From 10fb15190b1dd37b7a8f51d9fb698d592ac6cd98 Mon Sep 17 00:00:00 2001 From: Marcin Zajaczkowski Date: Sat, 21 Feb 2015 12:15:13 +0100 Subject: [PATCH] [#22] Rework generate server tests task --- .../io/coderate/accurest/FileSaver.groovy | 7 +-- .../io/coderate/accurest/TestGenerator.groovy | 12 ++-- .../config/AccurestConfigProperties.groovy | 6 +- .../accurest/TestGeneratorSpec.groovy | 6 +- .../plugin/AccurestGradlePlugin.groovy | 61 +++++++------------ .../plugin/GenerateServerTestsTask.groovy | 36 +++++++++++ 6 files changed, 72 insertions(+), 56 deletions(-) create mode 100644 accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy index 8d76595c4a..74d54d188a 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/FileSaver.groovy @@ -13,18 +13,17 @@ import static io.coderate.accurest.util.NamesUtil.capitalize @CompileStatic class FileSaver { - - String targetDirectory + File targetDirectory TestFramework framework - FileSaver(String targetDirectory, TestFramework framework) { + FileSaver(File targetDirectory, TestFramework framework) { this.targetDirectory = targetDirectory this.framework = framework } void saveClassFile(String fileName, String packageName, byte[] classBytes) { - def testBaseDir = Paths.get(targetDirectory, NamesUtil.packageToDirectory(packageName)) + def testBaseDir = Paths.get(targetDirectory.absolutePath, NamesUtil.packageToDirectory(packageName)) Files.createDirectories(testBaseDir) def classPath = Paths.get(testBaseDir.toString(), capitalize(fileName) + getTestClassSuffix() + getTestClassExtension()) .toAbsolutePath() diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy index 2358df8362..f01b5398eb 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/TestGenerator.groovy @@ -14,23 +14,21 @@ import static io.coderate.accurest.util.NamesUtil.afterLast class TestGenerator { private final AccurestConfigProperties configProperties - private final String stubsBaseDirectory private AtomicInteger counter = new AtomicInteger() private SingleTestGenerator generator private FileSaver saver private DirectoryScanner directoryScanner TestGenerator(AccurestConfigProperties accurestConfigProperties) { - this(accurestConfigProperties, new SingleTestGenerator(accurestConfigProperties), new FileSaver(accurestConfigProperties.generatedTestSourcesDir, accurestConfigProperties.targetFramework)) + this(accurestConfigProperties, new SingleTestGenerator(accurestConfigProperties), + new FileSaver(accurestConfigProperties.generatedTestSourcesDir, accurestConfigProperties.targetFramework)) } TestGenerator(AccurestConfigProperties configProperties, SingleTestGenerator generator, FileSaver saver) { this.configProperties = configProperties - File stubsResource = new File(configProperties.stubsBaseDirectory) - if (stubsResource == null) { + if (configProperties.stubsBaseDirectory == null) { throw new AccurestException("Stubs directory not found under " + configProperties.stubsBaseDirectory) } - this.stubsBaseDirectory = stubsResource.path this.generator = generator this.saver = saver this.directoryScanner = new DirectoryScanner() @@ -61,7 +59,7 @@ class TestGenerator { return includedFile.matches(includedDirectoryRelativePath + File.separator + "[A-Za-z0-9]*\\.json") } .collect { - return new File(stubsBaseDirectory + File.separator + it) + return new File(configProperties.stubsBaseDirectory, it) } if (filesToClass.size()) { def className = afterLast(includedDirectoryRelativePath, File.separator) @@ -71,6 +69,4 @@ class TestGenerator { } } } - - } \ No newline at end of file diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy index 3cf1edb274..3f6e50c889 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy @@ -6,12 +6,12 @@ package io.coderate.accurest.config class AccurestConfigProperties { TestFramework targetFramework = TestFramework.SPOCK TestMode testMode = TestMode.MOCKMVC - String stubsBaseDirectory = 'src/test/resources/stubs' - String basePackageForTests = 'io.codearte.accurest.tests' + File stubsBaseDirectory + String basePackageForTests String baseClassForTests String ruleClassForTests List ignoredFiles = [] - String generatedTestSourcesDir = 'build/generated-sources/accurest' + File generatedTestSourcesDir String[] imports = [] String[] staticImports = [] File groovyDslDir diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy index 279af858de..f639dfe1cd 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy @@ -14,7 +14,7 @@ class TestGeneratorSpec extends Specification { given: File resource = new File(this.getClass().getResource("/directory/with/stubs/stubsRepositoryIndicator").toURI()) AccurestConfigProperties properties = new AccurestConfigProperties() - properties.stubsBaseDirectory = resource.parentFile.path + properties.stubsBaseDirectory = resource.parentFile TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) when: testGenerator.generateTestClasses("com.ofg") @@ -27,7 +27,7 @@ class TestGeneratorSpec extends Specification { File resource = new File(this.getClass().getResource("/directory/with/stubs/stubsRepositoryIndicator").toURI()) AccurestConfigProperties properties = new AccurestConfigProperties() properties.ignoredFiles << "**/other/**" - properties.stubsBaseDirectory = resource.parentFile.path + properties.stubsBaseDirectory = resource.parentFile TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) when: testGenerator.generateTestClasses("com.ofg") @@ -40,7 +40,7 @@ class TestGeneratorSpec extends Specification { File resource = new File(this.getClass().getResource("/directory/with/stubs/stubsRepositoryIndicator").toURI()) AccurestConfigProperties properties = new AccurestConfigProperties() properties.ignoredFiles << "**/other.json" - properties.stubsBaseDirectory = resource.parentFile.path + properties.stubsBaseDirectory = resource.parentFile TestGenerator testGenerator = new TestGenerator(properties, classGenerator, Stub(FileSaver)) classGenerator.buildClass(_, _, _) >> "sample" when: diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy index b7561ea393..11c9d75ba8 100644 --- a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy @@ -1,9 +1,6 @@ package io.codearte.accurest.plugin -import io.coderate.accurest.AccurestException -import io.coderate.accurest.TestGenerator import io.coderate.accurest.config.AccurestConfigProperties -import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.Task @@ -18,66 +15,54 @@ class AccurestGradlePlugin implements Plugin { private static final Class IDEA_PLUGIN_CLASS = org.gradle.plugins.ide.idea.IdeaPlugin + private Project project + @Override void apply(Project project) { + this.project = project AccurestConfigProperties extension = project.extensions.create('accurest', AccurestConfigProperties) project.compileTestGroovy.dependsOn(GENERATE_SERVER_TESTS_TASK_NAME) - createGenerateTestsTask(project, extension) - createAndConfigureGenerateWiremockClientStubsFromDslTask(project, extension) + setConfigurationDefaults(extension) + createGenerateTestsTask(extension) + createAndConfigureGenerateWiremockClientStubsFromDslTask(extension) project.afterEvaluate { def hasIdea = project.plugins.findPlugin(IDEA_PLUGIN_CLASS) if (hasIdea) { project.idea { module { - testSourceDirs += project.file(buildGeneratedSourcesDir(project, extension)) + testSourceDirs += extension.generatedTestSourcesDir } } } } } - private Task createGenerateTestsTask(Project project, AccurestConfigProperties extension) { - project.task(GENERATE_SERVER_TESTS_TASK_NAME) << { - project.logger.info("Accurest Plugin: Invoking test sources generation") - - extension.stubsBaseDirectory = project.projectDir.path + File.separator + extension.stubsBaseDirectory - - project.sourceSets.test.groovy { - project.logger.info("Registering $extension.generatedTestSourcesDir as test source directory") - srcDir extension.generatedTestSourcesDir - } - - extension.generatedTestSourcesDir = buildGeneratedSourcesDir(project, extension) - - try { - TestGenerator generator = new TestGenerator(extension) - int generatedClasses = generator.generate() - project.logger.info("Generated {} test classes", generatedClasses) - } catch (AccurestException e) { - throw new GradleException("Accurest Plugin exception: ${e.message}", e) - } + void setConfigurationDefaults(AccurestConfigProperties extension) { + extension.with { + generatedTestSourcesDir = project.file("${project.buildDir}/generated-sources/accurest") + stubsBaseDirectory = project.file("${project.rootDir}/src/test/resources/stubs") //TODO: Use sourceset + basePackageForTests = 'io.codearte.accurest.tests' } } - private void createAndConfigureGenerateWiremockClientStubsFromDslTask(Project project, AccurestConfigProperties extension) { + private void createGenerateTestsTask(AccurestConfigProperties extension) { + Task task = project.tasks.create(GENERATE_SERVER_TESTS_TASK_NAME, GenerateServerTestsTask) + task.description = "Generate server tests from GroovyDSL" + task.conventionMapping.with { + generatedTestSourcesDir = { extension.generatedTestSourcesDir } + configProperties = { extension } + } + } + + private void createAndConfigureGenerateWiremockClientStubsFromDslTask(AccurestConfigProperties extension) { Task task = project.tasks.create(DSL_TO_WIREMOCK_CLIENT_TASK_NAME, GenerateWiremockClientStubsFromDslTask) - task.description = "Generate" + task.description = "Generate Wiremock client stubs from GroovyDSL" task.conventionMapping.with { groovyDslDir = { extension.groovyDslDir } generatedWiremockClientStubsDir = { extension.generatedWiremockClientStubsDir } } } - - private String buildGeneratedSourcesDir(Project project, def extension) { - String moduleDir - if (project.getParent()) { - moduleDir = project.name + File.separator + extension.generatedTestSourcesDir - } else { - moduleDir = extension.generatedTestSourcesDir - } - moduleDir - } } diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy new file mode 100644 index 0000000000..124c226fe4 --- /dev/null +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateServerTestsTask.groovy @@ -0,0 +1,36 @@ +package io.codearte.accurest.plugin + +import io.coderate.accurest.AccurestException +import io.coderate.accurest.TestGenerator +import io.coderate.accurest.config.AccurestConfigProperties +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction + +class GenerateServerTestsTask extends DefaultTask { + + @OutputDirectory File generatedTestSourcesDir + + //TODO: How to deal with @Input*, @Output* and that domain object? + AccurestConfigProperties configProperties + + @TaskAction + void generate() { + project.logger.info("Accurest Plugin: Invoking test sources generation") + + project.sourceSets.test.groovy { + project.logger.info("Registering ${getConfigProperties().generatedTestSourcesDir} as test source directory") + srcDir getConfigProperties().generatedTestSourcesDir + } + + try { + //TODO: What with that? How to pass? + TestGenerator generator = new TestGenerator(getConfigProperties()) + int generatedClasses = generator.generate() + project.logger.info("Generated {} test classes", generatedClasses) + } catch (AccurestException e) { + throw new GradleException("Accurest Plugin exception: ${e.message}", e) + } + } +}