66package aws.sdk.kotlin.runtime.region
77
88import aws.sdk.kotlin.runtime.util.TestInstanceMetadataProvider
9- import aws.smithy.kotlin.runtime.IgnoreNative
109import aws.smithy.kotlin.runtime.util.TestPlatformProvider
1110import kotlinx.coroutines.test.runTest
1211import kotlinx.serialization.json.*
1312import kotlin.test.Test
1413import kotlin.test.assertEquals
1514
1615class DefaultRegionProviderChainTest {
17- private data class RegionProviderChainTest (
18- val name : String ,
19- val platformProvider : TestPlatformProvider ,
20- val instanceMetadataProvider : TestInstanceMetadataProvider ,
21- val region : String? ,
22- val targets : List <String > = emptyList(),
23- )
24-
25- // FIXME "jvm property is favored" tests need to be made JVM-only. Native does not have system properties, so those tests will always fail.
26- @IgnoreNative
2716 @Test
28- fun testSuite () = runTest {
29- val tests = Json .parseToJsonElement(REGION_PROVIDER_CHAIN_TEST_SUITE ).jsonArray
30- .map { it.jsonObject }
31- .map {
32- val name = it[" name" ]!! .jsonPrimitive.content
33- val platform = TestPlatformProvider .fromJsonNode(it[" platform" ]!! .jsonObject)
34- val instanceMetadata = TestInstanceMetadataProvider .fromJsonNode(it[" imds" ]!! .jsonObject)
35- val region = it[" region" ]!! .jsonPrimitive.contentOrNull
36- RegionProviderChainTest (name, platform, instanceMetadata, region)
37- }
38-
39- tests.forEach { test ->
40- val provider = DefaultRegionProviderChain (
41- platformProvider = test.platformProvider,
42- imdsClient = lazy { test.instanceMetadataProvider },
43- )
44- val actual = provider.getRegion()
45- assertEquals(test.region, actual, test.name)
46- }
47- }
48- }
49-
50- /* *
51- * Construct a [TestPlatformProvider] from a JSON node like:
52- *
53- * ```json
54- * {
55- * "env": {
56- * "ENV_VAR": "value"
57- * },
58- * "props": {
59- * "aws.property": "value"
60- * },
61- * "fs": {
62- * "filename": "contents"
63- * }
64- * }
65- * ```
66- */
67- fun TestPlatformProvider.Companion.fromJsonNode (obj : JsonObject ): TestPlatformProvider {
68- val env = obj[" env" ]?.jsonObject?.mapValues { it.value.jsonPrimitive.content } ? : emptyMap()
69- val props = obj[" props" ]?.jsonObject?.mapValues { it.value.jsonPrimitive.content } ? : emptyMap()
70- val fs = obj[" fs" ]?.jsonObject?.mapValues { it.value.jsonPrimitive.content } ? : emptyMap()
71- return TestPlatformProvider (env, props, fs)
72- }
73-
74- /* *
75- * Construct a [TestInstanceMetadataProvider] from a JSON object containing metadata as key-value pairs.
76- */
77- fun TestInstanceMetadataProvider.Companion.fromJsonNode (obj : JsonObject ): TestInstanceMetadataProvider {
78- val metadata = obj.jsonObject.mapValues { it.value.jsonPrimitive.content }
79- return TestInstanceMetadataProvider (metadata)
17+ fun testSuite () = runRegionProviderChainTestSuite(REGION_PROVIDER_CHAIN_TEST_SUITE )
8018}
8119
8220// language=JSON
@@ -104,20 +42,6 @@ private const val REGION_PROVIDER_CHAIN_TEST_SUITE = """
10442 "imds": {},
10543 "region": "us-east-2"
10644 },
107- {
108- "name": "jvm property is favored",
109- "platform": {
110- "env": {
111- "AWS_REGION": "us-east-2"
112- },
113- "props": {
114- "aws.region": "us-west-1"
115- },
116- "fs": {}
117- },
118- "imds": {},
119- "region": "us-west-1"
120- },
12145 {
12246 "name": "default profile",
12347 "platform": {
@@ -160,31 +84,17 @@ private const val REGION_PROVIDER_CHAIN_TEST_SUITE = """
16084 "region": "us-east-1"
16185 },
16286 {
163- "name": "jvm system properties are favored over imds",
87+ "name": "environment variables are favored over imds",
16488 "platform": {
16589 "env": {
166- "AWS_REGION": "us-east-2 "
90+ "AWS_REGION": "us-west-1 "
16791 },
16892 "props": {},
16993 "fs": {}
17094 },
17195 "imds": {
17296 "/latest/meta-data/placement/region": "us-east-1"
17397 },
174- "region": "us-east-2"
175- },
176- {
177- "name": "environment variables are favored over imds",
178- "platform": {
179- "env": {},
180- "props": {
181- "aws.region": "us-west-1"
182- },
183- "fs": {}
184- },
185- "imds": {
186- "/latest/meta-data/placement/region": "us-east-1"
187- },
18898 "region": "us-west-1"
18999 },
190100 {
@@ -205,3 +115,64 @@ private const val REGION_PROVIDER_CHAIN_TEST_SUITE = """
205115 }
206116]
207117"""
118+
119+ internal fun runRegionProviderChainTestSuite (testSuite : String ) = runTest {
120+ data class RegionProviderChainTest (
121+ val name : String ,
122+ val platformProvider : TestPlatformProvider ,
123+ val instanceMetadataProvider : TestInstanceMetadataProvider ,
124+ val region : String? ,
125+ val targets : List <String > = emptyList(),
126+ )
127+
128+ /* *
129+ * Construct a [TestPlatformProvider] from a JSON node like:
130+ *
131+ * ```json
132+ * {
133+ * "env": {
134+ * "ENV_VAR": "value"
135+ * },
136+ * "props": {
137+ * "aws.property": "value"
138+ * },
139+ * "fs": {
140+ * "filename": "contents"
141+ * }
142+ * }
143+ * ```
144+ */
145+ fun TestPlatformProvider.Companion.fromJsonNode (obj : JsonObject ): TestPlatformProvider {
146+ val env = obj[" env" ]?.jsonObject?.mapValues { it.value.jsonPrimitive.content } ? : emptyMap()
147+ val props = obj[" props" ]?.jsonObject?.mapValues { it.value.jsonPrimitive.content } ? : emptyMap()
148+ val fs = obj[" fs" ]?.jsonObject?.mapValues { it.value.jsonPrimitive.content } ? : emptyMap()
149+ return TestPlatformProvider (env, props, fs)
150+ }
151+
152+ /* *
153+ * Construct a [TestInstanceMetadataProvider] from a JSON object containing metadata as key-value pairs.
154+ */
155+ fun TestInstanceMetadataProvider.Companion.fromJsonNode (obj : JsonObject ): TestInstanceMetadataProvider {
156+ val metadata = obj.jsonObject.mapValues { it.value.jsonPrimitive.content }
157+ return TestInstanceMetadataProvider (metadata)
158+ }
159+
160+ val tests = Json .parseToJsonElement(testSuite).jsonArray
161+ .map { it.jsonObject }
162+ .map {
163+ val name = it[" name" ]!! .jsonPrimitive.content
164+ val platform = TestPlatformProvider .fromJsonNode(it[" platform" ]!! .jsonObject)
165+ val instanceMetadata = TestInstanceMetadataProvider .fromJsonNode(it[" imds" ]!! .jsonObject)
166+ val region = it[" region" ]!! .jsonPrimitive.contentOrNull
167+ RegionProviderChainTest (name, platform, instanceMetadata, region)
168+ }
169+
170+ tests.forEach { test ->
171+ val provider = DefaultRegionProviderChain (
172+ platformProvider = test.platformProvider,
173+ imdsClient = lazy { test.instanceMetadataProvider },
174+ )
175+ val actual = provider.getRegion()
176+ assertEquals(test.region, actual, test.name)
177+ }
178+ }
0 commit comments