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)
}