treewide: fix t.Fatal calls in non-test goroutines

Functions that abruptly terminate a test, such as the
Fatal, Fatalf, FailNow, and Skip{,f,Now} methods of *testing.T,
must be called from the test goroutine itself, as they call
runtime.Goexit internally to stop the calling goroutine, not the
test.

Change-Id: I4926c802bfbb11aeec6e130b0f4fb2407879cbd4
Reviewed-on: https://review.monogon.dev/c/monogon/+/2972
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/cloud/bmaas/bmdb/sessions_test.go b/cloud/bmaas/bmdb/sessions_test.go
index d3c80bd..9806ddb 100644
--- a/cloud/bmaas/bmdb/sessions_test.go
+++ b/cloud/bmaas/bmdb/sessions_test.go
@@ -582,11 +582,13 @@
 	}
 
 	worker := func(workerID int) {
-		ctxS, ctxC := context.WithCancel(ctx)
-		defer ctxC()
+		ctxS, ctxSC := context.WithCancel(ctx)
+		defer ctxSC()
 		session, err := conn.StartSession(ctxS)
 		if err != nil {
-			t.Fatalf("Starting session failed: %v", err)
+			t.Errorf("Starting session failed: %v", err)
+			ctxC()
+			return
 		}
 		for {
 			err := workOnce(ctxS, workerID, session)
@@ -597,7 +599,9 @@
 				if errors.Is(err, ctxS.Err()) {
 					return
 				}
-				t.Fatalf("worker failed: %v", err)
+				t.Errorf("worker failed: %v", err)
+				ctxC()
+				return
 			}
 		}
 	}
@@ -608,7 +612,11 @@
 
 	// Wait for at least three workers to be alive.
 	for i := 0; i < 3; i++ {
-		workStarted <- struct{}{}
+		select {
+			case workStarted <- struct{}{}:
+			case <-ctx.Done():
+				t.FailNow()
+		}
 	}
 
 	// Allow all workers to continue running from now on.