test: use T.TempDir to create temporary test directory (#12853)

* test: use `T.TempDir` to create temporary test directory

This commit replaces `ioutil.TempDir` with `t.TempDir` in tests. The
directory created by `t.TempDir` is automatically removed when the test
and all its subtests complete.

Prior to this commit, temporary directory created using `ioutil.TempDir`
needs to be removed manually by calling `os.RemoveAll`, which is omitted
in some tests. The error handling boilerplate e.g.
	defer func() {
		if err := os.RemoveAll(dir); err != nil {
			t.Fatal(err)
		}
	}
is also tedious, but `t.TempDir` handles this for us nicely.

Reference: https://pkg.go.dev/testing#T.TempDir
Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>

* test: fix TestLogmon_Start_restart on Windows

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>

* test: fix failing TestConsul_Integration

t.TempDir fails to perform the cleanup properly because the folder is
still in use

testing.go:967: TempDir RemoveAll cleanup: unlinkat /tmp/TestConsul_Integration2837567823/002/191a6f1a-5371-cf7c-da38-220fe85d10e5/web/secrets: device or resource busy

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
This commit is contained in:
Eng Zer Jun
2022-05-12 23:42:40 +08:00
committed by GitHub
parent 9347613d9a
commit fca4ee8e05
53 changed files with 221 additions and 769 deletions

View File

@@ -19,14 +19,6 @@ import (
"github.com/stretchr/testify/require"
)
func tmpDir(t testing.TB) string {
dir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %v", err)
}
return dir
}
func TestAgent_RPC_Ping(t *testing.T) {
ci.Parallel(t)
agent := NewTestAgent(t, t.Name(), nil)
@@ -916,8 +908,6 @@ func TestServer_Reload_TLS_UpgradeToTLS(t *testing.T) {
foocert = "../../helper/tlsutil/testdata/nomad-foo.pem"
fookey = "../../helper/tlsutil/testdata/nomad-foo-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
logger := testlog.HCLogger(t)
@@ -959,8 +949,6 @@ func TestServer_Reload_TLS_DowngradeFromTLS(t *testing.T) {
foocert = "../../helper/tlsutil/testdata/nomad-foo.pem"
fookey = "../../helper/tlsutil/testdata/nomad-foo-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
logger := testlog.HCLogger(t)
@@ -1002,8 +990,6 @@ func TestServer_ShouldReload_ReturnFalseForNoChanges(t *testing.T) {
foocert = "../../helper/tlsutil/testdata/nomad-foo.pem"
fookey = "../../helper/tlsutil/testdata/nomad-foo-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
sameAgentConfig := &Config{
TLSConfig: &config.TLSConfig{
@@ -1042,8 +1028,6 @@ func TestServer_ShouldReload_ReturnTrueForOnlyHTTPChanges(t *testing.T) {
foocert = "../../helper/tlsutil/testdata/nomad-foo.pem"
fookey = "../../helper/tlsutil/testdata/nomad-foo-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
sameAgentConfig := &Config{
TLSConfig: &config.TLSConfig{
@@ -1082,8 +1066,6 @@ func TestServer_ShouldReload_ReturnTrueForOnlyRPCChanges(t *testing.T) {
foocert = "../../helper/tlsutil/testdata/nomad-foo.pem"
fookey = "../../helper/tlsutil/testdata/nomad-foo-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
sameAgentConfig := &Config{
TLSConfig: &config.TLSConfig{
@@ -1124,8 +1106,6 @@ func TestServer_ShouldReload_ReturnTrueForConfigChanges(t *testing.T) {
foocert2 = "../../helper/tlsutil/testdata/nomad-bad.pem"
fookey2 = "../../helper/tlsutil/testdata/nomad-bad-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
agent := NewTestAgent(t, t.Name(), func(c *Config) {
c.TLSConfig = &config.TLSConfig{
@@ -1180,14 +1160,10 @@ func TestServer_ShouldReload_ReturnTrueForFileChanges(t *testing.T) {
`
content := []byte(oldCertificate)
dir, err := ioutil.TempDir("", "certificate")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir) // clean up
dir := t.TempDir()
tmpfn := filepath.Join(dir, "testcert")
err = ioutil.WriteFile(tmpfn, content, 0666)
err := ioutil.WriteFile(tmpfn, content, 0666)
require.Nil(err)
const (
@@ -1269,8 +1245,6 @@ func TestServer_ShouldReload_ShouldHandleMultipleChanges(t *testing.T) {
foocert2 = "../../helper/tlsutil/testdata/nomad-bad.pem"
fookey2 = "../../helper/tlsutil/testdata/nomad-bad-key.pem"
)
dir := tmpDir(t)
defer os.RemoveAll(dir)
sameAgentConfig := &Config{
TLSConfig: &config.TLSConfig{

View File

@@ -3,7 +3,6 @@ package agent
import (
"io/ioutil"
"math"
"os"
"path/filepath"
"strings"
"testing"
@@ -24,11 +23,7 @@ func TestCommand_Implements(t *testing.T) {
func TestCommand_Args(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
type tcase struct {
args []string
@@ -99,11 +94,7 @@ func TestCommand_Args(t *testing.T) {
func TestCommand_MetaConfigValidation(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
tcases := []string{
"foo..invalid",
@@ -112,7 +103,7 @@ func TestCommand_MetaConfigValidation(t *testing.T) {
}
for _, tc := range tcases {
configFile := filepath.Join(tmpDir, "conf1.hcl")
err = ioutil.WriteFile(configFile, []byte(`client{
err := ioutil.WriteFile(configFile, []byte(`client{
enabled = true
meta = {
"valid" = "yes"
@@ -154,11 +145,7 @@ func TestCommand_MetaConfigValidation(t *testing.T) {
func TestCommand_NullCharInDatacenter(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
tcases := []string{
"char-\\000-in-the-middle",
@@ -167,7 +154,7 @@ func TestCommand_NullCharInDatacenter(t *testing.T) {
}
for _, tc := range tcases {
configFile := filepath.Join(tmpDir, "conf1.hcl")
err = ioutil.WriteFile(configFile, []byte(`
err := ioutil.WriteFile(configFile, []byte(`
datacenter = "`+tc+`"
client{
enabled = true
@@ -205,11 +192,7 @@ func TestCommand_NullCharInDatacenter(t *testing.T) {
func TestCommand_NullCharInRegion(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
tcases := []string{
"char-\\000-in-the-middle",
@@ -218,7 +201,7 @@ func TestCommand_NullCharInRegion(t *testing.T) {
}
for _, tc := range tcases {
configFile := filepath.Join(tmpDir, "conf1.hcl")
err = ioutil.WriteFile(configFile, []byte(`
err := ioutil.WriteFile(configFile, []byte(`
region = "`+tc+`"
client{
enabled = true

View File

@@ -491,11 +491,7 @@ func TestConfig_LoadConfigDir(t *testing.T) {
t.Fatalf("expected error, got nothing")
}
dir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(dir)
dir := t.TempDir()
// Returns empty config on empty dir
config, err := LoadConfig(dir)
@@ -576,11 +572,7 @@ func TestConfig_LoadConfig(t *testing.T) {
expectedConfigFiles, config.Files)
}
dir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(dir)
dir := t.TempDir()
file1 := filepath.Join(dir, "config1.hcl")
err = ioutil.WriteFile(file1, []byte(`{"datacenter":"sfo"}`), 0600)
@@ -1337,12 +1329,10 @@ func TestTelemetry_Parse(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
dir, err := ioutil.TempDir("", "nomad")
require.NoError(err)
defer os.RemoveAll(dir)
dir := t.TempDir()
file1 := filepath.Join(dir, "config1.hcl")
err = ioutil.WriteFile(file1, []byte(`telemetry{
err := ioutil.WriteFile(file1, []byte(`telemetry{
prefix_filter = ["+nomad.raft"]
filter_default = false
disable_dispatched_job_summary_metrics = true

View File

@@ -3,7 +3,6 @@ package consul_test
import (
"context"
"io/ioutil"
"os"
"testing"
"time"
@@ -66,16 +65,8 @@ func TestConsul_Integration(t *testing.T) {
t.Fatalf("error generating consul config: %v", err)
}
conf.StateDir, err = ioutil.TempDir("", "nomadtest-consulstate")
if err != nil {
t.Fatalf("error creating temp dir: %v", err)
}
defer os.RemoveAll(conf.StateDir)
conf.AllocDir, err = ioutil.TempDir("", "nomdtest-consulalloc")
if err != nil {
t.Fatalf("error creating temp dir: %v", err)
}
defer os.RemoveAll(conf.AllocDir)
conf.StateDir = t.TempDir()
conf.AllocDir = t.TempDir()
alloc := mock.Alloc()
task := alloc.Job.TaskGroups[0].Tasks[0]
@@ -136,6 +127,9 @@ func TestConsul_Integration(t *testing.T) {
if err := allocDir.Build(); err != nil {
t.Fatalf("error building alloc dir: %v", err)
}
t.Cleanup(func() {
r.NoError(allocDir.Destroy())
})
taskDir := allocDir.NewTaskDir(task.Name)
vclient := vaultclient.NewMockVaultClient()
consulClient, err := consulapi.NewClient(consulConfig)

View File

@@ -3,7 +3,6 @@ package agent
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"testing"
@@ -53,11 +52,7 @@ func TestAgent_InitKeyring(t *testing.T) {
key2 := "4leC33rgtXKIVUr9Nr0snQ=="
expected := fmt.Sprintf(`["%s"]`, key1)
dir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(dir)
dir := t.TempDir()
file := filepath.Join(dir, "keyring")

View File

@@ -2,7 +2,6 @@ package agent
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
@@ -20,12 +19,8 @@ const (
func TestLogFile_timeRotation(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
tempDir, err := ioutil.TempDir("", "LogWriterTimeTest")
require.NoError(err)
defer os.Remove(tempDir)
tempDir := t.TempDir()
filt := LevelFilter()
logFile := logFile{
@@ -47,9 +42,7 @@ func TestLogFile_openNew(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
tempDir, err := ioutil.TempDir("", "LogWriterOpenTest")
require.NoError(err)
defer os.Remove(tempDir)
tempDir := t.TempDir()
filt := LevelFilter()
filt.MinLevel = logutils.LogLevel("INFO")
@@ -62,7 +55,7 @@ func TestLogFile_openNew(t *testing.T) {
}
require.NoError(logFile.openNew())
_, err = ioutil.ReadFile(logFile.FileInfo.Name())
_, err := ioutil.ReadFile(logFile.FileInfo.Name())
require.NoError(err)
require.Equal(logFile.FileInfo.Name(), filepath.Join(tempDir, testFileName))
@@ -84,9 +77,7 @@ func TestLogFile_byteRotation(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
tempDir, err := ioutil.TempDir("", "LogWriterByteTest")
require.NoError(err)
defer os.Remove(tempDir)
tempDir := t.TempDir()
filt := LevelFilter()
filt.MinLevel = logutils.LogLevel("INFO")
@@ -108,9 +99,7 @@ func TestLogFile_logLevelFiltering(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
tempDir, err := ioutil.TempDir("", "LogWriterFilterTest")
require.NoError(err)
defer os.Remove(tempDir)
tempDir := t.TempDir()
filt := LevelFilter()
logFile := logFile{
logFilter: filt,
@@ -131,9 +120,7 @@ func TestLogFile_deleteArchives(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
tempDir, err := ioutil.TempDir("", "LogWriterDeleteArchivesTest")
require.NoError(err)
defer os.Remove(tempDir)
tempDir := t.TempDir()
filt := LevelFilter()
filt.MinLevel = logutils.LogLevel("INFO")
@@ -171,9 +158,7 @@ func TestLogFile_deleteArchivesDisabled(t *testing.T) {
ci.Parallel(t)
require := require.New(t)
tempDir, err := ioutil.TempDir("", "LogWriterDeleteArchivesDisabledTest")
require.NoError(err)
defer os.Remove(tempDir)
tempDir := t.TempDir()
filt := LevelFilter()
filt.MinLevel = logutils.LogLevel("INFO")

View File

@@ -6,7 +6,6 @@ import (
"encoding/base64"
"fmt"
"io"
"io/ioutil"
"net/http"
"net/http/httptest"
"os"
@@ -411,9 +410,7 @@ func TestOperator_SchedulerCASConfiguration(t *testing.T) {
func TestOperator_SnapshotRequests(t *testing.T) {
ci.Parallel(t)
dir, err := ioutil.TempDir("", "nomadtest-operator-")
require.NoError(t, err)
defer os.RemoveAll(dir)
dir := t.TempDir()
snapshotPath := filepath.Join(dir, "snapshot.bin")
job := mock.Job()

View File

@@ -2,8 +2,6 @@ package command
import (
"fmt"
"io/ioutil"
"os"
"regexp"
"strings"
"testing"
@@ -387,11 +385,7 @@ func TestAllocStatusCommand_HostVolumes(t *testing.T) {
ci.Parallel(t)
// We have to create a tempdir for the host volume even though we're
// not going to use it b/c the server validates the config on startup
tmpDir, err := ioutil.TempDir("", "vol0")
if err != nil {
t.Fatalf("unable to create tempdir for test: %v", err)
}
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
vol0 := uuid.Generate()
srv, _, url := testServer(t, true, func(c *agent.Config) {

View File

@@ -2,7 +2,6 @@ package command
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
@@ -12,11 +11,7 @@ import (
func TestConfigValidateCommand_FailWithEmptyDir(t *testing.T) {
ci.Parallel(t)
fh, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh)
fh := t.TempDir()
ui := cli.NewMockUi()
cmd := &ConfigValidateCommand{Meta: Meta{Ui: ui}}
@@ -30,14 +25,10 @@ func TestConfigValidateCommand_FailWithEmptyDir(t *testing.T) {
func TestConfigValidateCommand_SucceedWithMinimalConfigFile(t *testing.T) {
ci.Parallel(t)
fh, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh)
fh := t.TempDir()
fp := filepath.Join(fh, "config.hcl")
err = ioutil.WriteFile(fp, []byte(`data_dir="/"
err := ioutil.WriteFile(fp, []byte(`data_dir="/"
client {
enabled = true
}`), 0644)
@@ -57,14 +48,10 @@ func TestConfigValidateCommand_SucceedWithMinimalConfigFile(t *testing.T) {
func TestConfigValidateCommand_FailOnParseBadConfigFile(t *testing.T) {
ci.Parallel(t)
fh, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh)
fh := t.TempDir()
fp := filepath.Join(fh, "config.hcl")
err = ioutil.WriteFile(fp, []byte(`a: b`), 0644)
err := ioutil.WriteFile(fp, []byte(`a: b`), 0644)
if err != nil {
t.Fatalf("err: %s", err)
}
@@ -81,14 +68,10 @@ func TestConfigValidateCommand_FailOnParseBadConfigFile(t *testing.T) {
func TestConfigValidateCommand_FailOnValidateParsableConfigFile(t *testing.T) {
ci.Parallel(t)
fh, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.Remove(fh)
fh := t.TempDir()
fp := filepath.Join(fh, "config.hcl")
err = ioutil.WriteFile(fp, []byte(`data_dir="../"
err := ioutil.WriteFile(fp, []byte(`data_dir="../"
client {
enabled = true
}`), 0644)

View File

@@ -4,8 +4,6 @@ import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"os/exec"
"strings"
"testing"
@@ -17,11 +15,7 @@ import (
func TestIntegration_Command_NomadInit(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomadtest-rootsecretdir")
if err != nil {
t.Fatalf("unable to create tempdir for test: %v", err)
}
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
{
cmd := exec.Command("nomad", "job", "init")
@@ -44,9 +38,7 @@ func TestIntegration_Command_NomadInit(t *testing.T) {
func TestIntegration_Command_RoundTripJob(t *testing.T) {
ci.Parallel(t)
assert := assert.New(t)
tmpDir, err := ioutil.TempDir("", "nomadtest-rootsecretdir")
assert.Nil(err)
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
// Start in dev mode so we get a node registration
srv, client, url := testServer(t, true, nil)

View File

@@ -38,11 +38,7 @@ func TestInitCommand_Run(t *testing.T) {
defer os.Chdir(origDir)
// Create a temp dir and change into it
dir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(dir)
dir := t.TempDir()
if err := os.Chdir(dir); err != nil {
t.Fatalf("err: %s", err)
}
@@ -104,11 +100,7 @@ func TestInitCommand_customFilename(t *testing.T) {
defer os.Chdir(origDir)
// Create a temp dir and change into it
dir, err := ioutil.TempDir("", "nomad")
if err != nil {
t.Fatalf("err: %s", err)
}
defer os.RemoveAll(dir)
dir := t.TempDir()
if err := os.Chdir(dir); err != nil {
t.Fatalf("err: %s", err)
}

View File

@@ -2,7 +2,6 @@ package command
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
@@ -39,11 +38,9 @@ func TestOperatorSnapshotInspect_Works(t *testing.T) {
func TestOperatorSnapshotInspect_HandlesFailure(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad-clitests-")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
err = ioutil.WriteFile(
err := ioutil.WriteFile(
filepath.Join(tmpDir, "invalid.snap"),
[]byte("invalid data"),
0600)
@@ -69,10 +66,7 @@ func TestOperatorSnapshotInspect_HandlesFailure(t *testing.T) {
}
func generateSnapshotFile(t *testing.T, prepare func(srv *agent.TestAgent, client *api.Client, url string)) string {
tmpDir, err := ioutil.TempDir("", "nomad-tempdir")
require.NoError(t, err)
t.Cleanup(func() { os.RemoveAll(tmpDir) })
tmpDir := t.TempDir()
srv, api, url := testServer(t, false, func(c *agent.Config) {
c.DevMode = false

View File

@@ -1,8 +1,6 @@
package command
import (
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
@@ -18,9 +16,7 @@ import (
func TestOperatorSnapshotRestore_Works(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad-tempdir")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
snapshotPath := generateSnapshotFile(t, func(srv *agent.TestAgent, client *api.Client, url string) {
sampleJob := `

View File

@@ -1,7 +1,6 @@
package command
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
@@ -16,10 +15,7 @@ import (
func TestOperatorSnapshotSave_Works(t *testing.T) {
ci.Parallel(t)
tmpDir, err := ioutil.TempDir("", "nomad-tempdir")
require.NoError(t, err)
defer os.RemoveAll(tmpDir)
tmpDir := t.TempDir()
srv, _, url := testServer(t, false, func(c *agent.Config) {
c.DevMode = false

View File

@@ -32,9 +32,7 @@ func TestQuotaInitCommand_Run_HCL(t *testing.T) {
defer os.Chdir(origDir)
// Create a temp dir and change into it
dir, err := ioutil.TempDir("", "nomad")
require.NoError(t, err)
defer os.RemoveAll(dir)
dir := t.TempDir()
err = os.Chdir(dir)
require.NoError(t, err)
@@ -81,9 +79,7 @@ func TestQuotaInitCommand_Run_JSON(t *testing.T) {
defer os.Chdir(origDir)
// Create a temp dir and change into it
dir, err := ioutil.TempDir("", "nomad")
require.NoError(t, err)
defer os.RemoveAll(dir)
dir := t.TempDir()
err = os.Chdir(dir)
require.NoError(t, err)