Skip to content

Commit d510c80

Browse files
committed
more cleanups
1 parent be16fc4 commit d510c80

File tree

4 files changed

+135
-113
lines changed

4 files changed

+135
-113
lines changed

fuzzgen/src/main/kotlin/software/amazon/smithy/rust/codegen/fuzz/FuzzHarnessBuildPlugin.kt

Lines changed: 34 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ package software.amazon.smithy.rust.codegen.fuzz
88
import software.amazon.smithy.build.FileManifest
99
import software.amazon.smithy.build.PluginContext
1010
import software.amazon.smithy.build.SmithyBuildPlugin
11-
import software.amazon.smithy.codegen.core.Symbol
1211
import software.amazon.smithy.model.Model
13-
import software.amazon.smithy.model.knowledge.NullableIndex
1412
import software.amazon.smithy.model.knowledge.TopDownIndex
1513
import software.amazon.smithy.model.neighbor.Walker
1614
import software.amazon.smithy.model.node.ArrayNode
@@ -20,7 +18,6 @@ import software.amazon.smithy.model.node.ObjectNode
2018
import software.amazon.smithy.model.node.StringNode
2119
import software.amazon.smithy.model.shapes.MemberShape
2220
import software.amazon.smithy.model.shapes.OperationShape
23-
import software.amazon.smithy.model.shapes.ServiceShape
2421
import software.amazon.smithy.model.shapes.Shape
2522
import software.amazon.smithy.model.shapes.ShapeId
2623
import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait
@@ -30,37 +27,38 @@ import software.amazon.smithy.model.traits.JsonNameTrait
3027
import software.amazon.smithy.model.traits.XmlNameTrait
3128
import software.amazon.smithy.protocoltests.traits.HttpRequestTestsTrait
3229
import software.amazon.smithy.rust.codegen.core.rustlang.RustModule
33-
import software.amazon.smithy.rust.codegen.core.rustlang.RustType
3430
import software.amazon.smithy.rust.codegen.core.rustlang.Writable
35-
import software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig
36-
import software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings
3731
import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider
38-
import software.amazon.smithy.rust.codegen.core.smithy.PublicImportSymbolProvider
3932
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
40-
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
41-
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
42-
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig
43-
import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor
44-
import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider
45-
import software.amazon.smithy.rust.codegen.core.smithy.mapRustType
4633
import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer
4734
import software.amazon.smithy.rust.codegen.core.util.getTrait
4835
import software.amazon.smithy.rust.codegen.core.util.orNull
49-
import software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider
5036
import software.amazon.smithy.rust.codegen.server.smithy.transformers.AttachValidationExceptionToConstrainedOperationInputsInAllowList
5137
import java.nio.file.Path
5238
import java.util.Base64
5339
import kotlin.streams.toList
5440

55-
data class FuzzTarget(val name: String, val relativePath: String) {
41+
/**
42+
* Metadata for a TargetCrate: A code generated smithy-rs server for a given model
43+
*/
44+
data class TargetCrate(
45+
/** The name of the Fuzz target */
46+
val name: String,
47+
/** Where the server implementation of this target is */
48+
val relativePath: String,
49+
) {
5650
companion object {
57-
fun fromNode(node: ObjectNode): FuzzTarget {
51+
fun fromNode(node: ObjectNode): TargetCrate {
5852
val name = node.expectStringMember("name").value
5953
val relativePath = node.expectStringMember("relativePath").value
60-
return FuzzTarget(name, relativePath)
54+
return TargetCrate(name, relativePath)
6155
}
6256
}
6357

58+
/** The name of the actual `package` from Cargo's perspective.
59+
*
60+
* We need this to make a dependency on it
61+
* */
6462
fun targetPackage(): String {
6563
val path = Path.of(relativePath)
6664
val cargoToml = path.resolve("Cargo.toml").toFile()
@@ -71,20 +69,27 @@ data class FuzzTarget(val name: String, val relativePath: String) {
7169
}
7270

7371
data class FuzzSettings(
74-
val targetCratePath: List<FuzzTarget>,
72+
val targetServers: List<TargetCrate>,
7573
val service: ShapeId,
7674
val runtimeConfig: RuntimeConfig,
7775
) {
7876
companion object {
7977
fun fromNode(node: ObjectNode): FuzzSettings {
80-
val targetCrates = node.expectArrayMember("targetCrates").map { FuzzTarget.fromNode(it.expectObjectNode()) }
78+
val targetCrates =
79+
node.expectArrayMember("targetCrates")
80+
.map { TargetCrate.fromNode(it.expectObjectNode()) }
8181
val service = ShapeId.fromNode(node.expectStringMember("service"))
8282
val runtimeConfig = RuntimeConfig.fromNode(node.getObjectMember("runtimeConfig"))
8383
return FuzzSettings(targetCrates, service, runtimeConfig)
8484
}
8585
}
8686
}
8787

88+
/**
89+
* Build plugin for generating a fuzz harness and lexicon from a smithy model and a set of smithy-rs versions
90+
*
91+
* This is used by `aws-smithy-fuzz` which contains most of the usage docs
92+
*/
8893
class FuzzHarnessBuildPlugin : SmithyBuildPlugin {
8994
override fun getName(): String = "fuzz-harness"
9095

@@ -95,10 +100,11 @@ class FuzzHarnessBuildPlugin : SmithyBuildPlugin {
95100
context.model.let(OperationNormalizer::transform)
96101
.let(AttachValidationExceptionToConstrainedOperationInputsInAllowList::transform)
97102
val targets =
98-
fuzzSettings.targetCratePath.map { target ->
99-
val target = createFuzzTarget(target, context.fileManifest, fuzzSettings, model)
100-
FuzzTargetGenerator(target).generateFuzzTarget()
101-
target
103+
fuzzSettings.targetServers.map { target ->
104+
val targetContext = createFuzzTarget(target, context.fileManifest, fuzzSettings, model)
105+
println("Creating a fuzz targret for $targetContext")
106+
FuzzTargetGenerator(targetContext).generateFuzzTarget()
107+
targetContext
102108
}
103109

104110
println("creating the driver...")
@@ -110,21 +116,9 @@ class FuzzHarnessBuildPlugin : SmithyBuildPlugin {
110116
}
111117
}
112118

113-
fun driverSettings(
114-
service: ShapeId,
115-
runtimeConfig: RuntimeConfig,
116-
) = CoreRustSettings(
117-
service,
118-
moduleVersion = "0.1.0",
119-
moduleName = "fuzz-driver",
120-
moduleAuthors = listOf(),
121-
codegenConfig = CoreCodegenConfig(),
122-
license = null,
123-
runtimeConfig = runtimeConfig,
124-
moduleDescription = null,
125-
moduleRepository = null,
126-
)
127-
119+
/**
120+
* Generate a corpus of words used within the model to see the dictionary
121+
*/
128122
fun corpus(
129123
model: Model,
130124
fuzzSettings: FuzzSettings,
@@ -139,6 +133,7 @@ fun corpus(
139133
println("base64 decoding first (v2)")
140134
Base64.getDecoder().decode(testCase.body.orNull())?.map { NumberNode.from(it.toUByte().toInt()) }
141135
}
136+
142137
else -> testCase.body.orNull()?.chars()?.toList()?.map { c -> NumberNode.from(c) }
143138
} ?: listOf()
144139
out.withValue(
@@ -210,58 +205,8 @@ fun getTraitBasedNames(shape: Shape): List<String> {
210205
)
211206
}
212207

213-
fun createFuzzTarget(
214-
target: FuzzTarget,
215-
baseManifest: FileManifest,
216-
fuzzSettings: FuzzSettings,
217-
model: Model,
218-
): FuzzTargetContext {
219-
val newManifest = FileManifest.create(baseManifest.resolvePath(Path.of(target.name)))
220-
val codegenConfig = CoreCodegenConfig()
221-
val symbolProvider =
222-
SymbolVisitor(
223-
rustSettings(fuzzSettings, target),
224-
model,
225-
model.expectShape(fuzzSettings.service, ServiceShape::class.java),
226-
RustSymbolProviderConfig(
227-
fuzzSettings.runtimeConfig,
228-
renameExceptions = false,
229-
NullableIndex.CheckMode.SERVER,
230-
ServerModuleProvider,
231-
),
232-
).let { PublicImportSymbolProvider(it, "rust_server_codegen") }
233-
val crate =
234-
RustCrate(
235-
newManifest,
236-
symbolProvider,
237-
codegenConfig,
238-
DocProvider(),
239-
)
240-
return FuzzTargetContext(
241-
target = target,
242-
fuzzSettings = fuzzSettings,
243-
rustCrate = crate,
244-
model = model,
245-
manifest = newManifest,
246-
symbolProvider = symbolProvider,
247-
)
248-
}
249-
250-
class DocProvider : ModuleDocProvider {
208+
class NoOpDocProvider : ModuleDocProvider {
251209
override fun docsWriter(module: RustModule.LeafModule): Writable? {
252210
return null
253211
}
254212
}
255-
256-
class PublicCrateSymbolProvider(private val crateName: String, private val base: RustSymbolProvider) :
257-
WrappingSymbolProvider(base) {
258-
override fun toSymbol(shape: Shape): Symbol {
259-
val base = base.toSymbol(shape)
260-
return base.mapRustType { ty ->
261-
when (ty) {
262-
is RustType.Opaque -> RustType.Opaque(ty.name, ty.namespace?.replace("crate", crateName))
263-
else -> ty
264-
}
265-
}
266-
}
267-
}

fuzzgen/src/main/kotlin/software/amazon/smithy/rust/codegen/fuzz/FuzzTargetContext.kt renamed to fuzzgen/src/main/kotlin/software/amazon/smithy/rust/codegen/fuzz/FuzzTargetGenerator.kt

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.fuzz
77

88
import software.amazon.smithy.build.FileManifest
99
import software.amazon.smithy.model.Model
10+
import software.amazon.smithy.model.knowledge.NullableIndex
1011
import software.amazon.smithy.model.knowledge.TopDownIndex
1112
import software.amazon.smithy.model.shapes.OperationShape
1213
import software.amazon.smithy.model.shapes.ServiceShape
@@ -19,24 +20,28 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
1920
import software.amazon.smithy.rust.codegen.core.rustlang.writable
2021
import software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig
2122
import software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings
23+
import software.amazon.smithy.rust.codegen.core.smithy.PublicImportSymbolProvider
2224
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
2325
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope
2426
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
2527
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
28+
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig
29+
import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor
2630
import software.amazon.smithy.rust.codegen.core.smithy.contextName
2731
import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember
2832
import software.amazon.smithy.rust.codegen.core.util.inputShape
2933
import software.amazon.smithy.rust.codegen.core.util.isEventStream
3034
import software.amazon.smithy.rust.codegen.core.util.outputShape
3135
import software.amazon.smithy.rust.codegen.core.util.toPascalCase
3236
import software.amazon.smithy.rust.codegen.core.util.toSnakeCase
37+
import software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider
3338
import software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained
3439
import java.nio.file.Path
3540
import kotlin.io.path.name
3641

37-
fun rustSettings(
42+
private fun rustSettings(
3843
fuzzSettings: FuzzSettings,
39-
target: FuzzTarget,
44+
target: TargetCrate,
4045
) = CoreRustSettings(
4146
fuzzSettings.service,
4247
moduleVersion = "0.1.0",
@@ -50,7 +55,7 @@ fun rustSettings(
5055
)
5156

5257
data class FuzzTargetContext(
53-
val target: FuzzTarget,
58+
val target: TargetCrate,
5459
val fuzzSettings: FuzzSettings,
5560
val rustCrate: RustCrate,
5661
val model: Model,
@@ -59,7 +64,10 @@ data class FuzzTargetContext(
5964
) {
6065
fun finalize(): FileManifest {
6166
val forceWorkspace =
62-
mapOf("workspace" to listOf("_ignored" to "_ignored").toMap(), "lib" to mapOf("crate-type" to listOf("cdylib")))
67+
mapOf(
68+
"workspace" to listOf("_ignored" to "_ignored").toMap(),
69+
"lib" to mapOf("crate-type" to listOf("cdylib")),
70+
)
6371
val rustSettings = rustSettings(fuzzSettings, target)
6472
rustCrate.finalize(rustSettings, model, forceWorkspace, listOf(), requireDocs = false)
6573
return manifest
@@ -69,13 +77,13 @@ data class FuzzTargetContext(
6977
class FuzzTargetGenerator(private val context: FuzzTargetContext) {
7078
private val model = context.model
7179
private val serviceShape = context.model.expectShape(context.fuzzSettings.service, ServiceShape::class.java)
72-
private val symbolProvider = context.symbolProvider
80+
private val symbolProvider = PublicImportSymbolProvider(context.symbolProvider, targetCrate().name)
7381

7482
private fun targetCrate(): RuntimeType {
7583
val path = Path.of(context.target.relativePath).toAbsolutePath()
7684
return CargoDependency(
77-
path.name,
78-
Local(path.parent?.toString() ?: ""),
85+
name = path.name,
86+
location = Local(path.parent?.toString() ?: ""),
7987
`package` = context.target.targetPackage(),
8088
).toType()
8189
}
@@ -131,7 +139,8 @@ class FuzzTargetGenerator(private val context: FuzzTargetContext) {
131139
private fun allTxs(): Writable =
132140
writable {
133141
operationsToImplement().forEach { op ->
134-
val operationName = op.contextName(serviceShape).toSnakeCase().let { RustReservedWords.escapeIfNeeded(it) }
142+
val operationName =
143+
op.contextName(serviceShape).toSnakeCase().let { RustReservedWords.escapeIfNeeded(it) }
135144
rust("let tx_$operationName = tx.clone();")
136145
}
137146
}
@@ -140,7 +149,8 @@ class FuzzTargetGenerator(private val context: FuzzTargetContext) {
140149
writable {
141150
val operations = operationsToImplement()
142151
operations.forEach { op ->
143-
val operationName = op.contextName(serviceShape).toSnakeCase().let { RustReservedWords.escapeIfNeeded(it) }
152+
val operationName =
153+
op.contextName(serviceShape).toSnakeCase().let { RustReservedWords.escapeIfNeeded(it) }
144154
val output =
145155
writable {
146156
val outputSymbol = symbolProvider.toSymbol(op.outputShape(model))
@@ -166,3 +176,40 @@ class FuzzTargetGenerator(private val context: FuzzTargetContext) {
166176
}
167177
}
168178
}
179+
180+
fun createFuzzTarget(
181+
target: TargetCrate,
182+
baseManifest: FileManifest,
183+
fuzzSettings: FuzzSettings,
184+
model: Model,
185+
): FuzzTargetContext {
186+
val newManifest = FileManifest.create(baseManifest.resolvePath(Path.of(target.name)))
187+
val codegenConfig = CoreCodegenConfig()
188+
val symbolProvider =
189+
SymbolVisitor(
190+
rustSettings(fuzzSettings, target),
191+
model,
192+
model.expectShape(fuzzSettings.service, ServiceShape::class.java),
193+
RustSymbolProviderConfig(
194+
fuzzSettings.runtimeConfig,
195+
renameExceptions = false,
196+
NullableIndex.CheckMode.SERVER,
197+
ServerModuleProvider,
198+
),
199+
)
200+
val crate =
201+
RustCrate(
202+
newManifest,
203+
symbolProvider,
204+
codegenConfig,
205+
NoOpDocProvider(),
206+
)
207+
return FuzzTargetContext(
208+
target = target,
209+
fuzzSettings = fuzzSettings,
210+
rustCrate = crate,
211+
model = model,
212+
manifest = newManifest,
213+
symbolProvider = symbolProvider,
214+
)
215+
}

0 commit comments

Comments
 (0)