1+ /* *
2+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+ * SPDX-License-Identifier: Apache-2.0.
4+ */
5+
6+ #include < aws/core/auth/AWSCredentials.h>
7+ #include < aws/core/http/standard/StandardHttpRequest.h>
8+ #include < aws/core/http/standard/StandardHttpResponse.h>
9+ #include < aws/core/utils/Outcome.h>
10+ #include < aws/monitoring/CloudWatchClient.h>
11+ #include < aws/monitoring/model/PutMetricDataRequest.h>
12+ #include < aws/testing/AwsCppSdkGTestSuite.h>
13+ #include < aws/testing/AwsTestHelpers.h>
14+ #include < aws/testing/mocks/http/MockHttpClient.h>
15+ #include < aws/core/utils/StringUtils.h>
16+ #include < gtest/gtest.h>
17+ #include < algorithm>
18+ #include < iostream>
19+
20+ using namespace Aws ::Auth;
21+ using namespace Aws ::Http;
22+ using namespace Aws ::Client;
23+ using namespace Aws ::CloudWatch;
24+ using namespace Aws ::CloudWatch::Model;
25+
26+ const char * LOG_TAG = " CloudWatchTest" ;
27+
28+ class CloudWatchTest : public Aws ::Testing::AwsCppSdkGTestSuite {
29+ protected:
30+ std::shared_ptr<MockHttpClient> m_mockHttpClient;
31+ std::shared_ptr<MockHttpClientFactory> m_mockHttpClientFactory;
32+
33+ void SetUp () {
34+ m_mockHttpClient = Aws::MakeShared<MockHttpClient>(LOG_TAG);
35+ m_mockHttpClientFactory = Aws::MakeShared<MockHttpClientFactory>(LOG_TAG);
36+ m_mockHttpClientFactory->SetClient (m_mockHttpClient);
37+ SetHttpClientFactory (m_mockHttpClientFactory);
38+ }
39+
40+ void TearDown () {
41+ m_mockHttpClient->Reset ();
42+ m_mockHttpClient = nullptr ;
43+ m_mockHttpClientFactory = nullptr ;
44+ Aws::Http::CleanupHttp ();
45+ Aws::Http::InitHttp ();
46+ }
47+ };
48+
49+ TEST_F (CloudWatchTest, TestUserAgentCompressionTracking) {
50+ #ifndef ENABLED_ZLIB_REQUEST_COMPRESSION
51+ GTEST_SKIP () << " ZLIB compression not available in this build" ;
52+ #endif
53+ // Setup mock response with proper CloudWatch XML
54+ std::shared_ptr<HttpRequest> requestTmp =
55+ CreateHttpRequest (Aws::Http::URI (" dummy" ), Aws::Http::HttpMethod::HTTP_POST, Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
56+ auto successResponse = Aws::MakeShared<Standard::StandardHttpResponse>(LOG_TAG, requestTmp);
57+ successResponse->SetResponseCode (HttpResponseCode::OK);
58+ successResponse->GetResponseBody () << " <PutMetricDataResponse><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></PutMetricDataResponse>" ;
59+ m_mockHttpClient->AddResponseToReturn (successResponse);
60+
61+ // Create client with compression enabled
62+ Aws::Client::ClientConfigurationInitValues cfgInit;
63+ cfgInit.shouldDisableIMDS = true ;
64+ Aws::Client::ClientConfiguration clientConfig (cfgInit);
65+ clientConfig.region = Aws::Region::US_EAST_1;
66+ clientConfig.requestCompressionConfig .useRequestCompression = UseRequestCompression::ENABLE;
67+ clientConfig.requestCompressionConfig .requestMinCompressionSizeBytes = 10240 ;
68+
69+ AWSCredentials credentials{" mock" , " credentials" };
70+ CloudWatchClient client (credentials, clientConfig);
71+
72+ // Create request with large payload to trigger compression
73+ PutMetricDataRequest request;
74+ request.SetNamespace (" TestNamespace" );
75+
76+ // Add large metric data to trigger compression
77+ MetricDatum metricDatum;
78+ metricDatum.SetMetricName (" TestMetric" );
79+ metricDatum.SetValue (123.45 );
80+ metricDatum.SetTimestamp (Aws::Utils::DateTime::Now ());
81+
82+ // Create large metadata to exceed compression threshold
83+ Aws::String largeValue (20000 , ' A' ); // 20KB value to exceed compression threshold
84+ Dimension dimension;
85+ dimension.SetName (" LargeDimension" );
86+ dimension.SetValue (largeValue);
87+ metricDatum.AddDimensions (dimension);
88+
89+ request.AddMetricData (metricDatum);
90+
91+ auto outcome = client.PutMetricData (request);
92+ AWS_ASSERT_SUCCESS (outcome);
93+
94+ // Verify User-Agent contains compression metric
95+ auto lastRequest = m_mockHttpClient->GetMostRecentHttpRequest ();
96+ EXPECT_TRUE (lastRequest.HasUserAgent ());
97+ const auto & userAgent = lastRequest.GetUserAgent ();
98+ EXPECT_TRUE (!userAgent.empty ());
99+
100+ const auto userAgentParsed = Aws::Utils::StringUtils::Split (userAgent, ' ' );
101+
102+ // Check for gzip compression business metric (L) in user agent
103+ auto businessMetrics = std::find_if (userAgentParsed.begin (), userAgentParsed.end (),
104+ [](const Aws::String& value) { return value.find (" m/" ) != Aws::String::npos && value.find (" L" ) != Aws::String::npos; });
105+
106+ EXPECT_TRUE (businessMetrics != userAgentParsed.end ());
107+ }
0 commit comments