|
| 1 | +using System; |
| 2 | +using System.IO; |
| 3 | +using System.Reflection; |
| 4 | +using Aliyun.Acs.Core.Auth; |
| 5 | +using Aliyun.Acs.Core.Auth.Provider; |
| 6 | +using Aliyun.Acs.Core.Exceptions; |
| 7 | +using Aliyun.Acs.Core.Utils; |
| 8 | +using Newtonsoft.Json; |
| 9 | +using Xunit; |
| 10 | + |
| 11 | + |
| 12 | +namespace Aliyun.Acs.Core.Tests.Units.Auth; |
| 13 | + |
| 14 | +public class CLIProfileCredentialsProviderTest |
| 15 | +{ |
| 16 | + [Fact] |
| 17 | + public void GetProfileNameTest() |
| 18 | + { |
| 19 | + CLIProfileCredentialsProvider provider = new CLIProfileCredentialsProvider(); |
| 20 | + Assert.Null(provider.GetProfileName()); |
| 21 | + provider = new CLIProfileCredentialsProvider("AK"); |
| 22 | + Assert.Equal("AK", provider.GetProfileName()); |
| 23 | + |
| 24 | + var cacheProfile = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_PROFILE"); |
| 25 | + Environment.SetEnvironmentVariable("ALIBABA_CLOUD_PROFILE", "TEST"); |
| 26 | + provider = new CLIProfileCredentialsProvider(); |
| 27 | + Assert.Equal("TEST", provider.GetProfileName()); |
| 28 | + Environment.SetEnvironmentVariable("ALIBABA_CLOUD_PROFILE", cacheProfile); |
| 29 | + |
| 30 | + var path = TestHelper.GetCLIConfigFilePath("aliyun"); |
| 31 | + provider = new CLIProfileCredentialsProvider(); |
| 32 | + var credential = provider.GetCredentials(path); |
| 33 | + |
| 34 | + Environment.SetEnvironmentVariable("ALIBABA_CLOUD_PROFILE", "AK"); |
| 35 | + credential = provider.GetCredentials(path); |
| 36 | + Environment.SetEnvironmentVariable("ALIBABA_CLOUD_PROFILE", cacheProfile); |
| 37 | + |
| 38 | + path = TestHelper.GetCLIConfigFilePath("empty"); |
| 39 | + var ex = Assert.Throws<ClientException>(() => provider.GetCredentials(path)); |
| 40 | + Assert.Equal("Unable to get profile form empty CLI credentials file.", ex.Message); |
| 41 | + } |
| 42 | + |
| 43 | + [Fact] |
| 44 | + public void ShouldReloadCredentialsProviderTest() |
| 45 | + { |
| 46 | + CLIProfileCredentialsProvider provider = new CLIProfileCredentialsProvider(); |
| 47 | + Assert.True(provider.ShouldReloadCredentialsProvider("")); |
| 48 | + } |
| 49 | + |
| 50 | + [Fact] |
| 51 | + public void DisableCLIProfileTest() |
| 52 | + { |
| 53 | + bool isDisableCLIProfile = AuthUtils.EnvironmentDisableCLIProfile; |
| 54 | + AuthUtils.EnvironmentDisableCLIProfile = true; |
| 55 | + CLIProfileCredentialsProvider provider = new CLIProfileCredentialsProvider(); |
| 56 | + var ex = Assert.Throws<ClientException>(() => { provider.GetCredentials(); }); |
| 57 | + Assert.Contains("CLI credentials file is disabled.", ex.Message); |
| 58 | + AuthUtils.EnvironmentDisableCLIProfile = isDisableCLIProfile; |
| 59 | + } |
| 60 | + |
| 61 | + [Fact] |
| 62 | + public void ParseProfileTest() |
| 63 | + { |
| 64 | + CLIProfileCredentialsProvider provider = new CLIProfileCredentialsProvider(); |
| 65 | + var ex = Assert.Throws<ClientException>(() => { provider.ParseProfile("./not_exist_config.json"); }); |
| 66 | + Assert.Contains("Unable to open credentials file", ex.Message); |
| 67 | + |
| 68 | + string configPath = TestHelper.GetCLIConfigFilePath("invalid"); |
| 69 | + ex = Assert.Throws<ClientException>(() => { provider.ParseProfile(configPath); }); |
| 70 | + Assert.Contains("Failed to parse credential from CLI credentials file", ex.Message); |
| 71 | + |
| 72 | + configPath = TestHelper.GetCLIConfigFilePath("empty"); |
| 73 | + CLIProfileCredentialsProvider.Config config = provider.ParseProfile(configPath); |
| 74 | + Assert.Null(config); |
| 75 | + |
| 76 | + configPath = TestHelper.GetCLIConfigFilePath("mock_empty"); |
| 77 | + config = provider.ParseProfile(configPath); |
| 78 | + Assert.NotNull(config); |
| 79 | + Assert.Null(config.GetCurrent()); |
| 80 | + Assert.Null(config.GetProfiles()); |
| 81 | + |
| 82 | + configPath = TestHelper.GetCLIConfigFilePath("full"); |
| 83 | + config = provider.ParseProfile(configPath); |
| 84 | + Assert.Equal("AK", config.GetCurrent()); |
| 85 | + Assert.Equal(5, config.GetProfiles().Count); |
| 86 | + var settings = new JsonSerializerSettings |
| 87 | + { |
| 88 | + NullValueHandling = NullValueHandling.Ignore |
| 89 | + }; |
| 90 | + Assert.Equal("[{\"name\":\"AK\",\"mode\":\"AK\",\"access_key_id\":\"access_key_id\",\"access_key_secret\":\"access_key_secret\"},{\"name\":\"RamRoleArn\",\"mode\":\"RamRoleArn\",\"access_key_id\":\"access_key_id\",\"access_key_secret\":\"access_key_secret\",\"ram_role_arn\":\"ram_role_arn\",\"ram_session_name\":\"ram_session_name\",\"expired_seconds\":3600,\"sts_region\":\"cn-hangzhou\",\"enable_vpc\":true},{\"name\":\"EcsRamRole\",\"mode\":\"EcsRamRole\",\"ram_role_name\":\"ram_role_name\"},{\"name\":\"OIDC\",\"mode\":\"OIDC\",\"ram_role_arn\":\"ram_role_arn\",\"ram_session_name\":\"ram_session_name\",\"expired_seconds\":3600,\"sts_region\":\"cn-hangzhou\",\"oidc_token_file\":\"path/to/oidc/file\",\"oidc_provider_arn\":\"oidc_provider_arn\"},{\"name\":\"ChainableRamRoleArn\",\"mode\":\"ChainableRamRoleArn\",\"ram_role_arn\":\"ram_role_arn\",\"ram_session_name\":\"ram_session_name\",\"expired_seconds\":3600,\"sts_region\":\"cn-hangzhou\",\"source_profile\":\"AK\"}]", JsonConvert.SerializeObject(config.GetProfiles(), settings)); |
| 91 | + } |
| 92 | + |
| 93 | + [Fact] |
| 94 | + public void ReloadCredentialsProviderTest() |
| 95 | + { |
| 96 | + CLIProfileCredentialsProvider provider = new CLIProfileCredentialsProvider(); |
| 97 | + var configPath = TestHelper.GetCLIConfigFilePath("aliyun"); |
| 98 | + CLIProfileCredentialsProvider.Config config = provider.ParseProfile(configPath); |
| 99 | + var ex = Assert.Throws<ClientException>(() => { provider.ReloadCredentialsProvider(config, "notExist"); }); |
| 100 | + Assert.Contains("Unable to get profile with 'notExist' form CLI credentials file.", ex.Message); |
| 101 | + |
| 102 | + AlibabaCloudCredentialsProvider credentialsProvider = provider.ReloadCredentialsProvider(config, "AK"); |
| 103 | + Assert.True(credentialsProvider is StaticCredentialsProvider); |
| 104 | + AlibabaCloudCredentials credential = credentialsProvider.GetCredentials(); |
| 105 | + Assert.Equal("akid", credential.GetAccessKeyId()); |
| 106 | + Assert.Equal("secret", credential.GetAccessKeySecret()); |
| 107 | + |
| 108 | + credentialsProvider = provider.ReloadCredentialsProvider(config, "RamRoleArn"); |
| 109 | + Assert.True(credentialsProvider is STSAssumeRoleSessionCredentialsProvider); |
| 110 | + ex = Assert.Throws<ClientException>(() => { credentialsProvider.GetCredentials(); }); |
| 111 | + Assert.Contains("InvalidAccessKeyId.NotFound", ex.Message); |
| 112 | + |
| 113 | + credentialsProvider = provider.ReloadCredentialsProvider(config, "RamRoleArnEnableVpc"); |
| 114 | + Assert.True(credentialsProvider is STSAssumeRoleSessionCredentialsProvider); |
| 115 | + ex = Assert.Throws<ClientException>(() => { credentialsProvider.GetCredentials(); }); |
| 116 | + Assert.Contains("the request url is sts-vpc.cn-hangzhou.aliyuncs.com", ex.Message); |
| 117 | + |
| 118 | + var ex1 = Assert.Throws<ArgumentOutOfRangeException>(() => { provider.ReloadCredentialsProvider(config, "Invalid_RamRoleArn"); }); |
| 119 | + Assert.Contains("Access key ID cannot be null.", ex1.Message); |
| 120 | + |
| 121 | + credentialsProvider = provider.ReloadCredentialsProvider(config, "EcsRamRole"); |
| 122 | + Assert.True(credentialsProvider is InstanceProfileCredentialsProvider); |
| 123 | + |
| 124 | + credentialsProvider = provider.ReloadCredentialsProvider(config, "OIDC"); |
| 125 | + Assert.True(credentialsProvider is OIDCCredentialsProvider); |
| 126 | + |
| 127 | + credentialsProvider = provider.ReloadCredentialsProvider(config, "OIDCEnableVpc"); |
| 128 | + Assert.True(credentialsProvider is OIDCCredentialsProvider); |
| 129 | + |
| 130 | + credentialsProvider = provider.ReloadCredentialsProvider(config, "ChainableRamRoleArn"); |
| 131 | + Assert.True(credentialsProvider is STSAssumeRoleSessionCredentialsProvider); |
| 132 | + |
| 133 | + ex = Assert.Throws<ClientException>(() => { provider.ReloadCredentialsProvider(config, "ChainableRamRoleArn1"); }); |
| 134 | + Assert.Equal("Source profile name can not be the same as profile name.", ex.Message); |
| 135 | + |
| 136 | + ex = Assert.Throws<ClientException>(() => { provider.ReloadCredentialsProvider(config, "ChainableRamRoleArn2"); }); |
| 137 | + Assert.Contains("Unable to get profile with 'InvalidSource' form CLI credentials file.", ex.Message); |
| 138 | + |
| 139 | + ex = Assert.Throws<ClientException>(() => { provider.ReloadCredentialsProvider(config, "Unsupported"); }); |
| 140 | + Assert.Contains("Unsupported profile mode 'Unsupported' form CLI credentials file.", ex.Message); |
| 141 | + } |
| 142 | +} |
0 commit comments