func runTestCase()

in daisy_test_runner/main.go [520:607]


func runTestCase(ctx context.Context, test *test, tc *junitTestCase, errors chan error, retries int) {
	if err := test.testCase.w.PopulateClients(ctx); err != nil {
		errors <- fmt.Errorf("%s: %v", tc.Name, err)
		tc.Failure = &junitFailure{FailMessage: err.Error(), FailType: "Error"}
		return
	}

	c := make(chan os.Signal, 1)
	signal.Notify(c, os.Interrupt)
	go func() {
		select {
		case <-c:
			fmt.Printf("\nCtrl-C caught, sending cancel signal to %q...\n", test.name)
			test.testCase.w.CancelWorkflow()
			err := fmt.Errorf("test case %q was canceled", test.name)
			errors <- err
			tc.Failure = &junitFailure{FailMessage: err.Error(), FailType: "Canceled"}
		case <-test.testCase.w.Cancel:
		}
	}()

	project := test.testCase.w.Project
	client := test.testCase.w.ComputeClient
	key := test.testCase.w.ID()
	var lock string
	var err error
	if test.testCase.CustomProjectLock != "" {
		for i := 0; i < retries; i++ {
			lock, err = customProjectWriteLock(client, project, allowedChars.ReplaceAllString(test.testCase.CustomProjectLock, "_"), key, test.testCase.timeout)
			if err == nil {
				break
			}
		}
		if err != nil {
			errors <- err
			return
		}
	} else if test.testCase.ProjectLock {
		for i := 0; i < retries; i++ {
			lock, err = projectWriteLock(client, project, key, test.testCase.timeout)
			if err == nil {
				break
			}
		}
		if err != nil {
			errors <- err
			return
		}
	} else {
		for i := 0; i < retries; i++ {
			lock, err = projectReadLock(client, project, key, test.testCase.timeout)
			if err == nil {
				break
			}
		}
		if err != nil {
			errors <- err
			return
		}
	}
	defer func() {
		for i := 0; i < retries; i++ {
			err := projectUnlock(client, project, lock)
			if err == nil {
				break
			}
		}
		if err != nil {
			fmt.Printf("[TestRunner] Test %q: Error unlocking project: %v\n", test.name, err)
		}
	}()

	select {
	case <-test.testCase.w.Cancel:
		return
	default:
	}

	start := time.Now()
	fmt.Printf("[TestRunner] Running test case %q\n", tc.Name)
	if err := test.testCase.w.Run(ctx); err != nil {
		errors <- fmt.Errorf("%s: %v", tc.Name, err)
		tc.Failure = &junitFailure{FailMessage: err.Error(), FailType: "Failure"}
	}
	tc.Time = time.Since(start).Seconds()
	tc.SystemOut = test.testCase.logger.buf.String()
	fmt.Printf("[TestRunner] Test case %q finished\n", tc.Name)
}