Skip to content

Commit 7ad1276

Browse files
Don't use regex for profile config parsing, add more tests
1 parent e3f174d commit 7ad1276

File tree

5 files changed

+389
-66
lines changed

5 files changed

+389
-66
lines changed

aws-cpp-sdk-core-tests/aws/config/AWSConfigFileProfileConfigLoaderTest.cpp

Lines changed: 200 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,31 @@ static void WriteDefaultConfigFile(Aws::OStream& stream, bool useProfilePrefix =
3838
stream << "region = us-west-2" << std::endl;
3939
}
4040

41+
class TEST_HELPER_AWSConfigFileProfileConfigLoader : public AWSConfigFileProfileConfigLoader
42+
{
43+
public:
44+
TEST_HELPER_AWSConfigFileProfileConfigLoader(const Aws::String& fileName)
45+
: AWSConfigFileProfileConfigLoader(fileName, /*useProfilePrefix*/true)
46+
{}
47+
48+
// just making protected public in tests
49+
bool Public_PersistInternal(const Aws::Map<Aws::String, Aws::Config::Profile>& profiles)
50+
{
51+
return this->PersistInternal(profiles);
52+
}
53+
};
54+
55+
Aws::Map<Aws::String, Aws::Config::Profile> DumpAndReloadProfiles(const Aws::Map<Aws::String, Aws::Config::Profile>& profiles)
56+
{
57+
TempFile dumpedConfigFile(std::ios_base::out | std::ios_base::trunc);
58+
TEST_HELPER_AWSConfigFileProfileConfigLoader dumper(dumpedConfigFile.GetFileName());
59+
dumper.Public_PersistInternal(profiles);
60+
61+
AWSConfigFileProfileConfigLoader loader(dumpedConfigFile.GetFileName(), true);
62+
loader.Load();
63+
return loader.GetProfiles();
64+
}
65+
4166
TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileLoad)
4267
{
4368
TempFile configFile(std::ios_base::out | std::ios_base::trunc);
@@ -46,7 +71,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileLoad)
4671

4772
WriteDefaultConfigFile(configFile);
4873

49-
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName());
74+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), false);
5075
ASSERT_TRUE(loader.Load());
5176
auto profiles = loader.GetProfiles();
5277
// check the 3 profiles were read
@@ -90,7 +115,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestConfigFileLoad)
90115
TempFile configFile(std::ios_base::out | std::ios_base::trunc);
91116
ASSERT_TRUE(configFile.good());
92117

93-
WriteDefaultConfigFile(configFile);
118+
WriteDefaultConfigFile(configFile, true);
94119

95120
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
96121
ASSERT_TRUE(loader.Load());
@@ -133,7 +158,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileEmpty)
133158
ASSERT_TRUE(configFile.good());
134159
configFile << std::endl;
135160

136-
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName());
161+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), false);
137162
ASSERT_FALSE(loader.Load());
138163
ASSERT_EQ(0u, loader.GetProfiles().size());
139164
}
@@ -145,7 +170,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileNotExists)
145170
ASSERT_FALSE(configFile.good());
146171
configFile << std::endl;
147172

148-
AWSConfigFileProfileConfigLoader loader(configFileName);
173+
AWSConfigFileProfileConfigLoader loader(configFileName, false);
149174
ASSERT_FALSE(loader.Load());
150175
ASSERT_EQ(0u, loader.GetProfiles().size());
151176
}
@@ -161,7 +186,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileCorrupted)
161186
configFile << "blah=blah" << std::endl;
162187
configFile << "fjk;dsaifoewagtndsalkjds" << std::endl;
163188

164-
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName());
189+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), false);
165190
ASSERT_FALSE(loader.Load());
166191
ASSERT_EQ(0u, loader.GetProfiles().size());
167192
}
@@ -200,7 +225,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestConfigWithSSOParsing)
200225
static const Aws::String SSO_SESSION_NAME = profileFileName + "-sso-session"; // arbitrary
201226
ASSERT_TRUE(WriteConfigFileWithSSO(configFile, SSO_AWS_PROFILE, SSO_SESSION_NAME));
202227

203-
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName());
228+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
204229
ASSERT_TRUE(loader.Load());
205230
auto profiles = loader.GetProfiles();
206231

@@ -243,21 +268,8 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestProfileDumping)
243268
static const Aws::String SSO_SESSION_NAME = profileFileName + "-sso-session"; // arbitrary
244269
ASSERT_TRUE(WriteConfigFileWithSSO(configFile, SSO_AWS_PROFILE, SSO_SESSION_NAME));
245270

246-
class TEST_HELPER_AWSConfigFileProfileConfigLoader : public AWSConfigFileProfileConfigLoader
247-
{
248-
public:
249-
TEST_HELPER_AWSConfigFileProfileConfigLoader(const Aws::String& fileName)
250-
: AWSConfigFileProfileConfigLoader(fileName, /*useProfilePrefix*/true)
251-
{}
252-
253-
bool Public_PersistInternal(const Aws::Map<Aws::String, Aws::Config::Profile>& profiles)
254-
{
255-
return this->PersistInternal(profiles);
256-
}
257-
};
258-
259271
// Parse static test profile config
260-
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName());
272+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
261273
ASSERT_TRUE(loader.Load());
262274
auto initiallyReadProfiles = loader.GetProfiles();
263275

@@ -268,7 +280,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestProfileDumping)
268280
dumper.Public_PersistInternal(initiallyReadProfiles);
269281

270282
// Parse dumped test profile config
271-
AWSConfigFileProfileConfigLoader loaderOfDumped(dumpedConfigFile.GetFileName());
283+
AWSConfigFileProfileConfigLoader loaderOfDumped(dumpedConfigFile.GetFileName(), true);
272284
ASSERT_TRUE(loaderOfDumped.Load());
273285
auto profiles = loaderOfDumped.GetProfiles();
274286

@@ -300,3 +312,170 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestProfileDumping)
300312
ASSERT_EQ("us-east-1", ssoProfile.GetSsoSession().GetSsoRegion());
301313
ASSERT_EQ("https://d-abc123.awsapps.com/start", ssoProfile.GetSsoSession().GetSsoStartUrl());
302314
}
315+
316+
TEST(AWSConfigFileProfileConfigLoaderTest, TestEmptyProfileFile)
317+
{
318+
TempFile configFile(std::ios_base::out | std::ios_base::trunc);
319+
ASSERT_TRUE(configFile.good());
320+
321+
configFile << R"()";
322+
configFile.flush();
323+
324+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
325+
ASSERT_FALSE(loader.Load());
326+
ASSERT_EQ(0u, loader.GetProfiles().size());
327+
328+
configFile << "\t \n\n\n\n\n\t\t\t\t\t\n \n\n\n ";
329+
configFile.flush();
330+
AWSConfigFileProfileConfigLoader loader1(configFile.GetFileName());
331+
ASSERT_FALSE(loader1.Load());
332+
ASSERT_EQ(0u, loader1.GetProfiles().size());
333+
}
334+
335+
TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileCredentialsProcess)
336+
{
337+
TempFile configFile(std::ios_base::out | std::ios_base::trunc);
338+
ASSERT_TRUE(configFile.good());
339+
340+
const Aws::String profileFileContent = \
341+
R"(
342+
# Here is the example of .awsprofile
343+
;another comment
344+
[ default ]
345+
source_profile = base)" "\t" R"(
346+
credential_process = echo '{ "Version": 1, "AccessKeyId": "ASIARTESTID", "SecretAccessKey": "TESTSECRETKEY", "SessionToken": "TESTSESSIONTOKEN", "Expiration": "2022-05-02T18:36:00+00:00" }'#COMMENT
347+
; Comment to be ignored
348+
)"
349+
R"( )" // to avoid blank space removals by an IDE.
350+
R"(
351+
[ profile )" "\t\t\t" R"( base ]
352+
region = us-east-1#sa-east-3
353+
#region = commented-out region
354+
)";
355+
356+
configFile << profileFileContent;
357+
configFile.flush();
358+
359+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
360+
ASSERT_TRUE(loader.Load());
361+
const auto& loadedProfiles = loader.GetProfiles();
362+
const auto& reloadedProfiles = DumpAndReloadProfiles(loadedProfiles);
363+
364+
// 2 profiles 1 check
365+
const Aws::Vector<std::reference_wrapper<const Aws::Map<Aws::String, Aws::Config::Profile>>> loadedToCheck
366+
= {std::cref(loadedProfiles), std::cref(reloadedProfiles)};
367+
for(const auto& profilesRef : loadedToCheck)
368+
{
369+
const auto& profiles = profilesRef.get();
370+
ASSERT_EQ(2u, profiles.size());
371+
372+
ASSERT_EQ("base", profiles.at("default").GetSourceProfile());
373+
ASSERT_TRUE(profiles.at("base").GetSourceProfile().empty());
374+
375+
ASSERT_TRUE(profiles.at("base").GetCredentialProcess().empty());
376+
ASSERT_EQ(
377+
R"(echo '{ "Version": 1, "AccessKeyId": "ASIARTESTID", "SecretAccessKey": "TESTSECRETKEY", "SessionToken": "TESTSESSIONTOKEN", "Expiration": "2022-05-02T18:36:00+00:00" }')",
378+
profiles.at("default").GetCredentialProcess());
379+
380+
ASSERT_EQ("us-east-1", profiles.at("base").GetRegion());
381+
ASSERT_TRUE(profiles.at("default").GetRegion().empty());
382+
}
383+
}
384+
385+
TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileProfileName)
386+
{
387+
TempFile configFile(std::ios_base::out | std::ios_base::trunc);
388+
ASSERT_TRUE(configFile.good());
389+
390+
Aws::String profileFileContent = \
391+
R"([default]
392+
region = us-east-1
393+
aws_access_key_id = incorrect_key
394+
aws_secret_access_key = incorrect_secret
395+
[profile some-thing:long/the_one%only.foo@bar+]
396+
region = us-east-2
397+
aws_access_key_id = correct_key
398+
aws_secret_access_key = correct_secret)";
399+
400+
configFile << profileFileContent;
401+
configFile.flush();
402+
403+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
404+
ASSERT_TRUE(loader.Load());
405+
406+
const auto& loadedProfiles = loader.GetProfiles();
407+
const auto& reloadedProfiles = DumpAndReloadProfiles(loadedProfiles);
408+
409+
// 2 profiles 1 check
410+
const Aws::Vector<std::reference_wrapper<const Aws::Map<Aws::String, Aws::Config::Profile>>> loadedToCheck
411+
= {std::cref(loadedProfiles), std::cref(reloadedProfiles)};
412+
for(const auto& profilesRef : loadedToCheck)
413+
{
414+
const auto& profiles = profilesRef.get();
415+
416+
ASSERT_EQ(2u, profiles.size());
417+
ASSERT_TRUE(profiles.find("default") != profiles.end());
418+
ASSERT_EQ("default", profiles.at("default").GetName());
419+
ASSERT_EQ("us-east-1", profiles.at("default").GetRegion());
420+
ASSERT_EQ("incorrect_key", profiles.at("default").GetCredentials().GetAWSAccessKeyId());
421+
ASSERT_EQ("incorrect_secret", profiles.at("default").GetCredentials().GetAWSSecretKey());
422+
423+
const Aws::String complicatedProfileName = R"(some-thing:long/the_one%only.foo@bar+)";
424+
ASSERT_TRUE(profiles.find(complicatedProfileName) != profiles.end());
425+
ASSERT_EQ(complicatedProfileName, profiles.at(complicatedProfileName).GetName());
426+
ASSERT_EQ("us-east-2", profiles.at(complicatedProfileName).GetRegion());
427+
ASSERT_EQ("correct_key", profiles.at(complicatedProfileName).GetCredentials().GetAWSAccessKeyId());
428+
ASSERT_EQ("correct_secret", profiles.at(complicatedProfileName).GetCredentials().GetAWSSecretKey());
429+
}
430+
}
431+
432+
TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsBlankSpace)
433+
{
434+
TempFile configFile(std::ios_base::out | std::ios_base::trunc);
435+
ASSERT_TRUE(configFile.good());
436+
437+
Aws::String profileFileContent = \
438+
R"([ default ]
439+
region = us-east-1
440+
)"
441+
R"( )"
442+
R"(
443+
aws_access_key_id = incorrect_key
444+
aws_secret_access_key = incorrect_secret
445+
[ profile some-thing:long/the_one%only.foo@bar+ ]
446+
region = us-east-2
447+
aws_access_key_id = correct_key
448+
aws_secret_access_key = correct_secret)";
449+
450+
std::replace(profileFileContent.begin(), profileFileContent.end(), ' ', '\t');
451+
452+
configFile << profileFileContent;
453+
configFile.flush();
454+
455+
AWSConfigFileProfileConfigLoader loader(configFile.GetFileName(), true);
456+
ASSERT_TRUE(loader.Load());
457+
const auto& loadedProfiles = loader.GetProfiles();
458+
const auto& reloadedProfiles = DumpAndReloadProfiles(loadedProfiles);
459+
460+
// 2 profiles 1 check
461+
const Aws::Vector<std::reference_wrapper<const Aws::Map<Aws::String, Aws::Config::Profile>>> loadedToCheck
462+
= {std::cref(loadedProfiles), std::cref(reloadedProfiles)};
463+
for(const auto& profilesRef : loadedToCheck)
464+
{
465+
const auto& profiles = profilesRef.get();
466+
467+
ASSERT_EQ(2u, profiles.size());
468+
ASSERT_TRUE(profiles.find("default") != profiles.end());
469+
ASSERT_EQ("default", profiles.at("default").GetName());
470+
ASSERT_EQ("us-east-1", profiles.at("default").GetRegion());
471+
ASSERT_EQ("incorrect_key", profiles.at("default").GetCredentials().GetAWSAccessKeyId());
472+
ASSERT_EQ("incorrect_secret", profiles.at("default").GetCredentials().GetAWSSecretKey());
473+
474+
const Aws::String complicatedProfileName = R"(some-thing:long/the_one%only.foo@bar+)";
475+
ASSERT_TRUE(profiles.find(complicatedProfileName) != profiles.end());
476+
ASSERT_EQ(complicatedProfileName, profiles.at(complicatedProfileName).GetName());
477+
ASSERT_EQ("us-east-2", profiles.at(complicatedProfileName).GetRegion());
478+
ASSERT_EQ("correct_key", profiles.at(complicatedProfileName).GetCredentials().GetAWSAccessKeyId());
479+
ASSERT_EQ("correct_secret", profiles.at(complicatedProfileName).GetCredentials().GetAWSSecretKey());
480+
}
481+
}

0 commit comments

Comments
 (0)