@@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk
77
88import org.junit.jupiter.api.Test
99import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency
10+ import software.amazon.smithy.rust.codegen.core.rustlang.Feature
1011import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
1112import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
1213import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope
@@ -83,15 +84,24 @@ class EndpointOverrideMetricDecoratorTest {
8384 fun `endpoint override metric appears when set via SdkConfig` () {
8485 val testParams = awsIntegrationTestParams()
8586
86- awsSdkIntegrationTest(model, testParams) { context, rustCrate ->
87+ awsSdkIntegrationTest(
88+ model,
89+ testParams,
90+ environment = mapOf (" RUSTUP_TOOLCHAIN" to " 1.88.0" ),
91+ ) { context, rustCrate ->
8792 val rc = context.runtimeConfig
8893 val moduleName = context.moduleUseName()
94+
95+ // Enable test-util feature for aws-runtime
96+ rustCrate.mergeFeature(Feature (" test-util" , true , listOf (" aws-runtime/test-util" )))
97+
8998 rustCrate.integrationTest(" endpoint_override_via_sdk_config" ) {
9099 rustTemplate(
91100 """
92101 use $moduleName ::config::Region;
93102 use $moduleName ::Client;
94103 use #{capture_request};
104+ use #{assert_ua_contains_metric_values};
95105
96106 ##[#{tokio}::test]
97107 async fn metric_tracked_when_endpoint_set_via_sdk_config() {
@@ -121,29 +131,18 @@ class EndpointOverrideMetricDecoratorTest {
121131 uri
122132 );
123133
124- // Verify metric 'N' is present
125- let user_agent = std::str::from_utf8(
126- request
127- .headers()
128- .get("x-amz-user-agent")
129- .expect("x-amz-user-agent header missing")
130- .as_bytes(),
131- )
132- .expect("valid utf8");
133-
134- let has_metric = user_agent
135- .split_whitespace()
136- .any(|part| part.starts_with("m/") && part.contains("N"));
137-
138- assert!(
139- has_metric,
140- "Expected metric 'N' in user agent, got: {}",
141- user_agent
142- );
134+ // Verify metric 'N' is present in x-amz-user-agent header
135+ let user_agent = request
136+ .headers()
137+ .get("x-amz-user-agent")
138+ .expect("x-amz-user-agent header missing");
139+
140+ assert_ua_contains_metric_values(user_agent, &["N"]);
143141 }
144142 """ ,
145143 * preludeScope,
146144 " capture_request" to RuntimeType .captureRequest(rc),
145+ " assert_ua_contains_metric_values" to AwsRuntimeType .awsRuntime(rc).resolve(" user_agent::test_util::assert_ua_contains_metric_values" ),
147146 " SdkConfig" to AwsRuntimeType .awsTypes(rc).resolve(" sdk_config::SdkConfig" ),
148147 " tokio" to CargoDependency .Tokio .toType(),
149148 )
@@ -155,15 +154,24 @@ class EndpointOverrideMetricDecoratorTest {
155154 fun `no endpoint override metric when endpoint not set` () {
156155 val testParams = awsIntegrationTestParams()
157156
158- awsSdkIntegrationTest(model, testParams) { context, rustCrate ->
157+ awsSdkIntegrationTest(
158+ model,
159+ testParams,
160+ environment = mapOf (" RUSTUP_TOOLCHAIN" to " 1.88.0" ),
161+ ) { context, rustCrate ->
159162 val rc = context.runtimeConfig
160163 val moduleName = context.moduleUseName()
164+
165+ // Enable test-util feature for aws-runtime
166+ rustCrate.mergeFeature(Feature (" test-util" , true , listOf (" aws-runtime/test-util" )))
167+
161168 rustCrate.integrationTest(" no_endpoint_override" ) {
162169 rustTemplate(
163170 """
164171 use $moduleName ::config::{Credentials, Region, SharedCredentialsProvider};
165172 use $moduleName ::{Config, Client};
166173 use #{capture_request};
174+ use #{assert_ua_contains_metric_values};
167175
168176 ##[#{tokio}::test]
169177 async fn no_metric_when_endpoint_not_overridden() {
@@ -192,28 +200,25 @@ class EndpointOverrideMetricDecoratorTest {
192200 );
193201
194202 // Verify metric 'N' is NOT present
195- let user_agent = std::str::from_utf8(
196- request
197- .headers()
198- .get("x-amz-user-agent")
199- .map(|v| v.as_bytes())
200- .unwrap_or(b""),
201- )
202- .unwrap_or("");
203-
204- let has_metric = user_agent
205- .split_whitespace()
206- .any(|part| part.starts_with("m/") && part.contains("N"));
207-
203+ let user_agent = request
204+ .headers()
205+ .get("x-amz-user-agent")
206+ .expect("x-amz-user-agent header should be present");
207+
208+ // This should panic if 'N' is found
209+ let result = std::panic::catch_unwind(|| {
210+ assert_ua_contains_metric_values(user_agent, &["N"]);
211+ });
212+
208213 assert!(
209- !has_metric,
210- "Did not expect metric 'N' when endpoint not overridden, got: {}",
211- user_agent
214+ result.is_err(),
215+ "Metric 'N' should NOT be present when endpoint not overridden"
212216 );
213217 }
214218 """ ,
215219 * preludeScope,
216220 " capture_request" to RuntimeType .captureRequest(rc),
221+ " assert_ua_contains_metric_values" to AwsRuntimeType .awsRuntime(rc).resolve(" user_agent::test_util::assert_ua_contains_metric_values" ),
217222 " tokio" to CargoDependency .Tokio .toType(),
218223 )
219224 }
0 commit comments