Skip to content

Commit e7ac93f

Browse files
committed
Checkpoint for smoke tests code generation bug fixes
1 parent 2f47ed3 commit e7ac93f

File tree

1 file changed

+74
-17
lines changed

1 file changed

+74
-17
lines changed

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/smoketests/SmokeTestsRunnerGenerator.kt

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,24 @@ import software.amazon.smithy.kotlin.codegen.model.getTrait
88
import software.amazon.smithy.kotlin.codegen.model.hasTrait
99
import software.amazon.smithy.kotlin.codegen.rendering.endpoints.EndpointParametersGenerator
1010
import 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
1114
import software.amazon.smithy.kotlin.codegen.rendering.smoketests.SmokeTestUriValue.EndpointParameters
1215
import software.amazon.smithy.kotlin.codegen.rendering.smoketests.SmokeTestUriValue.EndpointProvider
1316
import software.amazon.smithy.kotlin.codegen.rendering.util.format
1417
import software.amazon.smithy.kotlin.codegen.utils.dq
1518
import software.amazon.smithy.kotlin.codegen.utils.toCamelCase
1619
import software.amazon.smithy.kotlin.codegen.utils.topDownOperations
20+
import software.amazon.smithy.model.node.Node
21+
import software.amazon.smithy.model.node.StringNode
1722
import software.amazon.smithy.model.shapes.OperationShape
23+
import software.amazon.smithy.model.shapes.Shape
1824
import software.amazon.smithy.smoketests.traits.SmokeTestCase
1925
import software.amazon.smithy.smoketests.traits.SmokeTestsTrait
2026
import kotlin.jvm.optionals.getOrNull
2127

28+
// TODO: Organize all these section IDs
2229
object SmokeTestsRunner : SectionId
2330
object SmokeTestAdditionalEnvVars : SectionId
2431
object 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+
4255
const val SKIP_TAGS = "AWS_SMOKE_TEST_SKIP_TAGS"
4356
const 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

Comments
 (0)