@@ -8,17 +8,24 @@ import software.amazon.smithy.kotlin.codegen.model.getTrait
88import software.amazon.smithy.kotlin.codegen.model.hasTrait
99import software.amazon.smithy.kotlin.codegen.rendering.endpoints.EndpointParametersGenerator
1010import software.amazon.smithy.kotlin.codegen.rendering.endpoints.EndpointProviderGenerator
11+ import software.amazon.smithy.kotlin.codegen.rendering.smoketests.Param.ParamName
12+ import software.amazon.smithy.kotlin.codegen.rendering.smoketests.Param.ParamShape
13+ import software.amazon.smithy.kotlin.codegen.rendering.smoketests.Param.Parameter
1114import software.amazon.smithy.kotlin.codegen.rendering.smoketests.SmokeTestUriValue.EndpointParameters
1215import software.amazon.smithy.kotlin.codegen.rendering.smoketests.SmokeTestUriValue.EndpointProvider
1316import software.amazon.smithy.kotlin.codegen.rendering.util.format
1417import software.amazon.smithy.kotlin.codegen.utils.dq
1518import software.amazon.smithy.kotlin.codegen.utils.toCamelCase
1619import software.amazon.smithy.kotlin.codegen.utils.topDownOperations
20+ import software.amazon.smithy.model.node.Node
21+ import software.amazon.smithy.model.node.StringNode
1722import software.amazon.smithy.model.shapes.OperationShape
23+ import software.amazon.smithy.model.shapes.Shape
1824import software.amazon.smithy.smoketests.traits.SmokeTestCase
1925import software.amazon.smithy.smoketests.traits.SmokeTestsTrait
2026import kotlin.jvm.optionals.getOrNull
2127
28+ // TODO: Organize all these section IDs
2229object SmokeTestsRunner : SectionId
2330object SmokeTestAdditionalEnvVars : SectionId
2431object SmokeTestDefaultConfig : SectionId
@@ -39,6 +46,12 @@ object SmokeTestUriValue : SectionId {
3946 val EndpointParameters : SectionKey <Symbol > = SectionKey (" EndpointParameters" )
4047}
4148
49+ object Param : SectionId {
50+ val ParamShape : SectionKey <Shape ?> = SectionKey (" SmokeTestsOperationParamKey2" ) // TODO: Rename section keys
51+ val Parameter : SectionKey <Node > = SectionKey (" SmokeTestsOperationParamKey3" )
52+ val ParamName : SectionKey <String > = SectionKey (" SmokeTestsOperationParamKey4" )
53+ }
54+
4255const val SKIP_TAGS = " AWS_SMOKE_TEST_SKIP_TAGS"
4356const val SERVICE_FILTER = " AWS_SMOKE_TEST_SERVICE_IDS"
4457
@@ -118,7 +131,7 @@ class SmokeTestsRunnerGenerator(
118131 renderClient(testCase)
119132 renderOperation(operation, testCase)
120133 }
121- withBlock(" catch (e : Exception) {" , " }" ) {
134+ withBlock(" catch (exception : Exception) {" , " }" ) {
122135 renderCatchBlock(testCase)
123136 }
124137 }
@@ -128,6 +141,7 @@ class SmokeTestsRunnerGenerator(
128141 writer.withInlineBlock(" #L {" , " }" , service) {
129142 if (testCase.vendorParams.isPresent) {
130143 testCase.vendorParams.get().members.forEach { vendorParam ->
144+ // TODO: Fix this to only use two sections
131145 when (vendorParam.key.value) {
132146 " region" -> {
133147 writeInline(" #L = " , vendorParam.key.value.toCamelCase())
@@ -213,33 +227,56 @@ class SmokeTestsRunnerGenerator(
213227 writer.withBlock(" .#T { client ->" , " }" , RuntimeTypes .Core .IO .use) {
214228 withBlock(" client.#L(" , " )" , operation.defaultName()) {
215229 withBlock(" #L {" , " }" , operationSymbol) {
216- if (testCase.params.isPresent) {
217- testCase.params.get().members.forEach { member ->
218- write(" #L = #L" , member.key.value.toCamelCase(), member.value.format())
219- }
220- }
230+ renderOperationParameters(operation, testCase)
221231 }
222232 }
223233 }
224234 }
225235
236+ private fun renderOperationParameters (operation : OperationShape , testCase : SmokeTestCase ) {
237+ if (! testCase.operationParametersArePresent) return
238+
239+ val paramsToShapes = mapOperationParametersToModeledShapes(operation)
240+
241+ testCase.operationParameters.forEach { param ->
242+ val name = param.key.value.toCamelCase()
243+ val value = param.value.format()
244+
245+ writer.writeInline(" #S = " , name)
246+ writer.declareSection(
247+ Param ,
248+ mapOf (
249+ ParamName to name,
250+ ParamShape to paramsToShapes[name],
251+ Parameter to param.value,
252+ ),
253+ ) {
254+ writer.write(" #L" , value )
255+ }
256+ }
257+ }
258+
226259 private fun renderCatchBlock (testCase : SmokeTestCase ) {
227- val expected = if (testCase.expectation.isFailure) {
260+ val expectedException = if (testCase.expectation.isFailure) {
228261 getFailureCriterion(testCase)
229262 } else {
230263 RuntimeTypes .HttpClient .Interceptors .SmokeTestsSuccessException
231264 }
232265
233- writer.write(" val success = e is #T" , expected)
234- writer.write(" val status = if (success) #S else #S" , " ok" , " not ok" )
266+ writer.write(" val success: Boolean = exception is #T" , expectedException)
267+ writer.write(" val status: String = if (success) #S else #S" , " ok" , " not ok" )
268+
235269 printTestResult(
236270 sdkId.filter { ! it.isWhitespace() },
237271 testCase.id,
238272 testCase.expectation.isFailure,
239273 writer,
240274 )
241- writer.write(" if (!success) #T(e)" , RuntimeTypes .Core .SmokeTests .printExceptionStackTrace)
242- writer.write(" if (!success) exitCode = 1" )
275+
276+ writer.withBlock(" if (!success) {" , " }" ) {
277+ write(" #T(exception)" , RuntimeTypes .Core .SmokeTests .printExceptionStackTrace)
278+ write(" exitCode = 1" )
279+ }
243280 }
244281
245282 /* *
@@ -267,10 +304,30 @@ class SmokeTestsRunnerGenerator(
267304 val testResult = " $status $service $testCase - $expectation $directive "
268305 writer.write(" println(#S)" , testResult)
269306 }
270- }
271307
272- /* *
273- * Derives a function name for a [SmokeTestCase]
274- */
275- private val SmokeTestCase .functionName: String
276- get() = this .id.toCamelCase()
308+ /* *
309+ * TODO:
310+ */
311+ private fun mapOperationParametersToModeledShapes (operation : OperationShape ): Map <String , Shape > =
312+ model.getShape(operation.inputShape).get().allMembers.map { (key, value) ->
313+ key.toCamelCase() to model.getShape(value.target).get()
314+ }.toMap()
315+
316+ /* *
317+ * Derives a function name for a [SmokeTestCase]
318+ */
319+ private val SmokeTestCase .functionName: String
320+ get() = this .id.toCamelCase()
321+
322+ /* *
323+ * TODO:
324+ */
325+ private val SmokeTestCase .operationParameters: Map <StringNode , Node >
326+ get() = this .params.get().members
327+
328+ /* *
329+ * TODO:
330+ */
331+ private val SmokeTestCase .operationParametersArePresent: Boolean
332+ get() = this .params.isPresent
333+ }
0 commit comments