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
This commit is contained in:
Seth Hoenig
2024-02-29 12:11:35 -06:00
committed by GitHub
parent c2fe51bf11
commit 4d83733909
106 changed files with 1297 additions and 1567 deletions

View File

@@ -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
)

View File

@@ -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=

View File

@@ -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{

View File

@@ -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 = <none>")
must.StrContains(t, out, "Expiry Time = <none>")
}
// 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 = <none>")
must.StrContains(t, out, "Expiry Time = <none>")
}
// Attempting to bootstrap the server with an invalid operator provided token in a file should

View File

@@ -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()

View File

@@ -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")
}

View File

@@ -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: <acl_role_id>")
must.One(t, cmd.Run([]string{"-address=" + url, "-token=" + rootACLToken.SecretID}))
must.StrContains(t, ui.ErrorWriter.String(), "This command takes one argument: <acl_role_id>")
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 = <none>")
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 = <none>")
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 = <none>")
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 = <none>")
must.StrContains(t, s, fmt.Sprintf("Policies = %s", aclPolicy.Name))
ui.OutputWriter.Reset()
ui.ErrorWriter.Reset()

View File

@@ -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()

View File

@@ -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)
}

View File

@@ -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()

View File

@@ -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 = <none>")
must.StrContains(t, out, "[foo]")
must.StrContains(t, out, "Expiry Time = <none>")
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 = <none>")
must.StrNotContains(t, out, "Expiry Time = <none>")
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)
}

View File

@@ -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
}

View File

@@ -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, "<redacted>", host.Environment["VAULT_TOKEN"])
require.Equal(t, "<redacted>", host.Environment["BOGUS_TOKEN"])
require.Equal(t, "<redacted>", host.Environment["BOGUS_SECRET"])
require.Equal(t, "<redacted>", 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, "<redacted>", host.Environment["VAULT_TOKEN"])
must.Eq(t, "<redacted>", host.Environment["BOGUS_TOKEN"])
must.Eq(t, "<redacted>", host.Environment["BOGUS_SECRET"])
must.Eq(t, "<redacted>", host.Environment["ryanSECRETS"])
}

View File

@@ -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])
}

View File

@@ -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])
}

View File

@@ -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])
}

View File

@@ -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])
}

View File

@@ -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])
}

View File

@@ -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])
}

View File

@@ -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)
})
}
}

View File

@@ -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))
}
}

View File

@@ -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])
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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) {

View File

@@ -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)
}
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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")
}

View File

@@ -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) {

View File

@@ -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"
)

View File

@@ -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) {

View File

@@ -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)
}

View File

@@ -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) {

View File

@@ -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)
}

View File

@@ -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")
}

View File

@@ -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)
})
}
}

View File

@@ -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)
})
}
}

View File

@@ -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) {

View File

@@ -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])
}

View File

@@ -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")
}

View File

@@ -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})

View File

@@ -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])
}

View File

@@ -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])
}

View File

@@ -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) {

View File

@@ -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))
}

View File

@@ -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&region=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")
}

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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)
}
}

View File

@@ -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")
}

View File

@@ -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")
}

View File

@@ -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)
}

View File

@@ -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
}

View File

@@ -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")
}

View File

@@ -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")
}

View File

@@ -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])
}

View File

@@ -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

View File

@@ -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))
}

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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])
}

View File

@@ -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)
}
}

View File

@@ -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)
})
}
}

View File

@@ -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")
}

View File

@@ -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)
})
}
}

View File

@@ -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: <service_name> and <service_id>")
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()

View File

@@ -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: <service_name>")
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)
})
}
}

View File

@@ -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()

View File

@@ -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) {

View File

@@ -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+<none>\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+<none>\s+<none>\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+<none>\s+8080,8081\n`
require.Regexp(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
must.RegexMatch(t, regexp.MustCompile(verboseHostNetworksBodyRegexpStr), out)
},
},
}

View File

@@ -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))
})
}
}

View File

@@ -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)
}))
}
}

View File

@@ -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))
})
}
}

View File

@@ -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])
})
}

View File

@@ -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))
})
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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])
})
}

View File

@@ -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) {

View File

@@ -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)
})
}
}

View File

@@ -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])
}

View File

@@ -1,6 +1,8 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
//go:build linux
package docker
import (

2
go.mod
View File

@@ -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

4
go.sum
View File

@@ -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=

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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)
}
})
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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)
}

View File

@@ -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)
})
}
}

View File

@@ -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())
})
}
}

Some files were not shown because too many files have changed in this diff Show More