1+ /* *
2+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+ * SPDX-License-Identifier: Apache-2.0.
4+ */
5+
6+ #include < aws/testing/AwsCppSdkGTestSuite.h>
7+ #include < aws/testing/AwsTestHelpers.h>
8+ #include < aws/testing/mocks/aws/client/MockAWSClient.h>
9+ #include < aws/testing/mocks/http/MockHttpClient.h>
10+ #include < aws/core/auth/AWSCredentialsProvider.h>
11+ #include < aws/core/client/ClientConfiguration.h>
12+ #include < aws/core/platform/Environment.h>
13+ #include < aws/core/utils/StringUtils.h>
14+
15+ using namespace Aws ::Client;
16+ using namespace Aws ::Auth;
17+ using namespace Aws ::Http;
18+
19+ static const char ALLOCATION_TAG[] = " CredentialTrackingTest" ;
20+
21+ class CredentialTrackingTest : public Aws ::Testing::AwsCppSdkGTestSuite
22+ {
23+ protected:
24+ std::shared_ptr<MockHttpClient> mockHttpClient;
25+ std::shared_ptr<MockHttpClientFactory> mockHttpClientFactory;
26+
27+ void SetUp () override
28+ {
29+ mockHttpClient = Aws::MakeShared<MockHttpClient>(ALLOCATION_TAG);
30+ mockHttpClientFactory = Aws::MakeShared<MockHttpClientFactory>(ALLOCATION_TAG);
31+ mockHttpClientFactory->SetClient (mockHttpClient);
32+ SetHttpClientFactory (mockHttpClientFactory);
33+ }
34+
35+ void TearDown () override
36+ {
37+ mockHttpClient->Reset ();
38+ mockHttpClient = nullptr ;
39+ mockHttpClientFactory = nullptr ;
40+ Aws::Http::CleanupHttp ();
41+ Aws::Http::InitHttp ();
42+ }
43+ };
44+
45+ TEST_F (CredentialTrackingTest, TestEnvironmentCredentialsTracking)
46+ {
47+ // Set environment variables
48+ Aws::Environment::SetEnv (" AWS_ACCESS_KEY_ID" , " test-access-key" );
49+ Aws::Environment::SetEnv (" AWS_SECRET_ACCESS_KEY" , " test-secret-key" );
50+
51+ // Setup mock response
52+ auto request = CreateHttpRequest (Aws::Http::URI (" http://test.com" ),
53+ Aws::Http::HttpMethod::HTTP_POST,
54+ Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
55+ auto response = Aws::MakeShared<Standard::StandardHttpResponse>(ALLOCATION_TAG, request);
56+ response->SetResponseCode (HttpResponseCode::OK);
57+ response->GetResponseBody () << " {}" ;
58+ mockHttpClient->AddResponseToReturn (response);
59+
60+ // Create client configuration
61+ ClientConfiguration config;
62+ config.region = Aws::Region::US_EAST_1;
63+
64+ // Create mock client
65+ MockAWSClient client (config);
66+
67+ // Make a request
68+ AmazonWebServiceRequestMock mockRequest;
69+ auto outcome = client.MakeRequest (mockRequest);
70+
71+ // Verify request succeeded
72+ AWS_ASSERT_SUCCESS (outcome);
73+
74+ // Verify User-Agent contains environment credentials tracking
75+ auto lastRequest = mockHttpClient->GetMostRecentHttpRequest ();
76+ EXPECT_TRUE (lastRequest.HasUserAgent ());
77+ const auto & userAgent = lastRequest.GetUserAgent ();
78+
79+ // Check for environment credentials feature (should contain "g")
80+ EXPECT_TRUE (userAgent.find (" g" ) != Aws::String::npos);
81+
82+ // Clean up environment variables
83+ Aws::Environment::UnSetEnv (" AWS_ACCESS_KEY_ID" );
84+ Aws::Environment::UnSetEnv (" AWS_SECRET_ACCESS_KEY" );
85+ }
86+
87+ TEST_F (CredentialTrackingTest, TestDirectEnvironmentProviderTracking)
88+ {
89+ // Create client with direct environment provider
90+ ClientConfiguration config;
91+ config.region = Aws::Region::US_EAST_1;
92+
93+ // Set up environment credentials
94+ Aws::Environment::SetEnv (" AWS_ACCESS_KEY_ID" , " test-access-key" );
95+ Aws::Environment::SetEnv (" AWS_SECRET_ACCESS_KEY" , " test-secret-key" );
96+
97+ // Create client with environment provider directly
98+ auto envProvider = Aws::MakeShared<EnvironmentAWSCredentialsProvider>(ALLOCATION_TAG);
99+
100+ // Setup mock response
101+ auto request = CreateHttpRequest (Aws::Http::URI (" http://test.com" ),
102+ Aws::Http::HttpMethod::HTTP_POST,
103+ Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
104+ auto response = Aws::MakeShared<Standard::StandardHttpResponse>(ALLOCATION_TAG, request);
105+ response->SetResponseCode (HttpResponseCode::OK);
106+ response->GetResponseBody () << " {}" ;
107+ mockHttpClient->AddResponseToReturn (response);
108+
109+ MockAWSClient client (config);
110+
111+ // Make a request
112+ AmazonWebServiceRequestMock mockRequest;
113+ auto outcome = client.MakeRequest (mockRequest);
114+
115+ // Verify request succeeded
116+ AWS_ASSERT_SUCCESS (outcome);
117+
118+ // Verify User-Agent contains environment credentials tracking
119+ auto lastRequest = mockHttpClient->GetMostRecentHttpRequest ();
120+ EXPECT_TRUE (lastRequest.HasUserAgent ());
121+ const auto & userAgent = lastRequest.GetUserAgent ();
122+
123+ // Check for environment credentials feature (should contain "g")
124+ EXPECT_TRUE (userAgent.find (" g" ) != Aws::String::npos);
125+
126+ // Clean up
127+ Aws::Environment::UnSetEnv (" AWS_ACCESS_KEY_ID" );
128+ Aws::Environment::UnSetEnv (" AWS_SECRET_ACCESS_KEY" );
129+ }
130+
131+ TEST_F (CredentialTrackingTest, TestNoEnvironmentCredentialsNoTracking)
132+ {
133+ // Ensure no environment variables are set
134+ Aws::Environment::UnSetEnv (" AWS_ACCESS_KEY_ID" );
135+ Aws::Environment::UnSetEnv (" AWS_SECRET_ACCESS_KEY" );
136+
137+ // Setup mock response
138+ auto request = CreateHttpRequest (Aws::Http::URI (" http://test.com" ),
139+ Aws::Http::HttpMethod::HTTP_POST,
140+ Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
141+ auto response = Aws::MakeShared<Standard::StandardHttpResponse>(ALLOCATION_TAG, request);
142+ response->SetResponseCode (HttpResponseCode::OK);
143+ response->GetResponseBody () << " {}" ;
144+ mockHttpClient->AddResponseToReturn (response);
145+
146+ // Create client configuration
147+ ClientConfiguration config;
148+ config.region = Aws::Region::US_EAST_1;
149+
150+ MockAWSClient client (config);
151+
152+ // Make a request
153+ AmazonWebServiceRequestMock mockRequest;
154+ auto outcome = client.MakeRequest (mockRequest);
155+
156+ // Verify request succeeded
157+ AWS_ASSERT_SUCCESS (outcome);
158+
159+ // Verify User-Agent does NOT contain environment credentials tracking
160+ auto lastRequest = mockHttpClient->GetMostRecentHttpRequest ();
161+ EXPECT_TRUE (lastRequest.HasUserAgent ());
162+ const auto & userAgent = lastRequest.GetUserAgent ();
163+
164+ // Should not contain environment credentials feature "g" when not using env vars
165+ EXPECT_TRUE (userAgent.find (" g" ) == Aws::String::npos);
166+ }
0 commit comments