chore: avoid concurrent usage of t.FailNow (#1683)

* chore: golangci: add linter rule to report usage of t.FailNow inside goroutines
* chore: avoid t.FailNow in goroutines to appease the race detector
This commit is contained in:
Cian Johnston
2022-05-24 08:58:39 +01:00
committed by GitHub
parent 9b70a9b2eb
commit c2f74f3cc2
27 changed files with 120 additions and 74 deletions
+2 -2
View File
@@ -6,7 +6,7 @@ import (
"time"
"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
"go.uber.org/atomic"
"github.com/coder/coder/cli/cliui"
@@ -43,7 +43,7 @@ func TestAgent(t *testing.T) {
go func() {
defer close(done)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
ptty.ExpectMatch("lost connection")
disconnected.Store(true)
+7 -6
View File
@@ -10,6 +10,7 @@ import (
"time"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/coder/coder/cli/cliui"
@@ -27,7 +28,7 @@ func TestPrompt(t *testing.T) {
resp, err := newPrompt(ptty, cliui.PromptOptions{
Text: "Example",
}, nil)
require.NoError(t, err)
assert.NoError(t, err)
msgChan <- resp
}()
ptty.ExpectMatch("Example")
@@ -44,7 +45,7 @@ func TestPrompt(t *testing.T) {
Text: "Example",
IsConfirm: true,
}, nil)
require.NoError(t, err)
assert.NoError(t, err)
doneChan <- resp
}()
ptty.ExpectMatch("Example")
@@ -80,7 +81,7 @@ func TestPrompt(t *testing.T) {
cliui.AllowSkipPrompt(cmd)
cmd.SetArgs([]string{"-y"})
})
require.NoError(t, err)
assert.NoError(t, err)
doneChan <- resp
}()
@@ -101,7 +102,7 @@ func TestPrompt(t *testing.T) {
resp, err := newPrompt(ptty, cliui.PromptOptions{
Text: "Example",
}, nil)
require.NoError(t, err)
assert.NoError(t, err)
doneChan <- resp
}()
ptty.ExpectMatch("Example")
@@ -117,7 +118,7 @@ func TestPrompt(t *testing.T) {
resp, err := newPrompt(ptty, cliui.PromptOptions{
Text: "Example",
}, nil)
require.NoError(t, err)
assert.NoError(t, err)
doneChan <- resp
}()
ptty.ExpectMatch("Example")
@@ -133,7 +134,7 @@ func TestPrompt(t *testing.T) {
resp, err := newPrompt(ptty, cliui.PromptOptions{
Text: "Example",
}, nil)
require.NoError(t, err)
assert.NoError(t, err)
doneChan <- resp
}()
ptty.ExpectMatch("Example")
+4 -4
View File
@@ -9,7 +9,7 @@ import (
"time"
"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
@@ -90,9 +90,9 @@ func TestProvisionerJob(t *testing.T) {
go func() {
<-test.Next
currentProcess, err := os.FindProcess(os.Getpid())
require.NoError(t, err)
assert.NoError(t, err)
err = currentProcess.Signal(os.Interrupt)
require.NoError(t, err)
assert.NoError(t, err)
<-test.Next
test.JobMutex.Lock()
test.Job.Status = codersdk.ProvisionerJobCanceled
@@ -150,7 +150,7 @@ func newProvisionerJob(t *testing.T) provisionerJobTest {
defer close(done)
err := cmd.ExecuteContext(context.Background())
if err != nil {
require.ErrorIs(t, err, cliui.Canceled)
assert.ErrorIs(t, err, cliui.Canceled)
}
}()
t.Cleanup(func() {
+3 -3
View File
@@ -4,7 +4,7 @@ import (
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/coderd/database"
@@ -32,7 +32,7 @@ func TestWorkspaceResources(t *testing.T) {
}}, cliui.WorkspaceResourcesOptions{
WorkspaceName: "example",
})
require.NoError(t, err)
assert.NoError(t, err)
close(done)
}()
ptty.ExpectMatch("coder ssh example")
@@ -85,7 +85,7 @@ func TestWorkspaceResources(t *testing.T) {
HideAgentState: false,
HideAccess: false,
})
require.NoError(t, err)
assert.NoError(t, err)
close(done)
}()
ptty.ExpectMatch("google_compute_disk.root")
+2 -1
View File
@@ -5,6 +5,7 @@ import (
"testing"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/coder/coder/cli/cliui"
@@ -21,7 +22,7 @@ func TestSelect(t *testing.T) {
resp, err := newSelect(ptty, cliui.SelectOptions{
Options: []string{"First", "Second"},
})
require.NoError(t, err)
assert.NoError(t, err)
msgChan <- resp
}()
require.Equal(t, "First", <-msgChan)
+3 -2
View File
@@ -11,6 +11,7 @@ import (
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"cdr.dev/slog/sloggers/slogtest"
@@ -96,7 +97,7 @@ func TestConfigSSH(t *testing.T) {
return
}
ssh, err := agentConn.SSH()
require.NoError(t, err)
assert.NoError(t, err)
go io.Copy(conn, ssh)
go io.Copy(ssh, conn)
}
@@ -120,7 +121,7 @@ func TestConfigSSH(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
<-doneChan
+6 -6
View File
@@ -45,7 +45,7 @@ func TestCreate(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []string{
"Confirm create", "yes",
@@ -126,7 +126,7 @@ func TestCreate(t *testing.T) {
go func() {
defer done()
err := cmd.ExecuteContext(cmdCtx)
require.NoError(t, err)
assert.NoError(t, err)
}()
// No pty interaction needed since we use the -y skip prompt flag
<-cmdCtx.Done()
@@ -149,7 +149,7 @@ func TestCreate(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []string{
"Specify a name", "my-workspace",
@@ -187,7 +187,7 @@ func TestCreate(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []string{
@@ -231,7 +231,7 @@ func TestCreate(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []string{
@@ -272,7 +272,7 @@ func TestCreate(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.EqualError(t, err, "Parameter value absent in parameter file for \"region\"!")
assert.EqualError(t, err, "Parameter value absent in parameter file for \"region\"!")
}()
<-doneChan
removeTmpDirUntilSuccess(t, tempDir)
+6 -2
View File
@@ -1,9 +1,10 @@
package cli_test
import (
"io"
"testing"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
"github.com/coder/coder/cli/clitest"
"github.com/coder/coder/coderd/coderdtest"
@@ -29,7 +30,10 @@ func TestDelete(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
// When running with the race detector on, we sometimes get an EOF.
if err != nil {
assert.ErrorIs(t, err, io.EOF)
}
}()
pty.ExpectMatch("Cleaning Up")
<-doneChan
+5 -4
View File
@@ -4,6 +4,7 @@ import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/coder/coder/cli/clitest"
@@ -35,7 +36,7 @@ func TestLogin(t *testing.T) {
go func() {
defer close(doneChan)
err := root.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []string{
@@ -71,7 +72,7 @@ func TestLogin(t *testing.T) {
go func() {
defer close(doneChan)
err := root.ExecuteContext(ctx)
require.ErrorIs(t, err, context.Canceled)
assert.ErrorIs(t, err, context.Canceled)
}()
matches := []string{
@@ -106,7 +107,7 @@ func TestLogin(t *testing.T) {
go func() {
defer close(doneChan)
err := root.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
pty.ExpectMatch("Paste your token here:")
@@ -131,7 +132,7 @@ func TestLogin(t *testing.T) {
defer close(doneChan)
err := root.ExecuteContext(ctx)
// An error is expected in this case, since the login wasn't successful:
require.Error(t, err)
assert.Error(t, err)
}()
pty.ExpectMatch("Paste your token here:")
+2 -1
View File
@@ -3,6 +3,7 @@ package cli_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/coder/coder/cli/clitest"
@@ -25,7 +26,7 @@ func TestLogout(t *testing.T) {
go func() {
defer close(doneChan)
err := root.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
pty.ExpectMatch("Paste your token here:")
+12 -14
View File
@@ -16,6 +16,7 @@ import (
"github.com/google/uuid"
"github.com/pion/udp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/coder/coder/cli/clitest"
@@ -172,8 +173,7 @@ func TestPortForward(t *testing.T) {
defer cancel()
go func() {
err := cmd.ExecuteContext(ctx)
require.Error(t, err)
require.ErrorIs(t, err, context.Canceled)
assert.ErrorIs(t, err, context.Canceled)
}()
waitForPortForwardReady(t, buf)
@@ -220,8 +220,7 @@ func TestPortForward(t *testing.T) {
defer cancel()
go func() {
err := cmd.ExecuteContext(ctx)
require.Error(t, err)
require.ErrorIs(t, err, context.Canceled)
assert.ErrorIs(t, err, context.Canceled)
}()
waitForPortForwardReady(t, buf)
@@ -275,8 +274,7 @@ func TestPortForward(t *testing.T) {
defer cancel()
go func() {
err := cmd.ExecuteContext(ctx)
require.Error(t, err)
require.ErrorIs(t, err, context.Canceled)
assert.ErrorIs(t, err, context.Canceled)
}()
waitForPortForwardReady(t, buf)
@@ -336,8 +334,8 @@ func TestPortForward(t *testing.T) {
defer cancel()
go func() {
err := cmd.ExecuteContext(ctx)
require.Error(t, err)
require.ErrorIs(t, err, context.Canceled)
assert.Error(t, err)
assert.ErrorIs(t, err, context.Canceled)
}()
waitForPortForwardReady(t, buf)
@@ -406,7 +404,7 @@ func runAgent(t *testing.T, client *codersdk.Client, userID uuid.UUID) ([]coders
t.Cleanup(agentCancel)
go func() {
err := cmd.ExecuteContext(agentCtx)
require.NoError(t, err)
assert.NoError(t, err)
}()
coderdtest.AwaitWorkspaceAgents(t, client, workspace.LatestBuild.ID)
@@ -463,15 +461,15 @@ func testAccept(t *testing.T, c net.Conn) {
func assertReadPayload(t *testing.T, r io.Reader, payload []byte) {
b := make([]byte, len(payload)+16)
n, err := r.Read(b)
require.NoError(t, err, "read payload")
require.Equal(t, len(payload), n, "read payload length does not match")
require.Equal(t, payload, b[:n])
assert.NoError(t, err, "read payload")
assert.Equal(t, len(payload), n, "read payload length does not match")
assert.Equal(t, payload, b[:n])
}
func assertWritePayload(t *testing.T, w io.Writer, payload []byte) {
n, err := w.Write(payload)
require.NoError(t, err, "write payload")
require.Equal(t, len(payload), n, "payload length does not match")
assert.NoError(t, err, "write payload")
assert.Equal(t, len(payload), n, "payload length does not match")
}
func waitForPortForwardReady(t *testing.T, output *threadSafeBuffer) {
+3 -2
View File
@@ -7,6 +7,7 @@ import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/coder/coder/cli/clitest"
@@ -41,7 +42,7 @@ func TestResetPassword(t *testing.T) {
go func() {
defer close(serverDone)
err = serverCmd.ExecuteContext(ctx)
require.ErrorIs(t, err, context.Canceled)
assert.ErrorIs(t, err, context.Canceled)
}()
var client *codersdk.Client
require.Eventually(t, func() bool {
@@ -73,7 +74,7 @@ func TestResetPassword(t *testing.T) {
go func() {
defer close(cmdDone)
err = resetCmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []struct {
+1 -1
View File
@@ -57,7 +57,7 @@ func TestServer(t *testing.T) {
return false
}
accessURL, err := url.Parse(rawURL)
require.NoError(t, err)
assert.NoError(t, err)
client = codersdk.New(accessURL)
return true
}, 15*time.Second, 25*time.Millisecond)
+3 -2
View File
@@ -8,6 +8,7 @@ import (
"time"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/ssh"
@@ -63,7 +64,7 @@ func TestSSH(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
pty.ExpectMatch("Waiting")
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
@@ -133,7 +134,7 @@ func TestSSH(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
conn, channels, requests, err := ssh.NewClientConn(&stdioConn{
+2 -2
View File
@@ -3,7 +3,7 @@ package cli_test
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/assert"
"github.com/coder/coder/cli/clitest"
"github.com/coder/coder/coderd/coderdtest"
@@ -25,7 +25,7 @@ func TestUserCreate(t *testing.T) {
go func() {
defer close(doneChan)
err := cmd.Execute()
require.NoError(t, err)
assert.NoError(t, err)
}()
matches := []string{
"Username", "dean",