@@ -38,6 +38,31 @@ static void WriteDefaultConfigFile(Aws::OStream& stream, bool useProfilePrefix =
38
38
stream << " region = us-west-2" << std::endl;
39
39
}
40
40
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
+
41
66
TEST (AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileLoad)
42
67
{
43
68
TempFile configFile (std::ios_base::out | std::ios_base::trunc);
@@ -46,7 +71,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileLoad)
46
71
47
72
WriteDefaultConfigFile (configFile);
48
73
49
- AWSConfigFileProfileConfigLoader loader (configFile.GetFileName ());
74
+ AWSConfigFileProfileConfigLoader loader (configFile.GetFileName (), false );
50
75
ASSERT_TRUE (loader.Load ());
51
76
auto profiles = loader.GetProfiles ();
52
77
// check the 3 profiles were read
@@ -90,7 +115,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestConfigFileLoad)
90
115
TempFile configFile (std::ios_base::out | std::ios_base::trunc);
91
116
ASSERT_TRUE (configFile.good ());
92
117
93
- WriteDefaultConfigFile (configFile);
118
+ WriteDefaultConfigFile (configFile, true );
94
119
95
120
AWSConfigFileProfileConfigLoader loader (configFile.GetFileName (), true );
96
121
ASSERT_TRUE (loader.Load ());
@@ -133,7 +158,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileEmpty)
133
158
ASSERT_TRUE (configFile.good ());
134
159
configFile << std::endl;
135
160
136
- AWSConfigFileProfileConfigLoader loader (configFile.GetFileName ());
161
+ AWSConfigFileProfileConfigLoader loader (configFile.GetFileName (), false );
137
162
ASSERT_FALSE (loader.Load ());
138
163
ASSERT_EQ (0u , loader.GetProfiles ().size ());
139
164
}
@@ -145,7 +170,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileNotExists)
145
170
ASSERT_FALSE (configFile.good ());
146
171
configFile << std::endl;
147
172
148
- AWSConfigFileProfileConfigLoader loader (configFileName);
173
+ AWSConfigFileProfileConfigLoader loader (configFileName, false );
149
174
ASSERT_FALSE (loader.Load ());
150
175
ASSERT_EQ (0u , loader.GetProfiles ().size ());
151
176
}
@@ -161,7 +186,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestCredentialsFileCorrupted)
161
186
configFile << " blah=blah" << std::endl;
162
187
configFile << " fjk;dsaifoewagtndsalkjds" << std::endl;
163
188
164
- AWSConfigFileProfileConfigLoader loader (configFile.GetFileName ());
189
+ AWSConfigFileProfileConfigLoader loader (configFile.GetFileName (), false );
165
190
ASSERT_FALSE (loader.Load ());
166
191
ASSERT_EQ (0u , loader.GetProfiles ().size ());
167
192
}
@@ -200,7 +225,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestConfigWithSSOParsing)
200
225
static const Aws::String SSO_SESSION_NAME = profileFileName + " -sso-session" ; // arbitrary
201
226
ASSERT_TRUE (WriteConfigFileWithSSO (configFile, SSO_AWS_PROFILE, SSO_SESSION_NAME));
202
227
203
- AWSConfigFileProfileConfigLoader loader (configFile.GetFileName ());
228
+ AWSConfigFileProfileConfigLoader loader (configFile.GetFileName (), true );
204
229
ASSERT_TRUE (loader.Load ());
205
230
auto profiles = loader.GetProfiles ();
206
231
@@ -243,21 +268,8 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestProfileDumping)
243
268
static const Aws::String SSO_SESSION_NAME = profileFileName + " -sso-session" ; // arbitrary
244
269
ASSERT_TRUE (WriteConfigFileWithSSO (configFile, SSO_AWS_PROFILE, SSO_SESSION_NAME));
245
270
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
-
259
271
// Parse static test profile config
260
- AWSConfigFileProfileConfigLoader loader (configFile.GetFileName ());
272
+ AWSConfigFileProfileConfigLoader loader (configFile.GetFileName (), true );
261
273
ASSERT_TRUE (loader.Load ());
262
274
auto initiallyReadProfiles = loader.GetProfiles ();
263
275
@@ -268,7 +280,7 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestProfileDumping)
268
280
dumper.Public_PersistInternal (initiallyReadProfiles);
269
281
270
282
// Parse dumped test profile config
271
- AWSConfigFileProfileConfigLoader loaderOfDumped (dumpedConfigFile.GetFileName ());
283
+ AWSConfigFileProfileConfigLoader loaderOfDumped (dumpedConfigFile.GetFileName (), true );
272
284
ASSERT_TRUE (loaderOfDumped.Load ());
273
285
auto profiles = loaderOfDumped.GetProfiles ();
274
286
@@ -300,3 +312,170 @@ TEST(AWSConfigFileProfileConfigLoaderTest, TestProfileDumping)
300
312
ASSERT_EQ (" us-east-1" , ssoProfile.GetSsoSession ().GetSsoRegion ());
301
313
ASSERT_EQ (" https://d-abc123.awsapps.com/start" , ssoProfile.GetSsoSession ().GetSsoStartUrl ());
302
314
}
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