diff --git a/codegen/smithy-kotlin-codegen/build.gradle.kts b/codegen/smithy-kotlin-codegen/build.gradle.kts index 0ab1c9881b..6362f70f15 100644 --- a/codegen/smithy-kotlin-codegen/build.gradle.kts +++ b/codegen/smithy-kotlin-codegen/build.gradle.kts @@ -20,8 +20,7 @@ val codegenVersion: String by project group = "software.amazon.smithy.kotlin" version = codegenVersion -val sdkVersion: String by project -val runtimeVersion = sdkVersion +val runtimeVersion: Provider = providers.gradleProperty("sdkVersion") dependencies { api(libs.smithy.codegen.core) @@ -42,16 +41,16 @@ dependencies { } val generateSdkRuntimeVersion by tasks.registering { - // generate the version of the runtime to use as a resource. - // this keeps us from having to manually change version numbers in multiple places - val resourcesDir = layout.buildDirectory.dir("resources/main/software/amazon/smithy/kotlin/codegen/core").get() - val versionFile = file("$resourcesDir/sdk-version.txt") - val gradlePropertiesFile = rootProject.file("gradle.properties") - inputs.file(gradlePropertiesFile) + val resourcesDir = layout.buildDirectory.dir("resources/main/software/amazon/smithy/kotlin/codegen/core") + val versionFile = resourcesDir.map { it.file("sdk-version.txt") } + + inputs.property("runtimeVersion", runtimeVersion) outputs.file(versionFile) - sourceSets.main.get().output.dir(resourcesDir) + doLast { - versionFile.writeText(runtimeVersion) + val version = inputs.properties["runtimeVersion"] as String + val file = versionFile.get().asFile + file.writeText(version) } } diff --git a/runtime/protocol/http-client-engines/test-suite/build.gradle.kts b/runtime/protocol/http-client-engines/test-suite/build.gradle.kts index e9c3e6555d..2b87461277 100644 --- a/runtime/protocol/http-client-engines/test-suite/build.gradle.kts +++ b/runtime/protocol/http-client-engines/test-suite/build.gradle.kts @@ -59,30 +59,27 @@ kotlin { } } -open class LocalTestServers : DefaultTask() { - @Internal - var server: Closeable? = null - private set - - @Internal - lateinit var main: String +abstract class TestServerProvider : + BuildService, + AutoCloseable { + interface Params : BuildServiceParameters { + val sslConfigPath: Property + val classpath: ConfigurableFileCollection + } - @Internal - lateinit var classpath: FileCollection + private var server: Closeable? = null - @Input - lateinit var sslConfigPath: String + fun startServers() { + if (server != null) return - @TaskAction - fun exec() { try { println("[TestServers] start") - val urlClassLoaderSource = classpath.map { file -> file.toURI().toURL() }.toTypedArray() + val urlClassLoaderSource = parameters.classpath.map { it.toURI().toURL() }.toTypedArray() val loader = URLClassLoader(urlClassLoaderSource, ClassLoader.getSystemClassLoader()) - val mainClass = loader.loadClass(main) + val mainClass = loader.loadClass("aws.smithy.kotlin.runtime.http.test.util.TestServersKt") val main = mainClass.getMethod("startServers", String::class.java) - server = main.invoke(null, sslConfigPath) as Closeable + server = main.invoke(null, parameters.sslConfigPath.get()) as Closeable println("[TestServers] started") } catch (cause: Throwable) { println("[TestServers] failed: ${cause.message}") @@ -90,36 +87,51 @@ open class LocalTestServers : DefaultTask() { } } - fun stop() { - if (server != null) { - server?.close() - println("[TestServers] stop") - } + override fun close() { + server?.close() + server = null + println("[TestServers] stopped") + } +} + +val testServerProvider = gradle.sharedServices.registerIfAbsent("testServers", TestServerProvider::class) { + parameters.sslConfigPath.set(File.createTempFile("ssl-", ".cfg").absolutePath) +} + +afterEvaluate { + testServerProvider.get().parameters.classpath.from(kotlin.targets.getByName("jvm").compilations["test"].runtimeDependencyFiles!!) +} + +abstract class StartTestServersTask : DefaultTask() { + @get:Internal + abstract val serverProvider: Property + + @TaskAction + fun start() { + serverProvider.get().startServers() } } val osName = System.getProperty("os.name") -val startTestServers = task("startTestServers") { +val startTestServers = tasks.register("startTestServers") { dependsOn(tasks["jvmJar"]) - - main = "aws.smithy.kotlin.runtime.http.test.util.TestServersKt" - val kotlinCompilation = kotlin.targets.getByName("jvm").compilations["test"] - classpath = kotlinCompilation.runtimeDependencyFiles!! - sslConfigPath = File.createTempFile("ssl-", ".cfg").absolutePath + usesService(testServerProvider) + serverProvider.set(testServerProvider) } val testTasks = listOf("allTests", "jvmTest") .forEach { tasks.named(it) { dependsOn(startTestServers) + usesService(testServerProvider) } } tasks.jvmTest { // set test environment for proxy tests systemProperty("MITM_PROXY_SCRIPTS_ROOT", projectDir.resolve("proxy-scripts").absolutePath) - systemProperty("SSL_CONFIG_PATH", startTestServers.sslConfigPath) + systemProperty("SSL_CONFIG_PATH", testServerProvider.get().parameters.sslConfigPath.get()) val enableProxyTestsProp = "aws.test.http.enableProxyTests" val runningInCodeBuild = System.getenv().containsKey("CODEBUILD_BUILD_ID") @@ -128,7 +140,3 @@ tasks.jvmTest { systemProperty(enableProxyTestsProp, System.getProperties().getOrDefault(enableProxyTestsProp, shouldRunProxyTests)) } - -gradle.buildFinished { - startTestServers.stop() -} diff --git a/tests/benchmarks/serde-benchmarks/build.gradle.kts b/tests/benchmarks/serde-benchmarks/build.gradle.kts index a604a67ecf..8e237a256d 100644 --- a/tests/benchmarks/serde-benchmarks/build.gradle.kts +++ b/tests/benchmarks/serde-benchmarks/build.gradle.kts @@ -85,27 +85,27 @@ tasks.generateSmithyProjections { buildClasspath.set(codegen) } -data class BenchmarkModel(val name: String) { - val projectionRootDir: File - get() = layout.buildDirectory.dir("smithyprojections/${project.name}/$name/kotlin-codegen/src/main/kotlin").get().asFile.absoluteFile +abstract class StageGeneratedSourcesTask : DefaultTask() { + @get:Input + abstract val projectName: Property - val sourceSetRootDir: File - get() = layout.buildDirectory.dir("generated-src/src").get().asFile.absoluteFile -} + @get:InputDirectory + abstract val smithyProjectionsDir: DirectoryProperty -val benchmarkModels = listOf( - "twitter", - "countries-states", -).map { BenchmarkModel(it) } + @get:OutputDirectory + abstract val generatedSourcesDir: DirectoryProperty -val stageGeneratedSources = tasks.register("stageGeneratedSources") { - group = "codegen" - dependsOn(tasks.generateSmithyProjections) - doLast { - benchmarkModels.forEach { - copy { - from("${it.projectionRootDir}") - into("${it.sourceSetRootDir}") + @get:Inject + abstract val fs: FileSystemOperations + + @TaskAction + fun stage() { + val models = listOf("twitter", "countries-states") + + models.forEach { modelName -> + fs.copy { + from(smithyProjectionsDir.dir("${projectName.get()}/$modelName/kotlin-codegen/src/main/kotlin")) + into(generatedSourcesDir.get().asFile) include("**/model/*.kt") include("**/serde/*.kt") exclude("**/serde/*OperationSerializer.kt") @@ -115,6 +115,20 @@ val stageGeneratedSources = tasks.register("stageGeneratedSources") { } } +val stageGeneratedSources = tasks.register("stageGeneratedSources") { + group = "codegen" + dependsOn(tasks.generateSmithyProjections) + projectName.set(project.name) + smithyProjectionsDir.set(layout.buildDirectory.dir("smithyprojections")) + generatedSourcesDir.set(layout.buildDirectory.dir("generated-src/src")) +} + +afterEvaluate { + tasks.named("jvmSourcesJar") { + dependsOn(stageGeneratedSources) + } +} + tasks.withType { dependsOn(stageGeneratedSources) } diff --git a/tests/codegen/serde-tests/build.gradle.kts b/tests/codegen/serde-tests/build.gradle.kts index fac6eb51ca..3b8d3f3eba 100644 --- a/tests/codegen/serde-tests/build.gradle.kts +++ b/tests/codegen/serde-tests/build.gradle.kts @@ -58,18 +58,24 @@ dependencies { val generatedSrcDir = project.layout.projectDirectory.dir("generated-src/main/kotlin") -val stageGeneratedSources = tasks.register("stageGeneratedSources") { - group = "codegen" - dependsOn(tasks.generateSmithyProjections) - outputs.dir(generatedSrcDir) - // FIXME - this task up-to-date checks are wrong, likely something is not setup right with inputs/outputs somewhere - // for now just always run it - outputs.upToDateWhen { false } - doLast { - listOf("xml", "json").forEach { projectionName -> - val fromDir = smithyBuild.smithyKotlinProjectionSrcDir(projectionName) - logger.info("copying from ${fromDir.get()} to $generatedSrcDir") - copy { +abstract class StageGeneratedSourcesTask : DefaultTask() { + @get:InputDirectory + abstract val projectionsDir: DirectoryProperty + + @get:OutputDirectory + abstract val generatedSrcDir: DirectoryProperty + + @get:Inject + abstract val fs: FileSystemOperations + + @TaskAction + fun stageGeneratedSources() { + val projections = listOf("xml", "json") + + projections.forEach { projectionName -> + val fromDir = projectionsDir.dir("$projectionName/kotlin-codegen/src/main/kotlin") + logger.info("copying from ${fromDir.get()} to ${generatedSrcDir.get()}") + fs.copy { from(fromDir) into(generatedSrcDir) include("**/model/*.kt") @@ -83,6 +89,13 @@ val stageGeneratedSources = tasks.register("stageGeneratedSources") { } } +val stageGeneratedSources = tasks.register("stageGeneratedSources") { + group = "codegen" + dependsOn(tasks.generateSmithyProjections) + generatedSrcDir.set(layout.projectDirectory.dir("generated-src/main/kotlin")) + projectionsDir.set(layout.buildDirectory.dir("smithyprojections/serde-tests")) +} + tasks.kotlinSourcesJar { dependsOn( tasks.generateSmithyProjections,