Skip to content

Commit 1112e37

Browse files
authored
Fix brittle UA tests (#6861)
These tests perform an exact match on the business metrics section which is brittle because any extra feature IDs break the tests. Switch to a regex based approach.
1 parent d4ceee0 commit 1112e37

9 files changed

+120
-61
lines changed

test/auth-tests/src/it/java/software/amazon/awssdk/auth/source/ContainerCredentialsProviderUserAgentTest.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
2121
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
2222
import static org.assertj.core.api.Assertions.assertThat;
23+
import static software.amazon.awssdk.auth.source.UserAgentTestUtils.assertUserAgentHasFeatureIds;
2324

2425
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
2526
import java.time.Duration;
2627
import java.time.Instant;
28+
import java.util.Arrays;
2729
import java.util.List;
2830
import java.util.stream.Stream;
2931
import org.junit.jupiter.api.AfterAll;
@@ -34,6 +36,7 @@
3436
import org.junit.jupiter.params.provider.MethodSource;
3537
import software.amazon.awssdk.auth.credentials.ContainerCredentialsProvider;
3638
import software.amazon.awssdk.core.SdkSystemSetting;
39+
import software.amazon.awssdk.core.useragent.BusinessMetricCollection;
3740
import software.amazon.awssdk.http.AbortableInputStream;
3841
import software.amazon.awssdk.http.HttpExecuteResponse;
3942
import software.amazon.awssdk.http.SdkHttpClient;
@@ -127,7 +130,7 @@ private String createCredentialsResponse(String accessKeyId, String secretAccess
127130
@ParameterizedTest
128131
@MethodSource("containerCredentialProviders")
129132
void userAgentString_containsContainerBusinessMetric_WhenUsingContainerCredentials(
130-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
133+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
131134

132135
stsClient(provider, mockHttpClient).getCallerIdentity();
133136

@@ -136,23 +139,25 @@ void userAgentString_containsContainerBusinessMetric_WhenUsingContainerCredentia
136139

137140
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
138141
assertThat(userAgentHeaders).isNotNull().hasSize(1);
139-
assertThat(userAgentHeaders.get(0)).contains(expected);
142+
String ua = userAgentHeaders.get(0);
143+
144+
assertUserAgentHasFeatureIds(ua, expectedIds);
140145
}
141146

142147
private static Stream<Arguments> containerCredentialProviders() {
143148
return Stream.of(
144-
Arguments.of(ContainerCredentialsProvider.create(), "m/D,z"),
149+
Arguments.of(ContainerCredentialsProvider.create(), Arrays.asList("D", "z")),
145150

146151
Arguments.of(ContainerCredentialsProvider.builder()
147152
.endpoint(CONTAINER_SERVICE_ENDPOINT + wireMockServer.getPort())
148-
.build(), "m/D,z")
153+
.build(), Arrays.asList("D", "z"))
149154
);
150155
}
151156

152157
@ParameterizedTest
153158
@MethodSource("containerCredentialProvidersWithSessionToken")
154159
void userAgentString_containsContainerBusinessMetric_WhenUsingContainerCredentialsWithSessionToken(
155-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
160+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
156161

157162
stubContainerCredentialsResponsesWithSessionToken();
158163

@@ -163,19 +168,21 @@ void userAgentString_containsContainerBusinessMetric_WhenUsingContainerCredentia
163168

164169
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
165170
assertThat(userAgentHeaders).isNotNull().hasSize(1);
166-
assertThat(userAgentHeaders.get(0)).contains(expected);
171+
String ua = userAgentHeaders.get(0);
172+
173+
assertUserAgentHasFeatureIds(ua, expectedIds);
167174
}
168175

169176
private static Stream<Arguments> containerCredentialProvidersWithSessionToken() {
170177
return Stream.of(
171-
Arguments.of(ContainerCredentialsProvider.create(), "m/D,z")
178+
Arguments.of(ContainerCredentialsProvider.create(), Arrays.asList("D", "z"))
172179
);
173180
}
174181

175182
@ParameterizedTest
176183
@MethodSource("containerCredentialProvidersWithAuthToken")
177184
void userAgentString_containsContainerBusinessMetric_WhenUsingContainerCredentialsWithAuthToken(
178-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
185+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
179186

180187
stubContainerCredentialsResponsesWithAuthToken();
181188

@@ -186,12 +193,15 @@ void userAgentString_containsContainerBusinessMetric_WhenUsingContainerCredentia
186193

187194
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
188195
assertThat(userAgentHeaders).isNotNull().hasSize(1);
189-
assertThat(userAgentHeaders.get(0)).contains(expected);
196+
197+
String ua = userAgentHeaders.get(0);
198+
199+
assertUserAgentHasFeatureIds(ua, expectedIds);
190200
}
191201

192202
private static Stream<Arguments> containerCredentialProvidersWithAuthToken() {
193203
return Stream.of(
194-
Arguments.of(ContainerCredentialsProvider.create(), "m/D,z")
204+
Arguments.of(ContainerCredentialsProvider.create(), Arrays.asList("D", "z"))
195205
);
196206
}
197207

test/auth-tests/src/it/java/software/amazon/awssdk/auth/source/EnvironmentVariableCredentialsProviderUserAgentTest.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
package software.amazon.awssdk.auth.source;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static software.amazon.awssdk.auth.source.UserAgentTestUtils.assertUserAgentHasFeatureIds;
1920

21+
import java.util.Arrays;
2022
import java.util.List;
2123
import java.util.stream.Stream;
2224
import org.junit.jupiter.api.AfterAll;
@@ -78,45 +80,45 @@ private static HttpExecuteResponse mockStsResponse() {
7880
@ParameterizedTest
7981
@MethodSource("environmentVariableCredentialProviders")
8082
void userAgentString_containsEnvironmentVariableBusinessMetric_WhenUsingEnvironmentVariableCredentials(
81-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
83+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
8284

83-
stsClient(provider, mockHttpClient).getCallerIdentity();
85+
stsClient(provider, mockHttpClient).getCallerIdentity();
8486

85-
SdkHttpRequest lastRequest = mockHttpClient.getLastRequest();
86-
assertThat(lastRequest).isNotNull();
87+
SdkHttpRequest lastRequest = mockHttpClient.getLastRequest();
88+
assertThat(lastRequest).isNotNull();
8789

88-
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
89-
assertThat(userAgentHeaders).isNotNull().hasSize(1);
90-
assertThat(userAgentHeaders.get(0)).contains(expected);
90+
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
91+
assertThat(userAgentHeaders).isNotNull().hasSize(1);
92+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
9193

9294
}
9395

9496
private static Stream<Arguments> environmentVariableCredentialProviders() {
9597
return Stream.of(
96-
Arguments.of(EnvironmentVariableCredentialsProvider.create(), "m/D,g")
98+
Arguments.of(EnvironmentVariableCredentialsProvider.create(), Arrays.asList("D", "g"))
9799
);
98100
}
99101

100102
@ParameterizedTest
101103
@MethodSource("environmentVariableCredentialProvidersWithSessionToken")
102104
void userAgentString_containsEnvironmentVariableBusinessMetric_WhenUsingEnvironmentVariableCredentialsWithSessionToken(
103-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
105+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
104106

105107
System.setProperty(SdkSystemSetting.AWS_SESSION_TOKEN.property(), "test-session-token");
106108

107-
stsClient(provider, mockHttpClient).getCallerIdentity();
109+
stsClient(provider, mockHttpClient).getCallerIdentity();
108110

109-
SdkHttpRequest lastRequest = mockHttpClient.getLastRequest();
110-
assertThat(lastRequest).isNotNull();
111+
SdkHttpRequest lastRequest = mockHttpClient.getLastRequest();
112+
assertThat(lastRequest).isNotNull();
111113

112-
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
113-
assertThat(userAgentHeaders).isNotNull().hasSize(1);
114-
assertThat(userAgentHeaders.get(0)).contains(expected);
114+
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
115+
assertThat(userAgentHeaders).isNotNull().hasSize(1);
116+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
115117
}
116118

117119
private static Stream<Arguments> environmentVariableCredentialProvidersWithSessionToken() {
118120
return Stream.of(
119-
Arguments.of(EnvironmentVariableCredentialsProvider.create(), "m/D,g")
121+
Arguments.of(EnvironmentVariableCredentialsProvider.create(), Arrays.asList("D", "g"))
120122
);
121123
}
122124

test/auth-tests/src/it/java/software/amazon/awssdk/auth/source/ImdsUserAgentProviderTest.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
2222
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
2323
import static org.assertj.core.api.Assertions.assertThat;
24+
import static software.amazon.awssdk.auth.source.UserAgentTestUtils.assertUserAgentHasFeatureIds;
2425

2526
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
2627
import java.time.Duration;
2728
import java.time.Instant;
29+
import java.util.Arrays;
2830
import java.util.List;
2931
import java.util.stream.Stream;
3032
import org.junit.jupiter.api.AfterAll;
@@ -132,7 +134,7 @@ private String createCredentialsResponse(String accessKeyId, String secretAccess
132134
@ParameterizedTest
133135
@MethodSource("imdsCredentialProviders")
134136
void userAgentString_containsImdsBusinessMetric_WhenUsingInstanceProfileCredentials(
135-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
137+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
136138

137139
stsClient(provider, mockHttpClient).getCallerIdentity();
138140

@@ -141,23 +143,23 @@ void userAgentString_containsImdsBusinessMetric_WhenUsingInstanceProfileCredenti
141143

142144
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
143145
assertThat(userAgentHeaders).isNotNull().hasSize(1);
144-
assertThat(userAgentHeaders.get(0)).contains(expected);
146+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
145147
}
146148

147149
private static Stream<Arguments> imdsCredentialProviders() {
148150
return Stream.of(
149-
Arguments.of(InstanceProfileCredentialsProvider.create(), "m/D,0"),
151+
Arguments.of(InstanceProfileCredentialsProvider.create(), Arrays.asList("D", "0")),
150152

151153
Arguments.of(InstanceProfileCredentialsProvider.builder()
152154
.endpoint("http://localhost:" + wireMockServer.getPort())
153-
.build(), "m/D,0")
155+
.build(), Arrays.asList("D", "0"))
154156
);
155157
}
156158

157159
@ParameterizedTest
158160
@MethodSource("imdsCredentialProvidersWithSessionToken")
159161
void userAgentString_containsImdsBusinessMetric_WhenUsingInstanceProfileCredentialsWithSessionToken(
160-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
162+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
161163

162164
stubImdsResponsesWithSessionToken();
163165

@@ -168,12 +170,12 @@ void userAgentString_containsImdsBusinessMetric_WhenUsingInstanceProfileCredenti
168170

169171
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
170172
assertThat(userAgentHeaders).isNotNull().hasSize(1);
171-
assertThat(userAgentHeaders.get(0)).contains(expected);
173+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
172174
}
173175

174176
private static Stream<Arguments> imdsCredentialProvidersWithSessionToken() {
175177
return Stream.of(
176-
Arguments.of(InstanceProfileCredentialsProvider.create(), "m/D,0")
178+
Arguments.of(InstanceProfileCredentialsProvider.create(), Arrays.asList("D", "0"))
177179
);
178180
}
179181

test/auth-tests/src/it/java/software/amazon/awssdk/auth/source/ProcessCredentialsProviderUserAgentTest.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package software.amazon.awssdk.auth.source;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static software.amazon.awssdk.auth.source.UserAgentTestUtils.assertUserAgentHasFeatureIds;
1920

2021
import java.time.Instant;
2122
import java.time.temporal.ChronoUnit;
@@ -64,7 +65,7 @@ private static HttpExecuteResponse mockStsResponse() {
6465
@ParameterizedTest
6566
@MethodSource("processCredentialProviders")
6667
void userAgentString_containsProcessBusinessMetric_WhenUsingProcessCredentials(
67-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
68+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
6869

6970
stsClient(provider, mockHttpClient).getCallerIdentity();
7071

@@ -73,7 +74,7 @@ void userAgentString_containsProcessBusinessMetric_WhenUsingProcessCredentials(
7374

7475
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
7576
assertThat(userAgentHeaders).isNotNull().hasSize(1);
76-
assertThat(userAgentHeaders.get(0)).contains(expected);
77+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
7778
}
7879

7980
private static Stream<Arguments> processCredentialProviders() {
@@ -83,18 +84,18 @@ private static Stream<Arguments> processCredentialProviders() {
8384
return Stream.of(
8485
Arguments.of(ProcessCredentialsProvider.builder()
8586
.command(mockCommand)
86-
.build(), "m/D,w"),
87+
.build(), Arrays.asList("D", "w")),
8788

8889
Arguments.of(ProcessCredentialsProvider.builder()
8990
.command(mockCommandList)
90-
.build(), "m/D,w")
91+
.build(), Arrays.asList("D", "w"))
9192
);
9293
}
9394

9495
@ParameterizedTest
9596
@MethodSource("processCredentialProvidersWithSessionToken")
9697
void userAgentString_containsProcessBusinessMetric_WhenUsingProcessCredentialsWithSessionToken(
97-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
98+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
9899

99100
stsClient(provider, mockHttpClient).getCallerIdentity();
100101

@@ -103,7 +104,7 @@ void userAgentString_containsProcessBusinessMetric_WhenUsingProcessCredentialsWi
103104

104105
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
105106
assertThat(userAgentHeaders).isNotNull().hasSize(1);
106-
assertThat(userAgentHeaders.get(0)).contains(expected);
107+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
107108
}
108109

109110
private static Stream<Arguments> processCredentialProvidersWithSessionToken() {
@@ -112,7 +113,7 @@ private static Stream<Arguments> processCredentialProvidersWithSessionToken() {
112113
return Stream.of(
113114
Arguments.of(ProcessCredentialsProvider.builder()
114115
.command(mockCommand)
115-
.build(), "m/D,w")
116+
.build(), Arrays.asList("D", "w"))
116117
);
117118
}
118119

test/auth-tests/src/it/java/software/amazon/awssdk/auth/source/ProfileCredentialProviderUserAgentTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616
package software.amazon.awssdk.auth.source;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static software.amazon.awssdk.auth.source.UserAgentTestUtils.assertUserAgentHasFeatureIds;
1920

2021
import java.io.IOException;
2122
import java.nio.file.Files;
2223
import java.nio.file.Path;
24+
import java.util.Arrays;
2325
import java.util.List;
2426
import org.junit.jupiter.api.AfterEach;
2527
import org.junit.jupiter.api.BeforeEach;
@@ -99,7 +101,7 @@ void basicProfileCredentials_containsFeatureIdN() throws Exception {
99101
assertThat(userAgentHeaders).isNotNull().hasSize(1);
100102
String userAgent = userAgentHeaders.get(0);
101103

102-
assertThat(userAgent).contains("m/D,n");
104+
assertUserAgentHasFeatureIds(userAgent, Arrays.asList("D", "n"));
103105

104106
credentialsProvider.close();
105107
stsClient.close();
@@ -141,7 +143,7 @@ void profileWithCredentialProcess_containsFeatureIdVW() throws Exception {
141143
assertThat(userAgentHeaders).isNotNull().hasSize(1);
142144
String userAgent = userAgentHeaders.get(0);
143145

144-
assertThat(userAgent).contains("m/D,v,w");
146+
assertUserAgentHasFeatureIds(userAgent, Arrays.asList("D", "v", "w"));
145147

146148
credentialsProvider.close();
147149
stsClient.close();

test/auth-tests/src/it/java/software/amazon/awssdk/auth/source/SystemPropertyCredentialsProviderUserAgentTest.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
package software.amazon.awssdk.auth.source;
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
19+
import static software.amazon.awssdk.auth.source.UserAgentTestUtils.assertUserAgentHasFeatureIds;
1920

21+
import java.util.Arrays;
2022
import java.util.List;
2123
import java.util.stream.Stream;
2224
import org.junit.jupiter.api.AfterAll;
@@ -73,7 +75,7 @@ private static HttpExecuteResponse mockStsResponse() {
7375
@ParameterizedTest
7476
@MethodSource("systemPropertyCredentialProviders")
7577
void userAgentString_containsSystemPropertyBusinessMetric_WhenUsingSystemPropertyCredentials(
76-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
78+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
7779

7880
stsClient(provider, mockHttpClient).getCallerIdentity();
7981

@@ -82,19 +84,19 @@ void userAgentString_containsSystemPropertyBusinessMetric_WhenUsingSystemPropert
8284

8385
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
8486
assertThat(userAgentHeaders).isNotNull().hasSize(1);
85-
assertThat(userAgentHeaders.get(0)).contains(expected);
87+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
8688
}
8789

8890
private static Stream<Arguments> systemPropertyCredentialProviders() {
8991
return Stream.of(
90-
Arguments.of(SystemPropertyCredentialsProvider.create(), "m/D,f")
92+
Arguments.of(SystemPropertyCredentialsProvider.create(), Arrays.asList("D", "f"))
9193
);
9294
}
9395

9496
@ParameterizedTest
9597
@MethodSource("systemPropertyCredentialProvidersWithSessionToken")
9698
void userAgentString_containsSystemPropertyBusinessMetric_WhenUsingSystemPropertyCredentialsWithSessionToken(
97-
IdentityProvider<? extends AwsCredentialsIdentity> provider, String expected) throws Exception {
99+
IdentityProvider<? extends AwsCredentialsIdentity> provider, List<String> expectedIds) throws Exception {
98100

99101
System.setProperty("aws.sessionToken", "test-session-token");
100102

@@ -105,12 +107,12 @@ void userAgentString_containsSystemPropertyBusinessMetric_WhenUsingSystemPropert
105107

106108
List<String> userAgentHeaders = lastRequest.headers().get("User-Agent");
107109
assertThat(userAgentHeaders).isNotNull().hasSize(1);
108-
assertThat(userAgentHeaders.get(0)).contains(expected);
110+
assertUserAgentHasFeatureIds(userAgentHeaders.get(0), expectedIds);
109111
}
110112

111113
private static Stream<Arguments> systemPropertyCredentialProvidersWithSessionToken() {
112114
return Stream.of(
113-
Arguments.of(SystemPropertyCredentialsProvider.create(), "m/D,f")
115+
Arguments.of(SystemPropertyCredentialsProvider.create(), Arrays.asList("D", "f"))
114116
);
115117
}
116118

0 commit comments

Comments
 (0)