diff --git a/api/renewer_test.go b/api/renewer_test.go index 2a5d5745ba..3b28d8546d 100644 --- a/api/renewer_test.go +++ b/api/renewer_test.go @@ -192,27 +192,44 @@ func TestLifetimeWatcher(t *testing.T) { }() defer v.Stop() - select { - case <-time.After(tc.maxTestTime): - t.Fatalf("renewal didn't happen") - case r := <-v.RenewCh(): - if !tc.expectRenewal { - t.Fatal("expected no renewals") - } - if r.Secret != renewedSecret { - t.Fatalf("expected secret %v, got %v", renewedSecret, r.Secret) - } - case err := <-doneCh: - if tc.expectError != nil && !errors.Is(err, tc.expectError) { - t.Fatalf("expected error %q, got: %v", tc.expectError, err) - } - if tc.expectError == nil && err != nil { - t.Fatalf("expected no error, got: %v", err) - } - if tc.expectRenewal { - t.Fatalf("expected at least one renewal, got donech result: %v", err) + receivedRenewal := false + receivedDone := false + ChannelLoop: + for { + select { + case <-time.After(tc.maxTestTime): + t.Fatalf("renewal didn't happen") + case r := <-v.RenewCh(): + if !tc.expectRenewal { + t.Fatal("expected no renewals") + } + if r.Secret != renewedSecret { + t.Fatalf("expected secret %v, got %v", renewedSecret, r.Secret) + } + receivedRenewal = true + if !receivedDone { + continue ChannelLoop + } + break ChannelLoop + case err := <-doneCh: + receivedDone = true + if tc.expectError != nil && !errors.Is(err, tc.expectError) { + t.Fatalf("expected error %q, got: %v", tc.expectError, err) + } + if tc.expectError == nil && err != nil { + t.Fatalf("expected no error, got: %v", err) + } + if tc.expectRenewal && !receivedRenewal { + // We might have received the stop before the renew call on the channel. + continue ChannelLoop + } + break ChannelLoop } } + + if tc.expectRenewal && !receivedRenewal { + t.Fatalf("expected at least one renewal, got none.") + } }) } }