Skip to content

Commit

Permalink
refine the test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
JacksonTian authored and yndu13 committed Aug 20, 2024
1 parent 36e3cfd commit de30cbd
Show file tree
Hide file tree
Showing 8 changed files with 100 additions and 53 deletions.
8 changes: 3 additions & 5 deletions credentials/credential.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,11 +197,9 @@ func (s *Config) SetSTSEndpoint(v string) *Config {
// please see README.md for detail.
func NewCredential(config *Config) (credential Credential, err error) {
if config == nil {
config, err = defaultChain.resolve()
if err != nil {
return
}
return NewCredential(config)
provider := providers.NewDefaultCredentialsProvider()
credential = fromCredentialsProvider("default", provider)
return
}
switch tea.StringValue(config.Type) {
case "credentials_uri":
Expand Down
21 changes: 12 additions & 9 deletions credentials/credential_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,26 @@ func TestConfig(t *testing.T) {
}

func TestNewCredentialWithNil(t *testing.T) {
originAccessKey := os.Getenv(EnvVarAccessKeyId)
originAccessSecret := os.Getenv(EnvVarAccessKeySecret)
os.Setenv(EnvVarAccessKeyId, "accesskey")
os.Setenv(EnvVarAccessKeySecret, "accesssecret")
rollback := utils.Memory(EnvVarAccessKeyId, EnvVarAccessKeySecret, "ALIBABA_CLOUD_CLI_PROFILE_DISABLED")
defer func() {
os.Setenv(EnvVarAccessKeyId, originAccessKey)
os.Setenv(EnvVarAccessKeySecret, originAccessSecret)
rollback()
}()

os.Setenv(EnvVarAccessKeyId, "accesskey")
os.Setenv(EnvVarAccessKeySecret, "accesssecret")

cred, err := NewCredential(nil)
assert.Nil(t, err)
assert.NotNil(t, cred)

os.Unsetenv(EnvVarAccessKeyId)
os.Unsetenv(EnvVarAccessKeySecret)
os.Setenv("ALIBABA_CLOUD_CLI_PROFILE_DISABLED", "true")

cred, err = NewCredential(nil)
assert.NotNil(t, err)
assert.Equal(t, "no credential found", err.Error())
assert.Nil(t, cred)
assert.Nil(t, err)
_, err = cred.GetCredential()
assert.Contains(t, err.Error(), "unable to get credentials from any of the providers in the chain:")
}

func TestNewCredentialWithAK(t *testing.T) {
Expand Down
11 changes: 9 additions & 2 deletions credentials/internal/providers/cli_profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package providers

import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"os"
Expand All @@ -24,7 +25,7 @@ func (b *CLIProfileCredentialsProviderBuilder) WithProfileName(profileName strin
return b
}

func (b *CLIProfileCredentialsProviderBuilder) Build() *CLIProfileCredentialsProvider {
func (b *CLIProfileCredentialsProviderBuilder) Build() (provider *CLIProfileCredentialsProvider, err error) {
// 优先级:
// 1. 使用显示指定的 profileName
// 2. 使用环境变量(ALIBABA_CLOUD_PROFILE)制定的 profileName
Expand All @@ -33,7 +34,13 @@ func (b *CLIProfileCredentialsProviderBuilder) Build() *CLIProfileCredentialsPro
b.provider.profileName = os.Getenv("ALIBABA_CLOUD_PROFILE")
}

return b.provider
if os.Getenv("ALIBABA_CLOUD_CLI_PROFILE_DISABLED") == "true" {
err = errors.New("the CLI profile is disabled")
return
}

provider = b.provider
return
}

func NewCLIProfileCredentialsProviderBuilder() *CLIProfileCredentialsProviderBuilder {
Expand Down
36 changes: 25 additions & 11 deletions credentials/internal/providers/cli_profile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,23 @@ import (
func TestCLIProfileCredentialsProvider(t *testing.T) {
rollback := utils.Memory("ALIBABA_CLOUD_PROFILE")
defer rollback()
b := NewCLIProfileCredentialsProviderBuilder().Build()

b, err := NewCLIProfileCredentialsProviderBuilder().
Build()
assert.Nil(t, err)
assert.Equal(t, "", b.profileName)

// get from env
os.Setenv("ALIBABA_CLOUD_PROFILE", "custom_profile")
b = NewCLIProfileCredentialsProviderBuilder().Build()
b, err = NewCLIProfileCredentialsProviderBuilder().
Build()
assert.Nil(t, err)
assert.Equal(t, "custom_profile", b.profileName)

b = NewCLIProfileCredentialsProviderBuilder().WithProfileName("profilename").Build()
b, err = NewCLIProfileCredentialsProviderBuilder().
WithProfileName("profilename").
Build()
assert.Nil(t, err)
assert.Equal(t, "profilename", b.profileName)
}

Expand Down Expand Up @@ -118,8 +126,9 @@ func TestCLIProfileCredentialsProvider_getCredentialsProvider(t *testing.T) {
},
}

provider := NewCLIProfileCredentialsProviderBuilder().Build()
_, err := provider.getCredentialsProvider(conf, "inexist")
provider, err := NewCLIProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(conf, "inexist")
assert.EqualError(t, err, "unable to get profile with 'inexist'")

// AK
Expand Down Expand Up @@ -172,14 +181,16 @@ func TestCLIProfileCredentialsProvider_GetCredentials(t *testing.T) {
getHomePath = func() string {
return ""
}
provider := NewCLIProfileCredentialsProviderBuilder().Build()
_, err := provider.GetCredentials()
provider, err := NewCLIProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "cannot found home dir")

getHomePath = func() string {
return "/path/invalid/home/dir"
}
provider = NewCLIProfileCredentialsProviderBuilder().Build()
provider, err = NewCLIProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "reading aliyun cli config from '/path/invalid/home/dir/.aliyun/config.json' failed open /path/invalid/home/dir/.aliyun/config.json: no such file or directory")

Expand All @@ -189,17 +200,20 @@ func TestCLIProfileCredentialsProvider_GetCredentials(t *testing.T) {
}

// get credentials by current profile
provider = NewCLIProfileCredentialsProviderBuilder().Build()
provider, err = NewCLIProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
cc, err := provider.GetCredentials()
assert.Nil(t, err)
assert.Equal(t, &Credentials{AccessKeyId: "akid", AccessKeySecret: "secret", SecurityToken: "", ProviderName: "cli_profile/static_ak"}, cc)

provider = NewCLIProfileCredentialsProviderBuilder().WithProfileName("inexist").Build()
provider, err = NewCLIProfileCredentialsProviderBuilder().WithProfileName("inexist").Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "unable to get profile with 'inexist'")

// The get_credentials_error profile is invalid
provider = NewCLIProfileCredentialsProviderBuilder().WithProfileName("get_credentials_error").Build()
provider, err = NewCLIProfileCredentialsProviderBuilder().WithProfileName("get_credentials_error").Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.Contains(t, err.Error(), "InvalidAccessKeyId.NotFound")
}
11 changes: 8 additions & 3 deletions credentials/internal/providers/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,16 @@ func NewDefaultCredentialsProvider() (provider *DefaultCredentialsProvider) {
}

// cli credentials provider
providers = append(providers, NewCLIProfileCredentialsProviderBuilder().Build())
cliProfileProvider, err := NewCLIProfileCredentialsProviderBuilder().Build()
if err == nil {
providers = append(providers, cliProfileProvider)
}

// profile credentials provider
// providers = append(providers)
providers = append(providers, NewProfileCredentialsProviderBuilder().Build())
profileProvider, err := NewProfileCredentialsProviderBuilder().Build()
if err == nil {
providers = append(providers, profileProvider)
}

// Add IMDS
if os.Getenv("ALIBABA_CLOUD_ECS_METADATA") != "" {
Expand Down
2 changes: 1 addition & 1 deletion credentials/internal/providers/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func (b *ProfileCredentialsProviderBuilder) WithProfileName(profileName string)
return b
}

func (b *ProfileCredentialsProviderBuilder) Build() (provider *ProfileCredentialsProvider) {
func (b *ProfileCredentialsProviderBuilder) Build() (provider *ProfileCredentialsProvider, err error) {
// 优先级:
// 1. 使用显示指定的 profileName
// 2. 使用环境变量(ALIBABA_CLOUD_PROFILE)指定的 profileName
Expand Down
61 changes: 40 additions & 21 deletions credentials/internal/providers/profile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,24 +91,28 @@ func TestProfileCredentialsProviderBuilder(t *testing.T) {
defer rollback()

// profile name from specified
provider := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
provider, err := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
assert.Nil(t, err)
assert.Equal(t, "custom", provider.profileName)

// profile name from env
os.Setenv("ALIBABA_CLOUD_PROFILE", "profile_from_env")
provider = NewProfileCredentialsProviderBuilder().Build()
provider, err = NewProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)

assert.Equal(t, "profile_from_env", provider.profileName)

// profile name from default
os.Setenv("ALIBABA_CLOUD_PROFILE", "")
provider = NewProfileCredentialsProviderBuilder().Build()
provider, err = NewProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
assert.Equal(t, "default", provider.profileName)
}

func TestProfileCredentialsProvider_getCredentialsProvider(t *testing.T) {
provider := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
_, err := provider.getCredentialsProvider(ini.Empty())
provider, err := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(ini.Empty())
assert.NotNil(t, err)
assert.EqualError(t, err, "ERROR: Can not load sectionsection \"custom\" does not exist")

Expand All @@ -117,25 +121,29 @@ func TestProfileCredentialsProvider_getCredentialsProvider(t *testing.T) {
assert.NotNil(t, file)

// no type
provider = NewProfileCredentialsProviderBuilder().WithProfileName("notype").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("notype").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.NotNil(t, err)
assert.EqualError(t, err, "ERROR: Can not find credential typeerror when getting key of section \"notype\": key \"type\" not exists")

// no ak
provider = NewProfileCredentialsProviderBuilder().WithProfileName("noak").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("noak").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.NotNil(t, err)
assert.EqualError(t, err, "ERROR: Failed to get value")

// value is empty
provider = NewProfileCredentialsProviderBuilder().WithProfileName("emptyak").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("emptyak").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.NotNil(t, err)
assert.EqualError(t, err, "ERROR: Value can't be empty")

// static ak provider
provider = NewProfileCredentialsProviderBuilder().Build()
provider, err = NewProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
cp, err := provider.getCredentialsProvider(file)
assert.Nil(t, err)
akcp, ok := cp.(*StaticAKCredentialsProvider)
Expand All @@ -145,36 +153,42 @@ func TestProfileCredentialsProvider_getCredentialsProvider(t *testing.T) {
assert.Equal(t, &Credentials{AccessKeyId: "foo", AccessKeySecret: "bar", SecurityToken: "", ProviderName: "static_ak"}, cc)

// ecs_ram_role without rolename
provider = NewProfileCredentialsProviderBuilder().WithProfileName("noecs").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("noecs").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.EqualError(t, err, "ERROR: Failed to get value")

// ecs_ram_role with rolename
provider = NewProfileCredentialsProviderBuilder().WithProfileName("ecs").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("ecs").Build()
assert.Nil(t, err)
cp, err = provider.getCredentialsProvider(file)
assert.Nil(t, err)
_, ok = cp.(*ECSRAMRoleCredentialsProvider)
assert.True(t, ok)

// ram role arn without keys
provider = NewProfileCredentialsProviderBuilder().WithProfileName("noram").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("noram").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.EqualError(t, err, "ERROR: Failed to get value")

// ram role arn without values
provider = NewProfileCredentialsProviderBuilder().WithProfileName("emptyram").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("emptyram").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.EqualError(t, err, "ERROR: Value can't be empty")

// normal ram role arn
provider = NewProfileCredentialsProviderBuilder().WithProfileName("ram").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("ram").Build()
assert.Nil(t, err)
cp, err = provider.getCredentialsProvider(file)
assert.Nil(t, err)
_, ok = cp.(*RAMRoleARNCredentialsProvider)
assert.True(t, ok)

// unsupported type
provider = NewProfileCredentialsProviderBuilder().WithProfileName("error_type").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("error_type").Build()
assert.Nil(t, err)
_, err = provider.getCredentialsProvider(file)
assert.EqualError(t, err, "ERROR: Failed to get credential")
}
Expand All @@ -190,22 +204,25 @@ func TestProfileCredentialsProviderGetCredentials(t *testing.T) {
getHomePath = func() string {
return ""
}
provider := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
_, err := provider.GetCredentials()
provider, err := NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "cannot found home dir")

// testcase: invalid home
getHomePath = func() string {
return "/path/invalid/home/dir"
}

provider = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "ERROR: Can not open fileopen /path/invalid/home/dir/.alibabacloud/credentials: no such file or directory")

// testcase: specify credentials file with env
os.Setenv("ALIBABA_CLOUD_CREDENTIALS_FILE", "/path/to/credentials.invalid")
provider = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "ERROR: Can not open fileopen /path/to/credentials.invalid: no such file or directory")
os.Unsetenv("ALIBABA_CLOUD_CREDENTIALS_FILE")
Expand All @@ -216,11 +233,13 @@ func TestProfileCredentialsProviderGetCredentials(t *testing.T) {
return path.Join(wd, "fixtures")
}

provider = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
provider, err = NewProfileCredentialsProviderBuilder().WithProfileName("custom").Build()
assert.Nil(t, err)
_, err = provider.GetCredentials()
assert.EqualError(t, err, "ERROR: Can not load sectionsection \"custom\" does not exist")

provider = NewProfileCredentialsProviderBuilder().Build()
provider, err = NewProfileCredentialsProviderBuilder().Build()
assert.Nil(t, err)
cc, err := provider.GetCredentials()
assert.Nil(t, err)
assert.Equal(t, &Credentials{AccessKeyId: "foo", AccessKeySecret: "bar", SecurityToken: "", ProviderName: "profile/static_ak"}, cc)
Expand Down
3 changes: 2 additions & 1 deletion credentials/provider_chain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,9 @@ func TestDefaultChainHasCred(t *testing.T) {
assert.Equal(t, "roleSessionName", tea.StringValue(config.RoleSessionName))
assert.Equal(t, "oidc_role_arn", tea.StringValue(config.Type))

os.Setenv("ALIBABA_CLOUD_CLI_PROFILE_DISABLED", "true")
cred, err := NewCredential(nil)
assert.Nil(t, err)
assert.NotNil(t, cred)
assert.Contains(t, "oidc_role_arn", tea.StringValue(cred.GetType()))
assert.Equal(t, "default", *cred.GetType())
}

0 comments on commit de30cbd

Please sign in to comment.