Fix a bug in the e2e tests
When the test was going to fail, a goroutine would accidentally block on writing to an unbuffered channel, and the spawnTestGoroutine helper would wait for that goroutine to end on cleanup, causing the test to hang forever while it was trying to fail.
This commit is contained in:
parent
7c246784dc
commit
2b93fdf357
@ -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
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
package integration
|
package integration
|
||||||
|
|
||||||
@ -299,7 +299,7 @@ func runPinnipedLoginOIDC(
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Start a background goroutine to read stderr from the CLI and parse out the login URL.
|
// 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) {
|
spawnTestGoroutine(t, func() (err error) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -318,7 +318,7 @@ func runPinnipedLoginOIDC(
|
|||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
loginURL, err := url.Parse(strings.TrimSpace(scanner.Text()))
|
loginURL, err := url.Parse(strings.TrimSpace(scanner.Text()))
|
||||||
if err == nil && loginURL.Scheme == "https" {
|
if err == nil && loginURL.Scheme == "https" {
|
||||||
loginURLChan <- loginURL.String()
|
loginURLChan <- loginURL.String() // this channel is buffered so this will not block
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -327,7 +327,7 @@ func runPinnipedLoginOIDC(
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Start a background goroutine to read stdout from the CLI and parse out an ExecCredential.
|
// 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) {
|
spawnTestGoroutine(t, func() (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
closeErr := stdout.Close()
|
closeErr := stdout.Close()
|
||||||
@ -343,7 +343,7 @@ func runPinnipedLoginOIDC(
|
|||||||
if err := json.NewDecoder(reader).Decode(&out); err != nil {
|
if err := json.NewDecoder(reader).Decode(&out); err != nil {
|
||||||
return fmt.Errorf("could not read ExecCredential from stdout: %w", err)
|
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)
|
return readAndExpectEmpty(reader)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -398,6 +398,7 @@ func readAndExpectEmpty(r io.Reader) (err error) {
|
|||||||
return nil
|
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) {
|
func spawnTestGoroutine(t *testing.T, f func() error) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
var eg errgroup.Group
|
var eg errgroup.Group
|
||||||
|
@ -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.
|
// 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) {
|
spawnTestGoroutine(t, func() (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
closeErr := stderrPipe.Close()
|
closeErr := stderrPipe.Close()
|
||||||
@ -198,7 +198,7 @@ func TestE2EFullIntegration(t *testing.T) { // nolint:gocyclo
|
|||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
loginURL, err := url.Parse(strings.TrimSpace(scanner.Text()))
|
loginURL, err := url.Parse(strings.TrimSpace(scanner.Text()))
|
||||||
if err == nil && loginURL.Scheme == "https" {
|
if err == nil && loginURL.Scheme == "https" {
|
||||||
loginURLChan <- loginURL.String()
|
loginURLChan <- loginURL.String() // this channel is buffered so this will not block
|
||||||
return nil
|
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.
|
// 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) {
|
spawnTestGoroutine(t, func() (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
closeErr := stdoutPipe.Close()
|
closeErr := stdoutPipe.Close()
|
||||||
@ -222,7 +222,7 @@ func TestE2EFullIntegration(t *testing.T) { // nolint:gocyclo
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
t.Logf("kubectl output:\n%s\n", output)
|
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
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user