Skip to content

Commit e2023b9

Browse files
rcohLukeMathWalker
authored andcommitted
Prevent test dependencies from leaking into production (#2264)
* Prevent test dependencies from leaking into production * refactor & fix tests * fix tests take two * fix more tests * Fix missed called to mergeDependencyFeatures * Add test * fix glacier compilation * fix more tests * fix one more test
1 parent 7bf9251 commit e2023b9

File tree

20 files changed

+323
-123
lines changed

20 files changed

+323
-123
lines changed

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.client.Fluen
1616
import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerics
1717
import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection
1818
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
19-
import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope
2019
import software.amazon.smithy.rust.codegen.core.rustlang.Feature
2120
import software.amazon.smithy.rust.codegen.core.rustlang.GenericTypeArg
2221
import software.amazon.smithy.rust.codegen.core.rustlang.RustGenerics
@@ -228,7 +227,7 @@ private class AwsFluentClientDocs(private val codegenContext: CodegenContext) :
228227
private val serviceShape = codegenContext.serviceShape
229228
private val crateName = codegenContext.moduleUseName()
230229
private val codegenScope =
231-
arrayOf("aws_config" to AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).copy(scope = DependencyScope.Dev).toType())
230+
arrayOf("aws_config" to AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency().toType())
232231

233232
// If no `aws-config` version is provided, assume that docs referencing `aws-config` cannot be given.
234233
// Also, STS and SSO must NOT reference `aws-config` since that would create a circular dependency.

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package software.amazon.smithy.rustsdk
77

88
import software.amazon.smithy.codegen.core.CodegenException
99
import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency
10-
import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope
1110
import software.amazon.smithy.rust.codegen.core.rustlang.Visibility
1211
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
1312
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeCrateLocation
@@ -63,7 +62,7 @@ object AwsRuntimeType {
6362
fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsCredentialTypes(runtimeConfig).toType()
6463

6564
fun awsCredentialTypesTestUtil(runtimeConfig: RuntimeConfig) =
66-
AwsCargoDependency.awsCredentialTypes(runtimeConfig).copy(scope = DependencyScope.Dev).withFeature("test-util").toType()
65+
AwsCargoDependency.awsCredentialTypes(runtimeConfig).toDevDependency().withFeature("test-util").toType()
6766

6867
fun awsEndpoint(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsEndpoint(runtimeConfig).toType()
6968
fun awsHttp(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsHttp(runtimeConfig).toType()

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable
3030
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
3131
import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization
3232
import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection
33+
import software.amazon.smithy.rust.codegen.core.testutil.testDependenciesOnly
3334
import java.nio.file.Files
3435
import java.nio.file.Paths
3536
import kotlin.io.path.absolute
@@ -72,7 +73,7 @@ class IntegrationTestDependencies(
7273
private val hasBenches: Boolean,
7374
) : LibRsCustomization() {
7475
override fun section(section: LibRsSection) = when (section) {
75-
is LibRsSection.Body -> writable {
76+
is LibRsSection.Body -> testDependenciesOnly {
7677
if (hasTests) {
7778
val smithyClient = CargoDependency.smithyClient(runtimeConfig)
7879
.copy(features = setOf("test-util"), scope = DependencyScope.Dev)
@@ -81,7 +82,7 @@ class IntegrationTestDependencies(
8182
addDependency(SerdeJson)
8283
addDependency(Tokio)
8384
addDependency(FuturesUtil)
84-
addDependency(Tracing)
85+
addDependency(Tracing.toDevDependency())
8586
addDependency(TracingSubscriber)
8687
}
8788
if (hasBenches) {
@@ -91,6 +92,7 @@ class IntegrationTestDependencies(
9192
serviceSpecific.section(section)(this)
9293
}
9394
}
95+
9496
else -> emptySection
9597
}
9698

@@ -114,8 +116,8 @@ class S3TestDependencies : LibRsCustomization() {
114116
override fun section(section: LibRsSection): Writable =
115117
writable {
116118
addDependency(AsyncStd)
117-
addDependency(BytesUtils)
118-
addDependency(FastRand)
119+
addDependency(BytesUtils.toDevDependency())
120+
addDependency(FastRand.toDevDependency())
119121
addDependency(HdrHistogram)
120122
addDependency(Smol)
121123
addDependency(TempFile)

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,16 @@ private val UploadMultipartPart: ShapeId = ShapeId.from("com.amazonaws.glacier#U
3333
private val Applies = setOf(UploadArchive, UploadMultipartPart)
3434

3535
class TreeHashHeader(private val runtimeConfig: RuntimeConfig) : OperationCustomization() {
36-
private val glacierChecksums = RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("glacier_checksums"))
36+
private val glacierChecksums = RuntimeType.forInlineDependency(
37+
InlineAwsDependency.forRustFile(
38+
"glacier_checksums",
39+
additionalDependency = TreeHashDependencies.toTypedArray(),
40+
),
41+
)
42+
3743
override fun section(section: OperationSection): Writable {
3844
return when (section) {
3945
is OperationSection.MutateRequest -> writable {
40-
TreeHashDependencies.forEach { dep ->
41-
addDependency(dep)
42-
}
4346
rustTemplate(
4447
"""
4548
#{glacier_checksums}::add_checksum_treehash(
@@ -49,6 +52,7 @@ class TreeHashHeader(private val runtimeConfig: RuntimeConfig) : OperationCustom
4952
"glacier_checksums" to glacierChecksums, "BuildError" to runtimeConfig.operationBuildError(),
5053
)
5154
}
55+
5256
else -> emptySection
5357
}
5458
}

aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesG
1717
import software.amazon.smithy.rust.codegen.client.smithy.generators.clientInstantiator
1818
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
1919
import software.amazon.smithy.rust.codegen.core.rustlang.AttributeKind
20-
import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency
2120
import software.amazon.smithy.rust.codegen.core.rustlang.escape
2221
import software.amazon.smithy.rust.codegen.core.rustlang.join
2322
import software.amazon.smithy.rust.codegen.core.rustlang.rust
2423
import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock
2524
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
2625
import software.amazon.smithy.rust.codegen.core.rustlang.writable
2726
import software.amazon.smithy.rust.codegen.core.smithy.PublicImportSymbolProvider
27+
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
2828
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
2929
import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName
3030
import software.amazon.smithy.rust.codegen.core.testutil.integrationTest
@@ -146,8 +146,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test:
146146
let _result = dbg!(#{invoke_operation});
147147
#{assertion}
148148
""",
149-
"capture_request" to CargoDependency.smithyClient(runtimeConfig)
150-
.withFeature("test-util").toType().resolve("test_connection::capture_request"),
149+
"capture_request" to RuntimeType.captureRequest(runtimeConfig),
151150
"conf" to config(testOperationInput),
152151
"invoke_operation" to operationInvocation(testOperationInput),
153152
"assertion" to writable {

aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
package software.amazon.smithy.rustsdk
77

88
import org.junit.jupiter.api.Test
9-
import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency
109
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
10+
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
1111
import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel
1212
import software.amazon.smithy.rust.codegen.core.testutil.integrationTest
1313
import software.amazon.smithy.rust.codegen.core.testutil.tokioTest
@@ -96,8 +96,7 @@ class EndpointsCredentialsTest {
9696
let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap();
9797
assert!(auth_header.contains("/us-west-2/foobaz/aws4_request"), "{}", auth_header);
9898
""",
99-
"capture_request" to CargoDependency.smithyClient(context.runtimeConfig)
100-
.withFeature("test-util").toType().resolve("test_connection::capture_request"),
99+
"capture_request" to RuntimeType.captureRequest(context.runtimeConfig),
101100
"Credentials" to AwsCargoDependency.awsCredentialTypes(context.runtimeConfig)
102101
.withFeature("test-util").toType().resolve("Credentials"),
103102
"Region" to AwsRuntimeType.awsTypes(context.runtimeConfig).resolve("region::Region"),
@@ -120,8 +119,7 @@ class EndpointsCredentialsTest {
120119
let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap();
121120
assert!(auth_header.contains("/region-custom-auth/name-custom-auth/aws4_request"), "{}", auth_header);
122121
""",
123-
"capture_request" to CargoDependency.smithyClient(context.runtimeConfig)
124-
.withFeature("test-util").toType().resolve("test_connection::capture_request"),
122+
"capture_request" to RuntimeType.captureRequest(context.runtimeConfig),
125123
"Credentials" to AwsCargoDependency.awsCredentialTypes(context.runtimeConfig)
126124
.withFeature("test-util").toType().resolve("Credentials"),
127125
"Region" to AwsRuntimeType.awsTypes(context.runtimeConfig).resolve("region::Region"),

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName
1313
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.symbol
1414
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
1515
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive
16-
import software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata
1716
import software.amazon.smithy.rust.codegen.core.rustlang.RustModule
1817
import software.amazon.smithy.rust.codegen.core.rustlang.RustType
1918
import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter
@@ -59,7 +58,7 @@ val EndpointTests = RustModule.new(
5958
documentation = "Generated endpoint tests",
6059
parent = EndpointsModule,
6160
inline = true,
62-
).copy(rustMetadata = RustMetadata.TestModule)
61+
).cfgTest()
6362

6463
// stdlib is isolated because it contains code generated names of stdlib functions–we want to ensure we avoid clashing
6564
val EndpointsStdLib = RustModule.private("endpoint_lib", "Endpoints standard library functions")

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustom
1414
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types
1515
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName
1616
import software.amazon.smithy.rust.codegen.client.smithy.generators.clientInstantiator
17-
import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency
1817
import software.amazon.smithy.rust.codegen.core.rustlang.Writable
1918
import software.amazon.smithy.rust.codegen.core.rustlang.docs
2019
import software.amazon.smithy.rust.codegen.core.rustlang.escape
@@ -48,8 +47,7 @@ internal class EndpointTestGenerator(
4847
"Error" to types.resolveEndpointError,
4948
"Document" to RuntimeType.document(runtimeConfig),
5049
"HashMap" to RuntimeType.HashMap,
51-
"capture_request" to CargoDependency.smithyClient(runtimeConfig)
52-
.withFeature("test-util").toType().resolve("test_connection::capture_request"),
50+
"capture_request" to RuntimeType.captureRequest(runtimeConfig),
5351
)
5452

5553
private val instantiator = clientInstantiator(codegenContext)

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,8 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
2222
import software.amazon.smithy.rust.codegen.client.smithy.generators.clientInstantiator
2323
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
2424
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow
25-
import software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata
2625
import software.amazon.smithy.rust.codegen.core.rustlang.RustModule
2726
import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter
28-
import software.amazon.smithy.rust.codegen.core.rustlang.Visibility
2927
import software.amazon.smithy.rust.codegen.core.rustlang.Writable
3028
import software.amazon.smithy.rust.codegen.core.rustlang.escape
3129
import software.amazon.smithy.rust.codegen.core.rustlang.rust
@@ -91,14 +89,10 @@ class ProtocolTestGenerator(
9189
if (allTests.isNotEmpty()) {
9290
val operationName = operationSymbol.name
9391
val testModuleName = "${operationName.toSnakeCase()}_request_test"
94-
val moduleMeta = RustMetadata(
95-
visibility = Visibility.PRIVATE,
96-
additionalAttributes = listOf(
97-
Attribute.CfgTest,
98-
Attribute(allow("unreachable_code", "unused_variables")),
99-
),
92+
val additionalAttributes = listOf(
93+
Attribute(allow("unreachable_code", "unused_variables")),
10094
)
101-
writer.withInlineModule(RustModule.LeafModule(testModuleName, moduleMeta, inline = true)) {
95+
writer.withInlineModule(RustModule.inlineTests(testModuleName, additionalAttributes = additionalAttributes)) {
10296
renderAllTestCases(allTests)
10397
}
10498
}

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ data class CargoDependency(
133133
return copy(features = features.toMutableSet().apply { add(feature) })
134134
}
135135

136+
fun toDevDependency() = copy(scope = DependencyScope.Dev)
137+
136138
override fun version(): String = when (location) {
137139
is CratesIo -> location.version
138140
is Local -> "local"
@@ -220,7 +222,12 @@ data class CargoDependency(
220222
val Smol: CargoDependency = CargoDependency("smol", CratesIo("1.2.0"), DependencyScope.Dev)
221223
val TempFile: CargoDependency = CargoDependency("tempfile", CratesIo("3.2.0"), DependencyScope.Dev)
222224
val Tokio: CargoDependency =
223-
CargoDependency("tokio", CratesIo("1.8.4"), DependencyScope.Dev, features = setOf("macros", "test-util", "rt-multi-thread"))
225+
CargoDependency(
226+
"tokio",
227+
CratesIo("1.8.4"),
228+
DependencyScope.Dev,
229+
features = setOf("macros", "test-util", "rt-multi-thread"),
230+
)
224231
val TracingAppender: CargoDependency = CargoDependency(
225232
"tracing-appender",
226233
CratesIo("0.2.2"),
@@ -236,12 +243,16 @@ data class CargoDependency(
236243
fun smithyAsync(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-async")
237244
fun smithyChecksums(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-checksums")
238245
fun smithyClient(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-client")
246+
fun smithyClientTestUtil(runtimeConfig: RuntimeConfig) =
247+
smithyClient(runtimeConfig).toDevDependency().withFeature("test-util")
248+
239249
fun smithyEventStream(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-eventstream")
240250
fun smithyHttp(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http")
241251
fun smithyHttpTower(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http-tower")
242252
fun smithyJson(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-json")
243253
fun smithyProtocolTestHelpers(runtimeConfig: RuntimeConfig) =
244254
runtimeConfig.smithyRuntimeCrate("smithy-protocol-test", scope = DependencyScope.Dev)
255+
245256
fun smithyQuery(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-query")
246257
fun smithyTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-types")
247258
fun smithyXml(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-xml")

0 commit comments

Comments
 (0)