Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make AccuREST tasks cacheable #296

Merged
merged 15 commits into from
Jul 13, 2017
5 changes: 2 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
language: java
sudo: required
dist: trusty
group: deprecated-2017Q2

before_install:
- "export JAVA_OPTS='-Xmx1024m -XX:MaxPermSize=256m'"
- "rm -rf $HOME/.m2/repository/io/codearte/accurest/stubs"
- "mkdir $HOME/.m2/repository/io/codearte/accurest/ --parents"
- "cp -r stub-runner/stub-runner-spring/src/test/resources/m2repo/repository/io/codearte/accurest/stubs $HOME/.m2/repository/io/codearte/accurest/"

jdk:
- oraclejdk8

install: ./gradlew assemble -s
script: ./gradlew check funcTest install -s --continue && jdk_switcher use oraclejdk8 && ./scripts/runTests.sh && jdk_switcher use $TRAVIS_JDK_VERSION && ./gradlew uploadSnapshotArchives -x check -s

matrix:
include:
- jdk: oraclejdk8
# Automatic snapshot release only in Java 7 build
- jdk: oraclejdk7
env:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
when:
String wireMockStub = new WireMockStubStrategy("Test", new Contract(null, false, 0, null), groovyDsl).toWireMockClientStub()
then:
//TODO: That assertion fails on some environments due to 2 ways how body array is created - with 'created' at the beginning or 'id'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe instead of adding a comment this assertion could be modified to compare the jsons wtih problematic elements removed on both sides?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but not in 1.1.1 :)

Copy link
Member Author

@szpak szpak Jul 13, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This project is no longer actively maintained :(

AssertionUtil.assertThatJsonsAreEqual(('''
{
"request" : {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,16 +180,16 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = JsonToJsonPathsConverter.transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json))
then:
pathAndValues.find {
it.method() == """.field("extensions").field("7").isEqualTo(28)""" &&
it.jsonPath() == '''$.extensions[?(@.7 == 28)]'''
it.method() == """.field("extensions").field("7").isEqualTo(28.00)""" &&
it.jsonPath() == '''$.extensions[?(@.7 == 28.00)]'''
}
pathAndValues.find {
it.method() == """.field("extensions").field("14").isEqualTo(41)""" &&
it.jsonPath() == '''$.extensions[?(@.14 == 41)]'''
it.method() == """.field("extensions").field("14").isEqualTo(41.00)""" &&
it.jsonPath() == '''$.extensions[?(@.14 == 41.00)]'''
}
pathAndValues.find {
it.method() == """.field("extensions").field("30").isEqualTo(60)""" &&
it.jsonPath() == '''$.extensions[?(@.30 == 60)]'''
it.method() == """.field("extensions").field("30").isEqualTo(60.00)""" &&
it.jsonPath() == '''$.extensions[?(@.30 == 60.00)]'''
}
and:
assertThatJsonPathsInMapAreValid(json, pathAndValues)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.codearte.accurest.plugin

import io.codearte.accurest.config.AccurestConfigProperties
import io.codearte.accurest.plugin.config.AccurestClientStubsTaskConfigProperties
import io.codearte.accurest.plugin.config.AccurestGenericGradleConfigProperties
import io.codearte.accurest.plugin.config.AccurestServerTestsTaskConfigProperties
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
Expand All @@ -20,7 +22,7 @@ class AccurestGradlePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
this.project = project
AccurestConfigProperties extension = project.extensions.create('accurest', AccurestConfigProperties)
AccurestGenericGradleConfigProperties extension = project.extensions.create('accurest', AccurestGenericGradleConfigProperties)

project.check.dependsOn(GENERATE_SERVER_TESTS_TASK_NAME)

Expand All @@ -45,7 +47,7 @@ class AccurestGradlePlugin implements Plugin<Project> {
}
}

void setConfigurationDefaults(AccurestConfigProperties extension) {
void setConfigurationDefaults(AccurestGenericGradleConfigProperties extension) {
extension.with {
generatedTestSourcesDir = project.file("${project.buildDir}/generated-test-sources/accurest")
contractsDslDir = defaultAccurestContractsDir() //TODO: Use sourceset
Expand All @@ -57,25 +59,21 @@ class AccurestGradlePlugin implements Plugin<Project> {
project.file("${project.rootDir}/src/test/resources/accurest")
}

private void createGenerateTestsTask(AccurestConfigProperties extension) {
private void createGenerateTestsTask(AccurestGenericGradleConfigProperties extension) {
Task task = project.tasks.create(GENERATE_SERVER_TESTS_TASK_NAME, GenerateServerTestsTask)
task.description = "Generate server tests from GroovyDSL"
task.group = GROUP_NAME
task.conventionMapping.with {
contractsDslDir = { extension.contractsDslDir }
generatedTestSourcesDir = { extension.generatedTestSourcesDir }
configProperties = { extension }
configProperties = { AccurestServerTestsTaskConfigProperties.fromGenericConfig(extension) }
}
}

private void createAndConfigureGenerateWireMockClientStubsFromDslTask(AccurestConfigProperties extension) {
private void createAndConfigureGenerateWireMockClientStubsFromDslTask(AccurestGenericGradleConfigProperties extension) {
Task task = project.tasks.create(DSL_TO_WIREMOCK_CLIENT_TASK_NAME, GenerateWireMockClientStubsFromDslTask)
task.description = "Generate WireMock client stubs from GroovyDSL"
task.group = GROUP_NAME
task.conventionMapping.with {
contractsDslDir = { extension.contractsDslDir }
stubsOutputDir = { extension.stubsOutputDir }
configProperties = { extension }
configProperties = { AccurestClientStubsTaskConfigProperties.fromGenericConfig(extension) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,18 @@ package io.codearte.accurest.plugin

import io.codearte.accurest.AccurestException
import io.codearte.accurest.TestGenerator
import io.codearte.accurest.config.AccurestConfigProperties
import io.codearte.accurest.plugin.config.AccurestServerTestsTaskConfigProperties
import org.gradle.api.GradleException
import org.gradle.api.internal.ConventionTask
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.TaskAction

@CacheableTask
class GenerateServerTestsTask extends ConventionTask {

@InputDirectory
File contractsDslDir
@OutputDirectory
File generatedTestSourcesDir

//TODO: How to deal with @Input*, @Output* and that domain object?
AccurestConfigProperties configProperties
@Nested
AccurestServerTestsTaskConfigProperties configProperties

@TaskAction
void generate() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,24 @@
package io.codearte.accurest.plugin

import io.codearte.accurest.config.AccurestConfigProperties
import io.codearte.accurest.plugin.config.AccurestClientStubsTaskConfigProperties
import io.codearte.accurest.wiremock.DslToWireMockClientConverter
import io.codearte.accurest.wiremock.RecursiveFilesConverter
import org.gradle.api.internal.ConventionTask
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.TaskAction

//TODO: Implement as an incremental task: https://gradle.org/docs/current/userguide/custom_tasks.html#incremental_tasks ?
@CacheableTask
class GenerateWireMockClientStubsFromDslTask extends ConventionTask {

@InputDirectory
File contractsDslDir
@OutputDirectory
File stubsOutputDir

AccurestConfigProperties configProperties
@Nested
AccurestClientStubsTaskConfigProperties configProperties

@TaskAction
void generate() {
logger.info("Accurest Plugin: Invoking GroovyDSL to WireMock client stubs conversion")
logger.debug("From '${getContractsDslDir()}' to '${getStubsOutputDir()}'")
logger.debug("From '${getConfigProperties().getContractsDslDir()}' to '${getConfigProperties().getStubsOutputDir()}'")
RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(), getConfigProperties())
converter.processFiles()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.codearte.accurest.plugin.config

import groovy.transform.CompileStatic
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory

@CompileStatic
class AccurestClientStubsTaskConfigProperties extends AccurestGenericGradleConfigProperties {

@Override
@Input
List<String> getExcludedFiles() {
return super.getExcludedFiles()
}

@Override
@Input
List<String> getIgnoredFiles() {
return super.getIgnoredFiles()
}

@Override
@InputDirectory
File getContractsDslDir() {
return super.getContractsDslDir()
}

@Override
@OutputDirectory
File getStubsOutputDir() {
return super.getStubsOutputDir()
}

static AccurestClientStubsTaskConfigProperties fromGenericConfig(AccurestGenericGradleConfigProperties configToCloneFrom) {
return new AccurestClientStubsTaskConfigProperties().with {
it.clonePropertiesFrom(configToCloneFrom)
return it
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package io.codearte.accurest.plugin.config

import groovy.transform.CompileStatic
import io.codearte.accurest.config.AccurestConfigProperties

@CompileStatic
class AccurestGenericGradleConfigProperties extends AccurestConfigProperties {

protected void clonePropertiesFrom(AccurestGenericGradleConfigProperties configToCloneFrom) {
//shallow copy which is enough to make workaround for overlapping outputs in tasks
targetFramework = configToCloneFrom.targetFramework
testMode = configToCloneFrom.testMode
basePackageForTests = configToCloneFrom.basePackageForTests
baseClassForTests = configToCloneFrom.baseClassForTests
nameSuffixForTests = configToCloneFrom.nameSuffixForTests
ruleClassForTests = configToCloneFrom.ruleClassForTests
jsonAssertVersion = configToCloneFrom.jsonAssertVersion
excludedFiles = configToCloneFrom.excludedFiles
ignoredFiles = configToCloneFrom.ignoredFiles
imports = configToCloneFrom.imports
staticImports = configToCloneFrom.staticImports
contractsDslDir = configToCloneFrom.contractsDslDir
generatedTestSourcesDir = configToCloneFrom.generatedTestSourcesDir
stubsOutputDir = configToCloneFrom.stubsOutputDir
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package io.codearte.accurest.plugin.config

import groovy.transform.CompileStatic
import io.codearte.accurest.config.TestFramework
import io.codearte.accurest.config.TestMode
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory

@CompileStatic
class AccurestServerTestsTaskConfigProperties extends AccurestGenericGradleConfigProperties {

@Override
@Input
TestFramework getTargetFramework() {
return super.getTargetFramework()
}

@Override
@Input
TestMode getTestMode() {
return super.getTestMode()
}

@Override
@Input
String getBasePackageForTests() {
return super.getBasePackageForTests()
}

@Override
@Input
@Optional
String getBaseClassForTests() {
return super.getBaseClassForTests()
}

@Override
@Input
@Optional
String getNameSuffixForTests() {
return super.getNameSuffixForTests()
}

@Override
@Input
@Optional
String getRuleClassForTests() {
return super.getRuleClassForTests()
}

@Override
@Input
String getJsonAssertVersion() {
return super.getJsonAssertVersion()
}

@Override
@Input
List<String> getExcludedFiles() {
return super.getExcludedFiles()
}

@Override
@Input
List<String> getIgnoredFiles() {
return super.getIgnoredFiles()
}

@Override
@Input
String[] getImports() {
return super.getImports()
}

@Override
@Input
String[] getStaticImports() {
return super.getStaticImports()
}

@Override
@InputDirectory
File getContractsDslDir() {
return super.getContractsDslDir()
}

@Override
@OutputDirectory
File getGeneratedTestSourcesDir() {
return super.getGeneratedTestSourcesDir()
}

static AccurestServerTestsTaskConfigProperties fromGenericConfig(AccurestGenericGradleConfigProperties configToCloneFrom) {
return new AccurestServerTestsTaskConfigProperties().with {
it.clonePropertiesFrom(configToCloneFrom)
return it
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ abstract class AccurestIntegrationSpec extends Specification {
protected void runTasksSuccessfully(String... tasks) {
BuildResult result = run(tasks)
result.tasks.each {
assert it.outcome == TaskOutcome.SUCCESS || it.outcome == TaskOutcome.UP_TO_DATE
assert it.outcome == TaskOutcome.SUCCESS || it.outcome == TaskOutcome.UP_TO_DATE || it.outcome == TaskOutcome.NO_SOURCE
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class BasicFunctionalSpec extends AccurestIntegrationSpec {
private static final String GENERATED_TEST = "build//generated-test-sources//accurest//accurest//com//ofg//twitter_places_analyzer//PairIdSpec.groovy"
private static final String GENERATED_CLIENT_JSON_STUB = "build//production//bootSimple-stubs//repository//mappings//com//ofg//twitter-places-analyzer//pairId//collerate_PlacesFrom_Tweet.json"
private static final String GROOVY_DSL_CONTRACT = "repository//mappings//com//ofg//twitter-places-analyzer//pairId//collerate_PlacesFrom_Tweet.groovy"
private static final String TEST_EXECUTION_XML_REPORT = "build/test-results/TEST-accurest.com.ofg.twitter_places_analyzer.PairIdSpec.xml"
private static final String TEST_EXECUTION_XML_REPORT = "build/test-results/test/TEST-accurest.com.ofg.twitter_places_analyzer.PairIdSpec.xml"

def setup() {
setupForProject("functionalTest/bootSimple")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ repositories {
dependencies {
compile "org.springframework:spring-web:$springVersion"
compile "org.springframework:spring-context-support:$springVersion"
compile "org.codehaus.groovy:groovy-all:2.4.5"
compile "org.codehaus.groovy:groovy-all:2.4.10"
compile 'com.jayway.jsonpath:json-path-assert:2.2.0'

testCompile "com.github.tomakehurst:wiremock:2.0.10-beta"
testCompile "org.spockframework:spock-spring:1.0-groovy-2.4"
testCompile "org.spockframework:spock-spring:1.1-groovy-2.4"
testCompile "com.jayway.restassured:rest-assured:$restAssuredVersion"
testCompile "com.jayway.restassured:spring-mock-mvc:$restAssuredVersion"
testCompile "ch.qos.logback:logback-classic:1.1.2"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
groupId=com.ofg
jacksonMapper=1.9.13
restAssuredVersion=2.4.0
springVersion=4.1.7.RELEASE
springVersion=4.3.9.RELEASE

springBootVersion=1.3.3.RELEASE
springBootVersion=1.4.7.RELEASE
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ repositories {
}

dependencies {
compile "org.codehaus.groovy:groovy-all:2.4.5"
compile "org.codehaus.groovy:groovy-all:2.4.10"
compile "org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
compile "org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}"
compile "org.springframework.boot:spring-boot-starter-integration:${springBootVersion}"
Expand Down
Loading