From 4d8373390902ab89f68fc5ef2ee25cf485933f32 Mon Sep 17 00:00:00 2001 From: Seth Hoenig Date: Thu, 29 Feb 2024 12:11:35 -0600 Subject: [PATCH] tests: swap testify for test in more places (#20028) * tests: swap testify for test in plugins/csi/client_test.go * tests: swap testify for test in testutil/ * tests: swap testify for test in host_test.go * tests: swap testify for test in plugin_test.go * tests: swap testify for test in utils_test.go * tests: swap testify for test in scheduler/ * tests: swap testify for test in parse_test.go * tests: swap testify for test in attribute_test.go * tests: swap testify for test in plugins/drivers/ * tests: swap testify for test in command/ * tests: fixup some test usages * go: run go mod tidy * windows: cpuset test only on linux --- api/go.mod | 2 +- api/go.sum | 4 +- command/acl_binding_rule_update_test.go | 3 +- command/acl_bootstrap_test.go | 5 +- command/acl_role_create_test.go | 26 +-- command/acl_role_delete_test.go | 20 +- command/acl_role_info_test.go | 36 ++-- command/acl_role_list_test.go | 24 +-- command/acl_role_test.go | 8 +- command/acl_role_update_test.go | 48 ++--- command/acl_token_create_test.go | 25 ++- command/agent/helpers_test.go | 54 ++--- command/agent/host/host_test.go | 32 +-- command/deployment_fail_test.go | 9 +- command/deployment_pause_test.go | 9 +- command/deployment_promote_test.go | 9 +- command/deployment_resume_test.go | 9 +- command/deployment_status_test.go | 26 ++- command/deployment_unblock_test.go | 9 +- command/eval_delete_test.go | 54 ++--- command/eval_list_test.go | 6 +- command/eval_status_test.go | 9 +- command/event_test.go | 4 +- command/fmt_test.go | 12 +- command/helper_devices_test.go | 25 ++- command/helpers_test.go | 58 +++-- command/integration_test.go | 15 +- command/job_allocs_test.go | 53 +++-- command/job_deployments_test.go | 19 +- command/job_dispatch_test.go | 11 +- command/job_eval_test.go | 22 +- command/job_history_test.go | 8 +- command/job_init_test.go | 13 +- command/job_inspect_test.go | 8 +- command/job_periodic_force_test.go | 61 +++--- command/job_plan_test.go | 24 +-- command/job_promote_test.go | 13 +- command/job_restart_test.go | 1 - command/job_revert_test.go | 8 +- command/job_run_test.go | 32 +-- command/job_status_test.go | 35 ++- command/job_validate_test.go | 24 +-- command/license_get_test.go | 14 +- command/meta_test.go | 5 +- command/monitor_test.go | 3 +- command/namespace_apply_test.go | 5 +- command/namespace_delete_test.go | 15 +- command/namespace_inspect_test.go | 26 +-- command/namespace_status_test.go | 5 +- command/node_drain_test.go | 40 ++-- command/node_eligibility_test.go | 7 +- command/node_pool_jobs_test.go | 7 +- command/node_status_test.go | 18 +- command/operator_api_test.go | 27 ++- command/operator_autopilot_set_test.go | 29 +-- command/operator_debug_test.go | 1 + command/operator_gossip_keyring_test.go | 13 +- command/operator_raft_remove_test.go | 29 +-- command/operator_scheduler_get_config_test.go | 20 +- command/operator_scheduler_set_config_test.go | 38 ++-- command/operator_snapshot_inspect_test.go | 18 +- command/operator_snapshot_restore_test.go | 26 +-- command/operator_snapshot_save_test.go | 20 +- command/plugin_status_test.go | 16 +- command/quota_delete_test.go | 15 +- command/quota_init_test.go | 58 ++--- command/quota_list_test.go | 5 +- command/recommendation_apply_test.go | 26 +-- command/recommendation_dismiss_test.go | 43 ++-- command/recommendation_info_test.go | 35 ++- command/recommendation_list_test.go | 43 ++-- command/scaling_policy_list_test.go | 24 +-- command/scaling_policy_test.go | 4 +- command/service_delete_test.go | 27 ++- command/service_info_test.go | 45 ++-- command/service_list_test.go | 27 +-- command/setup_vault_test.go | 5 +- command/status_test.go | 82 +++----- command/tls_ca_create_test.go | 50 ++--- command/tls_cert_create_test.go | 48 ++--- command/ui_test.go | 9 +- command/var_get_test.go | 51 +++-- command/var_init_test.go | 70 +++--- command/var_list_test.go | 56 ++--- command/var_lock_test.go | 5 +- command/var_purge_test.go | 51 +++-- command/var_put_test.go | 41 ++-- command/volume_register_test.go | 19 +- command/volume_status_test.go | 12 +- drivers/docker/cpuset_test.go | 2 + go.mod | 2 +- go.sum | 4 +- jobspec/parse_test.go | 28 +-- plugins/base/plugin_test.go | 54 ++--- plugins/csi/client_test.go | 101 +++++---- plugins/drivers/testutils/exec_testing.go | 54 +++-- plugins/drivers/testutils/testing.go | 14 +- plugins/drivers/testutils/testing_test.go | 59 +++--- plugins/drivers/utils_test.go | 11 +- plugins/shared/structs/attribute_test.go | 10 +- scheduler/feasible_test.go | 42 ++-- scheduler/reconcile_test.go | 143 +++++-------- scheduler/stack_test.go | 199 +++++------------- testutil/tls.go | 23 +- testutil/vault.go | 3 +- testutil/wait_test.go | 9 +- 106 files changed, 1297 insertions(+), 1567 deletions(-) diff --git a/api/go.mod b/api/go.mod index bca3c4536..017cd4d93 100644 --- a/api/go.mod +++ b/api/go.mod @@ -12,7 +12,7 @@ require ( github.com/hashicorp/go-rootcerts v1.0.2 github.com/mitchellh/go-testing-interface v1.14.1 github.com/mitchellh/mapstructure v1.5.0 - github.com/shoenig/test v1.7.0 + github.com/shoenig/test v1.7.1 golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 ) diff --git a/api/go.sum b/api/go.sum index e37210d46..92a42b04c 100644 --- a/api/go.sum +++ b/api/go.sum @@ -27,8 +27,8 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= -github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/command/acl_binding_rule_update_test.go b/command/acl_binding_rule_update_test.go index ffc4b7a0c..7b0366ee4 100644 --- a/command/acl_binding_rule_update_test.go +++ b/command/acl_binding_rule_update_test.go @@ -14,7 +14,6 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestACLBindingRuleUpdateCommand_Run(t *testing.T) { @@ -29,7 +28,7 @@ func TestACLBindingRuleUpdateCommand_Run(t *testing.T) { // Wait for the server to start fully and ensure we have a bootstrap token. testutil.WaitForLeader(t, srv.Agent.RPC) rootACLToken := srv.RootToken - require.NotNil(t, rootACLToken) + must.NotNil(t, rootACLToken) ui := cli.NewMockUi() cmd := &ACLBindingRuleUpdateCommand{ diff --git a/command/acl_bootstrap_test.go b/command/acl_bootstrap_test.go index 404341f2c..85edc5fd1 100644 --- a/command/acl_bootstrap_test.go +++ b/command/acl_bootstrap_test.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestACLBootstrapCommand(t *testing.T) { @@ -37,7 +36,7 @@ func TestACLBootstrapCommand(t *testing.T) { out := ui.OutputWriter.String() must.StrContains(t, out, "Secret ID") - require.Contains(t, out, "Expiry Time = ") + must.StrContains(t, out, "Expiry Time = ") } // If a bootstrap token has already been created, attempts to create more should @@ -115,7 +114,7 @@ func TestACLBootstrapCommand_WithOperatorFileBootstrapToken(t *testing.T) { out := ui.OutputWriter.String() must.StrContains(t, out, mockToken.SecretID) - require.Contains(t, out, "Expiry Time = ") + must.StrContains(t, out, "Expiry Time = ") } // Attempting to bootstrap the server with an invalid operator provided token in a file should diff --git a/command/acl_role_create_test.go b/command/acl_role_create_test.go index c002ece79..7221092c3 100644 --- a/command/acl_role_create_test.go +++ b/command/acl_role_create_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestACLRoleCreateCommand_Run(t *testing.T) { @@ -26,7 +26,7 @@ func TestACLRoleCreateCommand_Run(t *testing.T) { // Wait for the server to start fully and ensure we have a bootstrap token. testutil.WaitForLeader(t, srv.Agent.RPC) rootACLToken := srv.RootToken - require.NotNil(t, rootACLToken) + must.NotNil(t, rootACLToken) ui := cli.NewMockUi() cmd := &ACLRoleCreateCommand{ @@ -37,20 +37,20 @@ func TestACLRoleCreateCommand_Run(t *testing.T) { } // Test the basic validation on the command. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "this-command-does-not-take-args"})) - require.Contains(t, ui.ErrorWriter.String(), "This command takes no arguments") + must.One(t, cmd.Run([]string{"-address=" + url, "this-command-does-not-take-args"})) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes no arguments") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() - require.Equal(t, 1, cmd.Run([]string{"-address=" + url})) - require.Contains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag") + must.One(t, cmd.Run([]string{"-address=" + url})) + must.StrContains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, `-name="foobar"`})) - require.Contains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag") + must.One(t, cmd.Run([]string{"-address=" + url, `-name="foobar"`})) + must.StrContains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -65,18 +65,18 @@ func TestACLRoleCreateCommand_Run(t *testing.T) { } err := srv.Agent.Server().State().UpsertACLPolicies( structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy}) - require.NoError(t, err) + must.NoError(t, err) // Create an ACL role. args := []string{ "-address=" + url, "-token=" + rootACLToken.SecretID, "-name=acl-role-cli-test", "-policy=acl-role-cli-test-policy", "-description=acl-role-all-the-things", } - require.Equal(t, 0, cmd.Run(args)) + must.Zero(t, cmd.Run(args)) s := ui.OutputWriter.String() - require.Contains(t, s, "Name = acl-role-cli-test") - require.Contains(t, s, "Description = acl-role-all-the-things") - require.Contains(t, s, "Policies = acl-role-cli-test-policy") + must.StrContains(t, s, "Name = acl-role-cli-test") + must.StrContains(t, s, "Description = acl-role-all-the-things") + must.StrContains(t, s, "Policies = acl-role-cli-test-policy") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() diff --git a/command/acl_role_delete_test.go b/command/acl_role_delete_test.go index 1c7a7161c..ea115807e 100644 --- a/command/acl_role_delete_test.go +++ b/command/acl_role_delete_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestACLRoleDeleteCommand_Run(t *testing.T) { @@ -27,7 +27,7 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) { // Wait for the server to start fully and ensure we have a bootstrap token. testutil.WaitForLeader(t, srv.Agent.RPC) rootACLToken := srv.RootToken - require.NotNil(t, rootACLToken) + must.NotNil(t, rootACLToken) ui := cli.NewMockUi() cmd := &ACLRoleDeleteCommand{ @@ -39,15 +39,15 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) { // Try and delete more than one ACL role. code := cmd.Run([]string{"-address=" + url, "acl-role-1", "acl-role-2"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "This command takes one argument") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() // Try deleting a role that does not exist. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "acl-role-1"})) - require.Contains(t, ui.ErrorWriter.String(), "ACL role not found") + must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "acl-role-1"})) + must.StrContains(t, ui.ErrorWriter.String(), "ACL role not found") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -62,7 +62,7 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) { } err := srv.Agent.Server().State().UpsertACLPolicies( structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy}) - require.NoError(t, err) + must.NoError(t, err) // Create an ACL role referencing the previously created policy. aclRole := structs.ACLRole{ @@ -72,9 +72,9 @@ func TestACLRoleDeleteCommand_Run(t *testing.T) { } err = srv.Agent.Server().State().UpsertACLRoles( structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false) - require.NoError(t, err) + must.NoError(t, err) // Delete the existing ACL role. - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID})) - require.Contains(t, ui.OutputWriter.String(), "successfully deleted") + must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID})) + must.StrContains(t, ui.OutputWriter.String(), "successfully deleted") } diff --git a/command/acl_role_info_test.go b/command/acl_role_info_test.go index 309fb3eb4..ad8921a5c 100644 --- a/command/acl_role_info_test.go +++ b/command/acl_role_info_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestACLRoleInfoCommand_Run(t *testing.T) { @@ -28,7 +28,7 @@ func TestACLRoleInfoCommand_Run(t *testing.T) { // Wait for the server to start fully and ensure we have a bootstrap token. testutil.WaitForLeader(t, srv.Agent.RPC) rootACLToken := srv.RootToken - require.NotNil(t, rootACLToken) + must.NotNil(t, rootACLToken) ui := cli.NewMockUi() cmd := &ACLRoleInfoCommand{ @@ -39,15 +39,15 @@ func TestACLRoleInfoCommand_Run(t *testing.T) { } // Perform a lookup without specifying an ID. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID})) - require.Contains(t, ui.ErrorWriter.String(), "This command takes one argument: ") + must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID})) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument: ") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() // Perform a lookup specifying a random ID. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, uuid.Generate()})) - require.Contains(t, ui.ErrorWriter.String(), "ACL role not found") + must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, uuid.Generate()})) + must.StrContains(t, ui.ErrorWriter.String(), "ACL role not found") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -62,7 +62,7 @@ func TestACLRoleInfoCommand_Run(t *testing.T) { } err := srv.Agent.Server().State().UpsertACLPolicies( structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy}) - require.NoError(t, err) + must.NoError(t, err) // Create an ACL role referencing the previously created policy. aclRole := structs.ACLRole{ @@ -72,26 +72,26 @@ func TestACLRoleInfoCommand_Run(t *testing.T) { } err = srv.Agent.Server().State().UpsertACLRoles( structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false) - require.NoError(t, err) + must.NoError(t, err) // Look up the ACL role using its ID. - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID})) + must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID})) s := ui.OutputWriter.String() - require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) - require.Contains(t, s, fmt.Sprintf("Name = %s", aclRole.Name)) - require.Contains(t, s, "Description = ") - require.Contains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name)) + must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) + must.StrContains(t, s, fmt.Sprintf("Name = %s", aclRole.Name)) + must.StrContains(t, s, "Description = ") + must.StrContains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name)) ui.OutputWriter.Reset() ui.ErrorWriter.Reset() // Look up the ACL role using its Name. - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "-by-name", aclRole.Name})) + must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "-by-name", aclRole.Name})) s = ui.OutputWriter.String() - require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) - require.Contains(t, s, fmt.Sprintf("Name = %s", aclRole.Name)) - require.Contains(t, s, "Description = ") - require.Contains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name)) + must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) + must.StrContains(t, s, fmt.Sprintf("Name = %s", aclRole.Name)) + must.StrContains(t, s, "Description = ") + must.StrContains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name)) ui.OutputWriter.Reset() ui.ErrorWriter.Reset() diff --git a/command/acl_role_list_test.go b/command/acl_role_list_test.go index 7d074dda4..3513aeb4d 100644 --- a/command/acl_role_list_test.go +++ b/command/acl_role_list_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestACLRoleListCommand_Run(t *testing.T) { @@ -27,7 +27,7 @@ func TestACLRoleListCommand_Run(t *testing.T) { // Wait for the server to start fully and ensure we have a bootstrap token. testutil.WaitForLeader(t, srv.Agent.RPC) rootACLToken := srv.RootToken - require.NotNil(t, rootACLToken) + must.NotNil(t, rootACLToken) ui := cli.NewMockUi() cmd := &ACLRoleListCommand{ @@ -38,8 +38,8 @@ func TestACLRoleListCommand_Run(t *testing.T) { } // Perform a list straight away without any roles held in state. - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID})) - require.Contains(t, ui.OutputWriter.String(), "No ACL roles found") + must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID})) + must.StrContains(t, ui.OutputWriter.String(), "No ACL roles found") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -54,7 +54,7 @@ func TestACLRoleListCommand_Run(t *testing.T) { } err := srv.Agent.Server().State().UpsertACLPolicies( structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy}) - require.NoError(t, err) + must.NoError(t, err) // Create an ACL role referencing the previously created policy. aclRole := structs.ACLRole{ @@ -64,16 +64,16 @@ func TestACLRoleListCommand_Run(t *testing.T) { } err = srv.Agent.Server().State().UpsertACLRoles( structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false) - require.NoError(t, err) + must.NoError(t, err) // Perform a listing to get the created role. - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID})) + must.Zero(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID})) s := ui.OutputWriter.String() - require.Contains(t, s, "ID") - require.Contains(t, s, "Name") - require.Contains(t, s, "Policies") - require.Contains(t, s, "acl-role-cli-test") - require.Contains(t, s, "acl-role-policy-cli-test") + must.StrContains(t, s, "ID") + must.StrContains(t, s, "Name") + must.StrContains(t, s, "Policies") + must.StrContains(t, s, "acl-role-cli-test") + must.StrContains(t, s, "acl-role-policy-cli-test") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() diff --git a/command/acl_role_test.go b/command/acl_role_test.go index 4a6a555a5..e65ea78e1 100644 --- a/command/acl_role_test.go +++ b/command/acl_role_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/hashicorp/nomad/api" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func Test_formatACLRole(t *testing.T) { @@ -26,7 +26,7 @@ func Test_formatACLRole(t *testing.T) { } expectedOutput := "ID = this-is-usually-a-uuid\nName = this-is-my-friendly-name\nDescription = this-is-my-friendly-name\nPolicies = policy-link-1,policy-link-2,policy-link-3,policy-link-4\nCreate Index = 13\nModify Index = 1313" actualOutput := formatACLRole(&inputACLRole) - require.Equal(t, expectedOutput, actualOutput) + must.Eq(t, expectedOutput, actualOutput) } func Test_aclRolePolicyLinkToStringList(t *testing.T) { @@ -43,7 +43,7 @@ func Test_aclRolePolicyLinkToStringList(t *testing.T) { "z-policy-link-1", } actualOutput := aclRolePolicyLinkToStringList(inputPolicyLinks) - require.Equal(t, expectedOutput, actualOutput) + must.Eq(t, expectedOutput, actualOutput) } func Test_aclRolePolicyNamesToPolicyLinks(t *testing.T) { @@ -60,5 +60,5 @@ func Test_aclRolePolicyNamesToPolicyLinks(t *testing.T) { {Name: "policy-link-4"}, } actualOutput := aclRolePolicyNamesToPolicyLinks(inputPolicyNames) - require.ElementsMatch(t, expectedOutput, actualOutput) + must.SliceContainsAll(t, expectedOutput, actualOutput) } diff --git a/command/acl_role_update_test.go b/command/acl_role_update_test.go index 869f3c033..394c3414e 100644 --- a/command/acl_role_update_test.go +++ b/command/acl_role_update_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestACLRoleUpdateCommand_Run(t *testing.T) { @@ -28,7 +28,7 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) { // Wait for the server to start fully and ensure we have a bootstrap token. testutil.WaitForLeader(t, srv.Agent.RPC) rootACLToken := srv.RootToken - require.NotNil(t, rootACLToken) + must.NotNil(t, rootACLToken) ui := cli.NewMockUi() cmd := &ACLRoleUpdateCommand{ @@ -39,16 +39,16 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) { } // Try calling the command without setting an ACL Role ID arg. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url})) - require.Contains(t, ui.ErrorWriter.String(), "This command takes one argument") + must.One(t, cmd.Run([]string{"-address=" + url})) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() // Try calling the command with an ACL role ID that does not exist. code := cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "catch-me-if-you-can"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "ACL role not found") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "ACL role not found") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -63,7 +63,7 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) { } err := srv.Agent.Server().State().UpsertACLPolicies( structs.MsgTypeTestSetup, 10, []*structs.ACLPolicy{&aclPolicy}) - require.NoError(t, err) + must.NoError(t, err) // Create an ACL role that can be used for updating. aclRole := structs.ACLRole{ @@ -75,12 +75,12 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) { err = srv.Agent.Server().State().UpsertACLRoles( structs.MsgTypeTestSetup, 20, []*structs.ACLRole{&aclRole}, false) - require.NoError(t, err) + must.NoError(t, err) // Try a merge update without setting any parameters to update. code = cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, aclRole.ID}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "Please provide at least one flag to update the ACL role") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "Please provide at least one flag to update the ACL role") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -88,39 +88,39 @@ func TestACLRoleUpdateCommand_Run(t *testing.T) { // Update the description using the merge method. code = cmd.Run([]string{ "-address=" + url, "-token=" + rootACLToken.SecretID, "-description=badger-badger-badger", aclRole.ID}) - require.Equal(t, 0, code) + must.Zero(t, code) s := ui.OutputWriter.String() - require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) - require.Contains(t, s, "Name = acl-role-cli-test") - require.Contains(t, s, "Description = badger-badger-badger") - require.Contains(t, s, "Policies = acl-role-cli-test-policy") + must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) + must.StrContains(t, s, "Name = acl-role-cli-test") + must.StrContains(t, s, "Description = badger-badger-badger") + must.StrContains(t, s, "Policies = acl-role-cli-test-policy") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() // Try updating the role using no-merge without setting the required flags. code = cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID, "-no-merge", aclRole.ID}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "ACL role name must be specified using the -name flag") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() code = cmd.Run([]string{ "-address=" + url, "-token=" + rootACLToken.SecretID, "-no-merge", "-name=update-role-name", aclRole.ID}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "At least one policy name must be specified using the -policy flag") // Update the role using no-merge with all required flags set. code = cmd.Run([]string{ "-address=" + url, "-token=" + rootACLToken.SecretID, "-no-merge", "-name=update-role-name", "-description=updated-description", "-policy=acl-role-cli-test-policy", aclRole.ID}) - require.Equal(t, 0, code) + must.Zero(t, code) s = ui.OutputWriter.String() - require.Contains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) - require.Contains(t, s, "Name = update-role-name") - require.Contains(t, s, "Description = updated-description") - require.Contains(t, s, "Policies = acl-role-cli-test-policy") + must.StrContains(t, s, fmt.Sprintf("ID = %s", aclRole.ID)) + must.StrContains(t, s, "Name = update-role-name") + must.StrContains(t, s, "Description = updated-description") + must.StrContains(t, s, "Policies = acl-role-cli-test-policy") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() diff --git a/command/acl_token_create_test.go b/command/acl_token_create_test.go index d7f657be9..6afc140a1 100644 --- a/command/acl_token_create_test.go +++ b/command/acl_token_create_test.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/nomad/command/agent" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestACLTokenCreateCommand(t *testing.T) { @@ -39,12 +38,12 @@ func TestACLTokenCreateCommand(t *testing.T) { // Request to create a new token with a valid management token that does // not have an expiry set. code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-policy=foo", "-type=client"}) - require.Equal(t, 0, code) + must.Zero(t, code) // Check the output out := ui.OutputWriter.String() - require.Contains(t, out, "[foo]") - require.Contains(t, out, "Expiry Time = ") + must.StrContains(t, out, "[foo]") + must.StrContains(t, out, "Expiry Time = ") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -54,14 +53,14 @@ func TestACLTokenCreateCommand(t *testing.T) { var jsonMap map[string]interface{} for _, outputFormatFlag := range testCasesNoTTL { code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-policy=foo", "-type=client", outputFormatFlag}) - require.Equal(t, 0, code) + must.Zero(t, code) // Check the output out = ui.OutputWriter.String() - require.Contains(t, out, "foo") + must.StrContains(t, out, "foo") if outputFormatFlag == "-json" { err := json.Unmarshal([]byte(out), &jsonMap) - require.Nil(t, err, "Output not in JSON format") + must.NoError(t, err) } ui.OutputWriter.Reset() @@ -70,10 +69,10 @@ func TestACLTokenCreateCommand(t *testing.T) { // Create a new token that has an expiry TTL set and check the response. code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-type=management", "-ttl=10m"}) - require.Equal(t, 0, code) + must.Zero(t, code) out = ui.OutputWriter.String() - require.NotContains(t, out, "Expiry Time = ") + must.StrNotContains(t, out, "Expiry Time = ") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -81,15 +80,15 @@ func TestACLTokenCreateCommand(t *testing.T) { testCasesWithTTL := [][]string{{"-json", "ExpirationTTL"}, {"-t='{{ .ExpirationTTL }}'", "10m0s"}} for _, outputFormatFlag := range testCasesWithTTL { code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-type=management", "-ttl=10m", outputFormatFlag[0]}) - require.Equal(t, 0, code) + must.Zero(t, code) // Check the output out = ui.OutputWriter.String() if outputFormatFlag[0] == "-json" { err := json.Unmarshal([]byte(out), &jsonMap) - require.Nil(t, err, "Output not in JSON format") + must.NoError(t, err) } - require.Contains(t, out, outputFormatFlag[1]) + must.StrContains(t, out, outputFormatFlag[1]) ui.OutputWriter.Reset() ui.ErrorWriter.Reset() } @@ -117,5 +116,5 @@ func Test_generateACLTokenRoleLinks(t *testing.T) { {ID: "77a780d8-2dee-7c7f-7822-6f5471c5cbb2"}, {ID: "56850b06-a343-a772-1a5c-ad083fd8a50e"}, } - require.ElementsMatch(t, generateACLTokenRoleLinks(inputRoleNames, inputRoleIDs), expectedOutput) + must.SliceContainsAll(t, generateACLTokenRoleLinks(inputRoleNames, inputRoleIDs), expectedOutput) } diff --git a/command/agent/helpers_test.go b/command/agent/helpers_test.go index 114e17a96..7620b0b6b 100644 --- a/command/agent/helpers_test.go +++ b/command/agent/helpers_test.go @@ -8,12 +8,12 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/helper/uuid" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestHTTP_rpcHandlerForAlloc(t *testing.T) { ci.Parallel(t) - require := require.New(t) + agent := NewTestAgent(t, t.Name(), nil) defer agent.Shutdown() @@ -23,25 +23,25 @@ func TestHTTP_rpcHandlerForAlloc(t *testing.T) { // Case 1: Client has allocation // Outcome: Use local client lc, rc, s := agent.Server.rpcHandlerForAlloc(a.ID) - require.True(lc) - require.False(rc) - require.False(s) + must.True(t, lc) + must.False(t, rc) + must.False(t, s) // Case 2: Client doesn't have allocation and there is a server // Outcome: Use server lc, rc, s = agent.Server.rpcHandlerForAlloc(uuid.Generate()) - require.False(lc) - require.False(rc) - require.True(s) + must.False(t, lc) + must.False(t, rc) + must.True(t, s) // Case 3: Client doesn't have allocation and there is no server // Outcome: Use client RPC to server srv := agent.server agent.server = nil lc, rc, s = agent.Server.rpcHandlerForAlloc(uuid.Generate()) - require.False(lc) - require.True(rc) - require.False(s) + must.False(t, lc) + must.True(t, rc) + must.False(t, s) agent.server = srv // Case 4: No client @@ -49,15 +49,15 @@ func TestHTTP_rpcHandlerForAlloc(t *testing.T) { client := agent.client agent.client = nil lc, rc, s = agent.Server.rpcHandlerForAlloc(uuid.Generate()) - require.False(lc) - require.False(rc) - require.True(s) + must.False(t, lc) + must.False(t, rc) + must.True(t, s) agent.client = client } func TestHTTP_rpcHandlerForNode(t *testing.T) { ci.Parallel(t) - require := require.New(t) + agent := NewTestAgent(t, t.Name(), nil) defer agent.Shutdown() @@ -66,25 +66,25 @@ func TestHTTP_rpcHandlerForNode(t *testing.T) { // Case 1: Node running, no node ID given // Outcome: Use local node lc, rc, s := agent.Server.rpcHandlerForNode("") - require.True(lc) - require.False(rc) - require.False(s) + must.True(t, lc) + must.False(t, rc) + must.False(t, s) // Case 2: Node running, it's ID given // Outcome: Use local node lc, rc, s = agent.Server.rpcHandlerForNode(cID) - require.True(lc) - require.False(rc) - require.False(s) + must.True(t, lc) + must.False(t, rc) + must.False(t, s) // Case 3: Local node but wrong ID and there is no server // Outcome: Use client RPC to server srv := agent.server agent.server = nil lc, rc, s = agent.Server.rpcHandlerForNode(uuid.Generate()) - require.False(lc) - require.True(rc) - require.False(s) + must.False(t, lc) + must.True(t, rc) + must.False(t, s) agent.server = srv // Case 4: No client @@ -92,8 +92,8 @@ func TestHTTP_rpcHandlerForNode(t *testing.T) { client := agent.client agent.client = nil lc, rc, s = agent.Server.rpcHandlerForNode(uuid.Generate()) - require.False(lc) - require.False(rc) - require.True(s) + must.False(t, lc) + must.False(t, rc) + must.True(t, s) agent.client = client } diff --git a/command/agent/host/host_test.go b/command/agent/host/host_test.go index 8b685a152..8c9e2e8e6 100644 --- a/command/agent/host/host_test.go +++ b/command/agent/host/host_test.go @@ -6,17 +6,17 @@ package host import ( "testing" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestHostUtils(t *testing.T) { mounts := mountedPaths() - require.NotEmpty(t, mounts) + must.SliceNotEmpty(t, mounts) du, err := diskUsage("/") - require.NoError(t, err) - require.NotZero(t, du.DiskMB) - require.NotZero(t, du.UsedMB) + must.NoError(t, err) + must.Positive(t, du.DiskMB) + must.Positive(t, du.UsedMB) } func TestMakeHostData(t *testing.T) { @@ -27,15 +27,15 @@ func TestMakeHostData(t *testing.T) { t.Setenv("ryanSECRETS", "foo") host, err := MakeHostData() - require.NoError(t, err) - require.NotEmpty(t, host.OS) - require.NotEmpty(t, host.Network) - require.NotEmpty(t, host.ResolvConf) - require.NotEmpty(t, host.Hosts) - require.NotEmpty(t, host.Disk) - require.NotEmpty(t, host.Environment) - require.Equal(t, "", host.Environment["VAULT_TOKEN"]) - require.Equal(t, "", host.Environment["BOGUS_TOKEN"]) - require.Equal(t, "", host.Environment["BOGUS_SECRET"]) - require.Equal(t, "", host.Environment["ryanSECRETS"]) + must.NoError(t, err) + must.NotEq(t, "", host.OS) + must.SliceNotEmpty(t, host.Network) + must.NotEq(t, "", host.ResolvConf) + must.NotEq(t, "", host.Hosts) + must.MapNotEmpty(t, host.Disk) + must.MapNotEmpty(t, host.Environment) + must.Eq(t, "", host.Environment["VAULT_TOKEN"]) + must.Eq(t, "", host.Environment["BOGUS_TOKEN"]) + must.Eq(t, "", host.Environment["BOGUS_SECRET"]) + must.Eq(t, "", host.Environment["ryanSECRETS"]) } diff --git a/command/deployment_fail_test.go b/command/deployment_fail_test.go index b1e2757d8..c6d3c7233 100644 --- a/command/deployment_fail_test.go +++ b/command/deployment_fail_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestDeploymentFailCommand_Implements(t *testing.T) { @@ -44,7 +44,6 @@ func TestDeploymentFailCommand_Fails(t *testing.T) { func TestDeploymentFailCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -55,13 +54,13 @@ func TestDeploymentFailCommand_AutocompleteArgs(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() d := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, d)) + must.Nil(t, state.UpsertDeployment(1000, d)) prefix := d.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(d.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, d.ID, res[0]) } diff --git a/command/deployment_pause_test.go b/command/deployment_pause_test.go index 8eea4bad4..f8356af7c 100644 --- a/command/deployment_pause_test.go +++ b/command/deployment_pause_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestDeploymentPauseCommand_Implements(t *testing.T) { @@ -44,7 +44,6 @@ func TestDeploymentPauseCommand_Fails(t *testing.T) { func TestDeploymentPauseCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -55,13 +54,13 @@ func TestDeploymentPauseCommand_AutocompleteArgs(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() d := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, d)) + must.NoError(t, state.UpsertDeployment(1000, d)) prefix := d.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(d.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, d.ID, res[0]) } diff --git a/command/deployment_promote_test.go b/command/deployment_promote_test.go index 5e84f681f..38aefcddb 100644 --- a/command/deployment_promote_test.go +++ b/command/deployment_promote_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestDeploymentPromoteCommand_Implements(t *testing.T) { @@ -44,7 +44,6 @@ func TestDeploymentPromoteCommand_Fails(t *testing.T) { func TestDeploymentPromoteCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -55,13 +54,13 @@ func TestDeploymentPromoteCommand_AutocompleteArgs(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() d := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, d)) + must.NoError(t, state.UpsertDeployment(1000, d)) prefix := d.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(d.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, d.ID, res[0]) } diff --git a/command/deployment_resume_test.go b/command/deployment_resume_test.go index ddc286559..ee4f97c19 100644 --- a/command/deployment_resume_test.go +++ b/command/deployment_resume_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestDeploymentResumeCommand_Implements(t *testing.T) { @@ -44,7 +44,6 @@ func TestDeploymentResumeCommand_Fails(t *testing.T) { func TestDeploymentResumeCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -55,13 +54,13 @@ func TestDeploymentResumeCommand_AutocompleteArgs(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() d := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, d)) + must.NoError(t, state.UpsertDeployment(1000, d)) prefix := d.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(d.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, d.ID, res[0]) } diff --git a/command/deployment_status_test.go b/command/deployment_status_test.go index 38377d741..62e864282 100644 --- a/command/deployment_status_test.go +++ b/command/deployment_status_test.go @@ -10,8 +10,7 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestDeploymentStatusCommand_Implements(t *testing.T) { @@ -26,37 +25,36 @@ func TestDeploymentStatusCommand_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) + must.One(t, code) out := ui.ErrorWriter.String() - require.Contains(t, out, commandErrorText(cmd)) + must.StrContains(t, out, commandErrorText(cmd)) ui.ErrorWriter.Reset() code = cmd.Run([]string{"-address=nope", "12"}) - require.Equal(t, 1, code) + must.One(t, code) out = ui.ErrorWriter.String() - require.Contains(t, out, "Error retrieving deployment") + must.StrContains(t, out, "Error retrieving deployment") ui.ErrorWriter.Reset() code = cmd.Run([]string{"-address=nope"}) - require.Equal(t, 1, code) + must.One(t, code) out = ui.ErrorWriter.String() // "deployments" indicates that we attempted to list all deployments - require.Contains(t, out, "Error retrieving deployments") + must.StrContains(t, out, "Error retrieving deployments") ui.ErrorWriter.Reset() // Fails if monitor passed with json or tmpl flags for _, flag := range []string{"-json", "-t"} { code = cmd.Run([]string{"-monitor", flag, "12"}) - require.Equal(t, 1, code) + must.One(t, code) out = ui.ErrorWriter.String() - require.Contains(t, out, "The monitor flag cannot be used with the '-json' or '-t' flags") + must.StrContains(t, out, "The monitor flag cannot be used with the '-json' or '-t' flags") ui.ErrorWriter.Reset() } } func TestDeploymentStatusCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -67,13 +65,13 @@ func TestDeploymentStatusCommand_AutocompleteArgs(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() d := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, d)) + must.NoError(t, state.UpsertDeployment(1000, d)) prefix := d.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(d.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, d.ID, res[0]) } diff --git a/command/deployment_unblock_test.go b/command/deployment_unblock_test.go index b2b9110b5..96430fc71 100644 --- a/command/deployment_unblock_test.go +++ b/command/deployment_unblock_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestDeploymentUnblockCommand_Implements(t *testing.T) { @@ -44,7 +44,6 @@ func TestDeploymentUnblockCommand_Fails(t *testing.T) { func TestDeploymentUnblockCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -55,13 +54,13 @@ func TestDeploymentUnblockCommand_AutocompleteArgs(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() d := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, d)) + must.NoError(t, state.UpsertDeployment(1000, d)) prefix := d.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(d.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, d.ID, res[0]) } diff --git a/command/eval_delete_test.go b/command/eval_delete_test.go index c6e907207..9ada56f50 100644 --- a/command/eval_delete_test.go +++ b/command/eval_delete_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestEvalDeleteCommand_Run(t *testing.T) { @@ -36,30 +36,30 @@ func TestEvalDeleteCommand_Run(t *testing.T) { } // Test basic command input validation. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url})) - require.Contains(t, ui.ErrorWriter.String(), "Error validating command args and flags") + must.One(t, cmd.Run([]string{"-address=" + url})) + must.StrContains(t, ui.ErrorWriter.String(), "Error validating command args and flags") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Try running the command when the eval broker is not paused. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"})) - require.Contains(t, ui.ErrorWriter.String(), "Eval broker is not paused") + must.One(t, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"})) + must.StrContains(t, ui.ErrorWriter.String(), "Eval broker is not paused") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Paused the eval broker, then try deleting with an eval that // does not exist. schedulerConfig, _, err := client.Operator().SchedulerGetConfiguration(nil) - require.NoError(t, err) - require.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) + must.NoError(t, err) + must.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) schedulerConfig.SchedulerConfig.PauseEvalBroker = true _, _, err = client.Operator().SchedulerSetConfiguration(schedulerConfig.SchedulerConfig, nil) - require.NoError(t, err) - require.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) + must.NoError(t, err) + must.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"})) - require.Contains(t, ui.ErrorWriter.String(), "eval not found") + must.One(t, cmd.Run([]string{"-address=" + url, "fa3a8c37-eac3-00c7-3410-5ba3f7318fd8"})) + must.StrContains(t, ui.ErrorWriter.String(), "eval not found") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() }, @@ -82,13 +82,13 @@ func TestEvalDeleteCommand_Run(t *testing.T) { // Paused the eval broker. schedulerConfig, _, err := client.Operator().SchedulerGetConfiguration(nil) - require.NoError(t, err) - require.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) + must.NoError(t, err) + must.False(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) schedulerConfig.SchedulerConfig.PauseEvalBroker = true _, _, err = client.Operator().SchedulerSetConfiguration(schedulerConfig.SchedulerConfig, nil) - require.NoError(t, err) - require.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) + must.NoError(t, err) + must.True(t, schedulerConfig.SchedulerConfig.PauseEvalBroker) // With the eval broker paused, run a job register several times // to generate evals that will not be acted on. @@ -97,20 +97,20 @@ func TestEvalDeleteCommand_Run(t *testing.T) { evalIDs := make([]string, 3) for i := 0; i < 3; i++ { regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(t, err) - require.NotNil(t, regResp) - require.NotEmpty(t, regResp.EvalID) + must.NoError(t, err) + must.NotNil(t, regResp) + must.NotEq(t, "", regResp.EvalID) evalIDs[i] = regResp.EvalID } // Ensure we have three evaluations in state. evalList, _, err := client.Evaluations().List(nil) - require.NoError(t, err) - require.Len(t, evalList, 3) + must.NoError(t, err) + must.SliceLen(t, 3, evalList) // Attempted to delete one eval using the ID. - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, evalIDs[0]})) - require.Contains(t, ui.OutputWriter.String(), "Successfully deleted 1 evaluation") + must.Zero(t, cmd.Run([]string{"-address=" + url, evalIDs[0]})) + must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted 1 evaluation") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() @@ -122,15 +122,15 @@ func TestEvalDeleteCommand_Run(t *testing.T) { // Attempted to delete the remaining two evals using a filter // expression. expr := fmt.Sprintf("JobID == %q and Status == \"pending\" ", *testJob.Name) - require.Equal(t, 0, cmd.Run([]string{"-address=" + url, "-filter=" + expr})) - require.Contains(t, ui.OutputWriter.String(), "Successfully deleted 2 evaluations") + must.Zero(t, cmd.Run([]string{"-address=" + url, "-filter=" + expr})) + must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted 2 evaluations") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Ensure we have zero evaluations in state. evalList, _, err = client.Evaluations().List(nil) - require.NoError(t, err) - require.Len(t, evalList, 0) + must.NoError(t, err) + must.SliceEmpty(t, evalList) }, name: "successful", }, @@ -181,7 +181,7 @@ func TestEvalDeleteCommand_verifyArgsAndFlags(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { actualError := tc.inputEvalDeleteCommand.verifyArgsAndFlags(tc.inputArgs) - require.Equal(t, tc.expectedError, actualError) + must.Eq(t, tc.expectedError, actualError) }) } } diff --git a/command/eval_list_test.go b/command/eval_list_test.go index fbbf3a52e..a359aeac1 100644 --- a/command/eval_list_test.go +++ b/command/eval_list_test.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/hashicorp/nomad/ci" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestEvalList_ArgsWithoutPageToken(t *testing.T) { @@ -58,8 +58,6 @@ func TestEvalList_ArgsWithoutPageToken(t *testing.T) { for _, tc := range cases { args := strings.Split(tc.cli, " ") - assert.Equal(t, tc.expected, argsWithoutPageToken(args), - "for input: %s", tc.cli) + must.Eq(t, tc.expected, argsWithoutPageToken(args), must.Sprintf("for input: %s", tc.cli)) } - } diff --git a/command/eval_status_test.go b/command/eval_status_test.go index 9cab0b692..fa8f393c0 100644 --- a/command/eval_status_test.go +++ b/command/eval_status_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestEvalStatusCommand_Implements(t *testing.T) { @@ -68,7 +68,6 @@ func TestEvalStatusCommand_Fails(t *testing.T) { func TestEvalStatusCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -79,13 +78,13 @@ func TestEvalStatusCommand_AutocompleteArgs(t *testing.T) { // Create a fake eval state := srv.Agent.Server().State() e := mock.Eval() - assert.Nil(state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{e})) + must.NoError(t, state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{e})) prefix := e.ID[:5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(e.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, e.ID, res[0]) } diff --git a/command/event_test.go b/command/event_test.go index 40d2b96e8..6175e41e9 100644 --- a/command/event_test.go +++ b/command/event_test.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestEventCommand_BaseCommand(t *testing.T) { @@ -22,5 +22,5 @@ func TestEventCommand_BaseCommand(t *testing.T) { code := cmd.Run([]string{"-address=" + url}) - require.Equal(t, -18511, code) + must.Eq(t, -18511, code) } diff --git a/command/fmt_test.go b/command/fmt_test.go index 873d90d83..a2cf0f028 100644 --- a/command/fmt_test.go +++ b/command/fmt_test.go @@ -13,8 +13,6 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestFmtCommand(t *testing.T) { @@ -141,10 +139,10 @@ func TestFmtCommand_FromWorkingDirectory(t *testing.T) { tmpDir := fmtFixtureWriteDir(t) cwd, err := os.Getwd() - require.NoError(t, err) + must.NoError(t, err) err = os.Chdir(tmpDir) - require.NoError(t, err) + must.NoError(t, err) defer os.Chdir(cwd) tests := []struct { @@ -251,7 +249,7 @@ func TestFmtCommand_FileDoesNotExist(t *testing.T) { } code := cmd.Run([]string{"file/does/not/exist.hcl"}) - assert.Equal(t, 1, code) + must.One(t, code) } func TestFmtCommand_InvalidSyntax(t *testing.T) { @@ -266,14 +264,14 @@ func TestFmtCommand_InvalidSyntax(t *testing.T) { } code := cmd.Run([]string{"-"}) - assert.Equal(t, 1, code) + must.One(t, code) } func fmtFixtureWriteDir(t *testing.T) string { dir := t.TempDir() err := os.WriteFile(filepath.Join(dir, fmtFixture.filename), fmtFixture.input, 0644) - require.NoError(t, err) + must.NoError(t, err) return dir } diff --git a/command/helper_devices_test.go b/command/helper_devices_test.go index 217fdde2e..9c07ef2c3 100644 --- a/command/helper_devices_test.go +++ b/command/helper_devices_test.go @@ -9,18 +9,15 @@ import ( "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/helper/pointer" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestDeviceQualifiedID(t *testing.T) { ci.Parallel(t) - require := require.New(t) - - require.Equal("vendor/type/name[id]", deviceQualifiedID("vendor", "type", "name", "id")) - require.Equal("vendor/type[id]", deviceQualifiedID("vendor", "type", "", "id")) - require.Equal("vendor[id]", deviceQualifiedID("vendor", "", "", "id")) + must.Eq(t, "vendor/type/name[id]", deviceQualifiedID("vendor", "type", "name", "id")) + must.Eq(t, "vendor/type[id]", deviceQualifiedID("vendor", "type", "", "id")) + must.Eq(t, "vendor[id]", deviceQualifiedID("vendor", "", "", "id")) } func TestBuildDeviceStatsSummaryMap(t *testing.T) { @@ -77,7 +74,9 @@ func TestBuildDeviceStatsSummaryMap(t *testing.T) { }, } - require.EqualValues(t, expected, buildDeviceStatsSummaryMap(hostDeviceStats)) + must.Eq(t, expected, buildDeviceStatsSummaryMap(hostDeviceStats)) + // TODO(shoenig) figure out why the below does not compile + // must.MapContainsValues[map[string]*api.StatValue](t, expected, buildDeviceStatsSummaryMap(hostDeviceStats)) } func TestFormatDeviceStats(t *testing.T) { @@ -120,7 +119,7 @@ func TestFormatDeviceStats(t *testing.T) { result := formatDeviceStats("TestDeviceID", stat) // check that device id always appears first - require.Equal(t, "Device|TestDeviceID", result[0]) + must.Eq(t, "Device|TestDeviceID", result[0]) // check rest of values expected := []string{ @@ -134,7 +133,7 @@ func TestFormatDeviceStats(t *testing.T) { "nested2.k2|v2", } - require.Equal(t, expected, result) + must.Eq(t, expected, result) } func TestNodeStatusCommand_GetDeviceResourcesForNode(t *testing.T) { @@ -208,7 +207,7 @@ func TestNodeStatusCommand_GetDeviceResourcesForNode(t *testing.T) { "vendor2/type2[id2]|4", } - assert.Equal(t, expected, formattedDevices) + must.Eq(t, expected, formattedDevices) } func TestNodeStatusCommand_GetDeviceResources(t *testing.T) { @@ -258,7 +257,7 @@ func TestNodeStatusCommand_GetDeviceResources(t *testing.T) { "vendor2/type2[id2]|4", } - assert.Equal(t, expected, formattedDevices) + must.Eq(t, expected, formattedDevices) } func TestGetDeviceAttributes(t *testing.T) { ci.Parallel(t) @@ -286,5 +285,5 @@ func TestGetDeviceAttributes(t *testing.T) { "utilization|0.78 %", } - assert.Equal(t, expected, formattedDevices) + must.Eq(t, expected, formattedDevices) } diff --git a/command/helpers_test.go b/command/helpers_test.go index 25fb5b3b2..25402b924 100644 --- a/command/helpers_test.go +++ b/command/helpers_test.go @@ -23,7 +23,6 @@ import ( "github.com/kr/pretty" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestHelpers_FormatKV(t *testing.T) { @@ -315,22 +314,22 @@ func TestJobGetter_LocalFile_InvalidHCL2(t *testing.T) { for _, c := range cases { t.Run(c.name, func(t *testing.T) { fh, err := os.CreateTemp("", "nomad") - require.NoError(t, err) + must.NoError(t, err) defer os.Remove(fh.Name()) defer fh.Close() _, err = fh.WriteString(c.hcl) - require.NoError(t, err) + must.NoError(t, err) j := &JobGetter{} _, _, err = j.ApiJob(fh.Name()) - require.Error(t, err) + must.Error(t, err) exptMessage := "Failed to parse using HCL 2. Use the HCL 1" if c.expectHCL1Message { - require.Contains(t, err.Error(), exptMessage) + must.ErrorContains(t, err, exptMessage) } else { - require.NotContains(t, err.Error(), exptMessage) + must.StrNotContains(t, err.Error(), exptMessage) } }) } @@ -359,20 +358,20 @@ job "example" { expected := []string{"default-val", "from-cli", "from-varfile", "from-envvar"} hclf, err := os.CreateTemp("", "hcl") - require.NoError(t, err) + must.NoError(t, err) defer os.Remove(hclf.Name()) defer hclf.Close() _, err = hclf.WriteString(hcl) - require.NoError(t, err) + must.NoError(t, err) vf, err := os.CreateTemp("", "var.hcl") - require.NoError(t, err) + must.NoError(t, err) defer os.Remove(vf.Name()) defer vf.Close() _, err = vf.WriteString(fileVars + "\n") - require.NoError(t, err) + must.NoError(t, err) jg := &JobGetter{ Vars: cliArgs, @@ -381,10 +380,10 @@ job "example" { } _, j, err := jg.Get(hclf.Name()) - require.NoError(t, err) + must.NoError(t, err) - require.NotNil(t, j) - require.Equal(t, expected, j.Datacenters) + must.NotNil(t, j) + must.Eq(t, expected, j.Datacenters) } func TestJobGetter_HCL2_Variables_StrictFalse(t *testing.T) { @@ -414,20 +413,20 @@ unsedVar2 = "from-varfile" expected := []string{"default-val", "from-cli", "from-varfile", "from-envvar"} hclf, err := os.CreateTemp("", "hcl") - require.NoError(t, err) + must.NoError(t, err) defer os.Remove(hclf.Name()) defer hclf.Close() _, err = hclf.WriteString(hcl) - require.NoError(t, err) + must.NoError(t, err) vf, err := os.CreateTemp("", "var.hcl") - require.NoError(t, err) + must.NoError(t, err) defer os.Remove(vf.Name()) defer vf.Close() _, err = vf.WriteString(fileVars + "\n") - require.NoError(t, err) + must.NoError(t, err) jg := &JobGetter{ Vars: cliArgs, @@ -436,10 +435,9 @@ unsedVar2 = "from-varfile" } _, j, err := jg.Get(hclf.Name()) - require.NoError(t, err) - - require.NotNil(t, j) - require.Equal(t, expected, j.Datacenters) + must.NoError(t, err) + must.NotNil(t, j) + must.Eq(t, expected, j.Datacenters) } // Test StructJob with jobfile from HTTP Server @@ -535,9 +533,9 @@ func TestJobGetter_Validate(t *testing.T) { switch tc.errContains { case "": - require.NoError(t, err) + must.NoError(t, err) default: - require.ErrorContains(t, err, tc.errContains) + must.ErrorContains(t, err, tc.errContains) } }) @@ -610,27 +608,27 @@ func TestUiErrorWriter(t *testing.T) { partialAcc := "" for _, in := range inputs { n, err := w.Write([]byte(in)) - require.NoError(t, err) - require.Equal(t, len(in), n) + must.NoError(t, err) + must.Eq(t, len(in), n) // assert that writer emits partial result until last new line partialAcc += strings.ReplaceAll(in, "\r\n", "\n") lastNL := strings.LastIndex(partialAcc, "\n") - require.Equal(t, partialAcc[:lastNL+1], errBuf.String()) + must.Eq(t, partialAcc[:lastNL+1], errBuf.String()) } - require.Empty(t, outBuf.String()) + must.Eq(t, "", outBuf.String()) // note that the \r\n got replaced by \n expectedErr := "some line\nmultiple\nlines\nhere with followup\nand more lines without new line until here\n" - require.Equal(t, expectedErr, errBuf.String()) + must.Eq(t, expectedErr, errBuf.String()) // close emits the final line err := w.Close() - require.NoError(t, err) + must.NoError(t, err) expectedErr += "and thensome more\n" - require.Equal(t, expectedErr, errBuf.String()) + must.Eq(t, expectedErr, errBuf.String()) } func Test_extractVarFiles(t *testing.T) { diff --git a/command/integration_test.go b/command/integration_test.go index 482e6a1a2..bd3d77a31 100644 --- a/command/integration_test.go +++ b/command/integration_test.go @@ -14,7 +14,7 @@ import ( "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/client/testutil" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestIntegration_Command_NomadInit(t *testing.T) { @@ -43,7 +43,6 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) { ci.Parallel(t) testutil.DockerCompatible(t) - assert := assert.New(t) tmpDir := t.TempDir() // Start in dev mode so we get a node registration @@ -53,7 +52,7 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) { { cmd := exec.Command("nomad", "job", "init", "-short") cmd.Dir = tmpDir - assert.Nil(cmd.Run()) + must.NoError(t, cmd.Run()) } { @@ -71,16 +70,16 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) { cmd.Dir = tmpDir cmd.Env = []string{fmt.Sprintf("NOMAD_ADDR=%s", url)} out, err := cmd.Output() - assert.Nil(err) + must.NoError(t, err) var req api.JobRegisterRequest dec := json.NewDecoder(bytes.NewReader(out)) - assert.Nil(dec.Decode(&req)) + must.NoError(t, dec.Decode(&req)) var resp api.JobRegisterResponse _, err = client.Raw().Write("/v1/jobs", req, &resp, nil) - assert.Nil(err) - assert.NotZero(resp.EvalID) + must.NoError(t, err) + must.NotEq(t, "", resp.EvalID) } { @@ -88,6 +87,6 @@ func TestIntegration_Command_RoundTripJob(t *testing.T) { cmd.Dir = tmpDir cmd.Env = []string{fmt.Sprintf("NOMAD_ADDR=%s", url)} _, err := cmd.Output() - assert.Nil(err) + must.NoError(t, err) } } diff --git a/command/job_allocs_test.go b/command/job_allocs_test.go index c4d8117a3..4f51eec6f 100644 --- a/command/job_allocs_test.go +++ b/command/job_allocs_test.go @@ -14,7 +14,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestJobAllocsCommand_Implements(t *testing.T) { @@ -33,24 +32,24 @@ func TestJobAllocsCommand_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) outerr := ui.ErrorWriter.String() - require.Equalf(t, 1, code, "expected exit code 1, got: %d", code) - require.Containsf(t, outerr, commandErrorText(cmd), "expected help output, got: %s", outerr) + must.One(t, code) + must.StrContains(t, outerr, commandErrorText(cmd)) ui.ErrorWriter.Reset() // Bad address code = cmd.Run([]string{"-address=nope", "foo"}) outerr = ui.ErrorWriter.String() - require.Equalf(t, 1, code, "expected exit code 1, got: %d", code) - require.Containsf(t, outerr, "Error querying job prefix", "expected failed query error, got: %s", outerr) + must.One(t, code) + must.StrContains(t, outerr, "Error querying job prefix") ui.ErrorWriter.Reset() // Bad job name code = cmd.Run([]string{"-address=" + url, "foo"}) outerr = ui.ErrorWriter.String() - require.Equalf(t, 1, code, "expected exit 1, got: %d", code) - require.Containsf(t, outerr, "No job(s) with prefix or ID \"foo\" found", "expected no job found, got: %s", outerr) + must.One(t, code) + must.StrContains(t, outerr, "No job(s) with prefix or ID \"foo\" found") ui.ErrorWriter.Reset() } @@ -66,13 +65,13 @@ func TestJobAllocsCommand_Run(t *testing.T) { // Create a job without an allocation job := mock.Job() state := srv.Agent.Server().State() - require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) // Should display no match if the job doesn't have allocations code := cmd.Run([]string{"-address=" + url, job.ID}) out := ui.OutputWriter.String() - require.Equalf(t, 0, code, "expected exit 0, got: %d", code) - require.Containsf(t, out, "No allocations placed", "expected no allocations placed, got: %s", out) + must.Zero(t, code) + must.StrContains(t, out, "No allocations placed") ui.OutputWriter.Reset() @@ -84,15 +83,15 @@ func TestJobAllocsCommand_Run(t *testing.T) { a.Metrics = &structs.AllocMetric{} a.DesiredStatus = structs.AllocDesiredStatusRun a.ClientStatus = structs.AllocClientStatusRunning - require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a})) + must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a})) // Should now display the alloc code = cmd.Run([]string{"-address=" + url, "-verbose", job.ID}) out = ui.OutputWriter.String() outerr := ui.ErrorWriter.String() - require.Equalf(t, 0, code, "expected exit 0, got: %d", code) - require.Emptyf(t, outerr, "expected no error output, got: \n\n%s", outerr) - require.Containsf(t, out, a.ID, "expected alloc output, got: %s", out) + must.Zero(t, code) + must.Eq(t, "", outerr) + must.StrContains(t, out, a.ID) ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -109,7 +108,7 @@ func TestJobAllocsCommand_Template(t *testing.T) { // Create a job job := mock.Job() state := srv.Agent.Server().State() - require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) // Inject a running allocation a := mock.Alloc() @@ -119,7 +118,7 @@ func TestJobAllocsCommand_Template(t *testing.T) { a.Metrics = &structs.AllocMetric{} a.DesiredStatus = structs.AllocDesiredStatusRun a.ClientStatus = structs.AllocClientStatusRunning - require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a})) + must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 200, []*structs.Allocation{a})) // Inject a pending allocation b := mock.Alloc() @@ -129,16 +128,16 @@ func TestJobAllocsCommand_Template(t *testing.T) { b.Metrics = &structs.AllocMetric{} b.DesiredStatus = structs.AllocDesiredStatusRun b.ClientStatus = structs.AllocClientStatusPending - require.Nil(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 300, []*structs.Allocation{b})) + must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 300, []*structs.Allocation{b})) // Should display an AllocacitonListStub object code := cmd.Run([]string{"-address=" + url, "-t", "'{{printf \"%#+v\" .}}'", job.ID}) out := ui.OutputWriter.String() outerr := ui.ErrorWriter.String() - require.Equalf(t, 0, code, "expected exit 0, got: %d", code) - require.Emptyf(t, outerr, "expected no error output, got: \n\n%s", outerr) - require.Containsf(t, out, "api.AllocationListStub", "expected alloc output, got: %s", out) + must.Zero(t, code) + must.Eq(t, "", outerr) + must.StrContains(t, out, "api.AllocationListStub") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -148,10 +147,10 @@ func TestJobAllocsCommand_Template(t *testing.T) { out = ui.OutputWriter.String() outerr = ui.ErrorWriter.String() - require.Equalf(t, 0, code, "expected exit 0, got: %d", code) - require.Emptyf(t, outerr, "expected no error output, got: \n\n%s", outerr) - require.Containsf(t, out, a.ID, "expected ID of alloc a, got: %s", out) - require.NotContainsf(t, out, b.ID, "should not contain ID of alloc b, got: %s", out) + must.Zero(t, code) + must.Eq(t, "", outerr) + must.StrContains(t, out, a.ID) + must.StrNotContains(t, out, b.ID) ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -168,15 +167,15 @@ func TestJobAllocsCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobAllocsCommand_ACL(t *testing.T) { diff --git a/command/job_deployments_test.go b/command/job_deployments_test.go index 21148dc3e..ab1f43366 100644 --- a/command/job_deployments_test.go +++ b/command/job_deployments_test.go @@ -15,7 +15,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" ) func TestJobDeploymentsCommand_Implements(t *testing.T) { @@ -49,7 +48,6 @@ func TestJobDeploymentsCommand_Fails(t *testing.T) { func TestJobDeploymentsCommand_Run(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -64,7 +62,7 @@ func TestJobDeploymentsCommand_Run(t *testing.T) { // Create a job without a deployment job := mock.Job() state := srv.Agent.Server().State() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) // Should display no match if the job doesn't have deployments if code := cmd.Run([]string{"-address=" + url, job.ID}); code != 0 { @@ -79,7 +77,7 @@ func TestJobDeploymentsCommand_Run(t *testing.T) { d := mock.Deployment() d.JobID = job.ID d.JobCreateIndex = job.CreateIndex - assert.Nil(state.UpsertDeployment(200, d)) + must.NoError(t, state.UpsertDeployment(200, d)) // Should now display the deployment if code := cmd.Run([]string{"-address=" + url, "-verbose", job.ID}); code != 0 { @@ -93,7 +91,7 @@ func TestJobDeploymentsCommand_Run(t *testing.T) { func TestJobDeploymentsCommand_Run_Latest(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) + srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -108,7 +106,7 @@ func TestJobDeploymentsCommand_Run_Latest(t *testing.T) { // Create a job without a deployment job := mock.Job() state := srv.Agent.Server().State() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 100, nil, job)) // Should display no match if the job doesn't have deployments if code := cmd.Run([]string{"-address=" + url, "-latest", job.ID}); code != 0 { @@ -123,7 +121,7 @@ func TestJobDeploymentsCommand_Run_Latest(t *testing.T) { d := mock.Deployment() d.JobID = job.ID d.JobCreateIndex = job.CreateIndex - assert.Nil(state.UpsertDeployment(200, d)) + must.NoError(t, state.UpsertDeployment(200, d)) // Should now display the deployment if code := cmd.Run([]string{"-address=" + url, "-verbose", "-latest", job.ID}); code != 0 { @@ -137,7 +135,6 @@ func TestJobDeploymentsCommand_Run_Latest(t *testing.T) { func TestJobDeploymentsCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -148,15 +145,15 @@ func TestJobDeploymentsCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobDeploymentsCommand_ACL(t *testing.T) { diff --git a/command/job_dispatch_test.go b/command/job_dispatch_test.go index bbd4d55ad..d5e65796a 100644 --- a/command/job_dispatch_test.go +++ b/command/job_dispatch_test.go @@ -15,7 +15,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestJobDispatchCommand_Implements(t *testing.T) { @@ -67,7 +66,7 @@ func TestJobDispatchCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} @@ -75,12 +74,12 @@ func TestJobDispatchCommand_AutocompleteArgs(t *testing.T) { // No parameterized jobs, should be 0 results res := predictor.Predict(args) - require.Equal(t, 0, len(res)) + must.SliceEmpty(t, res) // Create a fake parameterized job j1 := mock.Job() j1.ParameterizedJob = &structs.ParameterizedJobConfig{} - require.Nil(t, state.UpsertJob(structs.MsgTypeTestSetup, 2000, nil, j1)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 2000, nil, j1)) prefix = j1.ID[:len(j1.ID)-5] args = complete.Args{Last: prefix} @@ -88,8 +87,8 @@ func TestJobDispatchCommand_AutocompleteArgs(t *testing.T) { // Should return 1 parameterized job res = predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, j1.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j1.ID, res[0]) } func TestJobDispatchCommand_ACL(t *testing.T) { diff --git a/command/job_eval_test.go b/command/job_eval_test.go index d16e1fc12..fd081b9ee 100644 --- a/command/job_eval_test.go +++ b/command/job_eval_test.go @@ -17,8 +17,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestJobEvalCommand_Implements(t *testing.T) { @@ -74,17 +72,16 @@ func TestJobEvalCommand_Run(t *testing.T) { ui := cli.NewMockUi() cmd := &JobEvalCommand{Meta: Meta{Ui: ui}} - require := require.New(t) state := srv.Agent.Server().State() // Create a job job := mock.Job() err := state.UpsertJob(structs.MsgTypeTestSetup, 11, nil, job) - require.Nil(err) + must.NoError(t, err) job, err = state.JobByID(nil, structs.DefaultNamespace, job.ID) - require.Nil(err) + must.NoError(t, err) // Create a failed alloc for the job alloc := mock.Alloc() @@ -94,7 +91,7 @@ func TestJobEvalCommand_Run(t *testing.T) { alloc.Namespace = job.Namespace alloc.ClientStatus = structs.AllocClientStatusFailed err = state.UpsertAllocs(structs.MsgTypeTestSetup, 12, []*structs.Allocation{alloc}) - require.Nil(err) + must.NoError(t, err) if code := cmd.Run([]string{"-address=" + url, "-force-reschedule", "-detach", job.ID}); code != 0 { t.Fatalf("expected exit 0, got: %d", code) @@ -102,15 +99,14 @@ func TestJobEvalCommand_Run(t *testing.T) { // Lookup alloc again alloc, err = state.AllocByID(nil, alloc.ID) - require.NotNil(alloc) - require.Nil(err) - require.True(*alloc.DesiredTransition.ForceReschedule) + must.NotNil(t, alloc) + must.Nil(t, err) + must.True(t, *alloc.DesiredTransition.ForceReschedule) } func TestJobEvalCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -121,15 +117,15 @@ func TestJobEvalCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobEvalCommand_ACL(t *testing.T) { diff --git a/command/job_history_test.go b/command/job_history_test.go index 5a4cf64bc..d4be11e87 100644 --- a/command/job_history_test.go +++ b/command/job_history_test.go @@ -15,7 +15,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" ) func TestJobHistoryCommand_Implements(t *testing.T) { @@ -48,7 +47,6 @@ func TestJobHistoryCommand_Fails(t *testing.T) { func TestJobHistoryCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -59,15 +57,15 @@ func TestJobHistoryCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobHistoryCommand_ACL(t *testing.T) { diff --git a/command/job_init_test.go b/command/job_init_test.go index e40813e7d..556d66539 100644 --- a/command/job_init_test.go +++ b/command/job_init_test.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/nomad/command/asset" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestInitCommand_Implements(t *testing.T) { @@ -64,12 +63,12 @@ func TestInitCommand_Run(t *testing.T) { // Works with -short flag os.Remove(DefaultInitName) if code := cmd.Run([]string{"-short"}); code != 0 { - require.Zero(t, code, "unexpected exit code: %d", code) + must.Zero(t, code) } content, err = os.ReadFile(DefaultInitName) - require.NoError(t, err) + must.NoError(t, err) shortJob := asset.JobExampleShort - require.Equal(t, string(content), string(shortJob)) + must.Eq(t, string(content), string(shortJob)) // Fails if the file exists if code := cmd.Run([]string{}); code != 1 { @@ -204,12 +203,12 @@ func TestInitCommand_customFilename(t *testing.T) { // Works with -short flag os.Remove(filename) if code := cmd.Run([]string{"-short", filename}); code != 0 { - require.Zero(t, code, "unexpected exit code: %d", code) + must.Zero(t, code) } content, err = os.ReadFile(filename) - require.NoError(t, err) + must.NoError(t, err) shortJob := asset.JobExampleShort - require.Equal(t, string(content), string(shortJob)) + must.Eq(t, string(content), string(shortJob)) // Fails if the file exists if code := cmd.Run([]string{filename}); code != 1 { diff --git a/command/job_inspect_test.go b/command/job_inspect_test.go index c86f733c4..9f33817a8 100644 --- a/command/job_inspect_test.go +++ b/command/job_inspect_test.go @@ -15,7 +15,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" ) func TestInspectCommand_Implements(t *testing.T) { @@ -69,7 +68,6 @@ func TestInspectCommand_Fails(t *testing.T) { func TestInspectCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -79,15 +77,15 @@ func TestInspectCommand_AutocompleteArgs(t *testing.T) { state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobInspectCommand_ACL(t *testing.T) { diff --git a/command/job_periodic_force_test.go b/command/job_periodic_force_test.go index 8ce8a867b..730240ed4 100644 --- a/command/job_periodic_force_test.go +++ b/command/job_periodic_force_test.go @@ -17,7 +17,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestJobPeriodicForceCommand_Implements(t *testing.T) { @@ -32,15 +31,15 @@ func TestJobPeriodicForceCommand_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, code, 1, "expected error") + must.One(t, code) out := ui.ErrorWriter.String() - require.Contains(t, out, commandErrorText(cmd), "expected help output") + must.StrContains(t, out, commandErrorText(cmd)) ui.ErrorWriter.Reset() code = cmd.Run([]string{"-address=nope", "12"}) - require.Equal(t, code, 1, "expected error") + must.One(t, code) out = ui.ErrorWriter.String() - require.Contains(t, out, "Error querying job prefix", "expected force error") + must.StrContains(t, out, "Error querying job prefix") } func TestJobPeriodicForceCommand_AutocompleteArgs(t *testing.T) { @@ -55,12 +54,12 @@ func TestJobPeriodicForceCommand_AutocompleteArgs(t *testing.T) { // Create a fake job, not periodic state := srv.Agent.Server().State() j := mock.Job() - require.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) predictor := cmd.AutocompleteArgs() res := predictor.Predict(complete.Args{Last: j.ID[:len(j.ID)-5]}) - require.Empty(t, res) + must.SliceEmpty(t, res) // Create another fake job, periodic state = srv.Agent.Server().State() @@ -72,13 +71,13 @@ func TestJobPeriodicForceCommand_AutocompleteArgs(t *testing.T) { ProhibitOverlap: true, TimeZone: "test zone", } - require.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j2)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j2)) res = predictor.Predict(complete.Args{Last: j2.ID[:len(j.ID)-5]}) - require.Equal(t, []string{j2.ID}, res) + must.Eq(t, []string{j2.ID}, res) res = predictor.Predict(complete.Args{}) - require.Equal(t, []string{j2.ID}, res) + must.Eq(t, []string{j2.ID}, res) } func TestJobPeriodicForceCommand_NonPeriodicJob(t *testing.T) { @@ -98,7 +97,7 @@ func TestJobPeriodicForceCommand_NonPeriodicJob(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) // Register a job @@ -108,14 +107,14 @@ func TestJobPeriodicForceCommand_NonPeriodicJob(t *testing.T) { cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}} resp, _, err := client.Jobs().Register(j, nil) - require.NoError(t, err) + must.NoError(t, err) code := waitForSuccess(ui, client, fullId, t, resp.EvalID) - require.Equal(t, 0, code) + must.Zero(t, code) code = cmd.Run([]string{"-address=" + url, "job_not_periodic"}) - require.Equal(t, 1, code, "expected exit code") + must.One(t, code) out := ui.ErrorWriter.String() - require.Contains(t, out, "No periodic job(s)", "non-periodic error message") + must.StrContains(t, out, "No periodic job(s)") } func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) { @@ -135,7 +134,7 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) // Register a job @@ -151,13 +150,13 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForceDetach(t *testing.T) { cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}} _, _, err := client.Jobs().Register(j, nil) - require.NoError(t, err) + must.NoError(t, err) code := cmd.Run([]string{"-address=" + url, "-detach", "job1_is_periodic"}) - require.Equal(t, 0, code, "expected no error code") + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(t, out, "Force periodic successful") - require.Contains(t, out, "Evaluation ID:") + must.StrContains(t, out, "Force periodic successful") + must.StrContains(t, out, "Evaluation ID:") } func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) { @@ -177,7 +176,7 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) // Register a job @@ -193,13 +192,13 @@ func TestJobPeriodicForceCommand_SuccessfulPeriodicForce(t *testing.T) { cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}} _, _, err := client.Jobs().Register(j, nil) - require.NoError(t, err) + must.NoError(t, err) code := cmd.Run([]string{"-address=" + url, "job2_is_periodic"}) - require.Equal(t, 0, code, "expected no error code") + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(t, out, "Monitoring evaluation") - require.Contains(t, out, "finished with status \"complete\"") + must.StrContains(t, out, "Monitoring evaluation") + must.StrContains(t, out, "finished with status \"complete\"") } func TestJobPeriodicForceCommand_SuccessfulIfJobIDEqualsPrefix(t *testing.T) { @@ -219,7 +218,7 @@ func TestJobPeriodicForceCommand_SuccessfulIfJobIDEqualsPrefix(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) j1 := testJob("periodic-prefix") @@ -241,15 +240,15 @@ func TestJobPeriodicForceCommand_SuccessfulIfJobIDEqualsPrefix(t *testing.T) { cmd := &JobPeriodicForceCommand{Meta: Meta{Ui: ui, flagAddress: url}} _, _, err := client.Jobs().Register(j1, nil) - require.NoError(t, err) + must.NoError(t, err) _, _, err = client.Jobs().Register(j2, nil) - require.NoError(t, err) + must.NoError(t, err) code := cmd.Run([]string{"-address=" + url, "periodic-prefix"}) - require.Equal(t, 0, code, "expected no error code") + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(t, out, "Monitoring evaluation") - require.Contains(t, out, "finished with status \"complete\"") + must.StrContains(t, out, "Monitoring evaluation") + must.StrContains(t, out, "finished with status \"complete\"") } func TestJobPeriodicForceCommand_ACL(t *testing.T) { diff --git a/command/job_plan_test.go b/command/job_plan_test.go index 343768b9b..81f3bc315 100644 --- a/command/job_plan_test.go +++ b/command/job_plan_test.go @@ -15,7 +15,6 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestPlanCommand_Implements(t *testing.T) { @@ -132,7 +131,7 @@ func TestPlanCommand_hcl1_hcl2_strict(t *testing.T) { }) // Exit code 1 here means that an alloc will be created, which is // expected. - require.Equal(t, 1, got) + must.One(t, got) }) } @@ -199,7 +198,7 @@ func TestPlanCommand_From_Files(t *testing.T) { cmd := &JobPlanCommand{Meta: Meta{Ui: ui}} args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-basic.nomad"} code := cmd.Run(args) - require.Equal(t, 1, code) // no client running, fail to place + must.One(t, code) // no client running, fail to place must.StrContains(t, ui.OutputWriter.String(), "WARNING: Failed to place all allocations.") }) @@ -253,7 +252,6 @@ func TestPlanCommand_Preemptions(t *testing.T) { ci.Parallel(t) ui := cli.NewMockUi() cmd := &JobPlanCommand{Meta: Meta{Ui: ui}} - require := require.New(t) // Only one preempted alloc resp1 := &api.JobPlanResponse{ @@ -271,8 +269,8 @@ func TestPlanCommand_Preemptions(t *testing.T) { } cmd.addPreemptions(resp1) out := ui.OutputWriter.String() - require.Contains(out, "Alloc ID") - require.Contains(out, "alloc1") + must.StrContains(t, out, "Alloc ID") + must.StrContains(t, out, "alloc1") // Less than 10 unique job ids var preemptedAllocs []*api.AllocationListStub @@ -296,8 +294,8 @@ func TestPlanCommand_Preemptions(t *testing.T) { ui.OutputWriter.Reset() cmd.addPreemptions(resp2) out = ui.OutputWriter.String() - require.Contains(out, "Job ID") - require.Contains(out, "Namespace") + must.StrContains(t, out, "Job ID") + must.StrContains(t, out, "Namespace") // More than 10 unique job IDs preemptedAllocs = make([]*api.AllocationListStub, 0) @@ -327,9 +325,9 @@ func TestPlanCommand_Preemptions(t *testing.T) { ui.OutputWriter.Reset() cmd.addPreemptions(resp3) out = ui.OutputWriter.String() - require.Contains(out, "Job Type") - require.Contains(out, "batch") - require.Contains(out, "service") + must.StrContains(t, out, "Job Type") + must.StrContains(t, out, "batch") + must.StrContains(t, out, "service") } func TestPlanCommand_JSON(t *testing.T) { @@ -344,6 +342,6 @@ func TestPlanCommand_JSON(t *testing.T) { "testdata/example-short.json", } code := cmd.Run(args) - require.Equal(t, 255, code) - require.Contains(t, ui.ErrorWriter.String(), "Error during plan: Put") + must.Eq(t, 255, code) + must.StrContains(t, ui.ErrorWriter.String(), "Error during plan: Put") } diff --git a/command/job_promote_test.go b/command/job_promote_test.go index f3d676498..299bb3704 100644 --- a/command/job_promote_test.go +++ b/command/job_promote_test.go @@ -10,13 +10,11 @@ import ( "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/command/agent" - "github.com/hashicorp/nomad/nomad/structs" - "github.com/shoenig/test/must" - "github.com/hashicorp/nomad/nomad/mock" + "github.com/hashicorp/nomad/nomad/structs" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestJobPromoteCommand_Implements(t *testing.T) { @@ -49,7 +47,6 @@ func TestJobPromoteCommand_Fails(t *testing.T) { func TestJobPromoteCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -60,15 +57,15 @@ func TestJobPromoteCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobPromoteCommand_ACL(t *testing.T) { diff --git a/command/job_restart_test.go b/command/job_restart_test.go index 1af1c76f6..4104fd87c 100644 --- a/command/job_restart_test.go +++ b/command/job_restart_test.go @@ -25,7 +25,6 @@ import ( "github.com/hashicorp/nomad/helper/pointer" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/shoenig/test/must" "github.com/shoenig/test/wait" ) diff --git a/command/job_revert_test.go b/command/job_revert_test.go index 0f9472d27..b55c48373 100644 --- a/command/job_revert_test.go +++ b/command/job_revert_test.go @@ -15,7 +15,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" ) func TestJobRevertCommand_Implements(t *testing.T) { @@ -48,7 +47,6 @@ func TestJobRevertCommand_Fails(t *testing.T) { func TestJobRevertCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -59,15 +57,15 @@ func TestJobRevertCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobRevertCommand_ACL(t *testing.T) { diff --git a/command/job_run_test.go b/command/job_run_test.go index 985fefd4e..cdb056831 100644 --- a/command/job_run_test.go +++ b/command/job_run_test.go @@ -15,7 +15,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) var _ cli.Command = (*JobRunCommand)(nil) @@ -70,7 +70,7 @@ func TestRunCommand_hcl1_hcl2_strict(t *testing.T) { "-detach", "asset/example-short.nomad.hcl", }) - require.Equal(t, 0, got, ui.ErrorWriter.String()) + must.Zero(t, got) }) } @@ -261,13 +261,13 @@ func TestRunCommand_JSON(t *testing.T) { // First convert HCL -> JSON with -output stdout, stderr, code := run("-output", "asset/example-short.nomad.hcl") - require.Zero(t, code, stderr) - require.Empty(t, stderr) - require.NotEmpty(t, stdout) + must.Zero(t, code) + must.Eq(t, "", stderr) + must.NotEq(t, "", stdout) t.Logf("run -output==> %s...", stdout[:12]) jsonFile := filepath.Join(t.TempDir(), "redis.json") - require.NoError(t, os.WriteFile(jsonFile, []byte(stdout), 0o640)) + must.NoError(t, os.WriteFile(jsonFile, []byte(stdout), 0o640)) // Wait for agent to start and get its address addr := "" @@ -279,23 +279,23 @@ func TestRunCommand_JSON(t *testing.T) { // Submit JSON stdout, stderr, code = run("-detach", "-address", addr, "-json", jsonFile) - require.Zero(t, code, stderr) - require.Empty(t, stderr) + must.Zero(t, code) + must.Eq(t, "", stderr) // Read the JSON from the API as it omits the Job envelope and // therefore differs from -output resp, err := http.Get(addr + "/v1/job/example") - require.NoError(t, err) + must.NoError(t, err) buf, err := io.ReadAll(resp.Body) - require.NoError(t, err) - require.NoError(t, resp.Body.Close()) - require.NotEmpty(t, buf) + must.NoError(t, err) + must.NoError(t, resp.Body.Close()) + must.SliceNotEmpty(t, buf) t.Logf("/v1/job/example==> %s...", string(buf[:12])) - require.NoError(t, os.WriteFile(jsonFile, buf, 0o640)) + must.NoError(t, os.WriteFile(jsonFile, buf, 0o640)) // Submit JSON stdout, stderr, code = run("-detach", "-address", addr, "-json", jsonFile) - require.Zerof(t, code, "stderr: %s\njson: %s\n", stderr, string(buf)) - require.Empty(t, stderr) - require.NotEmpty(t, stdout) + must.Zero(t, code) + must.Eq(t, "", stderr) + must.NotEq(t, "", stdout) } diff --git a/command/job_status_test.go b/command/job_status_test.go index 7441ff066..90800a527 100644 --- a/command/job_status_test.go +++ b/command/job_status_test.go @@ -19,8 +19,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestJobStatusCommand_Implements(t *testing.T) { @@ -166,7 +164,7 @@ func TestJobStatusCommand_Run(t *testing.T) { nodeNameHeaderStr := "Node Name" nodeNameHeaderIndex := strings.Index(allocationsTableStr, nodeNameHeaderStr) nodeNameRegexpStr := fmt.Sprintf(`.*%s.*\n.{%d}%s`, nodeNameHeaderStr, nodeNameHeaderIndex, regexp.QuoteMeta(nodeName)) - require.Regexp(t, regexp.MustCompile(nodeNameRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(nodeNameRegexpStr), out) ui.ErrorWriter.Reset() ui.OutputWriter.Reset() @@ -254,7 +252,6 @@ func TestJobStatusCommand_Fails(t *testing.T) { func TestJobStatusCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -265,20 +262,19 @@ func TestJobStatusCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) prefix := j.ID[:len(j.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(j.ID, res[0]) + must.SliceLen(t, 1, res) + must.Eq(t, j.ID, res[0]) } func TestJobStatusCommand_WithAccessPolicy(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) config := func(c *agent.Config) { c.ACL.Enabled = true @@ -289,7 +285,7 @@ func TestJobStatusCommand_WithAccessPolicy(t *testing.T) { // Bootstrap an initial ACL token token := srv.RootToken - assert.NotNil(token, "failed to bootstrap ACL token") + must.NotNil(t, token) // Wait for client ready client.SetSecretID(token.SecretID) @@ -320,22 +316,22 @@ func TestJobStatusCommand_WithAccessPolicy(t *testing.T) { // registering a job without a token fails client.SetSecretID(invalidToken.SecretID) resp, _, err := client.Jobs().Register(j, nil) - assert.NotNil(err) + must.NotNil(t, err) // registering a job with a valid token succeeds client.SetSecretID(token.SecretID) resp, _, err = client.Jobs().Register(j, nil) - assert.Nil(err) + must.NoError(t, err) code := waitForSuccess(ui, client, fullId, t, resp.EvalID) - assert.Equal(0, code) + must.Zero(t, code) // Request Job List without providing a valid token code = cmd.Run([]string{"-address=" + url, "-token=" + invalidToken.SecretID, "-short"}) - assert.Equal(1, code) + must.One(t, code) // Request Job List with a valid token code = cmd.Run([]string{"-address=" + url, "-token=" + token.SecretID, "-short"}) - assert.Equal(0, code) + must.Zero(t, code) out := ui.OutputWriter.String() if !strings.Contains(out, *j.ID) { @@ -367,16 +363,15 @@ func TestJobStatusCommand_RescheduleEvals(t *testing.T) { ui := cli.NewMockUi() cmd := &JobStatusCommand{Meta: Meta{Ui: ui, flagAddress: url}} - require := require.New(t) state := srv.Agent.Server().State() // Create state store objects for job, alloc and followup eval with a future WaitUntil value j := mock.Job() - require.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 900, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 900, nil, j)) e := mock.Eval() e.WaitUntil = time.Now().Add(1 * time.Hour) - require.Nil(state.UpsertEvals(structs.MsgTypeTestSetup, 902, []*structs.Evaluation{e})) + must.NoError(t, state.UpsertEvals(structs.MsgTypeTestSetup, 902, []*structs.Evaluation{e})) a := mock.Alloc() a.Job = j a.JobID = j.ID @@ -385,15 +380,15 @@ func TestJobStatusCommand_RescheduleEvals(t *testing.T) { a.Metrics = &structs.AllocMetric{} a.DesiredStatus = structs.AllocDesiredStatusRun a.ClientStatus = structs.AllocClientStatusRunning - require.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a})) + must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{a})) // Query jobs with prefix match if code := cmd.Run([]string{"-address=" + url, j.ID}); code != 0 { t.Fatalf("expected exit 0, got: %d", code) } out := ui.OutputWriter.String() - require.Contains(out, "Future Rescheduling Attempts") - require.Contains(out, e.ID[:8]) + must.StrContains(t, out, "Future Rescheduling Attempts") + must.StrContains(t, out, e.ID[:8]) } func TestJobStatusCommand_ACL(t *testing.T) { diff --git a/command/job_validate_test.go b/command/job_validate_test.go index c09b9e8f5..6adc2ae30 100644 --- a/command/job_validate_test.go +++ b/command/job_validate_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/helper/pointer" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestValidateCommand_Implements(t *testing.T) { @@ -40,7 +40,7 @@ func TestValidateCommand_Files(t *testing.T) { cmd := &JobValidateCommand{Meta: Meta{Ui: ui, flagAddress: "http://" + s.HTTPAddr}} args := []string{"testdata/example-basic.nomad"} code := cmd.Run(args) - require.Equal(t, 0, code) + must.Zero(t, code) }) t.Run("vault no token", func(t *testing.T) { @@ -48,8 +48,8 @@ func TestValidateCommand_Files(t *testing.T) { cmd := &JobValidateCommand{Meta: Meta{Ui: ui}} args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-vault.nomad"} code := cmd.Run(args) - require.Contains(t, ui.ErrorWriter.String(), "* Vault used in the job but missing Vault token") - require.Equal(t, 1, code) + must.StrContains(t, ui.ErrorWriter.String(), "* Vault used in the job but missing Vault token") + must.One(t, code) }) t.Run("vault bad token via flag", func(t *testing.T) { @@ -57,8 +57,8 @@ func TestValidateCommand_Files(t *testing.T) { cmd := &JobValidateCommand{Meta: Meta{Ui: ui}} args := []string{"-address", "http://" + s.HTTPAddr, "-vault-token=abc123", "testdata/example-vault.nomad"} code := cmd.Run(args) - require.Contains(t, ui.ErrorWriter.String(), "* bad token") - require.Equal(t, 1, code) + must.StrContains(t, ui.ErrorWriter.String(), "* bad token") + must.One(t, code) }) t.Run("vault token bad via env", func(t *testing.T) { @@ -67,8 +67,8 @@ func TestValidateCommand_Files(t *testing.T) { cmd := &JobValidateCommand{Meta: Meta{Ui: ui}} args := []string{"-address", "http://" + s.HTTPAddr, "testdata/example-vault.nomad"} code := cmd.Run(args) - require.Contains(t, ui.ErrorWriter.String(), "* bad token") - require.Equal(t, 1, code) + must.StrContains(t, ui.ErrorWriter.String(), "* bad token") + must.One(t, code) }) } func TestValidateCommand_hcl1_hcl2_strict(t *testing.T) { @@ -84,7 +84,7 @@ func TestValidateCommand_hcl1_hcl2_strict(t *testing.T) { "-address", addr, "asset/example-short.nomad.hcl", }) - require.Equal(t, 0, got, ui.ErrorWriter.String()) + must.Zero(t, got) }) } @@ -221,11 +221,9 @@ func TestValidateCommand_JSON(t *testing.T) { code := cmd.Run([]string{"-address", addr, "-json", "testdata/example-short.json"}) - require.Zerof(t, code, "stdout: %s\nstdout: %s\n", - ui.OutputWriter.String(), ui.ErrorWriter.String()) + must.Zero(t, code) code = cmd.Run([]string{"-address", addr, "-json", "testdata/example-short-bad.json"}) - require.Equalf(t, 1, code, "stdout: %s\nstdout: %s\n", - ui.OutputWriter.String(), ui.ErrorWriter.String()) + must.One(t, code) } diff --git a/command/license_get_test.go b/command/license_get_test.go index 60d3fce7e..fed0d4594 100644 --- a/command/license_get_test.go +++ b/command/license_get_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) var _ cli.Command = &LicenseGetCommand{} @@ -26,10 +26,10 @@ func TestCommand_LicenseGet_OSSErr(t *testing.T) { code := cmd.Run([]string{"-address=" + url}) if srv.Enterprise { - require.Equal(t, 0, code) + must.Zero(t, code) } else { - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") } } @@ -55,9 +55,9 @@ func TestOutputLicenseReply(t *testing.T) { ui := cli.NewMockUi() - require.Equal(t, 0, OutputLicenseReply(ui, lic)) + must.Zero(t, OutputLicenseReply(ui, lic)) out := ui.OutputWriter.String() - require.Contains(t, out, "Customer ID") - require.Contains(t, out, "License ID") + must.StrContains(t, out, "Customer ID") + must.StrContains(t, out, "License ID") } diff --git a/command/meta_test.go b/command/meta_test.go index 6a8d0d438..dd07837dc 100644 --- a/command/meta_test.go +++ b/command/meta_test.go @@ -16,7 +16,6 @@ import ( "github.com/hashicorp/nomad/helper/pointer" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestMeta_FlagSet(t *testing.T) { @@ -138,7 +137,7 @@ func TestMeta_Colorize(t *testing.T) { t.Run(tc.Name, func(t *testing.T) { // Create fake test terminal. _, tty, err := pty.Open() - require.NoError(t, err) + must.NoError(t, err) defer tty.Close() oldStdout := os.Stdout @@ -155,7 +154,7 @@ func TestMeta_Colorize(t *testing.T) { tc.SetupFn(t, m) } - require.Equal(t, !tc.ExpectColor, m.Colorize().Disable) + must.Eq(t, !tc.ExpectColor, m.Colorize().Disable) }) } } diff --git a/command/monitor_test.go b/command/monitor_test.go index 932d3e971..1466b20b2 100644 --- a/command/monitor_test.go +++ b/command/monitor_test.go @@ -16,7 +16,6 @@ import ( "github.com/mitchellh/cli" "github.com/shoenig/test/must" "github.com/shoenig/test/wait" - "github.com/stretchr/testify/require" ) func TestMonitor_Update_Eval(t *testing.T) { @@ -379,7 +378,7 @@ node-3 0 0 0 4 3 for _, tc := range tests { t.Run(tc.Name, func(t *testing.T) { got := formatAllocMetrics(tc.Metrics, true, "") - require.Equal(t, strings.TrimSpace(tc.Expected), got) + must.Eq(t, strings.TrimSpace(tc.Expected), got) }) } } diff --git a/command/namespace_apply_test.go b/command/namespace_apply_test.go index 2699e1285..a93518f16 100644 --- a/command/namespace_apply_test.go +++ b/command/namespace_apply_test.go @@ -11,7 +11,6 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" ) func TestNamespaceApplyCommand_Implements(t *testing.T) { @@ -59,8 +58,8 @@ func TestNamespaceApplyCommand_Good(t *testing.T) { } namespaces, _, err := client.Namespaces().List(nil) - assert.Nil(t, err) - assert.Len(t, namespaces, 2) + must.NoError(t, err) + must.SliceLen(t, 2, namespaces) } func TestNamespaceApplyCommand_parseNamesapceSpec(t *testing.T) { diff --git a/command/namespace_delete_test.go b/command/namespace_delete_test.go index a87977e6f..d0bc5a06a 100644 --- a/command/namespace_delete_test.go +++ b/command/namespace_delete_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestNamespaceDeleteCommand_Implements(t *testing.T) { @@ -57,7 +57,7 @@ func TestNamespaceDeleteCommand_Good(t *testing.T) { Name: "foo", } _, err := client.Namespaces().Register(ns, nil) - assert.Nil(t, err) + must.NoError(t, err) // Delete a namespace if code := cmd.Run([]string{"-address=" + url, ns.Name}); code != 0 { @@ -65,13 +65,12 @@ func TestNamespaceDeleteCommand_Good(t *testing.T) { } namespaces, _, err := client.Namespaces().List(nil) - assert.Nil(t, err) - assert.Len(t, namespaces, 1) + must.NoError(t, err) + must.Len(t, 1, namespaces) } func TestNamespaceDeleteCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -84,12 +83,12 @@ func TestNamespaceDeleteCommand_AutocompleteArgs(t *testing.T) { Name: "diddo", } _, err := client.Namespaces().Register(ns, nil) - assert.Nil(err) + must.NoError(t, err) args := complete.Args{Last: "d"} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(ns.Name, res[0]) + must.Len(t, 1, res) + must.Eq(t, ns.Name, res[0]) } diff --git a/command/namespace_inspect_test.go b/command/namespace_inspect_test.go index fc6851df9..f7554db7f 100644 --- a/command/namespace_inspect_test.go +++ b/command/namespace_inspect_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestNamespaceInspectCommand_Implements(t *testing.T) { @@ -57,7 +57,7 @@ func TestNamespaceInspectCommand_Good(t *testing.T) { Name: "foo", } _, err := client.Namespaces().Register(ns, nil) - assert.Nil(t, err) + must.NoError(t, err) // Inspect if code := cmd.Run([]string{"-address=" + url, ns.Name}); code != 0 { @@ -72,7 +72,6 @@ func TestNamespaceInspectCommand_Good(t *testing.T) { func TestNamespaceInspectCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -85,14 +84,14 @@ func TestNamespaceInspectCommand_AutocompleteArgs(t *testing.T) { Name: "foo", } _, err := client.Namespaces().Register(ns, nil) - assert.Nil(err) + must.NoError(t, err) args := complete.Args{Last: "f"} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(ns.Name, res[0]) + must.Len(t, 1, res) + must.Eq(t, ns.Name, res[0]) } // This test should demonstrate the behavior of a namespace @@ -112,27 +111,24 @@ func TestNamespaceInspectCommand_NamespaceMatchesPrefix(t *testing.T) { // Create a namespace that uses foo as a prefix ns := &api.Namespace{Name: "fooBar"} _, err := client.Namespaces().Register(ns, nil) - assert.Nil(t, err) + must.NoError(t, err) // Create a foo namespace ns2 := &api.Namespace{Name: "foo"} _, err = client.Namespaces().Register(ns2, nil) - assert.Nil(t, err) + must.NoError(t, err) // Adding a NS after to prevent sort from creating // false successes ns = &api.Namespace{Name: "fooBaz"} _, err = client.Namespaces().Register(ns, nil) - assert.Nil(t, err) + must.NoError(t, err) // Check status on namespace code := cmd.Run([]string{"-address=" + url, ns2.Name}) - if code != 0 { - t.Fatalf("expected exit 0, got: %d; %v", code, ui.ErrorWriter.String()) - } + must.Zero(t, code) + // Check to ensure we got the proper foo out := ui.OutputWriter.String() - if !strings.Contains(out, "\"foo\",\n") { - t.Fatalf("expected namespace foo, got: %s", out) - } + must.StrContains(t, out, "\"foo\",\n") } diff --git a/command/namespace_status_test.go b/command/namespace_status_test.go index 7495f68be..a1264d48a 100644 --- a/command/namespace_status_test.go +++ b/command/namespace_status_test.go @@ -13,7 +13,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" ) func TestNamespaceStatusCommand_Implements(t *testing.T) { @@ -108,7 +107,7 @@ func TestNamespaceStatusCommand_Run_Quota(t *testing.T) { // Create a quota to delete qs := testQuotaSpec() _, err := client.Quotas().Register(qs, nil) - assert.Nil(t, err) + must.NoError(t, err) // Create a namespace ns := &api.Namespace{ @@ -116,7 +115,7 @@ func TestNamespaceStatusCommand_Run_Quota(t *testing.T) { Quota: qs.Name, } _, err = client.Namespaces().Register(ns, nil) - assert.Nil(t, err) + must.NoError(t, err) // Check status on namespace code := cmd.Run([]string{"-address=" + url, ns.Name}) diff --git a/command/node_drain_test.go b/command/node_drain_test.go index 34e767828..4e5a1bafc 100644 --- a/command/node_drain_test.go +++ b/command/node_drain_test.go @@ -17,8 +17,7 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestNodeDrainCommand_Implements(t *testing.T) { @@ -28,7 +27,7 @@ func TestNodeDrainCommand_Implements(t *testing.T) { func TestNodeDrainCommand_Detach(t *testing.T) { ci.Parallel(t) - require := require.New(t) + server, client, url := testServer(t, true, func(c *agent.Config) { c.NodeName = "drain_detach_node" }) @@ -72,7 +71,7 @@ func TestNodeDrainCommand_Detach(t *testing.T) { } _, _, err := client.Jobs().Register(job, nil) - require.Nil(err) + must.NoError(t, err) testutil.WaitForResult(func() (bool, error) { allocs, _, err := client.Nodes().Allocations(nodeID, nil) @@ -92,16 +91,16 @@ func TestNodeDrainCommand_Detach(t *testing.T) { out := ui.OutputWriter.String() expected := "drain strategy set" - require.Contains(out, expected) + must.StrContains(t, out, expected) node, _, err := client.Nodes().Info(nodeID, nil) - require.Nil(err) - require.NotNil(node.DrainStrategy) + must.NoError(t, err) + must.NotNil(t, node.DrainStrategy) } func TestNodeDrainCommand_Monitor(t *testing.T) { ci.Parallel(t) - require := require.New(t) + server, client, url := testServer(t, true, func(c *agent.Config) { c.NodeName = "drain_monitor_node" }) @@ -161,7 +160,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) { } _, _, err := client.Jobs().Register(job, nil) - require.Nil(err) + must.NoError(t, err) // Register a system job to ensure it is ignored during draining sysjob := &api.Job{ @@ -191,7 +190,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) { } _, _, err = client.Jobs().Register(sysjob, nil) - require.Nil(err) + must.NoError(t, err) var allocs []*api.Allocation testutil.WaitForResult(func() (bool, error) { @@ -221,7 +220,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) { cmd := &NodeDrainCommand{Meta: Meta{Ui: ui}} args := []string{"-address=" + url, "-self", "-enable", "-deadline", "1s", "-ignore-system"} t.Logf("Running: %v", args) - require.Zero(cmd.Run(args)) + must.Zero(t, cmd.Run(args)) out := outBuf.String() t.Logf("Output:\n%s", out) @@ -230,7 +229,7 @@ func TestNodeDrainCommand_Monitor(t *testing.T) { // monitor goroutines may start only after some or all the allocs have been // migrated. if !testutil.IsTravis() { - require.Contains(out, "Drain complete for node") + must.StrContains(t, out, "Drain complete for node") for _, a := range allocs { if *a.Job.Type == "system" { if strings.Contains(out, a.ID) { @@ -238,8 +237,8 @@ func TestNodeDrainCommand_Monitor(t *testing.T) { } continue } - require.Contains(out, fmt.Sprintf("Alloc %q marked for migration", a.ID)) - require.Contains(out, fmt.Sprintf("Alloc %q draining", a.ID)) + must.StrContains(t, out, fmt.Sprintf("Alloc %q marked for migration", a.ID)) + must.StrContains(t, out, fmt.Sprintf("Alloc %q draining", a.ID)) } expected := fmt.Sprintf("All allocations on node %q have stopped\n", nodeID) @@ -252,16 +251,16 @@ func TestNodeDrainCommand_Monitor(t *testing.T) { outBuf.Reset() args = []string{"-address=" + url, "-self", "-monitor", "-ignore-system"} t.Logf("Running: %v", args) - require.Zero(cmd.Run(args)) + must.Zero(t, cmd.Run(args)) out = outBuf.String() t.Logf("Output:\n%s", out) - require.Contains(out, "No drain strategy set") + must.StrContains(t, out, "No drain strategy set") } func TestNodeDrainCommand_Monitor_NoDrainStrategy(t *testing.T) { ci.Parallel(t) - require := require.New(t) + server, client, url := testServer(t, true, func(c *agent.Config) { c.NodeName = "drain_monitor_node2" }) @@ -298,7 +297,7 @@ func TestNodeDrainCommand_Monitor_NoDrainStrategy(t *testing.T) { out := outBuf.String() t.Logf("Output:\n%s", out) - require.Contains(out, "No drain strategy set") + must.StrContains(t, out, "No drain strategy set") } func TestNodeDrainCommand_Fails(t *testing.T) { @@ -417,7 +416,6 @@ func TestNodeDrainCommand_Fails(t *testing.T) { func TestNodeDrainCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -446,6 +444,6 @@ func TestNodeDrainCommand_AutocompleteArgs(t *testing.T) { predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(nodeID, res[0]) + must.Len(t, 1, res) + must.Eq(t, nodeID, res[0]) } diff --git a/command/node_eligibility_test.go b/command/node_eligibility_test.go index 1aafb5d96..95de5dece 100644 --- a/command/node_eligibility_test.go +++ b/command/node_eligibility_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestNodeEligibilityCommand_Implements(t *testing.T) { @@ -95,7 +95,6 @@ func TestNodeEligibilityCommand_Fails(t *testing.T) { func TestNodeEligibilityCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -124,6 +123,6 @@ func TestNodeEligibilityCommand_AutocompleteArgs(t *testing.T) { predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(nodeID, res[0]) + must.Len(t, 1, res) + must.Eq(t, nodeID, res[0]) } diff --git a/command/node_pool_jobs_test.go b/command/node_pool_jobs_test.go index d16d0c9e5..a6dd93597 100644 --- a/command/node_pool_jobs_test.go +++ b/command/node_pool_jobs_test.go @@ -8,14 +8,13 @@ import ( "strings" "testing" - "github.com/mitchellh/cli" - "github.com/shoenig/test" - "github.com/shoenig/test/must" - "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/helper" "github.com/hashicorp/nomad/helper/pointer" + "github.com/mitchellh/cli" + "github.com/shoenig/test" + "github.com/shoenig/test/must" ) func TestNodePoolJobsListCommand_Run(t *testing.T) { diff --git a/command/node_status_test.go b/command/node_status_test.go index 12dbb6058..cfddd03f4 100644 --- a/command/node_status_test.go +++ b/command/node_status_test.go @@ -15,7 +15,7 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestNodeStatusCommand_Implements(t *testing.T) { @@ -241,7 +241,6 @@ func TestNodeStatusCommand_Fails(t *testing.T) { func TestNodeStatusCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -270,30 +269,29 @@ func TestNodeStatusCommand_AutocompleteArgs(t *testing.T) { predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(nodeID, res[0]) + must.Len(t, 1, res) + must.Eq(t, nodeID, res[0]) } func TestNodeStatusCommand_FormatDrain(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) node := &api.Node{} - assert.Equal("false", formatDrain(node)) + must.Eq(t, "false", formatDrain(node)) node.DrainStrategy = &api.DrainStrategy{} - assert.Equal("true; no deadline", formatDrain(node)) + must.Eq(t, "true; no deadline", formatDrain(node)) node.DrainStrategy = &api.DrainStrategy{} node.DrainStrategy.Deadline = -1 * time.Second - assert.Equal("true; force drain", formatDrain(node)) + must.Eq(t, "true; force drain", formatDrain(node)) // formatTime special cases Unix(0, 0), so increment by 1 node.DrainStrategy = &api.DrainStrategy{} node.DrainStrategy.ForceDeadline = time.Unix(1, 0).UTC() - assert.Equal("true; 1970-01-01T00:00:01Z deadline", formatDrain(node)) + must.Eq(t, "true; 1970-01-01T00:00:01Z deadline", formatDrain(node)) node.DrainStrategy.IgnoreSystemJobs = true - assert.Equal("true; 1970-01-01T00:00:01Z deadline; ignoring system jobs", formatDrain(node)) + must.Eq(t, "true; 1970-01-01T00:00:01Z deadline; ignoring system jobs", formatDrain(node)) } diff --git a/command/operator_api_test.go b/command/operator_api_test.go index 4d097b0d6..5f30b2572 100644 --- a/command/operator_api_test.go +++ b/command/operator_api_test.go @@ -19,7 +19,6 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) // TestOperatorAPICommand_Paths asserts that the op api command normalizes @@ -45,11 +44,11 @@ func TestOperatorAPICommand_Paths(t *testing.T) { // Assert that absolute paths are appended to the configured address exitCode := cmd.Run([]string{"-address=" + ts.URL, "/v1/jobs"}) - require.Zero(t, exitCode, buf.String()) + must.Zero(t, exitCode) select { case hit := <-hits: - require.Equal(t, expected, hit.String()) + must.Eq(t, expected, hit.String()) case <-time.After(10 * time.Second): t.Fatalf("timed out waiting for hit") } @@ -59,11 +58,11 @@ func TestOperatorAPICommand_Paths(t *testing.T) { // Assert that full URLs are used as-is even if an invalid address is // set. exitCode = cmd.Run([]string{"-address=ftp://127.0.0.2:1", ts.URL + "/v1/jobs"}) - require.Zero(t, exitCode, buf.String()) + must.Zero(t, exitCode) select { case hit := <-hits: - require.Equal(t, expected, hit.String()) + must.Eq(t, expected, hit.String()) case <-time.After(10 * time.Second): t.Fatalf("timed out waiting for hit") } @@ -73,11 +72,11 @@ func TestOperatorAPICommand_Paths(t *testing.T) { // Assert that URLs lacking a scheme are used even if an invalid // address is set. exitCode = cmd.Run([]string{"-address=ftp://127.0.0.2:1", ts.Listener.Addr().String() + "/v1/jobs"}) - require.Zero(t, exitCode, buf.String()) + must.Zero(t, exitCode) select { case hit := <-hits: - require.Equal(t, expected, hit.String()) + must.Eq(t, expected, hit.String()) case <-time.After(10 * time.Second): t.Fatalf("timed out waiting for hit") } @@ -105,7 +104,7 @@ func TestOperatorAPICommand_Curl(t *testing.T) { "-H", "Some-Other-Header: ok", "/url", }) - require.Zero(t, exitCode, buf.String()) + must.Zero(t, exitCode) expected := `curl \ -X POST \ @@ -113,7 +112,7 @@ func TestOperatorAPICommand_Curl(t *testing.T) { -H 'X-Nomad-Token: acl-token' \ http://127.0.0.1:1/url?filter=this+%3D%3D+%22that%22+or+this+%21%3D+%22foo%22®ion=not+even+a+valid+region ` - require.Equal(t, expected, buf.String()) + must.Eq(t, expected, buf.String()) } func Test_pathToURL(t *testing.T) { @@ -192,13 +191,13 @@ func TestOperatorAPICommand_ContentLength(t *testing.T) { // Setup a temp file to act as stdin. input := []byte("test-input") fakeStdin, err := os.CreateTemp("", "fake-stdin") - require.NoError(t, err) + must.NoError(t, err) defer os.Remove(fakeStdin.Name()) _, err = fakeStdin.Write(input) - require.NoError(t, err) + must.NoError(t, err) _, err = fakeStdin.Seek(0, 0) - require.NoError(t, err) + must.NoError(t, err) // Override the package's Stdin variable for testing. Stdin = fakeStdin @@ -214,11 +213,11 @@ func TestOperatorAPICommand_ContentLength(t *testing.T) { // Assert that a request has the expected content length. exitCode := cmd.Run([]string{"-address=" + ts.URL, "/v1/jobs"}) - require.Zero(t, exitCode, buf.String()) + must.Zero(t, exitCode) select { case l := <-contentLength: - require.Equal(t, len(input), l) + must.Eq(t, len(input), l) case <-time.After(10 * time.Second): t.Fatalf("timed out waiting for request") } diff --git a/command/operator_autopilot_set_test.go b/command/operator_autopilot_set_test.go index 93aaa7823..abd04a1ce 100644 --- a/command/operator_autopilot_set_test.go +++ b/command/operator_autopilot_set_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestOperator_Autopilot_SetConfig_Implements(t *testing.T) { @@ -20,7 +20,7 @@ func TestOperator_Autopilot_SetConfig_Implements(t *testing.T) { func TestOperatorAutopilotSetConfigCommand(t *testing.T) { ci.Parallel(t) - require := require.New(t) + s, _, addr := testServer(t, false, nil) defer s.Shutdown() @@ -39,22 +39,23 @@ func TestOperatorAutopilotSetConfigCommand(t *testing.T) { } code := c.Run(args) - require.EqualValues(0, code) + must.Zero(t, code) + output := strings.TrimSpace(ui.OutputWriter.String()) - require.Contains(output, "Configuration updated") + must.StrContains(t, output, "Configuration updated") client, err := c.Client() - require.NoError(err) + must.NoError(t, err) conf, _, err := client.Operator().AutopilotGetConfiguration(nil) - require.NoError(err) + must.NoError(t, err) - require.False(conf.CleanupDeadServers) - require.EqualValues(99, conf.MaxTrailingLogs) - require.EqualValues(3, conf.MinQuorum) - require.EqualValues(123*time.Millisecond, conf.LastContactThreshold) - require.EqualValues(123*time.Millisecond, conf.ServerStabilizationTime) - require.True(conf.EnableRedundancyZones) - require.True(conf.DisableUpgradeMigration) - require.True(conf.EnableCustomUpgrades) + must.False(t, conf.CleanupDeadServers) + must.Eq(t, 99, conf.MaxTrailingLogs) + must.Eq(t, 3, conf.MinQuorum) + must.Eq(t, 123*time.Millisecond, conf.LastContactThreshold) + must.Eq(t, 123*time.Millisecond, conf.ServerStabilizationTime) + must.True(t, conf.EnableRedundancyZones) + must.True(t, conf.DisableUpgradeMigration) + must.True(t, conf.EnableCustomUpgrades) } diff --git a/command/operator_debug_test.go b/command/operator_debug_test.go index 026169c01..364f7c022 100644 --- a/command/operator_debug_test.go +++ b/command/operator_debug_test.go @@ -31,6 +31,7 @@ import ( ) // NOTE: most of these tests cannot be run in parallel +// TODO(shoenig): come back to this one type testCase struct { name string diff --git a/command/operator_gossip_keyring_test.go b/command/operator_gossip_keyring_test.go index 73bd90eee..748fef912 100644 --- a/command/operator_gossip_keyring_test.go +++ b/command/operator_gossip_keyring_test.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" + "github.com/shoenig/test/must" ) func TestGossipKeyringGenerateCommand(t *testing.T) { @@ -17,17 +18,11 @@ func TestGossipKeyringGenerateCommand(t *testing.T) { ui := cli.NewMockUi() c := &OperatorGossipKeyringGenerateCommand{Meta: Meta{Ui: ui}} code := c.Run(nil) - if code != 0 { - t.Fatalf("bad: %d", code) - } + must.Zero(t, code) output := ui.OutputWriter.String() result, err := base64.StdEncoding.DecodeString(output) - if err != nil { - t.Fatalf("err: %s", err) - } + must.NoError(t, err) + must.Len(t, 32, result) - if len(result) != 32 { - t.Fatalf("bad: %#v", result) - } } diff --git a/command/operator_raft_remove_test.go b/command/operator_raft_remove_test.go index 4ace77416..5ac287e05 100644 --- a/command/operator_raft_remove_test.go +++ b/command/operator_raft_remove_test.go @@ -8,7 +8,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestOperator_Raft_RemovePeers_Implements(t *testing.T) { @@ -18,7 +18,7 @@ func TestOperator_Raft_RemovePeers_Implements(t *testing.T) { func TestOperator_Raft_RemovePeer(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) + s, _, addr := testServer(t, false, nil) defer s.Shutdown() @@ -32,21 +32,18 @@ func TestOperator_Raft_RemovePeer(t *testing.T) { t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String()) } - assert.Contains(ui.ErrorWriter.String(), "cannot give both an address and id") + must.StrContains(t, ui.ErrorWriter.String(), "cannot give both an address and id") // Neither address nor ID present args = args[:1] code = c.Run(args) - if code != 1 { - t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String()) - } - - assert.Contains(ui.ErrorWriter.String(), "an address or id is required for the peer to remove") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "an address or id is required for the peer to remove") } func TestOperator_Raft_RemovePeerAddress(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) + s, _, addr := testServer(t, false, nil) defer s.Shutdown() @@ -55,17 +52,15 @@ func TestOperator_Raft_RemovePeerAddress(t *testing.T) { args := []string{"-address=" + addr, "-peer-address=nope"} code := c.Run(args) - if code != 1 { - t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String()) - } + must.One(t, code) // If we get this error, it proves we sent the address all they through. - assert.Contains(ui.ErrorWriter.String(), "address \"nope\" was not found in the Raft configuration") + must.StrContains(t, ui.ErrorWriter.String(), "address \"nope\" was not found in the Raft configuration") } func TestOperator_Raft_RemovePeerID(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) + s, _, addr := testServer(t, false, nil) defer s.Shutdown() @@ -74,10 +69,8 @@ func TestOperator_Raft_RemovePeerID(t *testing.T) { args := []string{"-address=" + addr, "-peer-id=nope"} code := c.Run(args) - if code != 1 { - t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String()) - } + must.One(t, code) // If we get this error, it proves we sent the address all they through. - assert.Contains(ui.ErrorWriter.String(), "id \"nope\" was not found in the Raft configuration") + must.StrContains(t, ui.ErrorWriter.String(), "id \"nope\" was not found in the Raft configuration") } diff --git a/command/operator_scheduler_get_config_test.go b/command/operator_scheduler_get_config_test.go index 32b35da06..f1c73d753 100644 --- a/command/operator_scheduler_get_config_test.go +++ b/command/operator_scheduler_get_config_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestOperatorSchedulerGetConfig_Run(t *testing.T) { @@ -23,28 +23,28 @@ func TestOperatorSchedulerGetConfig_Run(t *testing.T) { c := &OperatorSchedulerGetConfig{Meta: Meta{Ui: ui}} // Run the command, so we get the default output and test this. - require.EqualValues(t, 0, c.Run([]string{"-address=" + addr})) + must.Zero(t, c.Run([]string{"-address=" + addr})) s := ui.OutputWriter.String() - require.Contains(t, s, "Scheduler Algorithm = binpack") - require.Contains(t, s, "Preemption SysBatch Scheduler = false") + must.StrContains(t, s, "Scheduler Algorithm = binpack") + must.StrContains(t, s, "Preemption SysBatch Scheduler = false") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Request JSON output and test. - require.EqualValues(t, 0, c.Run([]string{"-address=" + addr, "-json"})) + must.Zero(t, c.Run([]string{"-address=" + addr, "-json"})) s = ui.OutputWriter.String() var js api.SchedulerConfiguration - require.NoError(t, json.Unmarshal([]byte(s), &js)) + must.NoError(t, json.Unmarshal([]byte(s), &js)) ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Request a template output and test. - require.EqualValues(t, 0, c.Run([]string{"-address=" + addr, "-t='{{printf \"%s!!!\" .SchedulerConfig.SchedulerAlgorithm}}'"})) - require.Contains(t, ui.OutputWriter.String(), "binpack!!!") + must.Zero(t, c.Run([]string{"-address=" + addr, "-t='{{printf \"%s!!!\" .SchedulerConfig.SchedulerAlgorithm}}'"})) + must.StrContains(t, ui.OutputWriter.String(), "binpack!!!") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Test an unsupported flag. - require.EqualValues(t, 1, c.Run([]string{"-address=" + addr, "-yaml"})) - require.Contains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler get-config") + must.One(t, c.Run([]string{"-address=" + addr, "-yaml"})) + must.StrContains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler get-config") } diff --git a/command/operator_scheduler_set_config_test.go b/command/operator_scheduler_set_config_test.go index 4ea0ace79..533b4f71f 100644 --- a/command/operator_scheduler_set_config_test.go +++ b/command/operator_scheduler_set_config_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestOperatorSchedulerSetConfig_Run(t *testing.T) { @@ -23,19 +23,19 @@ func TestOperatorSchedulerSetConfig_Run(t *testing.T) { c := &OperatorSchedulerSetConfig{Meta: Meta{Ui: ui}} bootstrappedConfig, _, err := srv.APIClient().Operator().SchedulerGetConfiguration(nil) - require.NoError(t, err) - require.NotEmpty(t, bootstrappedConfig.SchedulerConfig) + must.NoError(t, err) + must.NotNil(t, bootstrappedConfig.SchedulerConfig) // Run the command with zero value and ensure the configuration does not // change. - require.EqualValues(t, 0, c.Run([]string{"-address=" + addr})) + must.Zero(t, c.Run([]string{"-address=" + addr})) ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Read the configuration again and test that nothing has changed which // ensures our empty flags are working correctly. nonModifiedConfig, _, err := srv.APIClient().Operator().SchedulerGetConfiguration(nil) - require.NoError(t, err) + must.NoError(t, err) schedulerConfigEquals(t, bootstrappedConfig.SchedulerConfig, nonModifiedConfig.SchedulerConfig) // Modify every configuration parameter using the flags. This ensures the @@ -52,12 +52,12 @@ func TestOperatorSchedulerSetConfig_Run(t *testing.T) { "-preempt-sysbatch-scheduler=true", "-preempt-system-scheduler=false", } - require.EqualValues(t, 0, c.Run(modifyingArgs)) + must.Zero(t, c.Run(modifyingArgs)) s := ui.OutputWriter.String() - require.Contains(t, s, "Scheduler configuration updated!") + must.StrContains(t, s, "Scheduler configuration updated!") modifiedConfig, _, err := srv.APIClient().Operator().SchedulerGetConfiguration(nil) - require.NoError(t, err) + must.NoError(t, err) schedulerConfigEquals(t, &api.SchedulerConfiguration{ SchedulerAlgorithm: "spread", PreemptionConfig: api.PreemptionConfig{ @@ -76,36 +76,36 @@ func TestOperatorSchedulerSetConfig_Run(t *testing.T) { // Make a Freudian slip with one of the flags to ensure the usage is // returned. - require.EqualValues(t, 1, c.Run([]string{"-address=" + addr, "-pause-evil-broker=true"})) - require.Contains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler set-config") + must.One(t, c.Run([]string{"-address=" + addr, "-pause-evil-broker=true"})) + must.StrContains(t, ui.OutputWriter.String(), "Usage: nomad operator scheduler set-config") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Try updating the config using an incorrect check-index value. - require.EqualValues(t, 1, c.Run([]string{ + must.One(t, c.Run([]string{ "-address=" + addr, "-pause-eval-broker=false", "-check-index=1000000", })) - require.Contains(t, ui.ErrorWriter.String(), "check-index 1000000 does not match does not match current state") + must.StrContains(t, ui.ErrorWriter.String(), "check-index 1000000 does not match does not match current state") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() // Try updating the config using a correct check-index value. - require.EqualValues(t, 0, c.Run([]string{ + must.Zero(t, c.Run([]string{ "-address=" + addr, "-pause-eval-broker=false", "-check-index=" + strconv.FormatUint(modifiedConfig.SchedulerConfig.ModifyIndex, 10), })) - require.Contains(t, ui.OutputWriter.String(), "Scheduler configuration updated!") + must.StrContains(t, ui.OutputWriter.String(), "Scheduler configuration updated!") ui.ErrorWriter.Reset() ui.OutputWriter.Reset() } func schedulerConfigEquals(t *testing.T, expected, actual *api.SchedulerConfiguration) { - require.Equal(t, expected.SchedulerAlgorithm, actual.SchedulerAlgorithm) - require.Equal(t, expected.RejectJobRegistration, actual.RejectJobRegistration) - require.Equal(t, expected.MemoryOversubscriptionEnabled, actual.MemoryOversubscriptionEnabled) - require.Equal(t, expected.PauseEvalBroker, actual.PauseEvalBroker) - require.Equal(t, expected.PreemptionConfig, actual.PreemptionConfig) + must.Eq(t, expected.SchedulerAlgorithm, actual.SchedulerAlgorithm) + must.Eq(t, expected.RejectJobRegistration, actual.RejectJobRegistration) + must.Eq(t, expected.MemoryOversubscriptionEnabled, actual.MemoryOversubscriptionEnabled) + must.Eq(t, expected.PauseEvalBroker, actual.PauseEvalBroker) + must.Eq(t, expected.PreemptionConfig, actual.PreemptionConfig) } diff --git a/command/operator_snapshot_inspect_test.go b/command/operator_snapshot_inspect_test.go index 3dd480fa4..c6dbb8622 100644 --- a/command/operator_snapshot_inspect_test.go +++ b/command/operator_snapshot_inspect_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/command/agent" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestOperatorSnapshotInspect_Works(t *testing.T) { @@ -24,7 +24,7 @@ func TestOperatorSnapshotInspect_Works(t *testing.T) { cmd := &OperatorSnapshotInspectCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{snapPath}) - require.Zero(t, code) + must.Zero(t, code) output := ui.OutputWriter.String() for _, key := range []string{ @@ -34,7 +34,7 @@ func TestOperatorSnapshotInspect_Works(t *testing.T) { "Term", "Version", } { - require.Contains(t, output, key) + must.StrContains(t, output, key) } } @@ -47,15 +47,15 @@ func TestOperatorSnapshotInspect_HandlesFailure(t *testing.T) { filepath.Join(tmpDir, "invalid.snap"), []byte("invalid data"), 0600) - require.NoError(t, err) + must.NoError(t, err) t.Run("not found", func(t *testing.T) { ui := cli.NewMockUi() cmd := &OperatorSnapshotInspectCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{filepath.Join(tmpDir, "foo")}) - require.NotZero(t, code) - require.Contains(t, ui.ErrorWriter.String(), "no such file") + must.Positive(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "no such file") }) t.Run("invalid file", func(t *testing.T) { @@ -63,8 +63,8 @@ func TestOperatorSnapshotInspect_HandlesFailure(t *testing.T) { cmd := &OperatorSnapshotInspectCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{filepath.Join(tmpDir, "invalid.snap")}) - require.NotZero(t, code) - require.Contains(t, ui.ErrorWriter.String(), "Error verifying snapshot") + must.Positive(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "Error verifying snapshot") }) } @@ -94,7 +94,7 @@ func generateSnapshotFile(t *testing.T, prepare func(srv *agent.TestAgent, clien "--address=" + url, dest, }) - require.Zero(t, code) + must.Zero(t, code) return dest } diff --git a/command/operator_snapshot_restore_test.go b/command/operator_snapshot_restore_test.go index 8f81b3c4c..434d788bc 100644 --- a/command/operator_snapshot_restore_test.go +++ b/command/operator_snapshot_restore_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/nomad/command/agent" "github.com/hashicorp/nomad/nomad/structs" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestOperatorSnapshotRestore_Works(t *testing.T) { @@ -44,7 +44,7 @@ job "snapshot-test-job" { cmd.JobGetter.testStdin = strings.NewReader(sampleJob) code := cmd.Run([]string{"--address=" + url, "-detach", "-"}) - require.Zero(t, code) + must.Zero(t, code) }) srv, _, url := testServer(t, false, func(c *agent.Config) { @@ -60,20 +60,20 @@ job "snapshot-test-job" { // job is not found before restore j, err := srv.Agent.Server().State().JobByID(nil, structs.DefaultNamespace, "snapshot-test-job") - require.NoError(t, err) - require.Nil(t, j) + must.NoError(t, err) + must.Nil(t, j) ui := cli.NewMockUi() cmd := &OperatorSnapshotRestoreCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"--address=" + url, snapshotPath}) - require.Empty(t, ui.ErrorWriter.String()) - require.Zero(t, code) - require.Contains(t, ui.OutputWriter.String(), "Snapshot Restored") + must.Eq(t, "", ui.ErrorWriter.String()) + must.Zero(t, code) + must.StrContains(t, ui.OutputWriter.String(), "Snapshot Restored") foundJob, err := srv.Agent.Server().State().JobByID(nil, structs.DefaultNamespace, "snapshot-test-job") - require.NoError(t, err) - require.Equal(t, "snapshot-test-job", foundJob.ID) + must.NoError(t, err) + must.Eq(t, "snapshot-test-job", foundJob.ID) } func TestOperatorSnapshotRestore_Fails(t *testing.T) { @@ -84,12 +84,12 @@ func TestOperatorSnapshotRestore_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) ui.ErrorWriter.Reset() // Fails when specified file does not exist code = cmd.Run([]string{"/unicorns/leprechauns"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "no such file") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "no such file") } diff --git a/command/operator_snapshot_save_test.go b/command/operator_snapshot_save_test.go index 2473dc583..55b5e5691 100644 --- a/command/operator_snapshot_save_test.go +++ b/command/operator_snapshot_save_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/command/agent" "github.com/hashicorp/nomad/helper/snapshot" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestOperatorSnapshotSave_Works(t *testing.T) { @@ -39,15 +39,15 @@ func TestOperatorSnapshotSave_Works(t *testing.T) { "--address=" + url, dest, }) - require.Zero(t, code) - require.Contains(t, ui.OutputWriter.String(), "State file written to "+dest) + must.Zero(t, code) + must.StrContains(t, ui.OutputWriter.String(), "State file written to "+dest) f, err := os.Open(dest) - require.NoError(t, err) + must.NoError(t, err) meta, err := snapshot.Verify(f) - require.NoError(t, err) - require.NotZero(t, meta.Index) + must.NoError(t, err) + must.Positive(t, meta.Index) } func TestOperatorSnapshotSave_Fails(t *testing.T) { @@ -58,12 +58,12 @@ func TestOperatorSnapshotSave_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) ui.ErrorWriter.Reset() // Fails when specified file does not exist code = cmd.Run([]string{"/unicorns/leprechauns"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "no such file") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "no such file") } diff --git a/command/plugin_status_test.go b/command/plugin_status_test.go index e62306c72..85c3b2a3c 100644 --- a/command/plugin_status_test.go +++ b/command/plugin_status_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/state" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestPluginStatusCommand_Implements(t *testing.T) { @@ -26,18 +26,18 @@ func TestPluginStatusCommand_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) + must.One(t, code) out := ui.ErrorWriter.String() - require.Contains(t, out, commandErrorText(cmd)) + must.StrContains(t, out, commandErrorText(cmd)) ui.ErrorWriter.Reset() // Test an unsupported plugin type. code = cmd.Run([]string{"-type=not-a-plugin"}) - require.Equal(t, 1, code) + must.One(t, code) out = ui.ErrorWriter.String() - require.Contains(t, out, "Unsupported plugin type: not-a-plugin") + must.StrContains(t, out, "Unsupported plugin type: not-a-plugin") ui.ErrorWriter.Reset() } @@ -57,13 +57,13 @@ func TestPluginStatusCommand_AutocompleteArgs(t *testing.T) { defer cleanup() ws := memdb.NewWatchSet() plug, err := s.CSIPluginByID(ws, id) - require.NoError(t, err) + must.NoError(t, err) prefix := plug.ID[:len(plug.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, plug.ID, res[0]) + must.Len(t, 1, res) + must.Eq(t, plug.ID, res[0]) } diff --git a/command/quota_delete_test.go b/command/quota_delete_test.go index 24e7ca98d..c084853fd 100644 --- a/command/quota_delete_test.go +++ b/command/quota_delete_test.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/nomad/helper/uuid" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestQuotaDeleteCommand_Implements(t *testing.T) { @@ -60,7 +60,7 @@ func TestQuotaDeleteCommand_Good(t *testing.T) { // Create a quota to delete qs := testQuotaSpec() _, err := client.Quotas().Register(qs, nil) - assert.Nil(t, err) + must.NoError(t, err) // Delete a namespace if code := cmd.Run([]string{"-address=" + url, qs.Name}); code != 0 { @@ -68,13 +68,12 @@ func TestQuotaDeleteCommand_Good(t *testing.T) { } quotas, _, err := client.Quotas().List(nil) - assert.Nil(t, err) - assert.Len(t, quotas, 0) + must.NoError(t, err) + must.SliceEmpty(t, quotas) } func TestQuotaDeleteCommand_AutocompleteArgs(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -85,14 +84,14 @@ func TestQuotaDeleteCommand_AutocompleteArgs(t *testing.T) { // Create a quota qs := testQuotaSpec() _, err := client.Quotas().Register(qs, nil) - assert.Nil(err) + must.NoError(t, err) args := complete.Args{Last: "quot"} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Equal(1, len(res)) - assert.Equal(qs.Name, res[0]) + must.Len(t, 1, res) + must.Eq(t, qs.Name, res[0]) } // testQuotaSpec returns a test quota specification diff --git a/command/quota_init_test.go b/command/quota_init_test.go index 95c995e06..3a6d3869f 100644 --- a/command/quota_init_test.go +++ b/command/quota_init_test.go @@ -9,7 +9,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestQuotaInitCommand_Implements(t *testing.T) { @@ -24,44 +24,44 @@ func TestQuotaInitCommand_Run_HCL(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) ui.ErrorWriter.Reset() // Ensure we change the cwd back origDir, err := os.Getwd() - require.NoError(t, err) + must.NoError(t, err) defer os.Chdir(origDir) // Create a temp dir and change into it dir := t.TempDir() err = os.Chdir(dir) - require.NoError(t, err) + must.NoError(t, err) // Works if the file doesn't exist code = cmd.Run([]string{}) - require.Empty(t, ui.ErrorWriter.String()) - require.Zero(t, code) + must.Eq(t, "", ui.ErrorWriter.String()) + must.Zero(t, code) content, err := os.ReadFile(DefaultHclQuotaInitName) - require.NoError(t, err) - require.Equal(t, defaultHclQuotaSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultHclQuotaSpec, string(content)) // Fails if the file exists code = cmd.Run([]string{}) - require.Contains(t, ui.ErrorWriter.String(), "exists") - require.Equal(t, 1, code) + must.StrContains(t, ui.ErrorWriter.String(), "exists") + must.One(t, code) ui.ErrorWriter.Reset() // Works if file is passed code = cmd.Run([]string{"mytest.hcl"}) - require.Empty(t, ui.ErrorWriter.String()) - require.Zero(t, code) + must.Eq(t, "", ui.ErrorWriter.String()) + must.Zero(t, code) content, err = os.ReadFile("mytest.hcl") - require.NoError(t, err) - require.Equal(t, defaultHclQuotaSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultHclQuotaSpec, string(content)) } func TestQuotaInitCommand_Run_JSON(t *testing.T) { @@ -71,42 +71,42 @@ func TestQuotaInitCommand_Run_JSON(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) ui.ErrorWriter.Reset() // Ensure we change the cwd back origDir, err := os.Getwd() - require.NoError(t, err) + must.NoError(t, err) defer os.Chdir(origDir) // Create a temp dir and change into it dir := t.TempDir() err = os.Chdir(dir) - require.NoError(t, err) + must.NoError(t, err) // Works if the file doesn't exist code = cmd.Run([]string{"-json"}) - require.Empty(t, ui.ErrorWriter.String()) - require.Zero(t, code) + must.Eq(t, "", ui.ErrorWriter.String()) + must.Zero(t, code) content, err := os.ReadFile(DefaultJsonQuotaInitName) - require.NoError(t, err) - require.Equal(t, defaultJsonQuotaSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultJsonQuotaSpec, string(content)) // Fails if the file exists code = cmd.Run([]string{"-json"}) - require.Contains(t, ui.ErrorWriter.String(), "exists") - require.Equal(t, 1, code) + must.StrContains(t, ui.ErrorWriter.String(), "exists") + must.One(t, code) ui.ErrorWriter.Reset() // Works if file is passed code = cmd.Run([]string{"-json", "mytest.json"}) - require.Empty(t, ui.ErrorWriter.String()) - require.Zero(t, code) + must.Eq(t, "", ui.ErrorWriter.String()) + must.Zero(t, code) content, err = os.ReadFile("mytest.json") - require.NoError(t, err) - require.Equal(t, defaultJsonQuotaSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultJsonQuotaSpec, string(content)) } diff --git a/command/quota_list_test.go b/command/quota_list_test.go index 19243bc41..729febf9d 100644 --- a/command/quota_list_test.go +++ b/command/quota_list_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func TestQuotaListCommand_Implements(t *testing.T) { @@ -45,7 +45,6 @@ func TestQuotaListCommand_Fails(t *testing.T) { func TestQuotaListCommand_List(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) // Create a server srv, client, url := testServer(t, true, nil) @@ -57,7 +56,7 @@ func TestQuotaListCommand_List(t *testing.T) { // Create a quota qs := testQuotaSpec() _, err := client.Quotas().Register(qs, nil) - assert.Nil(err) + must.NoError(t, err) // List should contain the new quota if code := cmd.Run([]string{"-address=" + url}); code != 0 { diff --git a/command/recommendation_apply_test.go b/command/recommendation_apply_test.go index 259ddbad8..360c1e8eb 100644 --- a/command/recommendation_apply_test.go +++ b/command/recommendation_apply_test.go @@ -11,12 +11,12 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestRecommendationApplyCommand_Run(t *testing.T) { ci.Parallel(t) - require := require.New(t) + srv, client, url := testServer(t, true, nil) defer srv.Shutdown() testutil.WaitForResult(func() (bool, error) { @@ -47,9 +47,9 @@ func TestRecommendationApplyCommand_Run(t *testing.T) { // Register a test job to write a recommendation against. testJob := testJob("recommendation_apply") regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(err) + must.NoError(t, err) registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID) - require.Equal(0, registerCode) + must.Zero(t, registerCode) // Write a recommendation. rec := api.Recommendation{ @@ -63,15 +63,15 @@ func TestRecommendationApplyCommand_Run(t *testing.T) { } recResp, _, err := client.Recommendations().Upsert(&rec, nil) if srv.Enterprise { - require.NoError(err) + must.NoError(t, err) // Read the recommendation out to ensure it is there as a control on // later tests. recInfo, _, err := client.Recommendations().Info(recResp.ID, nil) - require.NoError(err) - require.NotNil(recInfo) + must.NoError(t, err) + must.NotNil(t, recInfo) } else { - require.Error(err, "Nomad Enterprise only endpoint") + must.ErrorContains(t, err, "Nomad Enterprise only endpoint") } // Only perform the call if we are running enterprise tests. Otherwise the @@ -80,18 +80,18 @@ func TestRecommendationApplyCommand_Run(t *testing.T) { return } code := cmd.Run([]string{"-address=" + url, recResp.ID}) - require.Equal(0, code) + must.Zero(t, code) // Perform an info call on the recommendation which should return not // found. recInfo, _, err := client.Recommendations().Info(recResp.ID, nil) - require.Error(err, "not found") - require.Nil(recInfo) + must.ErrorContains(t, err, "not found") + must.Nil(t, recInfo) // Check the new jobspec to see if the resource value has changed. jobResp, _, err := client.Jobs().Info(*testJob.ID, nil) - require.NoError(err) - require.Equal(1, *jobResp.TaskGroups[0].Tasks[0].Resources.CPU) + must.NoError(t, err) + must.Eq(t, 1, *jobResp.TaskGroups[0].Tasks[0].Resources.CPU) } func TestRecommendationApplyCommand_AutocompleteArgs(t *testing.T) { diff --git a/command/recommendation_dismiss_test.go b/command/recommendation_dismiss_test.go index 9393ddfaf..86e8877eb 100644 --- a/command/recommendation_dismiss_test.go +++ b/command/recommendation_dismiss_test.go @@ -7,19 +7,18 @@ import ( "fmt" "testing" - "github.com/hashicorp/nomad/ci" - "github.com/mitchellh/cli" - "github.com/posener/complete" - "github.com/stretchr/testify/require" - "github.com/hashicorp/nomad/api" + "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/command/agent" "github.com/hashicorp/nomad/testutil" + "github.com/mitchellh/cli" + "github.com/posener/complete" + "github.com/shoenig/test/must" ) func TestRecommendationDismissCommand_Run(t *testing.T) { ci.Parallel(t) - require := require.New(t) + srv, client, url := testServer(t, true, nil) defer srv.Shutdown() testutil.WaitForResult(func() (bool, error) { @@ -51,9 +50,9 @@ func TestRecommendationDismissCommand_Run(t *testing.T) { // Register a test job to write a recommendation against. testJob := testJob("recommendation_dismiss") regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(err) + must.NoError(t, err) registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID) - require.Equal(0, registerCode) + must.Zero(t, registerCode) // Write a recommendation. rec := api.Recommendation{ @@ -67,15 +66,15 @@ func TestRecommendationDismissCommand_Run(t *testing.T) { } recResp, _, err := client.Recommendations().Upsert(&rec, nil) if srv.Enterprise { - require.NoError(err) + must.NoError(t, err) // Read the recommendation out to ensure it is there as a control on // later tests. recInfo, _, err := client.Recommendations().Info(recResp.ID, nil) - require.NoError(err) - require.NotNil(recInfo) + must.NoError(t, err) + must.NotNil(t, recInfo) } else { - require.Error(err, "Nomad Enterprise only endpoint") + must.ErrorContains(t, err, "Nomad Enterprise only endpoint") } // Only perform the call if we are running enterprise tests. Otherwise the @@ -84,15 +83,15 @@ func TestRecommendationDismissCommand_Run(t *testing.T) { return } code := cmd.Run([]string{"-address=" + url, recResp.ID}) - require.Equal(0, code) + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(out, "Successfully dismissed recommendation") + must.StrContains(t, out, "Successfully dismissed recommendation") // Perform an info call on the recommendation which should return not // found. recInfo, _, err := client.Recommendations().Info(recResp.ID, nil) - require.Error(err, "not found") - require.Nil(recInfo) + must.ErrorContains(t, err, "not found") + must.Nil(t, recInfo) } func TestRecommendationDismissCommand_AutocompleteArgs(t *testing.T) { @@ -114,12 +113,10 @@ func TestRecommendationDismissCommand_AutocompleteArgs(t *testing.T) { } func testRecommendationAutocompleteCommand(t *testing.T, client *api.Client, srv *agent.TestAgent, cmd *RecommendationAutocompleteCommand) { - require := require.New(t) - // Register a test job to write a recommendation against. testJob := testJob("recommendation_autocomplete") _, _, err := client.Jobs().Register(testJob, nil) - require.NoError(err) + must.NoError(t, err) // Write a recommendation. rec := &api.Recommendation{ @@ -133,9 +130,9 @@ func testRecommendationAutocompleteCommand(t *testing.T, client *api.Client, srv } rec, _, err = client.Recommendations().Upsert(rec, nil) if srv.Enterprise { - require.NoError(err) + must.NoError(t, err) } else { - require.Error(err, "Nomad Enterprise only endpoint") + must.ErrorContains(t, err, "Nomad Enterprise only endpoint") return } @@ -144,6 +141,6 @@ func testRecommendationAutocompleteCommand(t *testing.T, client *api.Client, srv predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(1, len(res)) - require.Equal(rec.ID, res[0]) + must.Len(t, 1, res) + must.Eq(t, rec.ID, res[0]) } diff --git a/command/recommendation_info_test.go b/command/recommendation_info_test.go index 76dc2d2fe..757842c9b 100644 --- a/command/recommendation_info_test.go +++ b/command/recommendation_info_test.go @@ -7,17 +7,16 @@ import ( "fmt" "testing" - "github.com/hashicorp/nomad/ci" - "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" - "github.com/hashicorp/nomad/api" + "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" + "github.com/mitchellh/cli" + "github.com/shoenig/test/must" ) func TestRecommendationInfoCommand_Run(t *testing.T) { ci.Parallel(t) - require := require.New(t) + srv, client, url := testServer(t, true, nil) defer srv.Shutdown() testutil.WaitForResult(func() (bool, error) { @@ -46,20 +45,20 @@ func TestRecommendationInfoCommand_Run(t *testing.T) { // Perform an initial call, which should return a not found error. code := cmd.Run([]string{"-address=" + url, "2c13f001-f5b6-ce36-03a5-e37afe160df5"}) if srv.Enterprise { - require.Equal(1, code) + must.One(t, code) out := ui.ErrorWriter.String() - require.Contains(out, "Recommendation not found") + must.StrContains(t, out, "Recommendation not found") } else { - require.Equal(1, code) - require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") } // Register a test job to write a recommendation against. testJob := testJob("recommendation_info") regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(err) + must.NoError(t, err) registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID) - require.Equal(0, registerCode) + must.Zero(t, registerCode) // Write a recommendation. rec := api.Recommendation{ @@ -73,21 +72,21 @@ func TestRecommendationInfoCommand_Run(t *testing.T) { } recResp, _, err := client.Recommendations().Upsert(&rec, nil) if srv.Enterprise { - require.NoError(err) + must.NoError(t, err) } else { - require.Error(err, "Nomad Enterprise only endpoint") + must.ErrorContains(t, err, "Nomad Enterprise only endpoint") } // Only perform the call if we are running enterprise tests. Otherwise the // recResp object will be nil. if srv.Enterprise { code = cmd.Run([]string{"-address=" + url, recResp.ID}) - require.Equal(0, code) + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(out, "test-meta-entry") - require.Contains(out, "p13") - require.Contains(out, "1.13") - require.Contains(out, recResp.ID) + must.StrContains(t, out, "test-meta-entry") + must.StrContains(t, out, "p13") + must.StrContains(t, out, "1.13") + must.StrContains(t, out, recResp.ID) } } diff --git a/command/recommendation_list_test.go b/command/recommendation_list_test.go index 1083b3848..9701b7e0e 100644 --- a/command/recommendation_list_test.go +++ b/command/recommendation_list_test.go @@ -11,13 +11,12 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestRecommendationListCommand_Run(t *testing.T) { ci.Parallel(t) - require := require.New(t) + srv, client, url := testServer(t, true, nil) defer srv.Shutdown() @@ -31,20 +30,20 @@ func TestRecommendationListCommand_Run(t *testing.T) { // Perform an initial list, which should return zero results. code := cmd.Run([]string{"-address=" + url}) if srv.Enterprise { - require.Equal(0, code) + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(out, "No recommendations found") + must.StrContains(t, out, "No recommendations found") } else { - require.Equal(1, code) - require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") } // Register a test job to write a recommendation against. testJob := testJob("recommendation_list") regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(err) + must.NoError(t, err) registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID) - require.Equal(0, registerCode) + must.Zero(t, registerCode) // Write a recommendation. rec := api.Recommendation{ @@ -58,26 +57,26 @@ func TestRecommendationListCommand_Run(t *testing.T) { } _, _, err = client.Recommendations().Upsert(&rec, nil) if srv.Enterprise { - require.NoError(err) + must.NoError(t, err) } else { - require.Error(err, "Nomad Enterprise only endpoint") + must.ErrorContains(t, err, "Nomad Enterprise only endpoint") } // Perform a new list which should yield results. code = cmd.Run([]string{"-address=" + url}) if srv.Enterprise { - require.Equal(0, code) + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(out, "ID") - require.Contains(out, "Job") - require.Contains(out, "Group") - require.Contains(out, "Task") - require.Contains(out, "Resource") - require.Contains(out, "Value") - require.Contains(out, "CPU") + must.StrContains(t, out, "ID") + must.StrContains(t, out, "Job") + must.StrContains(t, out, "Group") + must.StrContains(t, out, "Task") + must.StrContains(t, out, "Resource") + must.StrContains(t, out, "Value") + must.StrContains(t, out, "CPU") } else { - require.Equal(1, code) - require.Contains(ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "Nomad Enterprise only endpoint") } } @@ -163,7 +162,7 @@ func TestRecommendationListCommand_Sort(t *testing.T) { t.Run(tc.name, func(t *testing.T) { sortedRecs := recommendationList{r: tc.inputRecommendationList} sort.Sort(sortedRecs) - assert.Equal(t, tc.expectedOutputList, sortedRecs.r, tc.name) + must.Eq(t, tc.expectedOutputList, sortedRecs.r) }) } } diff --git a/command/scaling_policy_list_test.go b/command/scaling_policy_list_test.go index c7f6aab19..c5304e5cd 100644 --- a/command/scaling_policy_list_test.go +++ b/command/scaling_policy_list_test.go @@ -10,12 +10,12 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/helper/pointer" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestScalingPolicyListCommand_Run(t *testing.T) { ci.Parallel(t) - require := require.New(t) + srv, client, url := testServer(t, false, nil) defer srv.Shutdown() @@ -24,9 +24,9 @@ func TestScalingPolicyListCommand_Run(t *testing.T) { // Perform an initial list, which should return zero results. code := cmd.Run([]string{"-address=" + url}) - require.Equal(0, code) + must.Zero(t, code) out := ui.OutputWriter.String() - require.Contains(out, "No policies found") + must.StrContains(t, out, "No policies found") // Generate two test jobs. jobs := []*api.Job{testJob("scaling_policy_list_1"), testJob("scaling_policy_list_2")} @@ -43,17 +43,17 @@ func TestScalingPolicyListCommand_Run(t *testing.T) { for _, job := range jobs { job.TaskGroups[0].Scaling = &scalingPolicy _, _, err := client.Jobs().Register(job, nil) - require.NoError(err) + must.NoError(t, err) } // Perform a new list which should yield results.. code = cmd.Run([]string{"-address=" + url}) - require.Equal(0, code) + must.Zero(t, code) out = ui.OutputWriter.String() - require.Contains(out, "ID") - require.Contains(out, "Enabled") - require.Contains(out, "Type") - require.Contains(out, "Target") - require.Contains(out, "scaling_policy_list_1") - require.Contains(out, "scaling_policy_list_2") + must.StrContains(t, out, "ID") + must.StrContains(t, out, "Enabled") + must.StrContains(t, out, "Type") + must.StrContains(t, out, "Target") + must.StrContains(t, out, "scaling_policy_list_1") + must.StrContains(t, out, "scaling_policy_list_2") } diff --git a/command/scaling_policy_test.go b/command/scaling_policy_test.go index a80c47bc4..a804cc175 100644 --- a/command/scaling_policy_test.go +++ b/command/scaling_policy_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/hashicorp/nomad/ci" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" ) func Test_formatScalingPolicyTarget(t *testing.T) { @@ -49,7 +49,7 @@ func Test_formatScalingPolicyTarget(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { actualOutput := formatScalingPolicyTarget(tc.inputMap) - assert.Equal(t, tc.expectedOutput, actualOutput, tc.name) + must.Eq(t, tc.expectedOutput, actualOutput) }) } } diff --git a/command/service_delete_test.go b/command/service_delete_test.go index f9ca9a3ec..47d5d089e 100644 --- a/command/service_delete_test.go +++ b/command/service_delete_test.go @@ -13,8 +13,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestServiceDeleteCommand_Run(t *testing.T) { @@ -42,7 +41,7 @@ func TestServiceDeleteCommand_Run(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) ui := cli.NewMockUi() @@ -55,26 +54,26 @@ func TestServiceDeleteCommand_Run(t *testing.T) { // Run the command without any arguments to ensure we are performing this // check. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url})) - require.Contains(t, ui.ErrorWriter.String(), + must.One(t, cmd.Run([]string{"-address=" + url})) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes two arguments: and ") ui.ErrorWriter.Reset() // Create an upsert some service registrations. serviceRegs := mock.ServiceRegistrations() - assert.NoError(t, + must.NoError(t, srv.Agent.Server().State().UpsertServiceRegistrations(structs.MsgTypeTestSetup, 10, serviceRegs)) // Detail the service within the default namespace as we need the ID. defaultNSService, _, err := client.Services().Get(serviceRegs[0].ServiceName, nil) - require.NoError(t, err) - require.Len(t, defaultNSService, 1) + must.NoError(t, err) + must.Len(t, 1, defaultNSService) // Attempt to manually delete the service registration within the default // namespace. code := cmd.Run([]string{"-address=" + url, "service-discovery-nomad-delete", defaultNSService[0].ID}) - require.Equal(t, 0, code) - require.Contains(t, ui.OutputWriter.String(), "Successfully deleted service registration") + must.Zero(t, code) + must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted service registration") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -83,15 +82,15 @@ func TestServiceDeleteCommand_Run(t *testing.T) { platformNSService, _, err := client.Services().Get(serviceRegs[1].ServiceName, &api.QueryOptions{ Namespace: serviceRegs[1].Namespace}, ) - require.NoError(t, err) - require.Len(t, platformNSService, 1) + must.NoError(t, err) + must.Len(t, 1, platformNSService) // Attempt to manually delete the service registration within the platform // namespace. code = cmd.Run([]string{"-address=" + url, "-namespace=" + platformNSService[0].Namespace, "service-discovery-nomad-delete", platformNSService[0].ID}) - require.Equal(t, 0, code) - require.Contains(t, ui.OutputWriter.String(), "Successfully deleted service registration") + must.Zero(t, code) + must.StrContains(t, ui.OutputWriter.String(), "Successfully deleted service registration") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() diff --git a/command/service_info_test.go b/command/service_info_test.go index f0c865c99..edbc2eef8 100644 --- a/command/service_info_test.go +++ b/command/service_info_test.go @@ -5,6 +5,7 @@ package command import ( "fmt" + "strings" "testing" "time" @@ -12,7 +13,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/assert" + "github.com/shoenig/test/must" "github.com/stretchr/testify/require" ) @@ -36,7 +37,7 @@ func TestServiceInfoCommand_Run(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) ui := cli.NewMockUi() @@ -49,8 +50,8 @@ func TestServiceInfoCommand_Run(t *testing.T) { // Run the command without any arguments to ensure we are performing this // check. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url})) - require.Contains(t, ui.ErrorWriter.String(), + must.One(t, cmd.Run([]string{"-address=" + url})) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument: ") ui.ErrorWriter.Reset() @@ -61,9 +62,9 @@ func TestServiceInfoCommand_Run(t *testing.T) { // Register that job. regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(t, err) + must.NoError(t, err) registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID) - require.Equal(t, 0, registerCode) + must.Zero(t, registerCode) // Reset the output writer, otherwise we will have additional information here. ui.OutputWriter.Reset() @@ -72,6 +73,8 @@ func TestServiceInfoCommand_Run(t *testing.T) { // therefore needs this wrapper to account for eventual service // registration. One this has completed, we can perform lookups without // similar wraps. + // + // TODO(shoenig) clean this up require.Eventually(t, func() bool { defer ui.OutputWriter.Reset() @@ -83,25 +86,25 @@ func TestServiceInfoCommand_Run(t *testing.T) { // Test each header and data entry. s := ui.OutputWriter.String() - if !assert.Contains(t, s, "Job ID") { + if !strings.Contains(s, "Job ID") { return false } - if !assert.Contains(t, s, "Address") { + if !strings.Contains(s, "Address") { return false } - if !assert.Contains(t, s, "Node ID") { + if !strings.Contains(s, "Node ID") { return false } - if !assert.Contains(t, s, "Alloc ID") { + if !strings.Contains(s, "Alloc ID") { return false } - if !assert.Contains(t, s, "service-discovery-nomad-info") { + if !strings.Contains(s, "service-discovery-nomad-info") { return false } - if !assert.Contains(t, s, ":9999") { + if !strings.Contains(s, ":9999") { return false } - if !assert.Contains(t, s, "[foo,bar]") { + if !strings.Contains(s, "[foo,bar]") { return false } return true @@ -109,16 +112,16 @@ func TestServiceInfoCommand_Run(t *testing.T) { // Perform a verbose lookup. code := cmd.Run([]string{"-address=" + url, "-verbose", "service-discovery-nomad-info"}) - require.Equal(t, 0, code) + must.Zero(t, code) // Test KV entries. s := ui.OutputWriter.String() - require.Contains(t, s, "Service Name = service-discovery-nomad-info") - require.Contains(t, s, "Namespace = default") - require.Contains(t, s, "Job ID = service-discovery-nomad-info") - require.Contains(t, s, "Datacenter = dc1") - require.Contains(t, s, "Address = :9999") - require.Contains(t, s, "Tags = [foo,bar]") + must.StrContains(t, s, "Service Name = service-discovery-nomad-info") + must.StrContains(t, s, "Namespace = default") + must.StrContains(t, s, "Job ID = service-discovery-nomad-info") + must.StrContains(t, s, "Datacenter = dc1") + must.StrContains(t, s, "Address = :9999") + must.StrContains(t, s, "Tags = [foo,bar]") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() @@ -174,7 +177,7 @@ func Test_argsWithNewPageToken(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { actualOutput := argsWithNewPageToken(tc.inputOsArgs, tc.inputNextToken) - require.Equal(t, tc.expectedOutput, actualOutput) + must.Eq(t, tc.expectedOutput, actualOutput) }) } } diff --git a/command/service_list_test.go b/command/service_list_test.go index 344fbcf62..9d8292d8d 100644 --- a/command/service_list_test.go +++ b/command/service_list_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" + "github.com/shoenig/test/must" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -36,7 +37,7 @@ func TestServiceListCommand_Run(t *testing.T) { } return true, nil }, func(err error) { - require.NoError(t, err) + must.NoError(t, err) }) ui := cli.NewMockUi() @@ -49,8 +50,8 @@ func TestServiceListCommand_Run(t *testing.T) { // Run the command with some random arguments to ensure we are performing // this check. - require.Equal(t, 1, cmd.Run([]string{"-address=" + url, "pretty-please"})) - require.Contains(t, ui.ErrorWriter.String(), "This command takes no arguments") + must.One(t, cmd.Run([]string{"-address=" + url, "pretty-please"})) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes no arguments") ui.ErrorWriter.Reset() // Create a test job with a Nomad service. @@ -60,9 +61,9 @@ func TestServiceListCommand_Run(t *testing.T) { // Register that job. regResp, _, err := client.Jobs().Register(testJob, nil) - require.NoError(t, err) + must.NoError(t, err) registerCode := waitForSuccess(ui, client, fullId, t, regResp.EvalID) - require.Equal(t, 0, registerCode) + must.Zero(t, registerCode) // Reset the output writer, otherwise we will have additional information here. ui.OutputWriter.Reset() @@ -71,6 +72,8 @@ func TestServiceListCommand_Run(t *testing.T) { // therefore needs this wrapper to account for eventual service // registration. One this has completed, we can perform lookups without // similar wraps. + // + // TODO(shoenig) clean this up require.Eventually(t, func() bool { defer ui.OutputWriter.Reset() @@ -99,16 +102,16 @@ func TestServiceListCommand_Run(t *testing.T) { // Perform a wildcard namespace lookup. code := cmd.Run([]string{"-address=" + url, "-namespace", "*"}) - require.Equal(t, 0, code) + must.Zero(t, code) // Test each header and data entry. s := ui.OutputWriter.String() - require.Contains(t, s, "Service Name") - require.Contains(t, s, "Namespace") - require.Contains(t, s, "Tags") - require.Contains(t, s, "service-discovery-nomad-list") - require.Contains(t, s, "default") - require.Contains(t, s, "[bar,foo]") + must.StrContains(t, s, "Service Name") + must.StrContains(t, s, "Namespace") + must.StrContains(t, s, "Tags") + must.StrContains(t, s, "service-discovery-nomad-list") + must.StrContains(t, s, "default") + must.StrContains(t, s, "[bar,foo]") ui.OutputWriter.Reset() ui.ErrorWriter.Reset() diff --git a/command/setup_vault_test.go b/command/setup_vault_test.go index 9bce8d8b2..9f561ee6f 100644 --- a/command/setup_vault_test.go +++ b/command/setup_vault_test.go @@ -7,13 +7,12 @@ import ( "fmt" "testing" - "github.com/mitchellh/cli" - "github.com/shoenig/test/must" - "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/command/agent" "github.com/hashicorp/nomad/helper/pointer" + "github.com/mitchellh/cli" + "github.com/shoenig/test/must" ) func TestSetupVaultCommand_Run(t *testing.T) { diff --git a/command/status_test.go b/command/status_test.go index 33e8423e1..cce94977b 100644 --- a/command/status_test.go +++ b/command/status_test.go @@ -15,13 +15,11 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestStatusCommand_Run_JobStatus(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -32,22 +30,20 @@ func TestStatusCommand_Run_JobStatus(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() j := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) // Query to check the job status - if code := cmd.Run([]string{"-address=" + url, j.ID}); code != 0 { - t.Fatalf("expected exit 0, got: %d", code) - } + code := cmd.Run([]string{"-address=" + url, j.ID}) + must.Zero(t, code) out := ui.OutputWriter.String() - assert.Contains(out, j.ID) + must.StrContains(t, out, j.ID) ui.OutputWriter.Reset() } func TestStatusCommand_Run_JobStatus_MultiMatch(t *testing.T) { ci.Parallel(t) - assert := assert.New(t) srv, _, url := testServer(t, true, nil) defer srv.Shutdown() @@ -60,22 +56,20 @@ func TestStatusCommand_Run_JobStatus_MultiMatch(t *testing.T) { j := mock.Job() j2 := mock.Job() j2.ID = fmt.Sprintf("%s-more", j.ID) - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1001, nil, j2)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, j)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1001, nil, j2)) // Query to check the job status - if code := cmd.Run([]string{"-address=" + url, j.ID}); code != 0 { - t.Fatalf("expected exit 0, got: %d", code) - } + code := cmd.Run([]string{"-address=" + url, j.ID}) + must.Zero(t, code) out := ui.OutputWriter.String() - assert.Contains(out, j.ID) + must.StrContains(t, out, j.ID) ui.OutputWriter.Reset() } func TestStatusCommand_Run_EvalStatus(t *testing.T) { - assert := assert.New(t) ci.Parallel(t) srv, _, url := testServer(t, true, nil) @@ -87,7 +81,7 @@ func TestStatusCommand_Run_EvalStatus(t *testing.T) { // Create a fake eval state := srv.Agent.Server().State() eval := mock.Eval() - assert.Nil(state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{eval})) + must.NoError(t, state.UpsertEvals(structs.MsgTypeTestSetup, 1000, []*structs.Evaluation{eval})) // Query to check the eval status if code := cmd.Run([]string{"-address=" + url, eval.ID}); code != 0 { @@ -95,13 +89,12 @@ func TestStatusCommand_Run_EvalStatus(t *testing.T) { } out := ui.OutputWriter.String() - assert.Contains(out, eval.ID[:shortId]) + must.StrContains(t, out, eval.ID[:shortId]) ui.OutputWriter.Reset() } func TestStatusCommand_Run_NodeStatus(t *testing.T) { - assert := assert.New(t) ci.Parallel(t) // Start in dev mode so we get a node registration @@ -135,13 +128,12 @@ func TestStatusCommand_Run_NodeStatus(t *testing.T) { } out := ui.OutputWriter.String() - assert.Contains(out, "mynode") + must.StrContains(t, out, "mynode") ui.OutputWriter.Reset() } func TestStatusCommand_Run_AllocStatus(t *testing.T) { - assert := assert.New(t) ci.Parallel(t) srv, _, url := testServer(t, true, nil) @@ -153,20 +145,18 @@ func TestStatusCommand_Run_AllocStatus(t *testing.T) { // Create a fake alloc state := srv.Agent.Server().State() alloc := mock.Alloc() - assert.Nil(state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{alloc})) + must.NoError(t, state.UpsertAllocs(structs.MsgTypeTestSetup, 1000, []*structs.Allocation{alloc})) - if code := cmd.Run([]string{"-address=" + url, alloc.ID}); code != 0 { - t.Fatalf("expected exit 0, got: %d", code) - } + code := cmd.Run([]string{"-address=" + url, alloc.ID}) + must.Zero(t, code) out := ui.OutputWriter.String() - assert.Contains(out, alloc.ID[:shortId]) + must.StrContains(t, out, alloc.ID[:shortId]) ui.OutputWriter.Reset() } func TestStatusCommand_Run_DeploymentStatus(t *testing.T) { - assert := assert.New(t) ci.Parallel(t) srv, _, url := testServer(t, true, nil) @@ -178,21 +168,19 @@ func TestStatusCommand_Run_DeploymentStatus(t *testing.T) { // Create a fake deployment state := srv.Agent.Server().State() deployment := mock.Deployment() - assert.Nil(state.UpsertDeployment(1000, deployment)) + must.NoError(t, state.UpsertDeployment(1000, deployment)) // Query to check the deployment status - if code := cmd.Run([]string{"-address=" + url, deployment.ID}); code != 0 { - t.Fatalf("expected exit 0, got: %d", code) - } + code := cmd.Run([]string{"-address=" + url, deployment.ID}) + must.Zero(t, code) out := ui.OutputWriter.String() - assert.Contains(out, deployment.ID[:shortId]) + must.StrContains(t, out, deployment.ID[:shortId]) ui.OutputWriter.Reset() } func TestStatusCommand_Run_NoPrefix(t *testing.T) { - assert := assert.New(t) ci.Parallel(t) srv, _, url := testServer(t, true, nil) @@ -204,21 +192,19 @@ func TestStatusCommand_Run_NoPrefix(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() job := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job)) // Query to check status - if code := cmd.Run([]string{"-address=" + url}); code != 0 { - t.Fatalf("expected exit 0, got: %d", code) - } + code := cmd.Run([]string{"-address=" + url}) + must.Zero(t, code) out := ui.OutputWriter.String() - assert.Contains(out, job.ID) + must.StrContains(t, out, job.ID) ui.OutputWriter.Reset() } func TestStatusCommand_AutocompleteArgs(t *testing.T) { - assert := assert.New(t) ci.Parallel(t) srv, _, url := testServer(t, true, nil) @@ -230,14 +216,14 @@ func TestStatusCommand_AutocompleteArgs(t *testing.T) { // Create a fake job state := srv.Agent.Server().State() job := mock.Job() - assert.Nil(state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job)) + must.NoError(t, state.UpsertJob(structs.MsgTypeTestSetup, 1000, nil, job)) prefix := job.ID[:len(job.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - assert.Contains(res, job.ID) + must.SliceContains(t, res, job.ID) } func TestStatusCommand_Run_HostNetwork(t *testing.T) { @@ -261,7 +247,7 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) { verbose: false, assertions: func(out string) { hostNetworksRegexpStr := `Host Networks\s+=\s+internal\n` - require.Regexp(t, regexp.MustCompile(hostNetworksRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(hostNetworksRegexpStr), out) }, }, { @@ -274,10 +260,10 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) { verbose: true, assertions: func(out string) { verboseHostNetworksHeadRegexpStr := `Name\s+CIDR\s+Interface\s+ReservedPorts\n` - require.Regexp(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out) verboseHostNetworksBodyRegexpStr := `internal\s+127\.0\.0\.1/8\s+lo\s+\n` - require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out) }, }, { @@ -289,10 +275,10 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) { verbose: true, assertions: func(out string) { verboseHostNetworksHeadRegexpStr := `Name\s+CIDR\s+Interface\s+ReservedPorts\n` - require.Regexp(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out) verboseHostNetworksBodyRegexpStr := `public\s+10\.199\.0\.200/24\s+\s+\n` - require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out) }, }, { @@ -305,10 +291,10 @@ func TestStatusCommand_Run_HostNetwork(t *testing.T) { verbose: true, assertions: func(out string) { verboseHostNetworksHeadRegexpStr := `Name\s+CIDR\s+Interface\s+ReservedPorts\n` - require.Regexp(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksHeadRegexpStr), out) verboseHostNetworksBodyRegexpStr := `public\s+10\.199\.0\.200/24\s+\s+8080,8081\n` - require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out) + must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out) }, }, } diff --git a/command/tls_ca_create_test.go b/command/tls_ca_create_test.go index 90f11037c..30f70c0a9 100644 --- a/command/tls_ca_create_test.go +++ b/command/tls_ca_create_test.go @@ -11,14 +11,14 @@ import ( "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestCACreateCommand(t *testing.T) { testDir := t.TempDir() previousDirectory, err := os.Getwd() - require.NoError(t, err) - require.NoError(t, os.Chdir(testDir)) + must.NoError(t, err) + must.NoError(t, os.Chdir(testDir)) defer os.Chdir(previousDirectory) type testcase struct { @@ -35,9 +35,9 @@ func TestCACreateCommand(t *testing.T) { "nomad-agent-ca.pem", "nomad-agent-ca-key.pem", func(t *testing.T, cert *x509.Certificate) { - require.Equal(t, 1825*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour)) - require.False(t, cert.PermittedDNSDomainsCritical) - require.Len(t, cert.PermittedDNSDomains, 0) + must.Eq(t, 1825*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour)) + must.False(t, cert.PermittedDNSDomainsCritical) + must.SliceEmpty(t, cert.PermittedDNSDomains) }, }, {"ca custom domain", @@ -48,7 +48,7 @@ func TestCACreateCommand(t *testing.T) { "foo.com-agent-ca.pem", "foo.com-agent-ca-key.pem", func(t *testing.T, cert *x509.Certificate) { - require.ElementsMatch(t, cert.PermittedDNSDomains, []string{"nomad", "foo.com", "localhost"}) + must.SliceContainsAll(t, cert.PermittedDNSDomains, []string{"nomad", "foo.com", "localhost"}) }, }, {"ca options", @@ -65,14 +65,14 @@ func TestCACreateCommand(t *testing.T) { "foo-agent-ca.pem", "foo-agent-ca-key.pem", func(t *testing.T, cert *x509.Certificate) { - require.Equal(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour)) - require.True(t, cert.PermittedDNSDomainsCritical) - require.Len(t, cert.PermittedDNSDomains, 4) - require.ElementsMatch(t, cert.PermittedDNSDomains, []string{"nomad", "foo", "localhost", "bar"}) - require.Equal(t, cert.Issuer.Organization, []string{"CustOrg"}) - require.Equal(t, cert.Issuer.OrganizationalUnit, []string{"CustOrgUnit"}) - require.Equal(t, cert.Issuer.Country, []string{"ZZ"}) - require.Contains(t, cert.Issuer.CommonName, "CustomCA") + must.Eq(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour)) + must.True(t, cert.PermittedDNSDomainsCritical) + must.Len(t, 4, cert.PermittedDNSDomains) + must.SliceContainsAll(t, cert.PermittedDNSDomains, []string{"nomad", "foo", "localhost", "bar"}) + must.Eq(t, cert.Issuer.Organization, []string{"CustOrg"}) + must.Eq(t, cert.Issuer.OrganizationalUnit, []string{"CustOrgUnit"}) + must.Eq(t, cert.Issuer.Country, []string{"ZZ"}) + must.StrHasPrefix(t, "CustomCA", cert.Issuer.CommonName) }, }, {"ca custom date", @@ -82,7 +82,7 @@ func TestCACreateCommand(t *testing.T) { "nomad-agent-ca.pem", "nomad-agent-ca-key.pem", func(t *testing.T, cert *x509.Certificate) { - require.Equal(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour)) + must.Eq(t, 365*24*time.Hour, time.Until(cert.NotAfter).Round(24*time.Hour)) }, }, } @@ -91,20 +91,20 @@ func TestCACreateCommand(t *testing.T) { t.Run(tc.name, func(t *testing.T) { ui := cli.NewMockUi() cmd := &TLSCACreateCommand{Meta: Meta{Ui: ui}} - require.Equal(t, 0, cmd.Run(tc.args), ui.ErrorWriter.String()) - require.Equal(t, "", ui.ErrorWriter.String()) + must.Zero(t, cmd.Run(tc.args)) + must.Eq(t, "", ui.ErrorWriter.String()) // is a valid key key := testutil.IsValidSigner(t, tc.keyPath) - require.True(t, key) + must.True(t, key) // is a valid ca expects the ca ca := testutil.IsValidCertificate(t, tc.caPath) - require.True(t, ca.BasicConstraintsValid) - require.Equal(t, x509.KeyUsageCertSign|x509.KeyUsageCRLSign|x509.KeyUsageDigitalSignature, ca.KeyUsage) - require.True(t, ca.IsCA) - require.Equal(t, ca.AuthorityKeyId, ca.SubjectKeyId) + must.True(t, ca.BasicConstraintsValid) + must.Eq(t, x509.KeyUsageCertSign|x509.KeyUsageCRLSign|x509.KeyUsageDigitalSignature, ca.KeyUsage) + must.True(t, ca.IsCA) + must.Eq(t, ca.AuthorityKeyId, ca.SubjectKeyId) tc.extraCheck(t, ca) - require.NoError(t, os.Remove(tc.caPath)) - require.NoError(t, os.Remove(tc.keyPath)) + must.NoError(t, os.Remove(tc.caPath)) + must.NoError(t, os.Remove(tc.keyPath)) }) } } diff --git a/command/tls_cert_create_test.go b/command/tls_cert_create_test.go index 68f92c4d1..b48c1fc00 100644 --- a/command/tls_cert_create_test.go +++ b/command/tls_cert_create_test.go @@ -13,7 +13,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/testutil" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestTlsCertCreateCommand_InvalidArgs(t *testing.T) { @@ -48,12 +48,12 @@ func TestTlsCertCreateCommand_InvalidArgs(t *testing.T) { ci.Parallel(t) ui := cli.NewMockUi() cmd := &TLSCertCreateCommand{Meta: Meta{Ui: ui}} - require.NotEqual(t, 0, cmd.Run(tc.args)) + must.Positive(t, cmd.Run(tc.args)) got := ui.ErrorWriter.String() if tc.expectErr == "" { - require.NotEmpty(t, got) // don't care + must.NotNil(t, got) } else { - require.Contains(t, got, tc.expectErr) + must.StrContains(t, got, tc.expectErr) } }) } @@ -62,8 +62,8 @@ func TestTlsCertCreateCommand_InvalidArgs(t *testing.T) { func TestTlsCertCreateCommandDefaults_fileCreate(t *testing.T) { testDir := t.TempDir() previousDirectory, err := os.Getwd() - require.NoError(t, err) - require.NoError(t, os.Chdir(testDir)) + must.NoError(t, err) + must.NoError(t, os.Chdir(testDir)) defer os.Chdir(previousDirectory) ui := cli.NewMockUi() @@ -143,34 +143,34 @@ func TestTlsCertCreateCommandDefaults_fileCreate(t *testing.T) { for _, tc := range cases { tc := tc - require.True(t, t.Run(tc.name, func(t *testing.T) { + must.True(t, t.Run(tc.name, func(t *testing.T) { ui := cli.NewMockUi() cmd := &TLSCertCreateCommand{Meta: Meta{Ui: ui}} - require.Equal(t, 0, cmd.Run(tc.args)) - require.Equal(t, tc.errOut, ui.ErrorWriter.String()) + must.Zero(t, cmd.Run(tc.args)) + must.Eq(t, tc.errOut, ui.ErrorWriter.String()) // is a valid cert expects the cert cert := testutil.IsValidCertificate(t, tc.certPath) - require.Equal(t, tc.expectCN, cert.Subject.CommonName) - require.True(t, cert.BasicConstraintsValid) - require.Equal(t, x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment, cert.KeyUsage) + must.Eq(t, tc.expectCN, cert.Subject.CommonName) + must.True(t, cert.BasicConstraintsValid) + must.Eq(t, x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment, cert.KeyUsage) switch tc.typ { case "server": - require.Equal(t, + must.Eq(t, []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, cert.ExtKeyUsage) case "client": - require.Equal(t, + must.Eq(t, []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, cert.ExtKeyUsage) case "cli": - require.Equal(t, + must.Eq(t, []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}, cert.ExtKeyUsage) } - require.False(t, cert.IsCA) - require.Equal(t, tc.expectDNS, cert.DNSNames) - require.Equal(t, tc.expectIP, cert.IPAddresses) + must.False(t, cert.IsCA) + must.Eq(t, tc.expectDNS, cert.DNSNames) + must.Eq(t, tc.expectIP, cert.IPAddresses) })) } } @@ -310,7 +310,7 @@ func TestTlsRecordPreparation(t *testing.T) { for _, tc := range cases { tc := tc - require.True(t, t.Run(tc.name, func(t *testing.T) { + must.True(t, t.Run(tc.name, func(t *testing.T) { var ipAddresses []net.IP for _, i := range tc.ipAddresses { if len(i) > 0 { @@ -319,11 +319,11 @@ func TestTlsRecordPreparation(t *testing.T) { } ipAddresses, dnsNames, name, extKeyUsage, prefix := recordPreparation(tc.certType, tc.regionName, tc.domain, tc.dnsNames, ipAddresses) - require.Equal(t, tc.expectedipAddresses, ipAddresses) - require.Equal(t, tc.expectedDNSNames, dnsNames) - require.Equal(t, tc.expectedName, name) - require.Equal(t, tc.expectedextKeyUsage, extKeyUsage) - require.Equal(t, tc.expectedPrefix, prefix) + must.Eq(t, tc.expectedipAddresses, ipAddresses) + must.Eq(t, tc.expectedDNSNames, dnsNames) + must.Eq(t, tc.expectedName, name) + must.Eq(t, tc.expectedextKeyUsage, extKeyUsage) + must.Eq(t, tc.expectedPrefix, prefix) })) } } diff --git a/command/ui_test.go b/command/ui_test.go index 7cfcf10a5..144342fcc 100644 --- a/command/ui_test.go +++ b/command/ui_test.go @@ -9,7 +9,7 @@ import ( "testing" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestCommand_Ui(t *testing.T) { @@ -102,13 +102,12 @@ func TestCommand_Ui(t *testing.T) { // Don't try to open a browser. args := append(tc.Args, "-show-url") - if code := cmd.Run(args); code != 0 { - require.Equal(t, 0, code, "expected exit code 0, got %d", code) - } + code := cmd.Run(args) + must.Zero(t, code) got := ui.OutputWriter.String() expected := fmt.Sprintf("URL for web UI: %s", tc.ExpectedURL) - require.Equal(t, expected, strings.TrimSpace(got)) + must.Eq(t, expected, strings.TrimSpace(got)) }) } } diff --git a/command/var_get_test.go b/command/var_get_test.go index c0aaab4c0..16d33de02 100644 --- a/command/var_get_test.go +++ b/command/var_get_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestVarGetCommand_Implements(t *testing.T) { @@ -28,18 +28,17 @@ func TestVarGetCommand_Fails(t *testing.T) { cmd := &VarGetCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"some", "bad", "args"}) out := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit code 1, got: %d") - require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out) + must.One(t, code) + must.StrContains(t, out, commandErrorText(cmd)) }) t.Run("bad_address", func(t *testing.T) { ci.Parallel(t) ui := cli.NewMockUi() cmd := &VarGetCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"-address=nope", "foo"}) - out := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit code 1, got: %d") - require.Contains(t, ui.ErrorWriter.String(), "retrieving variable", "connection error, got: %s", out) - require.Zero(t, ui.OutputWriter.String()) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "retrieving variable") + must.Eq(t, "", ui.OutputWriter.String()) }) t.Run("missing_template", func(t *testing.T) { ci.Parallel(t) @@ -47,9 +46,9 @@ func TestVarGetCommand_Fails(t *testing.T) { cmd := &VarGetCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-out=go-template`, "foo"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, errMissingTemplate+"\n"+commandErrorText(cmd), out) - require.Zero(t, ui.OutputWriter.String()) + must.One(t, code) + must.Eq(t, errMissingTemplate+"\n"+commandErrorText(cmd), out) + must.Eq(t, "", ui.OutputWriter.String()) }) t.Run("unexpected_template", func(t *testing.T) { ci.Parallel(t) @@ -57,9 +56,9 @@ func TestVarGetCommand_Fails(t *testing.T) { cmd := &VarGetCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-out=json`, `-template="bad"`, "foo"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out) - require.Zero(t, ui.OutputWriter.String()) + must.One(t, code) + must.Eq(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out) + must.Eq(t, "", ui.OutputWriter.String()) }) } @@ -110,7 +109,7 @@ func TestVarGetCommand(t *testing.T) { // Create a namespace for the test case testNS := strings.Map(validNS, t.Name()) _, err = client.Namespaces().Register(&api.Namespace{Name: testNS}, nil) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { _, _ = client.Namespaces().Delete(testNS, nil) }) @@ -119,7 +118,7 @@ func TestVarGetCommand(t *testing.T) { sv := testVariable() sv.Namespace = testNS sv, _, err = client.Variables().Create(sv, nil) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { _, _ = client.Variables().Delete(sv.Path, nil) }) @@ -143,22 +142,22 @@ func TestVarGetCommand(t *testing.T) { code := cmd.Run(args) // Check the output - require.Equal(t, tc.exitCode, code, "expected exit %v, got: %d; %v", tc.exitCode, code, ui.ErrorWriter.String()) + must.Eq(t, tc.exitCode, code) if tc.isError { - require.Equal(t, tc.expected, strings.TrimSpace(ui.ErrorWriter.String())) + must.Eq(t, tc.expected, strings.TrimSpace(ui.ErrorWriter.String())) return } switch tc.format { case "json": - require.Equal(t, sv.AsPrettyJSON(), strings.TrimSpace(ui.OutputWriter.String())) + must.Eq(t, sv.AsPrettyJSON(), strings.TrimSpace(ui.OutputWriter.String())) case "table": out := ui.OutputWriter.String() outs := strings.Split(out, "\n") - require.Len(t, outs, 9) - require.Equal(t, "Namespace = "+testNS, outs[0]) - require.Equal(t, "Path = test/var", outs[1]) + must.Len(t, 9, outs) + must.Eq(t, "Namespace = "+testNS, outs[0]) + must.Eq(t, "Path = test/var", outs[1]) case "go-template": - require.Equal(t, tc.expected, strings.TrimSpace(ui.OutputWriter.String())) + must.Eq(t, tc.expected, strings.TrimSpace(ui.OutputWriter.String())) default: t.Fatalf("invalid format: %q", tc.format) } @@ -173,7 +172,7 @@ func TestVarGetCommand(t *testing.T) { // Create a var testNS := strings.Map(validNS, t.Name()) _, err := client.Namespaces().Register(&api.Namespace{Name: testNS}, nil) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { _, _ = client.Namespaces().Delete(testNS, nil) }) @@ -182,7 +181,7 @@ func TestVarGetCommand(t *testing.T) { sv.Path = "special/variable" sv.Namespace = testNS sv, _, err = client.Variables().Create(sv, nil) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { _, _ = client.Variables().Delete(sv.Path, nil) }) @@ -191,8 +190,8 @@ func TestVarGetCommand(t *testing.T) { predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, sv.Path, res[0]) + must.Len(t, 1, res) + must.Eq(t, sv.Path, res[0]) }) } diff --git a/command/var_init_test.go b/command/var_init_test.go index 86523c356..7d835ab62 100644 --- a/command/var_init_test.go +++ b/command/var_init_test.go @@ -10,7 +10,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestVarInitCommand_Implements(t *testing.T) { @@ -22,9 +22,9 @@ func TestVarInitCommand_Run(t *testing.T) { ci.Parallel(t) dir := t.TempDir() origDir, err := os.Getwd() - require.NoError(t, err) + must.NoError(t, err) err = os.Chdir(dir) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { os.Chdir(origDir) }) t.Run("hcl", func(t *testing.T) { @@ -35,41 +35,41 @@ func TestVarInitCommand_Run(t *testing.T) { // Fails on misuse ec := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, ec) - require.Contains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) - require.Empty(t, ui.OutputWriter.String()) + must.One(t, ec) + must.StrContains(t, ui.ErrorWriter.String(), commandErrorText(cmd)) + must.Eq(t, "", ui.OutputWriter.String()) reset(ui) // Works if the file doesn't exist ec = cmd.Run([]string{"-out", "hcl"}) - require.Empty(t, ui.ErrorWriter.String()) - require.Equal(t, "Example variable specification written to spec.nv.hcl\n", ui.OutputWriter.String()) - require.Zero(t, ec) + must.Eq(t, "", ui.ErrorWriter.String()) + must.Eq(t, "Example variable specification written to spec.nv.hcl\n", ui.OutputWriter.String()) + must.Zero(t, ec) reset(ui) t.Cleanup(func() { os.Remove(path.Join(dir, "spec.nv.hcl")) }) content, err := os.ReadFile(DefaultHclVarInitName) - require.NoError(t, err) - require.Equal(t, defaultHclVarSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultHclVarSpec, string(content)) // Fails if the file exists ec = cmd.Run([]string{"-out", "hcl"}) - require.Contains(t, ui.ErrorWriter.String(), "exists") - require.Empty(t, ui.OutputWriter.String()) - require.Equal(t, 1, ec) + must.StrContains(t, ui.ErrorWriter.String(), "exists") + must.Eq(t, "", ui.OutputWriter.String()) + must.One(t, ec) reset(ui) // Works if file is passed ec = cmd.Run([]string{"-out", "hcl", "myTest.hcl"}) - require.Empty(t, ui.ErrorWriter.String()) - require.Equal(t, "Example variable specification written to myTest.hcl\n", ui.OutputWriter.String()) - require.Zero(t, ec) + must.Eq(t, "", ui.ErrorWriter.String()) + must.Eq(t, "Example variable specification written to myTest.hcl\n", ui.OutputWriter.String()) + must.Zero(t, ec) reset(ui) t.Cleanup(func() { os.Remove(path.Join(dir, "myTest.hcl")) }) content, err = os.ReadFile("myTest.hcl") - require.NoError(t, err) - require.Equal(t, defaultHclVarSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultHclVarSpec, string(content)) }) t.Run("json", func(t *testing.T) { ci.Parallel(t) @@ -79,41 +79,41 @@ func TestVarInitCommand_Run(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) - require.Contains(t, ui.ErrorWriter.String(), "This command takes no arguments or one") - require.Empty(t, ui.OutputWriter.String()) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "This command takes no arguments or one") + must.Eq(t, "", ui.OutputWriter.String()) reset(ui) // Works if the file doesn't exist code = cmd.Run([]string{"-out", "json"}) - require.Contains(t, ui.ErrorWriter.String(), "REMINDER: While keys") - require.Contains(t, ui.OutputWriter.String(), "Example variable specification written to spec.nv.json\n") - require.Zero(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "REMINDER: While keys") + must.StrContains(t, ui.OutputWriter.String(), "Example variable specification written to spec.nv.json\n") + must.Zero(t, code) reset(ui) t.Cleanup(func() { os.Remove(path.Join(dir, "spec.nv.json")) }) content, err := os.ReadFile(DefaultJsonVarInitName) - require.NoError(t, err) - require.Equal(t, defaultJsonVarSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultJsonVarSpec, string(content)) // Fails if the file exists code = cmd.Run([]string{"-out", "json"}) - require.Contains(t, ui.ErrorWriter.String(), "exists") - require.Empty(t, ui.OutputWriter.String()) - require.Equal(t, 1, code) + must.StrContains(t, ui.ErrorWriter.String(), "exists") + must.Eq(t, "", ui.OutputWriter.String()) + must.One(t, code) reset(ui) // Works if file is passed code = cmd.Run([]string{"-out", "json", "myTest.json"}) - require.Contains(t, ui.ErrorWriter.String(), "REMINDER: While keys") - require.Contains(t, ui.OutputWriter.String(), "Example variable specification written to myTest.json\n") - require.Zero(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "REMINDER: While keys") + must.StrContains(t, ui.OutputWriter.String(), "Example variable specification written to myTest.json\n") + must.Zero(t, code) reset(ui) t.Cleanup(func() { os.Remove(path.Join(dir, "myTest.json")) }) content, err = os.ReadFile("myTest.json") - require.NoError(t, err) - require.Equal(t, defaultJsonVarSpec, string(content)) + must.NoError(t, err) + must.Eq(t, defaultJsonVarSpec, string(content)) }) } diff --git a/command/var_list_test.go b/command/var_list_test.go index ce18d99e2..3194cea46 100644 --- a/command/var_list_test.go +++ b/command/var_list_test.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestVarListCommand_Implements(t *testing.T) { @@ -81,36 +80,29 @@ func TestVarListCommand_Offline(t *testing.T) { errOut := ui.ErrorWriter.String() defer resetUiWriters(ui) - require.Equal(t, tC.exitCode, ec, - "Expected exit code %v; got: %v\nstdout: %s\nstderr: %s", - tC.exitCode, ec, stdOut, errOut, - ) + must.Eq(t, tC.exitCode, ec) if tC.expectUsage { help := cmd.Help() - require.Equal(t, help, strings.TrimSpace(stdOut)) + must.Eq(t, help, strings.TrimSpace(stdOut)) // Test that stdout ends with a linefeed since we trim them for // convenience in the equality tests. - require.True(t, strings.HasSuffix(stdOut, "\n"), - "stdout does not end with a linefeed") + must.True(t, strings.HasSuffix(stdOut, "\n")) } if tC.expectUsageError { - require.Contains(t, errOut, commandErrorText(cmd)) + must.StrContains(t, errOut, commandErrorText(cmd)) } if tC.expectStdOut != "" { - require.Equal(t, tC.expectStdOut, strings.TrimSpace(stdOut)) + must.Eq(t, tC.expectStdOut, strings.TrimSpace(stdOut)) // Test that stdout ends with a linefeed since we trim them for // convenience in the equality tests. - require.True(t, strings.HasSuffix(stdOut, "\n"), - "stdout does not end with a linefeed") + must.True(t, strings.HasSuffix(stdOut, "\n")) } if tC.expectStdErrPrefix != "" { - require.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix), - "Expected stderr to start with %q; got %s", - tC.expectStdErrPrefix, errOut) + must.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix)) + // Test that stderr ends with a linefeed since we trim them for // convenience in the equality tests. - require.True(t, strings.HasSuffix(errOut, "\n"), - "stderr does not end with a linefeed") + must.True(t, strings.HasSuffix(errOut, "\n")) } }) } @@ -140,10 +132,10 @@ func TestVarListCommand_Online(t *testing.T) { expect := expect exp, ok := expect.(NSPather) - require.True(t, ok, "expect is not an NSPather, got %T", expect) + must.True(t, ok) in, ok := check.(NSPather) - require.True(t, ok, "check is not an NSPather, got %T", check) - require.ElementsMatch(t, exp.NSPaths(), in.NSPaths()) + must.True(t, ok) + must.Eq(t, exp.NSPaths(), in.NSPaths()) } return out } @@ -153,11 +145,9 @@ func TestVarListCommand_Online(t *testing.T) { length := length in, ok := check.(NSPather) - require.True(t, ok, "check is not an NSPather, got %T", check) + must.True(t, ok) inLen := in.NSPaths().Len() - require.Equal(t, length, inLen, - "expected length of %v, got %v. \nvalues: %v", - length, inLen, in.NSPaths()) + must.Eq(t, length, inLen) } return out } @@ -285,34 +275,28 @@ func TestVarListCommand_Online(t *testing.T) { errOut := ui.ErrorWriter.String() defer resetUiWriters(ui) - require.Equal(t, tC.exitCode, code, - "Expected exit code %v; got: %v\nstdout: %s\nstderr: %s", - tC.exitCode, code, stdOut, errOut) + must.Eq(t, tC.exitCode, code) if tC.expectStdOut != "" { - require.Equal(t, tC.expectStdOut, strings.TrimSpace(stdOut)) + must.Eq(t, tC.expectStdOut, strings.TrimSpace(stdOut)) // Test that stdout ends with a linefeed since we trim them for // convenience in the equality tests. - require.True(t, strings.HasSuffix(stdOut, "\n"), - "stdout does not end with a linefeed") + must.True(t, strings.HasSuffix(stdOut, "\n")) } if tC.expectStdErrPrefix != "" { - require.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix), - "Expected stderr to start with %q; got %s", - tC.expectStdErrPrefix, errOut) + must.True(t, strings.HasPrefix(errOut, tC.expectStdErrPrefix)) // Test that stderr ends with a linefeed since this test only // considers prefixes. - require.True(t, strings.HasSuffix(stdOut, "\n"), - "stderr does not end with a linefeed") + must.True(t, strings.HasSuffix(stdOut, "\n")) } if tC.jsonTest != nil { jtC := tC.jsonTest err := json.Unmarshal([]byte(stdOut), &jtC.jsonDest) - require.NoError(t, err, "stdout: %s", stdOut) + must.NoError(t, err) for _, fn := range jtC.expectFns { fn(t, jtC.jsonDest) diff --git a/command/var_lock_test.go b/command/var_lock_test.go index 4df597a8c..87e1ea060 100644 --- a/command/var_lock_test.go +++ b/command/var_lock_test.go @@ -12,7 +12,6 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestVarLockCommand_Implements(t *testing.T) { @@ -99,7 +98,7 @@ func TestVarLockCommand_Good(t *testing.T) { // Get the variable code := cmd.Run([]string{"-address=" + url, "test/var/shell", "touch ", filePath}) - require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String()) + must.Zero(t, code) sv, _, err := srv.APIClient().Variables().Peek("test/var/shell", nil) must.NoError(t, err) @@ -133,7 +132,7 @@ func TestVarLockCommand_Good_NoShell(t *testing.T) { // Get the variable code := cmd.Run([]string{"-address=" + url, "-shell=false", "test/var/noShell", "touch", filePath}) - require.Zero(t, 0, code) + must.Zero(t, code) sv, _, err := srv.APIClient().Variables().Peek("test/var/noShell", nil) must.NoError(t, err) diff --git a/command/var_purge_test.go b/command/var_purge_test.go index a2214acde..94727c51d 100644 --- a/command/var_purge_test.go +++ b/command/var_purge_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestVarPurgeCommand_Implements(t *testing.T) { @@ -27,18 +27,17 @@ func TestVarPurgeCommand_Fails(t *testing.T) { cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"some", "bad", "args"}) out := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit code 1, got: %d") - require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out) + must.One(t, code) + must.StrContains(t, out, commandErrorText(cmd)) }) t.Run("bad_address", func(t *testing.T) { ci.Parallel(t) ui := cli.NewMockUi() cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"-address=nope", "foo"}) - out := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit code 1, got: %d") - require.Contains(t, ui.ErrorWriter.String(), "purging variable", "connection error, got: %s", out) - require.Zero(t, ui.OutputWriter.String()) + must.One(t, code) + must.StrContains(t, ui.ErrorWriter.String(), "purging variable") + must.Eq(t, "", ui.OutputWriter.String()) }) t.Run("bad_check_index/syntax", func(t *testing.T) { ci.Parallel(t) @@ -46,9 +45,9 @@ func TestVarPurgeCommand_Fails(t *testing.T) { cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-check-index=a`, "foo"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, `Invalid -check-index value "a": not parsable as uint64`, out) - require.Zero(t, ui.OutputWriter.String()) + must.One(t, code) + must.Eq(t, `Invalid -check-index value "a": not parsable as uint64`, out) + must.Eq(t, "", ui.OutputWriter.String()) }) t.Run("bad_check_index/range", func(t *testing.T) { ci.Parallel(t) @@ -56,9 +55,9 @@ func TestVarPurgeCommand_Fails(t *testing.T) { cmd := &VarPurgeCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-check-index=18446744073709551616`, "foo"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, `Invalid -check-index value "18446744073709551616": out of range for uint64`, out) - require.Zero(t, ui.OutputWriter.String()) + must.One(t, code) + must.Eq(t, `Invalid -check-index value "18446744073709551616": out of range for uint64`, out) + must.Eq(t, "", ui.OutputWriter.String()) }) } @@ -76,16 +75,16 @@ func TestVarPurgeCommand_Online(t *testing.T) { // Create a var to delete sv := testVariable() _, _, err := client.Variables().Create(sv, nil) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { _, _ = client.Variables().Delete(sv.Path, nil) }) // Delete the variable code := cmd.Run([]string{"-address=" + url, sv.Path}) - require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String()) + must.Zero(t, code) vars, _, err := client.Variables().List(nil) - require.NoError(t, err) - require.Len(t, vars, 0) + must.NoError(t, err) + must.SliceEmpty(t, vars) }) t.Run("unchecked", func(t *testing.T) { @@ -96,20 +95,20 @@ func TestVarPurgeCommand_Online(t *testing.T) { // Create a var to delete sv := testVariable() sv, _, err := client.Variables().Create(sv, nil) - require.NoError(t, err) + must.NoError(t, err) // Delete a variable code := cmd.Run([]string{"-address=" + url, "-check-index=1", sv.Path}) stderr := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit 1, got: %d; %v", code, stderr) - require.Contains(t, stderr, "\nCheck-and-Set conflict\n\n Your provided check-index (1)") + must.One(t, code) + must.StrContains(t, stderr, "\nCheck-and-Set conflict\n\n Your provided check-index (1)") code = cmd.Run([]string{"-address=" + url, fmt.Sprintf("-check-index=%v", sv.ModifyIndex), sv.Path}) - require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String()) + must.Zero(t, code) vars, _, err := client.Variables().List(nil) - require.NoError(t, err) - require.Len(t, vars, 0) + must.NoError(t, err) + must.SliceEmpty(t, vars) }) t.Run("autocompleteArgs", func(t *testing.T) { @@ -121,14 +120,14 @@ func TestVarPurgeCommand_Online(t *testing.T) { sv := testVariable() sv.Path = "autocomplete/test" _, _, err := client.Variables().Create(sv, nil) - require.NoError(t, err) + must.NoError(t, err) t.Cleanup(func() { client.Variables().Delete(sv.Path, nil) }) args := complete.Args{Last: "aut"} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, sv.Path, res[0]) + must.Len(t, 1, res) + must.Eq(t, sv.Path, res[0]) }) } diff --git a/command/var_put_test.go b/command/var_put_test.go index b724f201f..a6fd6cd3b 100644 --- a/command/var_put_test.go +++ b/command/var_put_test.go @@ -16,7 +16,6 @@ import ( "github.com/mitchellh/cli" "github.com/posener/complete" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func TestVarPutCommand_Implements(t *testing.T) { @@ -31,8 +30,8 @@ func TestVarPutCommand_Fails(t *testing.T) { cmd := &VarPutCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"-bad-flag"}) out := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit code 1, got: %d") - require.Contains(t, out, commandErrorText(cmd), "expected help output, got: %s", out) + must.One(t, code) + must.StrContains(t, out, commandErrorText(cmd)) }) t.Run("bad_address", func(t *testing.T) { ci.Parallel(t) @@ -40,8 +39,8 @@ func TestVarPutCommand_Fails(t *testing.T) { cmd := &VarPutCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{"-address=nope", "foo", "-"}) out := ui.ErrorWriter.String() - require.Equal(t, 1, code, "expected exit code 1, got: %d") - require.Contains(t, out, "Error creating variable", "expected error creating variable, got: %s", out) + must.One(t, code) + must.StrContains(t, out, "Error creating variable") }) t.Run("missing_template", func(t *testing.T) { ci.Parallel(t) @@ -49,8 +48,8 @@ func TestVarPutCommand_Fails(t *testing.T) { cmd := &VarPutCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-out=go-template`, "foo", "-"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, errMissingTemplate+"\n"+commandErrorText(cmd), out) + must.One(t, code) + must.Eq(t, errMissingTemplate+"\n"+commandErrorText(cmd), out) }) t.Run("unexpected_template", func(t *testing.T) { ci.Parallel(t) @@ -58,8 +57,8 @@ func TestVarPutCommand_Fails(t *testing.T) { cmd := &VarPutCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-out=json`, `-template="bad"`, "foo", "-"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out) + must.One(t, code) + must.Eq(t, errUnexpectedTemplate+"\n"+commandErrorText(cmd), out) }) t.Run("bad_in", func(t *testing.T) { ci.Parallel(t) @@ -67,8 +66,8 @@ func TestVarPutCommand_Fails(t *testing.T) { cmd := &VarPutCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-in=bad`, "foo", "-"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, errInvalidInFormat+"\n"+commandErrorText(cmd), out) + must.One(t, code) + must.Eq(t, errInvalidInFormat+"\n"+commandErrorText(cmd), out) }) t.Run("wildcard_namespace", func(t *testing.T) { ci.Parallel(t) @@ -76,8 +75,8 @@ func TestVarPutCommand_Fails(t *testing.T) { cmd := &VarPutCommand{Meta: Meta{Ui: ui}} code := cmd.Run([]string{`-namespace=*`, "foo", "-"}) out := strings.TrimSpace(ui.ErrorWriter.String()) - require.Equal(t, 1, code, "expected exit code 1, got: %d", code) - require.Equal(t, errWildcardNamespaceNotAllowed, out) + must.One(t, code) + must.Eq(t, errWildcardNamespaceNotAllowed, out) }) } @@ -93,7 +92,7 @@ func TestVarPutCommand_GoodJson(t *testing.T) { // Get the variable code := cmd.Run([]string{"-address=" + url, "-out=json", "test/var", "k1=v1", "k2=v2"}) - require.Equal(t, 0, code, "expected exit 0, got: %d; %v", code, ui.ErrorWriter.String()) + must.Zero(t, code) t.Cleanup(func() { _, _ = client.Variables().Delete("test/var", nil) @@ -102,10 +101,10 @@ func TestVarPutCommand_GoodJson(t *testing.T) { var outVar api.Variable b := ui.OutputWriter.Bytes() err := json.Unmarshal(b, &outVar) - require.NoError(t, err, "error unmarshaling json: %v\nb: %s", err, b) - require.Equal(t, "default", outVar.Namespace) - require.Equal(t, "test/var", outVar.Path) - require.Equal(t, api.VariableItems{"k1": "v1", "k2": "v2"}, outVar.Items) + must.NoError(t, err) + must.Eq(t, "default", outVar.Namespace) + must.Eq(t, "test/var", outVar.Path) + must.Eq(t, api.VariableItems{"k1": "v1", "k2": "v2"}, outVar.Items) } func TestVarPutCommand_FlagsWithSpec(t *testing.T) { @@ -153,14 +152,14 @@ func TestVarPutCommand_AutocompleteArgs(t *testing.T) { // Create a var sv := testVariable() _, _, err := client.Variables().Create(sv, nil) - require.NoError(t, err) + must.NoError(t, err) args := complete.Args{Last: "t"} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, sv.Path, res[0]) + must.Len(t, 1, res) + must.Eq(t, sv.Path, res[0]) } func TestVarPutCommand_KeyWarning(t *testing.T) { diff --git a/command/volume_register_test.go b/command/volume_register_test.go index b816a5b1e..5a757674b 100644 --- a/command/volume_register_test.go +++ b/command/volume_register_test.go @@ -9,7 +9,7 @@ import ( "github.com/hashicorp/hcl" "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestVolumeDispatchParse(t *testing.T) { @@ -35,13 +35,12 @@ rando = "bar" for _, c := range cases { t.Run(c.hcl, func(t *testing.T) { _, s, err := parseVolumeType(c.hcl) - require.Equal(t, c.t, s) + must.Eq(t, c.t, s) if c.err == "" { - require.NoError(t, err) + must.NoError(t, err) } else { - require.Contains(t, err.Error(), c.err) + must.ErrorContains(t, err, c.err) } - }) } } @@ -193,16 +192,14 @@ topology_request { for _, c := range cases { t.Run(c.name, func(t *testing.T) { ast, err := hcl.ParseString(c.hcl) - require.NoError(t, err) + must.NoError(t, err) vol, err := csiDecodeVolume(ast) if c.err == "" { - require.NoError(t, err) + must.NoError(t, err) } else { - require.Contains(t, err.Error(), c.err) + must.ErrorContains(t, err, c.err) } - require.Equal(t, c.expected, vol) - + must.Eq(t, c.expected, vol) }) - } } diff --git a/command/volume_status_test.go b/command/volume_status_test.go index d86b81cd9..0fde4610f 100644 --- a/command/volume_status_test.go +++ b/command/volume_status_test.go @@ -11,7 +11,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/mitchellh/cli" "github.com/posener/complete" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestCSIVolumeStatusCommand_Implements(t *testing.T) { @@ -26,10 +26,10 @@ func TestCSIVolumeStatusCommand_Fails(t *testing.T) { // Fails on misuse code := cmd.Run([]string{"some", "bad", "args"}) - require.Equal(t, 1, code) + must.One(t, code) out := ui.ErrorWriter.String() - require.Contains(t, out, commandErrorText(cmd)) + must.StrContains(t, out, commandErrorText(cmd)) ui.ErrorWriter.Reset() } @@ -50,13 +50,13 @@ func TestCSIVolumeStatusCommand_AutocompleteArgs(t *testing.T) { PluginID: "glade", } - require.NoError(t, state.UpsertCSIVolume(1000, []*structs.CSIVolume{vol})) + must.NoError(t, state.UpsertCSIVolume(1000, []*structs.CSIVolume{vol})) prefix := vol.ID[:len(vol.ID)-5] args := complete.Args{Last: prefix} predictor := cmd.AutocompleteArgs() res := predictor.Predict(args) - require.Equal(t, 1, len(res)) - require.Equal(t, vol.ID, res[0]) + must.Len(t, 1, res) + must.Eq(t, vol.ID, res[0]) } diff --git a/drivers/docker/cpuset_test.go b/drivers/docker/cpuset_test.go index 19cd32e09..c4a7ceffb 100644 --- a/drivers/docker/cpuset_test.go +++ b/drivers/docker/cpuset_test.go @@ -1,6 +1,8 @@ // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: BUSL-1.1 +//go:build linux + package docker import ( diff --git a/go.mod b/go.mod index 24885bb68..cfa2affc6 100644 --- a/go.mod +++ b/go.mod @@ -118,7 +118,7 @@ require ( github.com/shirou/gopsutil/v3 v3.23.9 github.com/shoenig/go-landlock v1.2.0 github.com/shoenig/go-m1cpu v0.1.6 - github.com/shoenig/test v1.7.0 + github.com/shoenig/test v1.7.1 github.com/stretchr/testify v1.8.4 github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 github.com/zclconf/go-cty v1.12.1 diff --git a/go.sum b/go.sum index 53a3f597f..72489b26e 100644 --- a/go.sum +++ b/go.sum @@ -1012,8 +1012,8 @@ github.com/shoenig/go-landlock v1.2.0/go.mod h1:S848L96G6iny3xexNb4sXUrKwEDIy5ul github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= -github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go index 609c9441a..c08c25da2 100644 --- a/jobspec/parse_test.go +++ b/jobspec/parse_test.go @@ -12,7 +12,7 @@ import ( capi "github.com/hashicorp/consul/api" "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/ci" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) // consts copied from nomad/structs package to keep jobspec isolated from rest of nomad @@ -1921,14 +1921,14 @@ func TestParse(t *testing.T) { t.Logf("Testing parse: %s", tc.File) path, err := filepath.Abs(filepath.Join("./test-fixtures", tc.File)) - require.NoError(t, err) + must.NoError(t, err) actual, err := ParseFile(path) if tc.Err { - require.Error(t, err) + must.Error(t, err) } else { - require.NoError(t, err) - require.Equal(t, tc.Result, actual) + must.NoError(t, err) + must.Eq(t, tc.Result, actual) } }) } @@ -1999,15 +1999,15 @@ func TestPortParsing(t *testing.T) { var job *api.Job path, err = filepath.Abs(filepath.Join("./test-fixtures", "parse-ports.hcl")) - require.NoError(t, err, "Can't get absolute path for file: parse-ports.hcl") + must.NoError(t, err, must.Sprint("Can't get absolute path for file: parse-ports.hcl")) job, err = ParseFile(path) - require.NoError(t, err, "cannot parse job") - require.NotNil(t, job) - require.Len(t, job.TaskGroups, 1) - require.Len(t, job.TaskGroups[0].Networks, 1) - require.Len(t, job.TaskGroups[0].Networks[0].ReservedPorts, 1) - require.Len(t, job.TaskGroups[0].Networks[0].DynamicPorts, 1) - require.Equal(t, 9000, job.TaskGroups[0].Networks[0].ReservedPorts[0].Value) - require.Equal(t, 0, job.TaskGroups[0].Networks[0].DynamicPorts[0].Value) + must.NoError(t, err) + must.NotNil(t, job) + must.Len(t, 1, job.TaskGroups) + must.Len(t, 1, job.TaskGroups[0].Networks) + must.Len(t, 1, job.TaskGroups[0].Networks[0].ReservedPorts) + must.Len(t, 1, job.TaskGroups[0].Networks[0].DynamicPorts) + must.Eq(t, 9000, job.TaskGroups[0].Networks[0].ReservedPorts[0].Value) + must.Eq(t, 0, job.TaskGroups[0].Networks[0].DynamicPorts[0].Value) } diff --git a/plugins/base/plugin_test.go b/plugins/base/plugin_test.go index 840ab116c..a8b374c2e 100644 --- a/plugins/base/plugin_test.go +++ b/plugins/base/plugin_test.go @@ -11,14 +11,13 @@ import ( "github.com/hashicorp/nomad/ci" "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/plugins/shared/hclspec" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/msgpack" ) func TestBasePlugin_PluginInfo_GRPC(t *testing.T) { ci.Parallel(t) - require := require.New(t) var ( apiVersions = []string{"v0.1.0", "v0.1.1"} @@ -69,22 +68,20 @@ func TestBasePlugin_PluginInfo_GRPC(t *testing.T) { } resp, err := impl.PluginInfo() - require.NoError(err) - require.Equal(apiVersions, resp.PluginApiVersions) - require.Equal(pluginVersion, resp.PluginVersion) - require.Equal(pluginName, resp.Name) - require.Equal(PluginTypeDriver, resp.Type) + must.NoError(t, err) + must.Eq(t, apiVersions, resp.PluginApiVersions) + must.Eq(t, pluginVersion, resp.PluginVersion) + must.Eq(t, pluginName, resp.Name) + must.Eq(t, PluginTypeDriver, resp.Type) // Swap the implementation to return an unknown type mock.PluginInfoF = unknownType _, err = impl.PluginInfo() - require.Error(err) - require.Contains(err.Error(), "unknown type") + must.ErrorContains(t, err, "unknown type") } func TestBasePlugin_ConfigSchema(t *testing.T) { ci.Parallel(t) - require := require.New(t) mock := &MockPlugin{ ConfigSchemaF: func() (*hclspec.Spec, error) { @@ -99,23 +96,18 @@ func TestBasePlugin_ConfigSchema(t *testing.T) { defer client.Close() raw, err := client.Dispense(PluginTypeBase) - if err != nil { - t.Fatalf("err: %s", err) - } + must.NoError(t, err) impl, ok := raw.(BasePlugin) - if !ok { - t.Fatalf("bad: %#v", raw) - } + must.True(t, ok) specOut, err := impl.ConfigSchema() - require.NoError(err) - require.True(pb.Equal(TestSpec, specOut)) + must.NoError(t, err) + must.True(t, pb.Equal(TestSpec, specOut)) } func TestBasePlugin_SetConfig(t *testing.T) { ci.Parallel(t) - require := require.New(t) var receivedData []byte mock := &MockPlugin{ @@ -138,29 +130,25 @@ func TestBasePlugin_SetConfig(t *testing.T) { defer client.Close() raw, err := client.Dispense(PluginTypeBase) - if err != nil { - t.Fatalf("err: %s", err) - } - + must.NoError(t, err) impl, ok := raw.(BasePlugin) - if !ok { - t.Fatalf("bad: %#v", raw) - } + must.True(t, ok) config := cty.ObjectVal(map[string]cty.Value{ "foo": cty.StringVal("v1"), "bar": cty.NumberIntVal(1337), "baz": cty.BoolVal(true), }) + cdata, err := msgpack.Marshal(config, config.Type()) - require.NoError(err) - require.NoError(impl.SetConfig(&Config{PluginConfig: cdata})) - require.Equal(cdata, receivedData) + must.NoError(t, err) + must.NoError(t, impl.SetConfig(&Config{PluginConfig: cdata})) + must.Eq(t, cdata, receivedData) // Decode the value back var actual TestConfig - require.NoError(structs.Decode(receivedData, &actual)) - require.Equal("v1", actual.Foo) - require.EqualValues(1337, actual.Bar) - require.True(actual.Baz) + must.NoError(t, structs.Decode(receivedData, &actual)) + must.Eq(t, "v1", actual.Foo) + must.Eq(t, 1337, actual.Bar) + must.True(t, actual.Baz) } diff --git a/plugins/csi/client_test.go b/plugins/csi/client_test.go index 45bfb4783..9ce8eb572 100644 --- a/plugins/csi/client_test.go +++ b/plugins/csi/client_test.go @@ -14,7 +14,6 @@ import ( csipbv1 "github.com/container-storage-interface/spec/lib/go/csi" "github.com/golang/protobuf/ptypes/wrappers" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -102,10 +101,10 @@ func TestClient_RPC_PluginProbe(t *testing.T) { resp, err := client.PluginProbe(context.TODO()) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponse, resp) + must.Eq(t, tc.ExpectedResponse, resp) }) } @@ -156,11 +155,11 @@ func TestClient_RPC_PluginInfo(t *testing.T) { name, version, err := client.PluginGetInfo(context.TODO()) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponseName, name) - require.Equal(t, tc.ExpectedResponseVersion, version) + must.Eq(t, tc.ExpectedResponseName, name) + must.Eq(t, tc.ExpectedResponseVersion, version) }) } @@ -223,10 +222,10 @@ func TestClient_RPC_PluginGetCapabilities(t *testing.T) { resp, err := client.PluginGetCapabilities(context.TODO()) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponse, resp) + must.Eq(t, tc.ExpectedResponse, resp) }) } } @@ -323,10 +322,10 @@ func TestClient_RPC_ControllerGetCapabilities(t *testing.T) { resp, err := client.ControllerGetCapabilities(context.TODO()) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponse, resp) + must.Eq(t, tc.ExpectedResponse, resp) }) } } @@ -383,10 +382,10 @@ func TestClient_RPC_NodeGetCapabilities(t *testing.T) { resp, err := client.NodeGetCapabilities(context.TODO()) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponse, resp) + must.Eq(t, tc.ExpectedResponse, resp) }) } } @@ -450,10 +449,10 @@ func TestClient_RPC_ControllerPublishVolume(t *testing.T) { resp, err := client.ControllerPublishVolume(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponse, resp) + must.Eq(t, tc.ExpectedResponse, resp) }) } } @@ -498,10 +497,10 @@ func TestClient_RPC_ControllerUnpublishVolume(t *testing.T) { resp, err := client.ControllerUnpublishVolume(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } - require.Equal(t, tc.ExpectedResponse, resp) + must.Eq(t, tc.ExpectedResponse, resp) }) } } @@ -723,9 +722,9 @@ func TestClient_RPC_ControllerValidateVolume(t *testing.T) { err := client.ControllerValidateCapabilities(context.TODO(), req) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } else { - require.NoError(t, err, tc.Name) + must.NoError(t, err, must.Sprint("name", tc.Name)) } }) } @@ -832,24 +831,24 @@ func TestClient_RPC_ControllerCreateVolume(t *testing.T) { resp, err := client.ControllerCreateVolume(context.TODO(), req) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) return } - require.NoError(t, err, tc.Name) + must.NoError(t, err, must.Sprint("name", tc.Name)) if tc.Response == nil { - require.Nil(t, resp) + must.Nil(t, resp) return } if tc.CapacityRange != nil { - require.Greater(t, resp.Volume.CapacityBytes, int64(0)) + must.Greater(t, 0, resp.Volume.CapacityBytes) } if tc.ContentSource != nil { - require.Equal(t, tc.ContentSource.CloneID, resp.Volume.ContentSource.CloneID) - require.Equal(t, tc.ContentSource.SnapshotID, resp.Volume.ContentSource.SnapshotID) + must.Eq(t, tc.ContentSource.CloneID, resp.Volume.ContentSource.CloneID) + must.Eq(t, tc.ContentSource.SnapshotID, resp.Volume.ContentSource.SnapshotID) } if tc.Response != nil && tc.Response.Volume != nil { - require.Len(t, resp.Volume.AccessibleTopology, 1) - require.Equal(t, + must.SliceLen(t, 1, resp.Volume.AccessibleTopology) + must.Eq(t, req.AccessibilityRequirements.Requisite[0].Segments, resp.Volume.AccessibleTopology[0].Segments, ) @@ -894,10 +893,10 @@ func TestClient_RPC_ControllerDeleteVolume(t *testing.T) { cc.NextErr = tc.ResponseErr err := client.ControllerDeleteVolume(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) return } - require.NoError(t, err, tc.Name) + must.NoError(t, err, must.Sprint("name", tc.Name)) }) } } @@ -987,11 +986,11 @@ func TestClient_RPC_ControllerListVolume(t *testing.T) { resp, err := client.ControllerListVolumes(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) return } - require.NoError(t, err, tc.Name) - require.NotNil(t, resp) + must.NoError(t, err, must.Sprint("name", tc.Name)) + must.NotNil(t, resp) }) } @@ -1054,11 +1053,11 @@ func TestClient_RPC_ControllerCreateSnapshot(t *testing.T) { // from protobuf to our struct resp, err := client.ControllerCreateSnapshot(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } else { - require.NoError(t, err, tc.Name) - require.NotZero(t, resp.Snapshot.CreateTime) - require.Equal(t, now.Second(), time.Unix(resp.Snapshot.CreateTime, 0).Second()) + must.NoError(t, err, must.Sprint("name", tc.Name)) + must.Positive(t, resp.Snapshot.CreateTime) + must.Eq(t, now.Second(), time.Unix(resp.Snapshot.CreateTime, 0).Second()) } }) } @@ -1099,10 +1098,10 @@ func TestClient_RPC_ControllerDeleteSnapshot(t *testing.T) { cc.NextErr = tc.ResponseErr err := client.ControllerDeleteSnapshot(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) return } - require.NoError(t, err, tc.Name) + must.NoError(t, err, must.Sprint("name", tc.Name)) }) } } @@ -1162,14 +1161,14 @@ func TestClient_RPC_ControllerListSnapshots(t *testing.T) { resp, err := client.ControllerListSnapshots(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) return } - require.NoError(t, err, tc.Name) - require.NotNil(t, resp) - require.Len(t, resp.Entries, 1) - require.NotZero(t, resp.Entries[0].Snapshot.CreateTime) - require.Equal(t, now.Second(), + must.NoError(t, err, must.Sprint("name", tc.Name)) + must.NotNil(t, resp) + must.Len(t, 1, resp.Entries) + must.Positive(t, resp.Entries[0].Snapshot.CreateTime) + must.Eq(t, now.Second(), time.Unix(resp.Entries[0].Snapshot.CreateTime, 0).Second()) }) } @@ -1359,9 +1358,9 @@ func TestClient_RPC_NodeStageVolume(t *testing.T) { VolumeCapability: &VolumeCapability{}, }) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } else { - require.Nil(t, err) + must.NoError(t, err) } }) } @@ -1398,9 +1397,9 @@ func TestClient_RPC_NodeUnstageVolume(t *testing.T) { err := client.NodeUnstageVolume(context.TODO(), "foo", "/foo") if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } else { - require.Nil(t, err) + must.NoError(t, err) } }) } @@ -1456,9 +1455,9 @@ func TestClient_RPC_NodePublishVolume(t *testing.T) { err := client.NodePublishVolume(context.TODO(), tc.Request) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } else { - require.Nil(t, err) + must.NoError(t, err) } }) } @@ -1511,9 +1510,9 @@ func TestClient_RPC_NodeUnpublishVolume(t *testing.T) { err := client.NodeUnpublishVolume(context.TODO(), tc.ExternalID, tc.TargetPath) if tc.ExpectedErr != nil { - require.EqualError(t, err, tc.ExpectedErr.Error()) + must.EqError(t, err, tc.ExpectedErr.Error()) } else { - require.Nil(t, err) + must.NoError(t, err) } }) } diff --git a/plugins/drivers/testutils/exec_testing.go b/plugins/drivers/testutils/exec_testing.go index 309a186fd..c0eeebd8d 100644 --- a/plugins/drivers/testutils/exec_testing.go +++ b/plugins/drivers/testutils/exec_testing.go @@ -8,7 +8,6 @@ import ( "fmt" "io" "os" - "reflect" "regexp" "runtime" "strings" @@ -20,7 +19,7 @@ import ( "github.com/hashicorp/nomad/plugins/drivers" dproto "github.com/hashicorp/nomad/plugins/drivers/proto" "github.com/hashicorp/nomad/testutil" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func ExecTaskStreamingConformanceTests(t *testing.T, driver *DriverHarness, taskID string) { @@ -121,30 +120,29 @@ func TestExecTaskStreamingBasicResponses(t *testing.T, driver *DriverHarness, ta result := execTask(t, driver, taskID, c.Command, c.Tty, c.Stdin) - require.Equal(t, c.ExitCode, result.exitCode) + must.Eq(t, c.ExitCode, result.exitCode) switch s := c.Stdout.(type) { case string: - require.Equal(t, s, result.stdout) + must.Eq(t, s, result.stdout) case *regexp.Regexp: - require.Regexp(t, s, result.stdout) + must.RegexMatch(t, s, result.stdout) case nil: - require.Empty(t, result.stdout) + must.Eq(t, "", result.stdout) default: - require.Fail(t, "unexpected stdout type", "found %v (%v), but expected string or regexp", s, reflect.TypeOf(s)) + t.Fatal("unexpected type") } switch s := c.Stderr.(type) { case string: - require.Equal(t, s, result.stderr) + must.Eq(t, s, result.stderr) case *regexp.Regexp: - require.Regexp(t, s, result.stderr) + must.RegexMatch(t, s, result.stderr) case nil: - require.Empty(t, result.stderr) + must.Eq(t, "", result.stderr) default: - require.Fail(t, "unexpected stderr type", "found %v (%v), but expected string or regexp", s, reflect.TypeOf(s)) + t.Fatal("unexpected type") } - }) } } @@ -154,7 +152,7 @@ func TestExecTaskStreamingBasicResponses(t *testing.T, driver *DriverHarness, ta func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) { t.Run("isolation", func(t *testing.T) { caps, err := driver.Capabilities() - require.NoError(t, err) + must.NoError(t, err) isolated := (caps.FSIsolation != drivers.FSIsolationNone) @@ -164,7 +162,7 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) { w := execTask(t, driver, taskID, fmt.Sprintf(`FILE=$(mktemp); echo "$FILE"; echo %q >> "${FILE}"`, text), false, "") - require.Zero(t, w.exitCode) + must.Zero(t, w.exitCode) tempfile := strings.TrimSpace(w.stdout) if !isolated { @@ -176,26 +174,26 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) { // read from host b, err := os.ReadFile(tempfile) if !isolated { - require.NoError(t, err) - require.Equal(t, text, strings.TrimSpace(string(b))) + must.NoError(t, err) + must.Eq(t, text, strings.TrimSpace(string(b))) } else { - require.Error(t, err) - require.True(t, os.IsNotExist(err)) + must.Error(t, err) + must.True(t, os.IsNotExist(err)) } // read should succeed from task again r := execTask(t, driver, taskID, fmt.Sprintf("cat %q", tempfile), false, "") - require.Zero(t, r.exitCode) - require.Equal(t, text, strings.TrimSpace(r.stdout)) + must.Zero(t, r.exitCode) + must.Eq(t, text, strings.TrimSpace(r.stdout)) // we always run in a cgroup - testing freezer cgroup r = execTask(t, driver, taskID, "cat /proc/self/cgroup", false, "", ) - require.Zero(t, r.exitCode) + must.Zero(t, r.exitCode) switch cgroupslib.GetMode() { @@ -214,7 +212,7 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) { } } if !ok { - require.Fail(t, "unexpected freezer cgroup", "expected freezer to be /nomad/ or /docker/, but found:\n%s", r.stdout) + t.Fatal("unexpected freezer cgroup") } case cgroupslib.CG2: info, _ := driver.PluginInfo() @@ -225,7 +223,7 @@ func TestExecFSIsolation(t *testing.T, driver *DriverHarness, taskID string) { t.Skip("/proc/self/cgroup not useful in docker cgroups.v2") } // e.g. 0::/testing.slice/5bdbd6c2-8aba-3ab2-728b-0ff3a81727a9.sleep.scope - require.True(t, strings.HasSuffix(strings.TrimSpace(r.stdout), ".scope"), "actual stdout %q", r.stdout) + must.True(t, strings.HasSuffix(strings.TrimSpace(r.stdout), ".scope"), must.Sprintf("actual stdout %q", r.stdout)) } }) } @@ -249,27 +247,27 @@ func execTask(t *testing.T, driver *DriverHarness, taskID string, cmd string, tt isRaw = true err := raw.ExecTaskStreamingRaw(ctx, taskID, command, tty, stream) - require.NoError(t, err) + must.NoError(t, err) } else if d, ok := driver.impl.(drivers.ExecTaskStreamingDriver); ok { execOpts, errCh := drivers.StreamToExecOptions(ctx, command, tty, stream) r, err := d.ExecTaskStreaming(ctx, taskID, execOpts) - require.NoError(t, err) + must.NoError(t, err) select { case err := <-errCh: - require.NoError(t, err) + must.NoError(t, err) default: // all good } exitCode = r.ExitCode } else { - require.Fail(t, "driver does not support exec") + t.Fatal("driver does not support exec") } result := stream.currentResult() - require.NoError(t, result.err) + must.NoError(t, result.err) if !isRaw { result.exitCode = exitCode diff --git a/plugins/drivers/testutils/testing.go b/plugins/drivers/testutils/testing.go index 9ceb0227d..f4dfdc6c9 100644 --- a/plugins/drivers/testutils/testing.go +++ b/plugins/drivers/testutils/testing.go @@ -25,7 +25,7 @@ import ( "github.com/hashicorp/nomad/plugins/drivers" "github.com/hashicorp/nomad/plugins/shared/hclspec" testing "github.com/mitchellh/go-testing-interface" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) type DriverHarness struct { @@ -55,7 +55,7 @@ func NewDriverHarness(t testing.T, d drivers.DriverPlugin) *DriverHarness { ) raw, err := client.Dispense(base.PluginTypeDriver) - require.NoError(t, err, "failed to dispense plugin") + must.NoError(t, err) dClient := raw.(drivers.DriverPlugin) return &DriverHarness{ @@ -80,21 +80,21 @@ func (h *DriverHarness) Kill() { // between tests. func (h *DriverHarness) MkAllocDir(t *drivers.TaskConfig, enableLogs bool) func() { dir, err := os.MkdirTemp("", "nomad_driver_harness-") - require.NoError(h.t, err) + must.NoError(h.t, err) allocDir := allocdir.NewAllocDir(h.logger, dir, t.AllocID) - require.NoError(h.t, allocDir.Build()) + must.NoError(h.t, allocDir.Build()) t.AllocDir = allocDir.AllocDir taskDir := allocDir.NewTaskDir(t.Name) caps, err := h.Capabilities() - require.NoError(h.t, err) + must.NoError(h.t, err) fsi := caps.FSIsolation h.logger.Trace("FS isolation", "fsi", fsi) - require.NoError(h.t, taskDir.Build(fsi == drivers.FSIsolationChroot, ci.TinyChroot)) + must.NoError(h.t, taskDir.Build(fsi == drivers.FSIsolationChroot, ci.TinyChroot)) task := &structs.Task{ Name: t.Name, @@ -142,7 +142,7 @@ func (h *DriverHarness) MkAllocDir(t *drivers.TaskConfig, enableLogs bool) func( MaxFiles: 10, MaxFileSizeMB: 10, }) - require.NoError(h.t, err) + must.NoError(h.t, err) return func() { lm.Stop() diff --git a/plugins/drivers/testutils/testing_test.go b/plugins/drivers/testutils/testing_test.go index 928063372..780ba4b45 100644 --- a/plugins/drivers/testutils/testing_test.go +++ b/plugins/drivers/testutils/testing_test.go @@ -16,7 +16,7 @@ import ( "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/plugins/drivers" pstructs "github.com/hashicorp/nomad/plugins/shared/structs" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) var _ drivers.DriverPlugin = (*MockDriver)(nil) @@ -34,8 +34,8 @@ func TestDriverHarness(t *testing.T) { harness := NewDriverHarness(t, d) defer harness.Kill() actual, _, err := harness.StartTask(&drivers.TaskConfig{}) - require.NoError(t, err) - require.Equal(t, handle.Config.Name, actual.Config.Name) + must.NoError(t, err) + must.Eq(t, handle.Config.Name, actual.Config.Name) } type testDriverState struct { @@ -45,7 +45,6 @@ type testDriverState struct { func TestBaseDriver_Fingerprint(t *testing.T) { ci.Parallel(t) - require := require.New(t) fingerprints := []*drivers.Fingerprint{ { @@ -81,7 +80,7 @@ func TestBaseDriver_Fingerprint(t *testing.T) { defer harness.Kill() ch, err := harness.Fingerprint(context.Background()) - require.NoError(err) + must.NoError(t, err) var wg sync.WaitGroup wg.Add(1) @@ -89,25 +88,24 @@ func TestBaseDriver_Fingerprint(t *testing.T) { defer wg.Done() select { case f := <-ch: - require.Exactly(f, fingerprints[0]) + must.Eq(t, f, fingerprints[0]) case <-time.After(1 * time.Second): - require.Fail("did not receive fingerprint[0]") + t.Fatal("did not receive fingerprint[0]") } select { case f := <-ch: - require.Exactly(f, fingerprints[1]) + must.Eq(t, f, fingerprints[1]) case <-time.After(1 * time.Second): - require.Fail("did not receive fingerprint[1]") + t.Fatal("did not receive fingerprint[1]") } }() - require.False(complete.Load().(bool)) + must.False(t, complete.Load().(bool)) wg.Wait() - require.True(complete.Load().(bool)) + must.True(t, complete.Load().(bool)) } func TestBaseDriver_RecoverTask(t *testing.T) { ci.Parallel(t) - require := require.New(t) // build driver state and encode it into proto msg state := testDriverState{Pid: 1, Log: "foo"} @@ -119,8 +117,8 @@ func TestBaseDriver_RecoverTask(t *testing.T) { impl := &MockDriver{ RecoverTaskF: func(h *drivers.TaskHandle) error { var actual testDriverState - require.NoError(h.GetDriverState(&actual)) - require.Equal(state, actual) + must.NoError(t, h.GetDriverState(&actual)) + must.Eq(t, state, actual) return nil }, } @@ -132,12 +130,11 @@ func TestBaseDriver_RecoverTask(t *testing.T) { DriverState: buf.Bytes(), } err := harness.RecoverTask(handle) - require.NoError(err) + must.NoError(t, err) } func TestBaseDriver_StartTask(t *testing.T) { ci.Parallel(t) - require := require.New(t) cfg := &drivers.TaskConfig{ ID: "foo", @@ -157,19 +154,18 @@ func TestBaseDriver_StartTask(t *testing.T) { harness := NewDriverHarness(t, impl) defer harness.Kill() resp, _, err := harness.StartTask(cfg) - require.NoError(err) - require.Equal(cfg.ID, resp.Config.ID) - require.Equal(handle.State, resp.State) + must.NoError(t, err) + must.Eq(t, cfg.ID, resp.Config.ID) + must.Eq(t, handle.State, resp.State) var actualState testDriverState - require.NoError(resp.GetDriverState(&actualState)) - require.Equal(*state, actualState) + must.NoError(t, resp.GetDriverState(&actualState)) + must.Eq(t, *state, actualState) } func TestBaseDriver_WaitTask(t *testing.T) { ci.Parallel(t) - require := require.New(t) result := &drivers.ExitResult{ExitCode: 1, Signal: 9} @@ -194,20 +190,19 @@ func TestBaseDriver_WaitTask(t *testing.T) { go func() { defer wg.Done() ch, err := harness.WaitTask(context.TODO(), "foo") - require.NoError(err) + must.NoError(t, err) actualResult := <-ch finished = true - require.Exactly(result, actualResult) + must.Eq(t, result, actualResult) }() - require.False(finished) + must.False(t, finished) close(signalTask) wg.Wait() - require.True(finished) + must.True(t, finished) } func TestBaseDriver_TaskEvents(t *testing.T) { ci.Parallel(t) - require := require.New(t) now := time.Now().UTC().Truncate(time.Millisecond) events := []*drivers.TaskEvent{ @@ -254,14 +249,14 @@ func TestBaseDriver_TaskEvents(t *testing.T) { defer harness.Kill() ch, err := harness.TaskEvents(context.Background()) - require.NoError(err) + must.NoError(t, err) for _, event := range events { select { case actual := <-ch: - require.Exactly(actual, event) + must.Eq(t, actual, event) case <-time.After(500 * time.Millisecond): - require.Fail("failed to receive event") + t.Fatal("failed to receive event") } } @@ -291,6 +286,6 @@ func TestBaseDriver_Capabilities(t *testing.T) { defer harness.Kill() caps, err := harness.Capabilities() - require.NoError(t, err) - require.Equal(t, capabilities, caps) + must.NoError(t, err) + must.Eq(t, capabilities, caps) } diff --git a/plugins/drivers/utils_test.go b/plugins/drivers/utils_test.go index e64bf5102..14267e981 100644 --- a/plugins/drivers/utils_test.go +++ b/plugins/drivers/utils_test.go @@ -9,8 +9,7 @@ import ( "github.com/hashicorp/nomad/helper/uuid" "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/plugins/drivers/proto" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestResourceUsageRoundTrip(t *testing.T) { @@ -36,8 +35,7 @@ func TestResourceUsageRoundTrip(t *testing.T) { } parsed := resourceUsageFromProto(resourceUsageToProto(input)) - - require.EqualValues(t, parsed, input) + must.Eq(t, parsed, input) } func TestTaskConfigRoundTrip(t *testing.T) { @@ -109,8 +107,7 @@ func TestTaskConfigRoundTrip(t *testing.T) { } parsed := taskConfigFromProto(taskConfigToProto(input)) - - require.EqualValues(t, input, parsed) + must.Eq(t, input, parsed) } @@ -140,7 +137,7 @@ func Test_networkCreateRequestFromProto(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { actualOutput := networkCreateRequestFromProto(tc.inputPB) - assert.Equal(t, tc.expectedOutput, actualOutput, tc.name) + must.Eq(t, tc.expectedOutput, actualOutput) }) } } diff --git a/plugins/shared/structs/attribute_test.go b/plugins/shared/structs/attribute_test.go index 22a342056..1a01e7cf1 100644 --- a/plugins/shared/structs/attribute_test.go +++ b/plugins/shared/structs/attribute_test.go @@ -8,7 +8,7 @@ import ( "testing" "github.com/hashicorp/nomad/helper/pointer" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestAttribute_Validate(t *testing.T) { @@ -77,7 +77,7 @@ func TestAttribute_Validate(t *testing.T) { for _, c := range cases { t.Run(c.Input.GoString(), func(t *testing.T) { if err := c.Input.Validate(); err != nil && !c.Fail { - require.NoError(t, err) + must.NoError(t, err) } }) } @@ -538,7 +538,7 @@ func testComparison(t *testing.T, cases []*compareTestCase) { if !ok && !c.NotComparable { t.Fatal("should be comparable") } else if ok { - require.Equal(t, c.Expected, v) + must.Eq(t, c.Expected, v) } }) } @@ -662,8 +662,8 @@ func TestAttribute_ParseAndValidate(t *testing.T) { for _, c := range cases { t.Run(c.Input, func(t *testing.T) { a := ParseAttribute(c.Input) - require.Equal(t, c.Expected, a) - require.NoError(t, a.Validate()) + must.Eq(t, c.Expected, a) + must.NoError(t, a.Validate()) }) } } diff --git a/scheduler/feasible_test.go b/scheduler/feasible_test.go index 9c4990ae4..f552b70c9 100644 --- a/scheduler/feasible_test.go +++ b/scheduler/feasible_test.go @@ -14,9 +14,8 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/hashicorp/nomad/nomad/structs" psstructs "github.com/hashicorp/nomad/plugins/shared/structs" + "github.com/shoenig/test" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestStaticIterator_Reset(t *testing.T) { @@ -354,7 +353,7 @@ func TestCSIVolumeChecker(t *testing.T) { index := uint64(999) for _, node := range nodes { err := state.UpsertNode(structs.MsgTypeTestSetup, index, node) - require.NoError(t, err) + must.NoError(t, err) index++ } @@ -370,7 +369,7 @@ func TestCSIVolumeChecker(t *testing.T) { {Segments: map[string]string{"rack": "R2"}}, } err := state.UpsertCSIVolume(index, []*structs.CSIVolume{vol}) - require.NoError(t, err) + must.NoError(t, err) index++ // Create some other volumes in use on nodes[3] to trip MaxVolumes @@ -381,14 +380,14 @@ func TestCSIVolumeChecker(t *testing.T) { vol2.AccessMode = structs.CSIVolumeAccessModeMultiNodeSingleWriter vol2.AttachmentMode = structs.CSIVolumeAttachmentModeFilesystem err = state.UpsertCSIVolume(index, []*structs.CSIVolume{vol2}) - require.NoError(t, err) + must.NoError(t, err) index++ vid3 := "volume-id[0]" vol3 := vol.Copy() vol3.ID = vid3 err = state.UpsertCSIVolume(index, []*structs.CSIVolume{vol3}) - require.NoError(t, err) + must.NoError(t, err) index++ alloc := mock.Alloc() @@ -401,13 +400,13 @@ func TestCSIVolumeChecker(t *testing.T) { }, } err = state.UpsertJob(structs.MsgTypeTestSetup, index, nil, alloc.Job) - require.NoError(t, err) + must.NoError(t, err) index++ summary := mock.JobSummary(alloc.JobID) - require.NoError(t, state.UpsertJobSummary(index, summary)) + must.NoError(t, state.UpsertJobSummary(index, summary)) index++ err = state.UpsertAllocs(structs.MsgTypeTestSetup, index, []*structs.Allocation{alloc}) - require.NoError(t, err) + must.NoError(t, err) index++ // Create volume requests @@ -499,7 +498,7 @@ func TestCSIVolumeChecker(t *testing.T) { for _, c := range cases { checker.SetVolumes(alloc.Name, c.RequestedVolumes) - assert.Equal(t, c.Result, checker.Feasible(c.Node), c.Name) + test.Eq(t, c.Result, checker.Feasible(c.Node), test.Sprint(c.Name)) } // add a missing volume @@ -515,7 +514,7 @@ func TestCSIVolumeChecker(t *testing.T) { for _, node := range nodes { checker.SetVolumes(alloc.Name, volumes) act := checker.Feasible(node) - require.False(t, act, "request with missing volume should never be feasible") + must.False(t, act, must.Sprint("request with missing volume should never be feasible")) } } @@ -661,7 +660,7 @@ func TestNetworkChecker(t *testing.T) { for _, c := range cases { checker.SetNetwork(c.network) for i, node := range nodes { - require.Equal(t, c.results[i], checker.Feasible(node), "mode=%q, idx=%d", c.network.Mode, i) + must.Eq(t, c.results[i], checker.Feasible(node), must.Sprintf("mode=%q, idx=%d", c.network.Mode, i)) } } } @@ -681,7 +680,7 @@ func TestNetworkChecker_bridge_upgrade_path(t *testing.T) { checker.SetNetwork(&structs.NetworkResource{Mode: "bridge"}) ok := checker.Feasible(oldClient) - require.True(t, ok) + must.True(t, ok) }) t.Run("updated client", func(t *testing.T) { @@ -694,7 +693,7 @@ func TestNetworkChecker_bridge_upgrade_path(t *testing.T) { checker.SetNetwork(&structs.NetworkResource{Mode: "bridge"}) ok := checker.Feasible(oldClient) - require.False(t, ok) + must.False(t, ok) }) } @@ -805,7 +804,6 @@ func TestDriverChecker_Compatibility(t *testing.T) { func Test_HealthChecks(t *testing.T) { ci.Parallel(t) - require := require.New(t) _, ctx := testContext(t) nodes := []*structs.Node{ @@ -863,7 +861,7 @@ func Test_HealthChecks(t *testing.T) { } checker := NewDriverChecker(ctx, drivers) act := checker.Feasible(c.Node) - require.Equal(act, c.Result) + must.Eq(t, act, c.Result) } } @@ -1348,7 +1346,7 @@ func TestCheckSemverConstraint(t *testing.T) { _, ctx := testContext(t) p := newSemverConstraintParser(ctx) actual := checkVersionMatch(ctx, p, tc.lVal, tc.rVal) - require.Equal(t, tc.result, actual) + must.Eq(t, tc.result, actual) }) } } @@ -2639,11 +2637,11 @@ func TestFeasibilityWrapper_JobEligible_TgEscaped(t *testing.T) { func TestSetContainsAny(t *testing.T) { ci.Parallel(t) - require.True(t, checkSetContainsAny("a", "a")) - require.True(t, checkSetContainsAny("a,b", "a")) - require.True(t, checkSetContainsAny(" a,b ", "a ")) - require.True(t, checkSetContainsAny("a", "a")) - require.False(t, checkSetContainsAny("b", "a")) + must.True(t, checkSetContainsAny("a", "a")) + must.True(t, checkSetContainsAny("a,b", "a")) + must.True(t, checkSetContainsAny(" a,b ", "a ")) + must.True(t, checkSetContainsAny("a", "a")) + must.False(t, checkSetContainsAny("b", "a")) } func TestDeviceChecker(t *testing.T) { diff --git a/scheduler/reconcile_test.go b/scheduler/reconcile_test.go index be0afdc4c..905958438 100644 --- a/scheduler/reconcile_test.go +++ b/scheduler/reconcile_test.go @@ -19,9 +19,8 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/hashicorp/nomad/nomad/structs" "github.com/kr/pretty" + "github.com/shoenig/test" "github.com/shoenig/test/must" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) var ( @@ -270,7 +269,6 @@ type resultExpectation struct { func assertResults(t *testing.T, r *reconcileResults, exp *resultExpectation) { t.Helper() - assertion := assert.New(t) if exp.createDeployment != nil && r.deployment == nil { t.Errorf("Expect a created deployment got none") @@ -285,15 +283,15 @@ func assertResults(t *testing.T, r *reconcileResults, exp *resultExpectation) { } } - assertion.EqualValues(exp.deploymentUpdates, r.deploymentUpdates, "Expected Deployment Updates") - assertion.Len(r.place, exp.place, "Expected Placements") - assertion.Len(r.destructiveUpdate, exp.destructive, "Expected Destructive") - assertion.Len(r.inplaceUpdate, exp.inplace, "Expected Inplace Updates") - assertion.Len(r.attributeUpdates, exp.attributeUpdates, "Expected Attribute Updates") - assertion.Len(r.reconnectUpdates, exp.reconnectUpdates, "Expected Reconnect Updates") - assertion.Len(r.disconnectUpdates, exp.disconnectUpdates, "Expected Disconnect Updates") - assertion.Len(r.stop, exp.stop, "Expected Stops") - assertion.EqualValues(exp.desiredTGUpdates, r.desiredTGUpdates, "Expected Desired TG Update Annotations") + test.Eq(t, exp.deploymentUpdates, r.deploymentUpdates, test.Sprint("Expected Deployment Updates")) + test.SliceLen(t, exp.place, r.place, test.Sprint("Expected Placements")) + test.SliceLen(t, exp.destructive, r.destructiveUpdate, test.Sprint("Expected Destructive")) + test.SliceLen(t, exp.inplace, r.inplaceUpdate, test.Sprint("Expected Inplace Updates")) + test.MapLen(t, exp.attributeUpdates, r.attributeUpdates, test.Sprint("Expected Attribute Updates")) + test.MapLen(t, exp.reconnectUpdates, r.reconnectUpdates, test.Sprint("Expected Reconnect Updates")) + test.MapLen(t, exp.disconnectUpdates, r.disconnectUpdates, test.Sprint("Expected Disconnect Updates")) + test.SliceLen(t, exp.stop, r.stop, test.Sprint("Expected Stops")) + test.Eq(t, exp.desiredTGUpdates, r.desiredTGUpdates, test.Sprint("Expected Desired TG Update Annotations")) } func buildAllocations(job *structs.Job, count int, clientStatus, desiredStatus string, nodeScore float64) []*structs.Allocation { @@ -726,7 +724,7 @@ func TestReconciler_Inplace_Rollback(t *testing.T) { }, }) - assert.Len(t, r.desiredFollowupEvals, 1, "expected 1 follow-up eval") + test.MapLen(t, 1, r.desiredFollowupEvals, test.Sprint("expected 1 follow-up eval")) assertNamesHaveIndexes(t, intRange(0, 0), allocsToNames(r.inplaceUpdate)) assertNamesHaveIndexes(t, intRange(2, 2), stopResultsToNames(r.stop)) assertNamesHaveIndexes(t, intRange(2, 3), placeResultsToNames(r.place)) @@ -1540,7 +1538,7 @@ func TestReconciler_JobStopped_TerminalAllocs(t *testing.T) { reconciler := NewAllocReconciler(testlog.HCLogger(t), allocUpdateFnIgnore, false, c.jobID, c.job, nil, allocs, nil, "", 50, true) r := reconciler.Compute() - require.Len(t, r.stop, 0) + must.SliceEmpty(t, r.stop) // Assert the correct results assertResults(t, r, &resultExpectation{ createDeployment: nil, @@ -1657,8 +1655,6 @@ func TestReconciler_MultiTG_SingleUpdateBlock(t *testing.T) { func TestReconciler_RescheduleLater_Batch(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 4 job := mock.Job() job.TaskGroups[0].Count = 4 @@ -1717,9 +1713,9 @@ func TestReconciler_RescheduleLater_Batch(t *testing.T) { // Two reschedule attempts were already made, one more can be made at a future time // Verify that the follow up eval has the expected waitUntil time evals := r.desiredFollowupEvals[tgName] - require.NotNil(evals) - require.Equal(1, len(evals)) - require.Equal(now.Add(delayDur), evals[0].WaitUntil) + must.NotNil(t, evals) + must.SliceLen(t, 1, evals) + must.Eq(t, now.Add(delayDur), evals[0].WaitUntil) // Alloc 5 should not be replaced because it is terminal assertResults(t, r, &resultExpectation{ @@ -1745,7 +1741,7 @@ func TestReconciler_RescheduleLater_Batch(t *testing.T) { for _, a := range r.attributeUpdates { annotated = a } - require.Equal(evals[0].ID, annotated.FollowupEvalID) + must.Eq(t, evals[0].ID, annotated.FollowupEvalID) } // Tests delayed rescheduling of failed batch allocations and batching of allocs @@ -1753,8 +1749,6 @@ func TestReconciler_RescheduleLater_Batch(t *testing.T) { func TestReconciler_RescheduleLaterWithBatchedEvals_Batch(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 4 job := mock.Job() job.TaskGroups[0].Count = 10 @@ -1799,13 +1793,13 @@ func TestReconciler_RescheduleLaterWithBatchedEvals_Batch(t *testing.T) { // Verify that two follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.NotNil(evals) - require.Equal(2, len(evals)) + must.NotNil(t, evals) + must.SliceLen(t, 2, evals) // Verify expected WaitUntil values for both batched evals - require.Equal(now.Add(delayDur), evals[0].WaitUntil) + must.Eq(t, now.Add(delayDur), evals[0].WaitUntil) secondBatchDuration := delayDur + 10*time.Second - require.Equal(now.Add(secondBatchDuration), evals[1].WaitUntil) + must.Eq(t, now.Add(secondBatchDuration), evals[1].WaitUntil) // Alloc 5 should not be replaced because it is terminal assertResults(t, r, &resultExpectation{ @@ -1829,9 +1823,9 @@ func TestReconciler_RescheduleLaterWithBatchedEvals_Batch(t *testing.T) { // Verify that the followup evalID field is set correctly for _, alloc := range r.attributeUpdates { if allocNameToIndex(alloc.Name) < 5 { - require.Equal(evals[0].ID, alloc.FollowupEvalID) + must.Eq(t, evals[0].ID, alloc.FollowupEvalID) } else if allocNameToIndex(alloc.Name) < 7 { - require.Equal(evals[1].ID, alloc.FollowupEvalID) + must.Eq(t, evals[1].ID, alloc.FollowupEvalID) } else { t.Fatalf("Unexpected alloc name in Inplace results %v", alloc.Name) } @@ -1842,7 +1836,6 @@ func TestReconciler_RescheduleLaterWithBatchedEvals_Batch(t *testing.T) { func TestReconciler_RescheduleNow_Batch(t *testing.T) { ci.Parallel(t) - require := require.New(t) // Set desired 4 job := mock.Job() job.TaskGroups[0].Count = 4 @@ -1897,7 +1890,7 @@ func TestReconciler_RescheduleNow_Batch(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Two reschedule attempts were made, one more can be made now // Alloc 5 should not be replaced because it is terminal @@ -1926,8 +1919,6 @@ func TestReconciler_RescheduleNow_Batch(t *testing.T) { func TestReconciler_RescheduleLater_Service(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -1975,9 +1966,9 @@ func TestReconciler_RescheduleLater_Service(t *testing.T) { // Should place a new placement and create a follow up eval for the delayed reschedule // Verify that the follow up eval has the expected waitUntil time evals := r.desiredFollowupEvals[tgName] - require.NotNil(evals) - require.Equal(1, len(evals)) - require.Equal(now.Add(delayDur), evals[0].WaitUntil) + must.NotNil(t, evals) + must.SliceLen(t, 1, evals) + must.Eq(t, now.Add(delayDur), evals[0].WaitUntil) assertResults(t, r, &resultExpectation{ createDeployment: nil, @@ -2004,7 +1995,7 @@ func TestReconciler_RescheduleLater_Service(t *testing.T) { for _, a := range r.attributeUpdates { annotated = a } - require.Equal(evals[0].ID, annotated.FollowupEvalID) + must.Eq(t, evals[0].ID, annotated.FollowupEvalID) } // Tests service allocations with client status complete @@ -2122,16 +2113,13 @@ func TestReconciler_Service_DesiredStop_ClientStatusComplete(t *testing.T) { assertNamesHaveIndexes(t, intRange(4, 4), placeResultsToNames(r.place)) // Should not have any follow up evals created - require := require.New(t) - require.Equal(0, len(r.desiredFollowupEvals)) + must.MapEmpty(t, r.desiredFollowupEvals) } // Tests rescheduling failed service allocations with desired state stop func TestReconciler_RescheduleNow_Service(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -2185,7 +2173,7 @@ func TestReconciler_RescheduleNow_Service(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc and one replacement for terminal alloc were placed assertResults(t, r, &resultExpectation{ @@ -2213,8 +2201,6 @@ func TestReconciler_RescheduleNow_Service(t *testing.T) { func TestReconciler_RescheduleNow_WithinAllowedTimeWindow(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -2267,7 +2253,7 @@ func TestReconciler_RescheduleNow_WithinAllowedTimeWindow(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc was placed assertResults(t, r, &resultExpectation{ @@ -2295,8 +2281,6 @@ func TestReconciler_RescheduleNow_WithinAllowedTimeWindow(t *testing.T) { func TestReconciler_RescheduleNow_EvalIDMatch(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -2351,7 +2335,7 @@ func TestReconciler_RescheduleNow_EvalIDMatch(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc was placed assertResults(t, r, &resultExpectation{ @@ -2379,8 +2363,6 @@ func TestReconciler_RescheduleNow_EvalIDMatch(t *testing.T) { func TestReconciler_RescheduleNow_Service_WithCanaries(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -2462,7 +2444,7 @@ func TestReconciler_RescheduleNow_Service_WithCanaries(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc and one replacement for terminal alloc were placed assertResults(t, r, &resultExpectation{ @@ -2490,8 +2472,6 @@ func TestReconciler_RescheduleNow_Service_WithCanaries(t *testing.T) { func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -2589,7 +2569,7 @@ func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc and one replacement for terminal alloc were placed assertResults(t, r, &resultExpectation{ @@ -2618,8 +2598,6 @@ func TestReconciler_RescheduleNow_Service_Canaries(t *testing.T) { func TestReconciler_RescheduleNow_Service_Canaries_Limit(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -2719,7 +2697,7 @@ func TestReconciler_RescheduleNow_Service_Canaries_Limit(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc and one replacement for terminal alloc were placed assertResults(t, r, &resultExpectation{ @@ -5163,8 +5141,6 @@ func TestReconciler_SuccessfulDeploymentWithFailedAllocs_Reschedule(t *testing.T func TestReconciler_ForceReschedule_Service(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -5211,7 +5187,7 @@ func TestReconciler_ForceReschedule_Service(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // Verify that one rescheduled alloc was created because of the forced reschedule assertResults(t, r, &resultExpectation{ @@ -5241,8 +5217,6 @@ func TestReconciler_ForceReschedule_Service(t *testing.T) { func TestReconciler_RescheduleNot_Service(t *testing.T) { ci.Parallel(t) - require := require.New(t) - // Set desired 5 job := mock.Job() job.TaskGroups[0].Count = 5 @@ -5296,7 +5270,7 @@ func TestReconciler_RescheduleNot_Service(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // no rescheduling, ignore all 4 allocs // but place one to substitute allocs[4] that was stopped explicitly @@ -5785,10 +5759,10 @@ func TestReconciler_Disconnected_Client(t *testing.T) { if tc.shouldStopOnDisconnectedNode { must.Eq(t, testNode.ID, stopResult.alloc.NodeID) } else { - require.NotEqual(t, testNode.ID, stopResult.alloc.NodeID) + must.NotEq(t, testNode.ID, stopResult.alloc.NodeID) } - require.Equal(t, job.Version, stopResult.alloc.Job.Version) + must.Eq(t, job.Version, stopResult.alloc.Job.Version) } }) } @@ -5799,7 +5773,6 @@ func TestReconciler_Disconnected_Client(t *testing.T) { func TestReconciler_RescheduleNot_Batch(t *testing.T) { ci.Parallel(t) - require := require.New(t) // Set desired 4 job := mock.Job() job.TaskGroups[0].Count = 4 @@ -5859,7 +5832,7 @@ func TestReconciler_RescheduleNot_Batch(t *testing.T) { // Verify that no follow up evals were created evals := r.desiredFollowupEvals[tgName] - require.Nil(evals) + must.Nil(t, evals) // No reschedule attempts were made and all allocs are untouched assertResults(t, r, &resultExpectation{ @@ -5891,19 +5864,19 @@ func TestReconciler_Node_Disconnect_Updates_Alloc_To_Unknown(t *testing.T) { // Verify that 1 follow up eval was created with the values we expect. evals := results.desiredFollowupEvals[job.TaskGroups[0].Name] - require.Len(t, evals, 1) + must.SliceLen(t, 1, evals) expectedTime := reconciler.now.Add(5 * time.Minute) eval := evals[0] - require.NotNil(t, eval.WaitUntil) - require.Equal(t, expectedTime, eval.WaitUntil) + must.NotNil(t, eval.WaitUntil) + must.Eq(t, expectedTime, eval.WaitUntil) // Validate that the queued disconnectUpdates have the right client status, // and that they have a valid FollowUpdEvalID. for _, disconnectUpdate := range results.disconnectUpdates { - require.Equal(t, structs.AllocClientStatusUnknown, disconnectUpdate.ClientStatus) - require.NotEmpty(t, disconnectUpdate.FollowupEvalID) - require.Equal(t, eval.ID, disconnectUpdate.FollowupEvalID) + must.Eq(t, structs.AllocClientStatusUnknown, disconnectUpdate.ClientStatus) + must.NotEq(t, "", disconnectUpdate.FollowupEvalID) + must.Eq(t, eval.ID, disconnectUpdate.FollowupEvalID) } // 2 to place, 2 to update, 1 to ignore @@ -6243,7 +6216,7 @@ func TestReconciler_Client_Disconnect_Canaries(t *testing.T) { } } - require.Equal(t, tc.deploymentState.DesiredTotal, allocsConfigured, "invalid alloc configuration: expect %d got %d", tc.deploymentState.DesiredTotal, allocsConfigured) + must.Eq(t, tc.deploymentState.DesiredTotal, allocsConfigured, must.Sprintf("invalid alloc configuration: expect %d got %d", tc.deploymentState.DesiredTotal, allocsConfigured)) // Populate Alloc IDS, Node IDs, Job on canaries canariesConfigured := 0 @@ -6275,7 +6248,7 @@ func TestReconciler_Client_Disconnect_Canaries(t *testing.T) { } // Validate tc.canaryAllocs against tc.deploymentState - require.Equal(t, tc.deploymentState.PlacedAllocs, canariesConfigured, "invalid canary configuration: expect %d got %d", tc.deploymentState.PlacedAllocs, canariesConfigured) + must.Eq(t, tc.deploymentState.PlacedAllocs, canariesConfigured, must.Sprintf("invalid canary configuration: expect %d got %d", tc.deploymentState.PlacedAllocs, canariesConfigured)) deployment := structs.NewDeployment(updatedJob, 50) deployment.TaskGroups[updatedJob.TaskGroups[0].Name] = tc.deploymentState @@ -6304,33 +6277,33 @@ func TestReconciler_Client_Disconnect_Canaries(t *testing.T) { // and that they have a disconnect update. for _, placeResult := range result.place { found := false - require.NotNil(t, placeResult.previousAlloc) + must.NotNil(t, placeResult.previousAlloc) for _, deployed := range tc.deployedAllocs[disconnectedNode] { if deployed.ID == placeResult.previousAlloc.ID { found = true - require.Equal(t, job.Version, placeResult.previousAlloc.Job.Version) - require.Equal(t, disconnectedNode.ID, placeResult.previousAlloc.NodeID) + must.Eq(t, job.Version, placeResult.previousAlloc.Job.Version) + must.Eq(t, disconnectedNode.ID, placeResult.previousAlloc.NodeID) _, exists := result.disconnectUpdates[placeResult.previousAlloc.ID] - require.True(t, exists) + must.True(t, exists) break } } for _, canary := range tc.canaryAllocs[disconnectedNode] { if canary.ID == placeResult.previousAlloc.ID { found = true - require.Equal(t, updatedJob.Version, placeResult.previousAlloc.Job.Version) - require.Equal(t, disconnectedNode.ID, placeResult.previousAlloc.NodeID) + must.Eq(t, updatedJob.Version, placeResult.previousAlloc.Job.Version) + must.Eq(t, disconnectedNode.ID, placeResult.previousAlloc.NodeID) _, exists := result.disconnectUpdates[placeResult.previousAlloc.ID] - require.True(t, exists) + must.True(t, exists) break } } - require.True(t, found) + must.True(t, found) } // Validate that stops are for pending disconnects for _, stopResult := range result.stop { - require.Equal(t, pending, stopResult.alloc.ClientStatus) + must.Eq(t, pending, stopResult.alloc.ClientStatus) } }) } @@ -6417,7 +6390,7 @@ func TestReconciler_ComputeDeploymentPaused(t *testing.T) { job = mock.BatchJob() } - require.NotNil(t, job, "invalid job type", tc.jobType) + must.NotNil(t, job, must.Sprint("invalid job type", tc.jobType)) var deployment *structs.Deployment if tc.isMultiregion { @@ -6447,7 +6420,7 @@ func TestReconciler_ComputeDeploymentPaused(t *testing.T) { _ = reconciler.Compute() - require.Equal(t, tc.expected, reconciler.deploymentPaused) + must.Eq(t, tc.expected, reconciler.deploymentPaused) }) } } diff --git a/scheduler/stack_test.go b/scheduler/stack_test.go index fe4cc33e8..0197bb245 100644 --- a/scheduler/stack_test.go +++ b/scheduler/stack_test.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/nomad/nomad/mock" "github.com/hashicorp/nomad/nomad/structs" "github.com/shoenig/test/must" - "github.com/stretchr/testify/require" ) func BenchmarkServiceStack_With_ComputedClass(b *testing.B) { @@ -150,15 +149,11 @@ func TestServiceStack_Select_PreferringNodes(t *testing.T) { prefNodes := []*structs.Node{preferredNode} selectOptions := &SelectOptions{PreferredNodes: prefNodes} option := stack.Select(job.TaskGroups[0], selectOptions) - if option == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } - if option.Node.ID != preferredNode.ID { - t.Fatalf("expected: %v, actual: %v", option.Node.ID, preferredNode.ID) - } + must.NotNil(t, option, must.Sprintf("missing node %#v", ctx.Metrics())) + must.Eq(t, option.Node.ID, preferredNode.ID) // Make sure select doesn't have a side effect on preferred nodes - require.Equal(t, prefNodes, selectOptions.PreferredNodes) + must.Eq(t, prefNodes, selectOptions.PreferredNodes) // Change the preferred node's kernel to windows and ensure the allocations // are placed elsewhere @@ -168,14 +163,9 @@ func TestServiceStack_Select_PreferringNodes(t *testing.T) { prefNodes1 := []*structs.Node{preferredNode1} selectOptions = &SelectOptions{PreferredNodes: prefNodes1} option = stack.Select(job.TaskGroups[0], selectOptions) - if option == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } - - if option.Node.ID != nodes[0].ID { - t.Fatalf("expected: %#v, actual: %#v", nodes[0], option.Node) - } - require.Equal(t, prefNodes1, selectOptions.PreferredNodes) + must.NotNil(t, option, must.Sprintf("missing node %#v", ctx.Metrics())) + must.Eq(t, option.Node.ID, nodes[0].ID) + must.Eq(t, prefNodes1, selectOptions.PreferredNodes) } func TestServiceStack_Select_MetricsReset(t *testing.T) { @@ -196,24 +186,16 @@ func TestServiceStack_Select_MetricsReset(t *testing.T) { selectOptions := &SelectOptions{} n1 := stack.Select(job.TaskGroups[0], selectOptions) m1 := ctx.Metrics() - if n1 == nil { - t.Fatalf("missing node %#v", m1) - } + must.NotNil(t, n1, must.Sprintf("missing node %#v", m1)) - if m1.NodesEvaluated != 2 { - t.Fatalf("should only be 2") - } + must.Eq(t, 2, m1.NodesEvaluated) n2 := stack.Select(job.TaskGroups[0], selectOptions) m2 := ctx.Metrics() - if n2 == nil { - t.Fatalf("missing node %#v", m2) - } + must.NotNil(t, n2, must.Sprintf("missing node %#v", m2)) // If we don't reset, this would be 4 - if m2.NodesEvaluated != 2 { - t.Fatalf("should only be 2") - } + must.Eq(t, 2, m2.NodesEvaluated) } func TestServiceStack_Select_DriverFilter(t *testing.T) { @@ -226,9 +208,7 @@ func TestServiceStack_Select_DriverFilter(t *testing.T) { } zero := nodes[0] zero.Attributes["driver.foo"] = "1" - if err := zero.ComputeClass(); err != nil { - t.Fatalf("ComputedClass() failed: %v", err) - } + must.NoError(t, zero.ComputeClass()) stack := NewGenericStack(false, ctx) stack.SetNodes(nodes) @@ -239,13 +219,9 @@ func TestServiceStack_Select_DriverFilter(t *testing.T) { selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } + must.NotNil(t, node, must.Sprintf("missing node %#v", ctx.Metrics())) - if node.Node != zero { - t.Fatalf("bad") - } + must.Eq(t, zero, node.Node) } func TestServiceStack_Select_HostVolume(t *testing.T) { @@ -359,7 +335,7 @@ func TestServiceStack_Select_CSI(t *testing.T) { v.AttachmentMode = structs.CSIVolumeAttachmentModeFilesystem v.PluginID = "bar" err := state.UpsertCSIVolume(999, []*structs.CSIVolume{v}) - require.NoError(t, err) + must.NoError(t, err) // Create a node with healthy fingerprints for both controller and node plugins zero := nodes[0] @@ -386,12 +362,10 @@ func TestServiceStack_Select_CSI(t *testing.T) { // Add the node to the state store to index the healthy plugins and mark the volume "foo" healthy err = state.UpsertNode(structs.MsgTypeTestSetup, 1000, zero) - require.NoError(t, err) + must.NoError(t, err) // Use the node to build the stack and test - if err := zero.ComputeClass(); err != nil { - t.Fatalf("ComputedClass() failed: %v", err) - } + must.NoError(t, zero.ComputeClass()) stack := NewGenericStack(false, ctx) stack.SetNodes(nodes) @@ -411,13 +385,9 @@ func TestServiceStack_Select_CSI(t *testing.T) { selectOptions := &SelectOptions{ AllocName: structs.AllocName(job.Name, job.TaskGroups[0].Name, 0)} node := stack.Select(job.TaskGroups[0], selectOptions) - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } + must.NotNil(t, node, must.Sprintf("missing node %#v", ctx.Metrics())) - if node.Node != zero { - t.Fatalf("bad") - } + must.Eq(t, zero, node.Node) } func TestServiceStack_Select_ConstraintFilter(t *testing.T) { @@ -442,24 +412,14 @@ func TestServiceStack_Select_ConstraintFilter(t *testing.T) { stack.SetJob(job) selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } + must.NotNil(t, node, must.Sprintf("missing node %#v", ctx.Metrics())) - if node.Node != zero { - t.Fatalf("bad") - } + must.Eq(t, zero, node.Node) met := ctx.Metrics() - if met.NodesFiltered != 1 { - t.Fatalf("bad: %#v", met) - } - if met.ClassFiltered["linux-medium-pci"] != 1 { - t.Fatalf("bad: %#v", met) - } - if met.ConstraintFiltered["${attr.kernel.name} = freebsd"] != 1 { - t.Fatalf("bad: %#v", met) - } + must.One(t, met.NodesFiltered) + must.One(t, met.ClassFiltered["linux-medium-pci"]) + must.One(t, met.ConstraintFiltered["${attr.kernel.name} = freebsd"]) } func TestServiceStack_Select_BinPack_Overflow(t *testing.T) { @@ -486,25 +446,14 @@ func TestServiceStack_Select_BinPack_Overflow(t *testing.T) { selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) ctx.Metrics().PopulateScoreMetaData() - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } - - if node.Node != zero { - t.Fatalf("bad") - } + must.NotNil(t, node) + must.Eq(t, zero, node.Node) met := ctx.Metrics() - if met.NodesExhausted != 1 { - t.Fatalf("bad: %#v", met) - } - if met.ClassExhausted["linux-medium-pci"] != 1 { - t.Fatalf("bad: %#v", met) - } + must.One(t, met.NodesExhausted) + must.One(t, met.ClassExhausted["linux-medium-pci"]) // Expect score metadata for one node - if len(met.ScoreMetaData) != 1 { - t.Fatalf("bad: %#v", met) - } + must.Len(t, 1, met.ScoreMetaData) } func TestSystemStack_SetNodes(t *testing.T) { @@ -526,9 +475,7 @@ func TestSystemStack_SetNodes(t *testing.T) { stack.SetNodes(nodes) out := collectFeasible(stack.source) - if !reflect.DeepEqual(out, nodes) { - t.Fatalf("bad: %#v", out) - } + must.Eq(t, out, nodes) } func TestSystemStack_SetJob(t *testing.T) { @@ -540,12 +487,8 @@ func TestSystemStack_SetJob(t *testing.T) { job := mock.Job() stack.SetJob(job) - if stack.binPack.priority != job.Priority { - t.Fatalf("bad") - } - if !reflect.DeepEqual(stack.jobConstraint.constraints, job.Constraints) { - t.Fatalf("bad") - } + must.Eq(t, stack.binPack.priority, job.Priority) + must.Eq(t, stack.jobConstraint.constraints, job.Constraints) } func TestSystemStack_Select_Size(t *testing.T) { @@ -560,9 +503,7 @@ func TestSystemStack_Select_Size(t *testing.T) { stack.SetJob(job) selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } + must.NotNil(t, node) // Note: On Windows time.Now currently has a best case granularity of 1ms. // We skip the following assertion on Windows because this test usually @@ -591,24 +532,15 @@ func TestSystemStack_Select_MetricsReset(t *testing.T) { selectOptions := &SelectOptions{} n1 := stack.Select(job.TaskGroups[0], selectOptions) m1 := ctx.Metrics() - if n1 == nil { - t.Fatalf("missing node %#v", m1) - } - - if m1.NodesEvaluated != 1 { - t.Fatalf("should only be 1") - } + must.NotNil(t, n1) + must.One(t, m1.NodesEvaluated) n2 := stack.Select(job.TaskGroups[0], selectOptions) m2 := ctx.Metrics() - if n2 == nil { - t.Fatalf("missing node %#v", m2) - } + must.NotNil(t, n2) // If we don't reset, this would be 2 - if m2.NodesEvaluated != 1 { - t.Fatalf("should only be 2") - } + must.One(t, m2.NodesEvaluated) } func TestSystemStack_Select_DriverFilter(t *testing.T) { @@ -630,26 +562,17 @@ func TestSystemStack_Select_DriverFilter(t *testing.T) { selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } - - if node.Node != zero { - t.Fatalf("bad") - } + must.NotNil(t, node) + must.Eq(t, zero, node.Node) zero.Attributes["driver.foo"] = "0" - if err := zero.ComputeClass(); err != nil { - t.Fatalf("ComputedClass() failed: %v", err) - } + must.NoError(t, zero.ComputeClass()) stack = NewSystemStack(false, ctx) stack.SetNodes(nodes) stack.SetJob(job) node = stack.Select(job.TaskGroups[0], selectOptions) - if node != nil { - t.Fatalf("node not filtered %#v", node) - } + must.Nil(t, node) } func TestSystemStack_Select_ConstraintFilter(t *testing.T) { @@ -675,24 +598,13 @@ func TestSystemStack_Select_ConstraintFilter(t *testing.T) { selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } - - if node.Node != zero { - t.Fatalf("bad") - } + must.NotNil(t, node) + must.Eq(t, zero, node.Node) met := ctx.Metrics() - if met.NodesFiltered != 1 { - t.Fatalf("bad: %#v", met) - } - if met.ClassFiltered["linux-medium-pci"] != 1 { - t.Fatalf("bad: %#v", met) - } - if met.ConstraintFiltered["${attr.kernel.name} = freebsd"] != 1 { - t.Fatalf("bad: %#v", met) - } + must.One(t, met.NodesFiltered) + must.One(t, met.ClassFiltered["linux-medium-pci"]) + must.One(t, met.ConstraintFiltered["${attr.kernel.name} = freebsd"]) } func TestSystemStack_Select_BinPack_Overflow(t *testing.T) { @@ -720,23 +632,12 @@ func TestSystemStack_Select_BinPack_Overflow(t *testing.T) { selectOptions := &SelectOptions{} node := stack.Select(job.TaskGroups[0], selectOptions) ctx.Metrics().PopulateScoreMetaData() - if node == nil { - t.Fatalf("missing node %#v", ctx.Metrics()) - } - - if node.Node != one { - t.Fatalf("bad") - } + must.NotNil(t, node) + must.Eq(t, one, node.Node) met := ctx.Metrics() - if met.NodesExhausted != 1 { - t.Fatalf("bad: %#v", met) - } - if met.ClassExhausted["linux-medium-pci"] != 1 { - t.Fatalf("bad: %#v", met) - } + must.One(t, met.NodesExhausted) + must.One(t, met.ClassExhausted["linux-medium-pci"]) // Should have two scores, one from bin packing and one from normalization - if len(met.ScoreMetaData) != 1 { - t.Fatalf("bad: %#v", met) - } + must.Len(t, 1, met.ScoreMetaData) } diff --git a/testutil/tls.go b/testutil/tls.go index a1093e18f..db44d4480 100644 --- a/testutil/tls.go +++ b/testutil/tls.go @@ -10,20 +10,20 @@ import ( "testing" "github.com/hashicorp/nomad/helper/tlsutil" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) // Assert CA file exists and is a valid CA Returns the CA func IsValidCertificate(t *testing.T, caPath string) *x509.Certificate { t.Helper() - require.FileExists(t, caPath) + must.FileExists(t, caPath) caData, err := os.ReadFile(caPath) - require.NoError(t, err) + must.NoError(t, err) ca, err := tlsutil.ParseCert(string(caData)) - require.NoError(t, err) - require.NotNil(t, ca) + must.NoError(t, err) + must.NotNil(t, ca) return ca } @@ -32,21 +32,18 @@ func IsValidCertificate(t *testing.T, caPath string) *x509.Certificate { func IsValidSigner(t *testing.T, keyPath string) bool { t.Helper() - require.FileExists(t, keyPath) + must.FileExists(t, keyPath) fi, err := os.Stat(keyPath) - if err != nil { - t.Fatal("should not happen", err) - } + must.NoError(t, err) if want, have := fs.FileMode(0600), fi.Mode().Perm(); want != have { t.Fatalf("private key file %s: permissions: want: %o; have: %o", keyPath, want, have) } keyData, err := os.ReadFile(keyPath) - require.NoError(t, err) + must.NoError(t, err) signer, err := tlsutil.ParseSigner(string(keyData)) - require.NoError(t, err) - require.NotNil(t, signer) - + must.NoError(t, err) + must.NotNil(t, signer) return true } diff --git a/testutil/vault.go b/testutil/vault.go index ad4c85ce3..3622a5943 100644 --- a/testutil/vault.go +++ b/testutil/vault.go @@ -19,7 +19,6 @@ import ( "github.com/hashicorp/nomad/nomad/structs/config" vapi "github.com/hashicorp/vault/api" testing "github.com/mitchellh/go-testing-interface" - "github.com/stretchr/testify/require" ) // TestVault is a test helper. It uses a fork/exec model to create a test Vault @@ -229,7 +228,7 @@ func (tv *TestVault) Stop() { case <-tv.waitCh: return case <-time.After(1 * time.Second): - require.Fail(tv.t, "Timed out waiting for vault to terminate") + tv.t.Fatal("Timed out waiting for vault to terminate") } } } diff --git a/testutil/wait_test.go b/testutil/wait_test.go index 6006df36d..5f1785a19 100644 --- a/testutil/wait_test.go +++ b/testutil/wait_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "github.com/stretchr/testify/require" + "github.com/shoenig/test/must" ) func TestWait_WaitForFilesUntil(t *testing.T) { @@ -30,11 +30,10 @@ func TestWait_WaitForFilesUntil(t *testing.T) { for _, file := range files { t.Logf("Creating file %s ...", file) fh, createErr := os.Create(file) - require.NoError(t, createErr) + must.NoError(t, createErr) - closeErr := fh.Close() - require.NoError(t, closeErr) - require.FileExists(t, file) + must.Close(t, fh) + must.FileExists(t, file) time.Sleep(250 * time.Millisecond) }