1
+ /*
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License").
5
+ * You may not use this file except in compliance with the License.
6
+ * A copy of the License is located at
7
+ *
8
+ * http://aws.amazon.com/apache2.0
9
+ *
10
+ * or in the "license" file accompanying this file. This file is distributed
11
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12
+ * express or implied. See the License for the specific language governing
13
+ * permissions and limitations under the License.
14
+ */
15
+
16
+ package software .amazon .awssdk .awscore .internal ;
17
+
18
+ import static com .github .tomakehurst .wiremock .client .WireMock .aResponse ;
19
+ import static com .github .tomakehurst .wiremock .client .WireMock .get ;
20
+ import static com .github .tomakehurst .wiremock .client .WireMock .put ;
21
+ import static com .github .tomakehurst .wiremock .client .WireMock .stubFor ;
22
+ import static org .assertj .core .api .Assertions .assertThat ;
23
+
24
+ import com .github .tomakehurst .wiremock .junit .WireMockRule ;
25
+ import java .util .Arrays ;
26
+ import java .util .Collection ;
27
+ import java .util .concurrent .Callable ;
28
+ import org .junit .After ;
29
+ import org .junit .Before ;
30
+ import org .junit .Rule ;
31
+ import org .junit .Test ;
32
+ import org .junit .runner .RunWith ;
33
+ import org .junit .runners .Parameterized ;
34
+ import software .amazon .awssdk .awscore .internal .defaultsmode .AutoDefaultsModeDiscovery ;
35
+ import software .amazon .awssdk .core .SdkSystemSetting ;
36
+ import software .amazon .awssdk .defaultsmode .DefaultsMode ;
37
+ import software .amazon .awssdk .regions .Region ;
38
+ import software .amazon .awssdk .testutils .EnvironmentVariableHelper ;
39
+ import software .amazon .awssdk .utils .JavaSystemSetting ;
40
+
41
+ @ RunWith (Parameterized .class )
42
+ public class AutoDefaultsModeDiscoveryTest {
43
+ private static final EnvironmentVariableHelper ENVIRONMENT_VARIABLE_HELPER = new EnvironmentVariableHelper ();
44
+ @ Parameterized .Parameter
45
+ public TestData testData ;
46
+
47
+ @ Parameterized .Parameters
48
+ public static Collection <Object > data () {
49
+ return Arrays .asList (new Object [] {
50
+ new TestData ().clientRegion (Region .US_EAST_1 )
51
+ .javaVendorProperty ("The Android Project" )
52
+ .awsExecutionEnvVar ("AWS_Lambda_java8" )
53
+ .awsRegionEnvVar ("us-east-1" )
54
+ .expectedResolvedMode (DefaultsMode .MOBILE ),
55
+
56
+ new TestData ().clientRegion (Region .US_EAST_1 )
57
+ .awsExecutionEnvVar ("AWS_Lambda_java8" )
58
+ .awsRegionEnvVar ("us-east-1" )
59
+ .expectedResolvedMode (DefaultsMode .IN_REGION ),
60
+
61
+ new TestData ().clientRegion (Region .US_EAST_1 )
62
+ .awsExecutionEnvVar ("AWS_Lambda_java8" )
63
+ .awsDefaultRegionEnvVar ("us-west-2" )
64
+ .expectedResolvedMode (DefaultsMode .CROSS_REGION ),
65
+
66
+ new TestData ().clientRegion (Region .US_EAST_1 )
67
+ .awsDefaultRegionEnvVar ("us-west-2" )
68
+ .ec2MetadataConfig (new Ec2MetadataConfig ().region ("us-east-1" )
69
+ .imdsAvailable (true ))
70
+ .expectedResolvedMode (DefaultsMode .IN_REGION ),
71
+
72
+ new TestData ().clientRegion (Region .US_EAST_1 )
73
+ .awsDefaultRegionEnvVar ("us-west-2" )
74
+ .ec2MetadataConfig (new Ec2MetadataConfig ().region ("us-west-2" )
75
+ .imdsAvailable (true )
76
+ .ec2MetadataDisabledEnvVar ("false" ))
77
+ .expectedResolvedMode (DefaultsMode .CROSS_REGION ),
78
+
79
+ new TestData ().clientRegion (Region .US_EAST_1 )
80
+ .awsDefaultRegionEnvVar ("us-west-2" )
81
+ .ec2MetadataConfig (new Ec2MetadataConfig ().imdsAvailable (false ))
82
+ .expectedResolvedMode (DefaultsMode .STANDARD ),
83
+ });
84
+ }
85
+
86
+ @ Rule
87
+ public WireMockRule wireMock = new WireMockRule (0 );
88
+
89
+ @ Before
90
+ public void methodSetup () {
91
+ System .setProperty (SdkSystemSetting .AWS_EC2_METADATA_SERVICE_ENDPOINT .property (),
92
+ "http://localhost:" + wireMock .port ());
93
+ }
94
+
95
+ @ After
96
+ public void cleanUp () {
97
+ wireMock .resetAll ();
98
+ ENVIRONMENT_VARIABLE_HELPER .reset ();
99
+ System .clearProperty (JavaSystemSetting .JAVA_VENDOR .property ());
100
+ }
101
+
102
+ @ Test
103
+ public void differentCombinationOfConfigs_shouldResolveCorrectly () throws Exception {
104
+ if (testData .javaVendorProperty != null ) {
105
+ System .setProperty (JavaSystemSetting .JAVA_VENDOR .property (), testData .javaVendorProperty );
106
+ }
107
+
108
+ if (testData .awsExecutionEnvVar != null ) {
109
+ ENVIRONMENT_VARIABLE_HELPER .set (SdkSystemSetting .AWS_EXECUTION_ENV .environmentVariable (),
110
+ testData .awsExecutionEnvVar );
111
+ }
112
+
113
+ if (testData .awsRegionEnvVar != null ) {
114
+ ENVIRONMENT_VARIABLE_HELPER .set (SdkSystemSetting .AWS_REGION .environmentVariable (), testData .awsRegionEnvVar );
115
+ }
116
+
117
+ if (testData .awsDefaultRegionEnvVar != null ) {
118
+ ENVIRONMENT_VARIABLE_HELPER .set ("AWS_DEFAULT_REGION" , testData .awsDefaultRegionEnvVar );
119
+ }
120
+
121
+ if (testData .ec2MetadataConfig != null ) {
122
+ if (testData .ec2MetadataConfig .ec2MetadataDisabledEnvVar != null ) {
123
+ ENVIRONMENT_VARIABLE_HELPER .set (SdkSystemSetting .AWS_EC2_METADATA_DISABLED .environmentVariable (),
124
+ testData .ec2MetadataConfig .ec2MetadataDisabledEnvVar );
125
+ }
126
+
127
+ if (testData .ec2MetadataConfig .imdsAvailable ) {
128
+ stubSuccessfulResponse (testData .ec2MetadataConfig .region );
129
+ }
130
+ }
131
+
132
+ Callable <DefaultsMode > result = () -> new AutoDefaultsModeDiscovery ().discover (testData .clientRegion );
133
+ assertThat (result .call ()).isEqualTo (testData .expectedResolvedMode );
134
+ }
135
+
136
+ public void stubSuccessfulResponse (String region ) {
137
+ stubFor (put ("/latest/api/token" )
138
+ .willReturn (aResponse ().withStatus (200 ).withBody ("token" )));
139
+
140
+
141
+ stubFor (get ("/latest/dynamic/instance-identity/document" )
142
+ .willReturn (aResponse ().withStatus (200 ).withBody (constructInstanceInfo (region ))));
143
+ }
144
+
145
+ private String constructInstanceInfo (String region ) {
146
+ return String .format ("{"
147
+ + "\" pendingTime\" :\" 2014-08-07T22:07:46Z\" ,"
148
+ + "\" instanceType\" :\" m1.small\" ,"
149
+ + "\" imageId\" :\" ami-123456\" ,"
150
+ + "\" instanceId\" :\" i-123456\" ,"
151
+ + "\" region\" :\" %s\" ,"
152
+ + "\" version\" :\" 2010-08-31\" "
153
+ + "}" , region );
154
+ }
155
+
156
+
157
+ private static final class TestData {
158
+ private Region clientRegion ;
159
+ private String javaVendorProperty ;
160
+ private String awsExecutionEnvVar ;
161
+ private String awsRegionEnvVar ;
162
+ private String awsDefaultRegionEnvVar ;
163
+ private Ec2MetadataConfig ec2MetadataConfig ;
164
+ private DefaultsMode expectedResolvedMode ;
165
+
166
+ public TestData clientRegion (Region clientRegion ) {
167
+ this .clientRegion = clientRegion ;
168
+ return this ;
169
+ }
170
+
171
+ public TestData javaVendorProperty (String javaVendorProperty ) {
172
+ this .javaVendorProperty = javaVendorProperty ;
173
+ return this ;
174
+ }
175
+
176
+ public TestData awsExecutionEnvVar (String awsExecutionEnvVar ) {
177
+ this .awsExecutionEnvVar = awsExecutionEnvVar ;
178
+ return this ;
179
+ }
180
+
181
+ public TestData awsRegionEnvVar (String awsRegionEnvVar ) {
182
+ this .awsRegionEnvVar = awsRegionEnvVar ;
183
+ return this ;
184
+ }
185
+
186
+ public TestData awsDefaultRegionEnvVar (String awsDefaultRegionEnvVar ) {
187
+ this .awsDefaultRegionEnvVar = awsDefaultRegionEnvVar ;
188
+ return this ;
189
+ }
190
+
191
+ public TestData ec2MetadataConfig (Ec2MetadataConfig ec2MetadataConfig ) {
192
+ this .ec2MetadataConfig = ec2MetadataConfig ;
193
+ return this ;
194
+ }
195
+
196
+ public TestData expectedResolvedMode (DefaultsMode expectedResolvedMode ) {
197
+ this .expectedResolvedMode = expectedResolvedMode ;
198
+ return this ;
199
+ }
200
+ }
201
+
202
+ private static final class Ec2MetadataConfig {
203
+ private boolean imdsAvailable ;
204
+ private String region ;
205
+ private String ec2MetadataDisabledEnvVar ;
206
+
207
+ public Ec2MetadataConfig imdsAvailable (boolean imdsAvailable ) {
208
+ this .imdsAvailable = imdsAvailable ;
209
+ return this ;
210
+ }
211
+
212
+ public Ec2MetadataConfig region (String region ) {
213
+ this .region = region ;
214
+ return this ;
215
+ }
216
+
217
+ public Ec2MetadataConfig ec2MetadataDisabledEnvVar (String ec2MetadataDisabledEnvVar ) {
218
+ this .ec2MetadataDisabledEnvVar = ec2MetadataDisabledEnvVar ;
219
+ return this ;
220
+ }
221
+ }
222
+ }
0 commit comments