diff --git a/test/integration/cli_test.go b/test/integration/cli_test.go index dd833414..3c16d11f 100644 --- a/test/integration/cli_test.go +++ b/test/integration/cli_test.go @@ -1,4 +1,4 @@ -// Copyright 2020-2021 the Pinniped contributors. All Rights Reserved. +// Copyright 2020-2022 the Pinniped contributors. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package integration @@ -299,7 +299,7 @@ func runPinnipedLoginOIDC( }) // Start a background goroutine to read stderr from the CLI and parse out the login URL. - loginURLChan := make(chan string) + loginURLChan := make(chan string, 1) spawnTestGoroutine(t, func() (err error) { t.Helper() defer func() { @@ -318,7 +318,7 @@ func runPinnipedLoginOIDC( for scanner.Scan() { loginURL, err := url.Parse(strings.TrimSpace(scanner.Text())) if err == nil && loginURL.Scheme == "https" { - loginURLChan <- loginURL.String() + loginURLChan <- loginURL.String() // this channel is buffered so this will not block return nil } } @@ -327,7 +327,7 @@ func runPinnipedLoginOIDC( }) // Start a background goroutine to read stdout from the CLI and parse out an ExecCredential. - credOutputChan := make(chan clientauthenticationv1beta1.ExecCredential) + credOutputChan := make(chan clientauthenticationv1beta1.ExecCredential, 1) spawnTestGoroutine(t, func() (err error) { defer func() { closeErr := stdout.Close() @@ -343,7 +343,7 @@ func runPinnipedLoginOIDC( if err := json.NewDecoder(reader).Decode(&out); err != nil { return fmt.Errorf("could not read ExecCredential from stdout: %w", err) } - credOutputChan <- out + credOutputChan <- out // this channel is buffered so this will not block return readAndExpectEmpty(reader) }) @@ -398,6 +398,7 @@ func readAndExpectEmpty(r io.Reader) (err error) { return nil } +// Note: Callers should ensure that f eventually returns, otherwise this helper will hang forever in t.Cleanup. func spawnTestGoroutine(t *testing.T, f func() error) { t.Helper() var eg errgroup.Group diff --git a/test/integration/e2e_test.go b/test/integration/e2e_test.go index 4f334541..f84a6395 100644 --- a/test/integration/e2e_test.go +++ b/test/integration/e2e_test.go @@ -181,7 +181,7 @@ func TestE2EFullIntegration(t *testing.T) { // nolint:gocyclo }) // Start a background goroutine to read stderr from the CLI and parse out the login URL. - loginURLChan := make(chan string) + loginURLChan := make(chan string, 1) spawnTestGoroutine(t, func() (err error) { defer func() { closeErr := stderrPipe.Close() @@ -198,7 +198,7 @@ func TestE2EFullIntegration(t *testing.T) { // nolint:gocyclo for scanner.Scan() { loginURL, err := url.Parse(strings.TrimSpace(scanner.Text())) if err == nil && loginURL.Scheme == "https" { - loginURLChan <- loginURL.String() + loginURLChan <- loginURL.String() // this channel is buffered so this will not block return nil } } @@ -206,7 +206,7 @@ func TestE2EFullIntegration(t *testing.T) { // nolint:gocyclo }) // Start a background goroutine to read stdout from kubectl and return the result as a string. - kubectlOutputChan := make(chan string) + kubectlOutputChan := make(chan string, 1) spawnTestGoroutine(t, func() (err error) { defer func() { closeErr := stdoutPipe.Close() @@ -222,7 +222,7 @@ func TestE2EFullIntegration(t *testing.T) { // nolint:gocyclo return err } t.Logf("kubectl output:\n%s\n", output) - kubectlOutputChan <- string(output) + kubectlOutputChan <- string(output) // this channel is buffered so this will not block return nil })