From 290a8dc94cd2b04cc814c8d75cb582fb24472520 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Mon, 16 Jan 2023 14:45:40 +0000 Subject: [PATCH 1/7] test: Fix flaky TestServer/Logging/Multiple --- cli/server_test.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/cli/server_test.go b/cli/server_test.go index 6cd13cb32e2ce..015e606285e3e 100644 --- a/cli/server_test.go +++ b/cli/server_test.go @@ -1279,6 +1279,10 @@ func TestServer(t *testing.T) { _ = os.Remove(fi3.Name()) }() + // NOTE(mafredri): This test might end up downloading Terraform + // which can take a long time and end up failing the test. + // This is why we wait extra long below for server to listen on + // HTTP. root, _ := clitest.New(t, "server", "--verbose", @@ -1289,26 +1293,38 @@ func TestServer(t *testing.T) { "--log-json", fi2.Name(), "--log-stackdriver", fi3.Name(), ) + // Attach pty so we get debug output from the command if this test + // fails. + pty := ptytest.New(t) + root.SetOut(pty.Output()) + root.SetErr(pty.Output()) + serverErr := make(chan error, 1) go func() { serverErr <- root.ExecuteContext(ctx) }() + defer func() { + cancelFunc() + <-serverErr + }() - assert.Eventually(t, func() bool { + require.Eventually(t, func() bool { + line := pty.ReadLine() + return strings.HasPrefix(line, "Started HTTP listener at ") + }, testutil.WaitLong*2, testutil.IntervalMedium, "wait for server to listen on http") + + require.Eventually(t, func() bool { stat, err := os.Stat(fi1.Name()) return err == nil && stat.Size() > 0 - }, testutil.WaitLong, testutil.IntervalMedium) - assert.Eventually(t, func() bool { + }, testutil.WaitShort, testutil.IntervalMedium, "log human size > 0") + require.Eventually(t, func() bool { stat, err := os.Stat(fi2.Name()) return err == nil && stat.Size() > 0 - }, testutil.WaitLong, testutil.IntervalMedium) - assert.Eventually(t, func() bool { + }, testutil.WaitShort, testutil.IntervalMedium, "log json size > 0") + require.Eventually(t, func() bool { stat, err := os.Stat(fi3.Name()) return err == nil && stat.Size() > 0 - }, testutil.WaitLong, testutil.IntervalMedium) - - cancelFunc() - <-serverErr + }, testutil.WaitShort, testutil.IntervalMedium, "log stackdriver size > 0") }) }) } From 13552ff98e9563268c1a543219fb002d31fc01cd Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Mon, 16 Jan 2023 15:30:12 +0000 Subject: [PATCH 2/7] test: Fix flaky TestServer/Logging/Stackdriver --- cli/server_test.go | 61 +++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/cli/server_test.go b/cli/server_test.go index 015e606285e3e..bfa9ab4846e5f 100644 --- a/cli/server_test.go +++ b/cli/server_test.go @@ -1134,10 +1134,8 @@ func TestServer(t *testing.T) { random, err := cryptorand.String(5) require.NoError(t, err) - fiName := fmt.Sprint(os.TempDir(), "/coder-logging-test-", random) - defer func() { - _ = os.Remove(fiName) - }() + tmpdir := t.TempDir() + fiName := fmt.Sprint(tmpdir, "/coder-logging-test-", random) root, _ := clitest.New(t, "server", @@ -1165,11 +1163,9 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi, err := os.CreateTemp("", "coder-logging-test-*") + tmpdir := t.TempDir() + fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) - defer func() { - _ = os.Remove(fi.Name()) - }() root, _ := clitest.New(t, "server", @@ -1197,11 +1193,9 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi, err := os.CreateTemp("", "coder-logging-test-*") + tmpdir := t.TempDir() + fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) - defer func() { - _ = os.Remove(fi.Name()) - }() root, _ := clitest.New(t, "server", @@ -1229,11 +1223,9 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi, err := os.CreateTemp("", "coder-logging-test-*") + tmpdir := t.TempDir() + fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) - defer func() { - _ = os.Remove(fi.Name()) - }() root, _ := clitest.New(t, "server", @@ -1243,17 +1235,30 @@ func TestServer(t *testing.T) { "--access-url", "http://example.com", "--log-stackdriver", fi.Name(), ) + // Attach pty so we get debug output from the command if this test + // fails. + pty := ptytest.New(t) + root.SetOut(pty.Output()) + root.SetErr(pty.Output()) + serverErr := make(chan error, 1) go func() { serverErr <- root.ExecuteContext(ctx) }() + defer func() { + cancelFunc() + <-serverErr + }() - assert.Eventually(t, func() bool { + require.Eventually(t, func() bool { + line := pty.ReadLine() + return strings.HasPrefix(line, "Started HTTP listener at ") + }, testutil.WaitLong*2, testutil.IntervalMedium, "wait for server to listen on http") + + require.Eventually(t, func() bool { stat, err := os.Stat(fi.Name()) return err == nil && stat.Size() > 0 }, testutil.WaitLong, testutil.IntervalMedium) - cancelFunc() - <-serverErr }) t.Run("Multiple", func(t *testing.T) { @@ -1261,23 +1266,13 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi1, err := os.CreateTemp("", "coder-logging-test-*") + tmpdir := t.TempDir() + fi1, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) - defer func() { - _ = os.Remove(fi1.Name()) - }() - - fi2, err := os.CreateTemp("", "coder-logging-test-*") + fi2, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) - defer func() { - _ = os.Remove(fi2.Name()) - }() - - fi3, err := os.CreateTemp("", "coder-logging-test-*") + fi3, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) - defer func() { - _ = os.Remove(fi3.Name()) - }() // NOTE(mafredri): This test might end up downloading Terraform // which can take a long time and end up failing the test. From 3f1f23e0a6540f39566fdaeea31a9223a8a94f7c Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Mon, 16 Jan 2023 16:31:23 +0000 Subject: [PATCH 3/7] Add testutil.TempDir for common handling of cleanup on Windows --- cli/server_test.go | 10 +++++----- testutil/temp.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 testutil/temp.go diff --git a/cli/server_test.go b/cli/server_test.go index bfa9ab4846e5f..9b42718fa99bd 100644 --- a/cli/server_test.go +++ b/cli/server_test.go @@ -1134,7 +1134,7 @@ func TestServer(t *testing.T) { random, err := cryptorand.String(5) require.NoError(t, err) - tmpdir := t.TempDir() + tmpdir := testutil.TempDir(t) fiName := fmt.Sprint(tmpdir, "/coder-logging-test-", random) root, _ := clitest.New(t, @@ -1163,7 +1163,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := t.TempDir() + tmpdir := testutil.TempDir(t) fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) @@ -1193,7 +1193,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := t.TempDir() + tmpdir := testutil.TempDir(t) fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) @@ -1223,7 +1223,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := t.TempDir() + tmpdir := testutil.TempDir(t) fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) @@ -1266,7 +1266,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := t.TempDir() + tmpdir := testutil.TempDir(t) fi1, err := os.CreateTemp(tmpdir, "coder-logging-test-*") require.NoError(t, err) fi2, err := os.CreateTemp(tmpdir, "coder-logging-test-*") diff --git a/testutil/temp.go b/testutil/temp.go new file mode 100644 index 0000000000000..4f6e75a4882d0 --- /dev/null +++ b/testutil/temp.go @@ -0,0 +1,28 @@ +package testutil + +import ( + "os" + "runtime" + "testing" +) + +func TempDir(t *testing.T) string { + t.Helper() + dir := t.TempDir() + t.Cleanup(func() { + if runtime.GOOS == "windows" { + tries := 50 + var err error + for i := 0; i < tries; i++ { + err = os.RemoveAll(dir) + if err == nil { + return + } + } + // Note that even though we're giving up here, t.TempDir + // cleanup _could_ still succeed (or fail the test). + t.Logf("TempDir: delete %q: giving up after %d tries: %v", dir, tries, err) + } + }) + return dir +} From ac17078f2e79ec331610a9e562d095a1f63625a1 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Mon, 16 Jan 2023 16:33:20 +0000 Subject: [PATCH 4/7] Flip the if --- testutil/temp.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testutil/temp.go b/testutil/temp.go index 4f6e75a4882d0..2f1135718e861 100644 --- a/testutil/temp.go +++ b/testutil/temp.go @@ -9,8 +9,8 @@ import ( func TempDir(t *testing.T) string { t.Helper() dir := t.TempDir() - t.Cleanup(func() { - if runtime.GOOS == "windows" { + if runtime.GOOS == "windows" { + t.Cleanup(func() { tries := 50 var err error for i := 0; i < tries; i++ { @@ -22,7 +22,7 @@ func TempDir(t *testing.T) string { // Note that even though we're giving up here, t.TempDir // cleanup _could_ still succeed (or fail the test). t.Logf("TempDir: delete %q: giving up after %d tries: %v", dir, tries, err) - } - }) + }) + } return dir } From c54c89ef87f25db02e47b00f2f27aae5c9a54fe3 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Tue, 17 Jan 2023 11:19:13 +0000 Subject: [PATCH 5/7] test: Try to improve testutil.TempDir cleanup on Windows --- testutil/temp.go | 55 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/testutil/temp.go b/testutil/temp.go index 2f1135718e861..ef985f76516fe 100644 --- a/testutil/temp.go +++ b/testutil/temp.go @@ -1,27 +1,74 @@ package testutil import ( + "io/fs" "os" + "path/filepath" "runtime" "testing" + "time" ) func TempDir(t *testing.T) string { t.Helper() dir := t.TempDir() + + // On Windows, os.RemoveAll can fail with (among other): + // + // The process cannot access the file because it is being used by another process. + // + // We try to work around this issue by removing files and directories in + // a loop until os.RemoveAll succeeds or we give up. if runtime.GOOS == "windows" { t.Cleanup(func() { - tries := 50 - var err error - for i := 0; i < tries; i++ { + var dirs, files []string + _ = filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() && path != dir { + dirs = append(dirs, path) + return nil + } + files = append(files, path) + return nil + }) + removeFilesAndDirs := func() { + // Try to remove all files so that the directories are empty. + var newFiles []string + for _, path := range files { + if err := os.Remove(path); err != nil { + newFiles = append(newFiles, path) + } + } + files = newFiles + + // Remove directories in reverse order (~depth first). + var newDirs []string + for i := len(dirs) - 1; i >= 0; i-- { + if err := os.Remove(dirs[i]); err != nil { + newDirs = append([]string{dirs[i]}, newDirs...) + } + } + dirs = newDirs + } + + var ( + start = time.Now() + timeout = 5 * time.Second + err error + ) + for time.Since(start) < timeout { + removeFilesAndDirs() err = os.RemoveAll(dir) if err == nil { return } + time.Sleep(100 * time.Millisecond) } // Note that even though we're giving up here, t.TempDir // cleanup _could_ still succeed (or fail the test). - t.Logf("TempDir: delete %q: giving up after %d tries: %v", dir, tries, err) + t.Logf("TempDir: delete %q: giving up after %s: %v", dir, timeout, err) }) } return dir From 635cadc5700b287a4b01051e44ab0b5f7dff7040 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Tue, 17 Jan 2023 11:35:54 +0000 Subject: [PATCH 6/7] test: Add testutil.CreateTemp, remove testutil.TempDir --- cli/server_test.go | 24 ++++--------- testutil/temp.go | 85 ++++++++++++---------------------------------- 2 files changed, 28 insertions(+), 81 deletions(-) diff --git a/cli/server_test.go b/cli/server_test.go index 9b42718fa99bd..4f271aabb8b69 100644 --- a/cli/server_test.go +++ b/cli/server_test.go @@ -1134,7 +1134,7 @@ func TestServer(t *testing.T) { random, err := cryptorand.String(5) require.NoError(t, err) - tmpdir := testutil.TempDir(t) + tmpdir := t.TempDir() fiName := fmt.Sprint(tmpdir, "/coder-logging-test-", random) root, _ := clitest.New(t, @@ -1163,9 +1163,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := testutil.TempDir(t) - fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") - require.NoError(t, err) + fi := testutil.CreateTemp(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1193,9 +1191,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := testutil.TempDir(t) - fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") - require.NoError(t, err) + fi := testutil.CreateTemp(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1223,9 +1219,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := testutil.TempDir(t) - fi, err := os.CreateTemp(tmpdir, "coder-logging-test-*") - require.NoError(t, err) + fi := testutil.CreateTemp(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1266,13 +1260,9 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - tmpdir := testutil.TempDir(t) - fi1, err := os.CreateTemp(tmpdir, "coder-logging-test-*") - require.NoError(t, err) - fi2, err := os.CreateTemp(tmpdir, "coder-logging-test-*") - require.NoError(t, err) - fi3, err := os.CreateTemp(tmpdir, "coder-logging-test-*") - require.NoError(t, err) + fi1 := testutil.CreateTemp(t, "", "coder-logging-test-*") + fi2 := testutil.CreateTemp(t, "", "coder-logging-test-*") + fi3 := testutil.CreateTemp(t, "", "coder-logging-test-*") // NOTE(mafredri): This test might end up downloading Terraform // which can take a long time and end up failing the test. diff --git a/testutil/temp.go b/testutil/temp.go index ef985f76516fe..8a67676841e1d 100644 --- a/testutil/temp.go +++ b/testutil/temp.go @@ -1,75 +1,32 @@ package testutil import ( - "io/fs" "os" - "path/filepath" - "runtime" "testing" - "time" + + "github.com/stretchr/testify/require" ) -func TempDir(t *testing.T) string { +// CreateTemp is a convenience function for creating a temporary file, like +// os.CreateTemp, but it also registers a cleanup function to close and remove +// the file. +func CreateTemp(t *testing.T, dir, pattern string) *os.File { t.Helper() - dir := t.TempDir() - - // On Windows, os.RemoveAll can fail with (among other): - // - // The process cannot access the file because it is being used by another process. - // - // We try to work around this issue by removing files and directories in - // a loop until os.RemoveAll succeeds or we give up. - if runtime.GOOS == "windows" { - t.Cleanup(func() { - var dirs, files []string - _ = filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if d.IsDir() && path != dir { - dirs = append(dirs, path) - return nil - } - files = append(files, path) - return nil - }) - removeFilesAndDirs := func() { - // Try to remove all files so that the directories are empty. - var newFiles []string - for _, path := range files { - if err := os.Remove(path); err != nil { - newFiles = append(newFiles, path) - } - } - files = newFiles - - // Remove directories in reverse order (~depth first). - var newDirs []string - for i := len(dirs) - 1; i >= 0; i-- { - if err := os.Remove(dirs[i]); err != nil { - newDirs = append([]string{dirs[i]}, newDirs...) - } - } - dirs = newDirs - } - var ( - start = time.Now() - timeout = 5 * time.Second - err error - ) - for time.Since(start) < timeout { - removeFilesAndDirs() - err = os.RemoveAll(dir) - if err == nil { - return - } - time.Sleep(100 * time.Millisecond) - } - // Note that even though we're giving up here, t.TempDir - // cleanup _could_ still succeed (or fail the test). - t.Logf("TempDir: delete %q: giving up after %s: %v", dir, timeout, err) - }) + if dir == "" { + dir = t.TempDir() } - return dir + f, err := os.CreateTemp(dir, pattern) + require.NoError(t, err, "create temp file") + t.Cleanup(func() { + err = f.Close() + if err != nil { + t.Logf("CreateTemp: Cleanup: close failed for %q: %v", f.Name(), err) + } + err = os.Remove(f.Name()) + if err != nil { + t.Logf("CreateTemp: Cleanup: remove failed for %q: %v", f.Name(), err) + } + }) + return f } From 47b5d28f34291ab1306d0afb1f64e415d777bf82 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Tue, 17 Jan 2023 11:46:45 +0000 Subject: [PATCH 7/7] test: Add testutil.TempFile and cleanup tests relying on temp file --- cli/server_test.go | 42 +++++++++++++++++++----------------------- testutil/temp.go | 23 +++++++++++++++++++---- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/cli/server_test.go b/cli/server_test.go index 4f271aabb8b69..1683ea6647ddf 100644 --- a/cli/server_test.go +++ b/cli/server_test.go @@ -35,7 +35,6 @@ import ( "github.com/coder/coder/coderd/database/postgres" "github.com/coder/coder/coderd/telemetry" "github.com/coder/coder/codersdk" - "github.com/coder/coder/cryptorand" "github.com/coder/coder/pty/ptytest" "github.com/coder/coder/testutil" ) @@ -1132,10 +1131,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - random, err := cryptorand.String(5) - require.NoError(t, err) - tmpdir := t.TempDir() - fiName := fmt.Sprint(tmpdir, "/coder-logging-test-", random) + fiName := testutil.TempFile(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1163,7 +1159,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi := testutil.CreateTemp(t, "", "coder-logging-test-*") + fi := testutil.TempFile(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1171,7 +1167,7 @@ func TestServer(t *testing.T) { "--in-memory", "--http-address", ":0", "--access-url", "http://example.com", - "--log-human", fi.Name(), + "--log-human", fi, ) serverErr := make(chan error, 1) go func() { @@ -1179,7 +1175,7 @@ func TestServer(t *testing.T) { }() assert.Eventually(t, func() bool { - stat, err := os.Stat(fi.Name()) + stat, err := os.Stat(fi) return err == nil && stat.Size() > 0 }, testutil.WaitShort, testutil.IntervalFast) cancelFunc() @@ -1191,7 +1187,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi := testutil.CreateTemp(t, "", "coder-logging-test-*") + fi := testutil.TempFile(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1199,7 +1195,7 @@ func TestServer(t *testing.T) { "--in-memory", "--http-address", ":0", "--access-url", "http://example.com", - "--log-json", fi.Name(), + "--log-json", fi, ) serverErr := make(chan error, 1) go func() { @@ -1207,7 +1203,7 @@ func TestServer(t *testing.T) { }() assert.Eventually(t, func() bool { - stat, err := os.Stat(fi.Name()) + stat, err := os.Stat(fi) return err == nil && stat.Size() > 0 }, testutil.WaitShort, testutil.IntervalFast) cancelFunc() @@ -1219,7 +1215,7 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi := testutil.CreateTemp(t, "", "coder-logging-test-*") + fi := testutil.TempFile(t, "", "coder-logging-test-*") root, _ := clitest.New(t, "server", @@ -1227,7 +1223,7 @@ func TestServer(t *testing.T) { "--in-memory", "--http-address", ":0", "--access-url", "http://example.com", - "--log-stackdriver", fi.Name(), + "--log-stackdriver", fi, ) // Attach pty so we get debug output from the command if this test // fails. @@ -1250,7 +1246,7 @@ func TestServer(t *testing.T) { }, testutil.WaitLong*2, testutil.IntervalMedium, "wait for server to listen on http") require.Eventually(t, func() bool { - stat, err := os.Stat(fi.Name()) + stat, err := os.Stat(fi) return err == nil && stat.Size() > 0 }, testutil.WaitLong, testutil.IntervalMedium) }) @@ -1260,9 +1256,9 @@ func TestServer(t *testing.T) { ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() - fi1 := testutil.CreateTemp(t, "", "coder-logging-test-*") - fi2 := testutil.CreateTemp(t, "", "coder-logging-test-*") - fi3 := testutil.CreateTemp(t, "", "coder-logging-test-*") + fi1 := testutil.TempFile(t, "", "coder-logging-test-*") + fi2 := testutil.TempFile(t, "", "coder-logging-test-*") + fi3 := testutil.TempFile(t, "", "coder-logging-test-*") // NOTE(mafredri): This test might end up downloading Terraform // which can take a long time and end up failing the test. @@ -1274,9 +1270,9 @@ func TestServer(t *testing.T) { "--in-memory", "--http-address", ":0", "--access-url", "http://example.com", - "--log-human", fi1.Name(), - "--log-json", fi2.Name(), - "--log-stackdriver", fi3.Name(), + "--log-human", fi1, + "--log-json", fi2, + "--log-stackdriver", fi3, ) // Attach pty so we get debug output from the command if this test // fails. @@ -1299,15 +1295,15 @@ func TestServer(t *testing.T) { }, testutil.WaitLong*2, testutil.IntervalMedium, "wait for server to listen on http") require.Eventually(t, func() bool { - stat, err := os.Stat(fi1.Name()) + stat, err := os.Stat(fi1) return err == nil && stat.Size() > 0 }, testutil.WaitShort, testutil.IntervalMedium, "log human size > 0") require.Eventually(t, func() bool { - stat, err := os.Stat(fi2.Name()) + stat, err := os.Stat(fi2) return err == nil && stat.Size() > 0 }, testutil.WaitShort, testutil.IntervalMedium, "log json size > 0") require.Eventually(t, func() bool { - stat, err := os.Stat(fi3.Name()) + stat, err := os.Stat(fi3) return err == nil && stat.Size() > 0 }, testutil.WaitShort, testutil.IntervalMedium, "log stackdriver size > 0") }) diff --git a/testutil/temp.go b/testutil/temp.go index 8a67676841e1d..4f17552415618 100644 --- a/testutil/temp.go +++ b/testutil/temp.go @@ -7,6 +7,24 @@ import ( "github.com/stretchr/testify/require" ) +// TempFile returns the name of a temporary file that does not exist. +func TempFile(t *testing.T, dir, pattern string) string { + t.Helper() + + if dir == "" { + dir = t.TempDir() + } + f, err := os.CreateTemp(dir, pattern) + require.NoError(t, err, "create temp file") + name := f.Name() + err = f.Close() + require.NoError(t, err, "close temp file") + err = os.Remove(name) + require.NoError(t, err, "remove temp file") + + return name +} + // CreateTemp is a convenience function for creating a temporary file, like // os.CreateTemp, but it also registers a cleanup function to close and remove // the file. @@ -19,10 +37,7 @@ func CreateTemp(t *testing.T, dir, pattern string) *os.File { f, err := os.CreateTemp(dir, pattern) require.NoError(t, err, "create temp file") t.Cleanup(func() { - err = f.Close() - if err != nil { - t.Logf("CreateTemp: Cleanup: close failed for %q: %v", f.Name(), err) - } + _ = f.Close() err = os.Remove(f.Name()) if err != nil { t.Logf("CreateTemp: Cleanup: remove failed for %q: %v", f.Name(), err)