@@ -98,9 +98,12 @@ class SSOCredentialsProviderTrackingTest : public Aws::Testing::AwsCppSdkGTestSu
9898 void CreateTestConfig (const Aws::String& startUrl) {
9999 std::ofstream cfg (m_configPath.c_str ());
100100 cfg << " [default]\n "
101+ " sso_session = my-sso\n "
101102 " sso_account_id = 123456789012\n "
102- " sso_region = us-east-1\n "
103103 " sso_role_name = TestRole\n "
104+ " \n "
105+ " [sso-session my-sso]\n "
106+ " sso_region = us-east-1\n "
104107 " sso_start_url = " << startUrl << " \n " ;
105108 cfg.close ();
106109
@@ -132,6 +135,27 @@ class SSOCredentialsProviderTrackingTest : public Aws::Testing::AwsCppSdkGTestSu
132135 check.close ();
133136 }
134137
138+ void CreateSSOSessionTokenFile (const Aws::String& sessionName /* e.g., "my-sso" */ ) {
139+ const Aws::String hash = Aws::Utils::HashingUtils::HexEncode (
140+ Aws::Utils::HashingUtils::CalculateSHA1 (sessionName));
141+ const Aws::String tokenPath = m_ssoCacheDir + PATH_DELIM + hash + " .json" ;
142+
143+ std::ofstream tokenFile (tokenPath.c_str ());
144+ ASSERT_TRUE (tokenFile.good ()) << " Failed to open " << tokenPath;
145+
146+ const auto futureTime = Aws::Utils::DateTime::Now () + std::chrono::hours (1 );
147+ tokenFile << " {\n "
148+ " \" accessToken\" : \" test-token\" ,\n "
149+ " \" expiresAt\" : \" " << futureTime.ToGmtString (Aws::Utils::DateFormat::ISO_8601) << " \"\n "
150+ // (region/startUrl fields are optional on this path)
151+ " }\n " ;
152+ tokenFile.close ();
153+
154+ std::ifstream check (tokenPath.c_str ());
155+ ASSERT_TRUE (check.good ()) << " Token not created at: " << tokenPath;
156+ check.close ();
157+ }
158+
135159 void RunTrackingProbe (const std::shared_ptr<AWSCredentialsProvider>& provider, const Aws::String& marker) {
136160 // 200 OK dummy response for the signed call
137161 auto req = CreateHttpRequest (URI (" dummy" ), HttpMethod::HTTP_POST, Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
@@ -154,14 +178,14 @@ class SSOCredentialsProviderTrackingTest : public Aws::Testing::AwsCppSdkGTestSu
154178 const auto userAgent = last.GetHeaderValue (USER_AGENT_HEADER);
155179 ASSERT_FALSE (userAgent.empty ());
156180
157- const auto parts = StringUtils::Split (userAgent, ' ' );
181+ const auto userAgentParsed = StringUtils::Split (userAgent, ' ' );
158182 int mCount = 0 ;
159- for (const auto & p : parts ) if (p.find (" m/" ) != Aws::String::npos) ++mCount ;
183+ for (const auto & p : userAgentParsed ) if (p.find (" m/" ) != Aws::String::npos) ++mCount ;
160184 EXPECT_EQ (1 , mCount ); // only one m/ section
161185
162- auto it = std::find_if (parts .begin (), parts .end (),
186+ auto businessMetrics = std::find_if (userAgentParsed .begin (), userAgentParsed .end (),
163187 [&marker](const Aws::String& v){ return v.find (" m/" ) != Aws::String::npos && v.find (marker) != Aws::String::npos; });
164- EXPECT_TRUE (it != parts .end ());
188+ EXPECT_TRUE (businessMetrics != userAgentParsed .end ());
165189 }
166190
167191 Aws::String m_profileDir;
@@ -176,7 +200,7 @@ TEST_F(SSOCredentialsProviderTrackingTest, TestSSOCredentialsTracking){
176200 const Aws::String startUrl = " https://test.awsapps.com/start" ;
177201
178202 CreateTestConfig (startUrl);
179- CreateSSOTokenFile (startUrl );
203+ CreateSSOSessionTokenFile ( " my-sso " );
180204
181205 // Prepare mock SSO GetRoleCredentials response
182206 auto ssoReq = CreateHttpRequest (
0 commit comments