From 03d8554adba1ebb45b1dd859dea7ddb2155e2e54 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 19 Jul 2016 07:21:00 +0100 Subject: [PATCH] Add back the ContractVerifierMessage in an internal package It's easier to write generated tests with this abstraction, but it doesn't have to be visible to users. --- .../CamelMessagingApplicationSpec.groovy | 10 +- ...IntegrationMessagingApplicationSpec.groovy | 10 +- .../com/example/SpringApplicationSpec.groovy | 10 +- .../StreamMessagingApplicationSpec.groovy | 10 +- .../camel/StubRunnerCamelPredicate.java | 2 +- .../StubRunnerIntegrationMessageSelector.java | 2 +- .../IntegrationStubRunnerSpec.groovy | 14 +- .../StubRunnerStreamMessageSelector.java | 2 +- .../stream/StreamStubRunnerSpec.groovy | 136 +++++++++--------- .../stubrunner/BatchStubRunnerFactory.java | 8 +- .../cloud/contract/stubrunner/StubRunner.java | 4 +- .../stubrunner/StubRunnerExecutor.java | 6 +- .../stubrunner/StubRunnerFactory.java | 6 +- .../StubRunnerBackupAutoConfiguration.java | 14 +- .../spring/StubRunnerConfiguration.java | 4 +- .../main/resources/META-INF/spring.factories | 3 - .../stubrunner/StubRunnerExecutorSpec.groovy | 39 ++--- ...nerSpringCloudAutoConfigurationSpec.groovy | 6 +- .../JUnitMessagingMethodBodyBuilder.groovy | 2 +- .../builder/SingleTestGenerator.groovy | 8 +- .../SpockMessagingMethodBodyBuilder.groovy | 4 +- .../MessagingMethodBodyBuilderSpec.groovy | 20 +-- .../ContractVerifierCamelConfiguration.java | 34 ++++- .../camel/ContractVerifierCamelMessaging.java | 10 +- ...tractVerifierIntegrationConfiguration.java | 29 +++- .../ContractVerifierIntegrationMessaging.java | 10 +- ...a => ContractVerifierMessageExchange.java} | 6 +- .../internal/ContractVerifierMessage.java | 65 +++++++++ .../internal/ContractVerifierMessaging.java | 51 +++++++ .../ContractVerifierObjectMapper.java | 2 +- ...NoOpContractVerifierAutoConfiguration.java | 56 ++++++++ .../noop/NoOpContractVerifierMessaging.java | 8 +- .../ContractVerifierMessagingUtil.java | 2 +- .../main/resources/META-INF/spring.factories | 3 + ...ntractVerifierStreamAutoConfiguration.java | 31 +++- .../ContractVerifierStreamMessaging.java | 10 +- 36 files changed, 446 insertions(+), 191 deletions(-) rename spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/{ContractVerifierMessaging.java => ContractVerifierMessageExchange.java} (90%) create mode 100644 spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessage.java create mode 100644 spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessaging.java rename spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/{ => internal}/ContractVerifierObjectMapper.java (95%) create mode 100644 spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierAutoConfiguration.java rename spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/{ => util}/ContractVerifierMessagingUtil.java (97%) create mode 100644 spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/resources/META-INF/spring.factories diff --git a/samples/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy b/samples/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy index 13aa03b49d..b85edc8aa8 100644 --- a/samples/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy +++ b/samples/samples-messaging-camel/src/test/groovy/com/example/CamelMessagingApplicationSpec.groovy @@ -24,9 +24,9 @@ import org.junit.BeforeClass import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.cloud.contract.spec.Contract -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration @@ -46,7 +46,7 @@ import com.toomuchcoding.jsonassert.JsonAssertion public class CamelMessagingApplicationSpec extends Specification { // ALL CASES - @Inject ContractVerifierMessaging contractVerifierMessaging + @Inject ContractVerifierMessageExchange contractVerifierMessaging ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper() @BeforeClass @@ -73,7 +73,7 @@ public class CamelMessagingApplicationSpec extends Specification { when: bookReturnedTriggered() then: - def response = contractVerifierMessaging.receiveMessage('activemq:output') + def response = contractVerifierMessaging.receive('activemq:output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.body)) @@ -112,7 +112,7 @@ public class CamelMessagingApplicationSpec extends Specification { contractVerifierObjectMapper.writeValueAsString([bookName: 'foo']), [sample: 'header'], 'jms:input') then: - def response = contractVerifierMessaging.receiveMessage('jms:output') + def response = contractVerifierMessaging.receive('jms:output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.body)) diff --git a/samples/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy b/samples/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy index b03513291e..e43f9c71d9 100644 --- a/samples/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy +++ b/samples/samples-messaging-integration/src/test/groovy/com/example/IntegrationMessagingApplicationSpec.groovy @@ -21,9 +21,9 @@ import javax.inject.Inject import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.cloud.contract.spec.Contract -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.messaging.Message import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration @@ -40,7 +40,7 @@ import com.toomuchcoding.jsonassert.JsonAssertion public class IntegrationMessagingApplicationSpec extends Specification { // ALL CASES - @Inject ContractVerifierMessaging> contractVerifierMessaging + @Inject ContractVerifierMessageExchange> contractVerifierMessaging ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper() def "should work for triggered based messaging"() { @@ -73,7 +73,7 @@ public class IntegrationMessagingApplicationSpec extends Specification { when: bookReturnedTriggered() then: - def response = contractVerifierMessaging.receiveMessage('output') + def response = contractVerifierMessaging.receive('output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) @@ -118,7 +118,7 @@ public class IntegrationMessagingApplicationSpec extends Specification { contractVerifierObjectMapper.writeValueAsString([bookName: 'foo']), [sample: 'header'], 'input') then: - def response = contractVerifierMessaging.receiveMessage('output') + def response = contractVerifierMessaging.receive('output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) diff --git a/samples/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy b/samples/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy index ed13cef08d..b8e36045f7 100644 --- a/samples/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy +++ b/samples/samples-messaging-spring/src/test/groovy/com/example/SpringApplicationSpec.groovy @@ -22,9 +22,9 @@ import org.junit.BeforeClass import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.cloud.contract.spec.Contract -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.messaging.Message; import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration @@ -45,7 +45,7 @@ import com.toomuchcoding.jsonassert.JsonAssertion public class SpringApplicationSpec extends Specification { // ALL CASES - @Inject ContractVerifierMessaging> contractVerifierMessaging + @Inject ContractVerifierMessageExchange> contractVerifierMessaging ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper() @BeforeClass @@ -72,7 +72,7 @@ public class SpringApplicationSpec extends Specification { when: bookReturnedTriggered() then: - def response = contractVerifierMessaging.receiveMessage('output') + def response = contractVerifierMessaging.receive('output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) @@ -113,7 +113,7 @@ public class SpringApplicationSpec extends Specification { when: contractVerifierMessaging.send(inputMessage, 'input') then: - def response = contractVerifierMessaging.receiveMessage('output') + def response = contractVerifierMessaging.receive('output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) diff --git a/samples/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy b/samples/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy index e50f4a07e2..774d208187 100644 --- a/samples/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy +++ b/samples/samples-messaging-stream/src/test/groovy/com/example/StreamMessagingApplicationSpec.groovy @@ -22,9 +22,9 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.IntegrationTest import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.cloud.contract.spec.Contract -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.messaging.Message; import org.springframework.test.annotation.DirtiesContext import org.springframework.test.context.ContextConfiguration @@ -45,7 +45,7 @@ import com.toomuchcoding.jsonassert.JsonAssertion public class StreamMessagingApplicationSpec extends Specification { // ALL CASES - @Inject ContractVerifierMessaging> contractVerifierMessaging + @Inject ContractVerifierMessageExchange> contractVerifierMessaging ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper() def "should work for triggered based messaging"() { @@ -67,7 +67,7 @@ public class StreamMessagingApplicationSpec extends Specification { when: bookReturnedTriggered() then: - def response = contractVerifierMessaging.receiveMessage('output') + def response = contractVerifierMessaging.receive('output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) @@ -105,7 +105,7 @@ public class StreamMessagingApplicationSpec extends Specification { contractVerifierObjectMapper.writeValueAsString([bookName: 'foo']), [sample: 'header'], 'input') then: - def response = contractVerifierMessaging.receiveMessage('output') + def response = contractVerifierMessaging.receive('output') response.headers.get('BOOK-NAME') == 'foo' and: DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-camel/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelPredicate.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-camel/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelPredicate.java index 51721cbbf5..7540e4c355 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-camel/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelPredicate.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-camel/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelPredicate.java @@ -23,7 +23,7 @@ import org.apache.camel.Exchange; import org.apache.camel.Predicate; import org.springframework.cloud.contract.spec.Contract; import org.springframework.cloud.contract.spec.internal.Header; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.cloud.contract.verifier.util.JsonPaths; import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter; import org.springframework.cloud.contract.verifier.util.MethodBufferingJsonVerifiable; diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.java index c04b845964..9a0aba3aa7 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.java @@ -21,7 +21,7 @@ import java.util.regex.Pattern; import org.springframework.cloud.contract.spec.Contract; import org.springframework.cloud.contract.spec.internal.Header; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.cloud.contract.verifier.util.JsonPaths; import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter; import org.springframework.cloud.contract.verifier.util.MethodBufferingJsonVerifiable; diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy index 309357da8b..1a6e734424 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy @@ -52,7 +52,7 @@ class IntegrationStubRunnerSpec extends Specification { def setup() { // ensure that message were taken from the queue - messaging.receiveMessage('outputTest', 100, TimeUnit.MILLISECONDS) + messaging.receive('outputTest', 100, TimeUnit.MILLISECONDS) } def 'should download the stub and register a route for it'() { @@ -62,7 +62,7 @@ class IntegrationStubRunnerSpec extends Specification { // end::client_send[] then: // tag::client_receive[] - Message receivedMessage = messaging.receiveMessage('outputTest') + Message receivedMessage = messaging.receive('outputTest') // end::client_receive[] and: // tag::client_receive_message[] @@ -79,7 +79,7 @@ class IntegrationStubRunnerSpec extends Specification { // end::client_trigger[] then: // tag::client_trigger_receive[] - Message receivedMessage = messaging.receiveMessage('outputTest') + Message receivedMessage = messaging.receive('outputTest') // end::client_trigger_receive[] and: // tag::client_trigger_message[] @@ -95,7 +95,7 @@ class IntegrationStubRunnerSpec extends Specification { stubFinder.trigger('org.springframework.cloud.contract.verifier.stubs:integrationService', 'return_book_1') // end::trigger_group_artifact[] then: - Message receivedMessage = messaging.receiveMessage('outputTest') + Message receivedMessage = messaging.receive('outputTest') and: receivedMessage != null assertJsons(receivedMessage.payload) @@ -108,7 +108,7 @@ class IntegrationStubRunnerSpec extends Specification { stubFinder.trigger('integrationService', 'return_book_1') // end::trigger_artifact[] then: - Message receivedMessage = messaging.receiveMessage('outputTest') + Message receivedMessage = messaging.receive('outputTest') and: receivedMessage != null assertJsons(receivedMessage.payload) @@ -135,7 +135,7 @@ class IntegrationStubRunnerSpec extends Specification { stubFinder.trigger() // end::trigger_all[] then: - Message receivedMessage = messaging.receiveMessage('outputTest') + Message receivedMessage = messaging.receive('outputTest') and: receivedMessage != null assertJsons(receivedMessage.payload) @@ -155,7 +155,7 @@ class IntegrationStubRunnerSpec extends Specification { when: messaging.send(new BookReturned('not_matching'), [wrong: 'header_value'], 'input') then: - Message receivedMessage = messaging.receiveMessage('outputTest', 100, TimeUnit.MILLISECONDS) + Message receivedMessage = messaging.receive('outputTest', 100, TimeUnit.MILLISECONDS) and: receivedMessage == null } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.java index 1cc1321b24..93365b3f1e 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/main/java/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.java @@ -21,7 +21,7 @@ import java.util.regex.Pattern; import org.springframework.cloud.contract.spec.Contract; import org.springframework.cloud.contract.spec.internal.Header; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper; import org.springframework.cloud.contract.verifier.util.JsonPaths; import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter; import org.springframework.cloud.contract.verifier.util.MethodBufferingJsonVerifiable; diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy index 358695e317..af4151b750 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy @@ -23,11 +23,13 @@ import java.util.concurrent.TimeUnit import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.EnableAutoConfiguration +import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.context.SpringBootContextLoader import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.stubrunner.StubFinder import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange +import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging; import org.springframework.cloud.stream.annotation.EnableBinding import org.springframework.cloud.stream.messaging.Sink import org.springframework.cloud.stream.messaging.Source @@ -41,125 +43,123 @@ import spock.lang.Specification /** * @author Marcin Grzejszczak */ -@Configuration -@ComponentScan -@EnableAutoConfiguration -@ContextConfiguration(classes = StreamStubRunnerSpec, loader = SpringBootContextLoader) -@EnableBinding([Sink, Source]) +@ContextConfiguration(classes = Config, loader = SpringBootContextLoader) +@IntegrationTest("debug=true") @AutoConfigureStubRunner +@AutoConfigureContractVerifierMessaging class StreamStubRunnerSpec extends Specification { @Autowired StubFinder stubFinder - @Autowired ContractVerifierMessaging> messaging + @Autowired ContractVerifierMessageExchange> messaging def setup() { // ensure that message were taken from the queue - messaging.receiveMessage('returnBook', 100, TimeUnit.MILLISECONDS) + messaging.receive('returnBook', 100, TimeUnit.MILLISECONDS) } def 'should download the stub and register a route for it'() { when: // tag::client_send[] - messaging.send(new BookReturned('foo'), [sample: 'header'], 'bookStorage') + messaging.send(new BookReturned('foo'), [sample: 'header'], 'bookStorage') // end::client_send[] then: // tag::client_receive[] - Message receivedMessage = messaging.receiveMessage('returnBook') + Message receivedMessage = messaging.receive('returnBook') // end::client_receive[] and: // tag::client_receive_message[] - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' // end::client_receive_message[] } def 'should trigger a message by label'() { when: // tag::client_trigger[] - stubFinder.trigger('return_book_1') + stubFinder.trigger('return_book_1') // end::client_trigger[] then: // tag::client_trigger_receive[] - Message receivedMessage = messaging.receiveMessage('returnBook') + Message receivedMessage = messaging.receive('returnBook') // end::client_trigger_receive[] and: // tag::client_trigger_message[] - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' // end::client_trigger_message[] } def 'should trigger a label for the existing groupId:artifactId'() { when: // tag::trigger_group_artifact[] - stubFinder.trigger('org.springframework.cloud.contract.verifier.stubs:streamService', 'return_book_1') + stubFinder.trigger('org.springframework.cloud.contract.verifier.stubs:streamService', 'return_book_1') // end::trigger_group_artifact[] then: - Message receivedMessage = messaging.receiveMessage('returnBook') + Message receivedMessage = messaging.receive('returnBook') and: - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' } def 'should trigger a label for the existing artifactId'() { when: // tag::trigger_artifact[] - stubFinder.trigger('streamService', 'return_book_1') + stubFinder.trigger('streamService', 'return_book_1') // end::trigger_artifact[] then: - Message receivedMessage = messaging.receiveMessage('returnBook') + Message receivedMessage = messaging.receive('returnBook') and: - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' } def 'should throw exception when missing label is passed'() { when: - stubFinder.trigger('missing label') + stubFinder.trigger('missing label') then: - thrown(IllegalArgumentException) + thrown(IllegalArgumentException) } def 'should throw exception when missing label and artifactid is passed'() { when: - stubFinder.trigger('some:service', 'return_book_1') + stubFinder.trigger('some:service', 'return_book_1') then: - thrown(IllegalArgumentException) + thrown(IllegalArgumentException) } def 'should trigger messages by running all triggers'() { when: // tag::trigger_all[] - stubFinder.trigger() + stubFinder.trigger() // end::trigger_all[] then: - Message receivedMessage = messaging.receiveMessage('returnBook') + Message receivedMessage = messaging.receive('returnBook') and: - receivedMessage != null - assertJsons(receivedMessage.payload) - receivedMessage.headers.get('BOOK-NAME') == 'foo' + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' } def 'should trigger a label with no output message'() { when: // tag::trigger_no_output[] - messaging.send(new BookReturned('foo'), [sample: 'header'], 'delete') + messaging.send(new BookReturned('foo'), [sample: 'header'], 'delete') // end::trigger_no_output[] then: - noExceptionThrown() + noExceptionThrown() } def 'should not trigger a message that does not match input'() { when: - messaging.send(new BookReturned('not_matching'), [wrong: 'header_value'], 'bookStorage') + messaging.send(new BookReturned('not_matching'), [wrong: 'header_value'], 'bookStorage') then: - Message receivedMessage = messaging.receiveMessage('returnBook', 100, TimeUnit.MILLISECONDS) + Message receivedMessage = messaging.receive('returnBook', 100, TimeUnit.MILLISECONDS) and: - receivedMessage == null + receivedMessage == null } private boolean assertJsons(Object payload) { @@ -173,15 +173,11 @@ class StreamStubRunnerSpec extends Specification { // tag::sample_dsl[] Contract.make { label 'return_book_1' - input { - triggeredBy('bookReturnedTriggered()') - } + input { triggeredBy('bookReturnedTriggered()') } outputMessage { sentTo('returnBook') body('''{ "bookName" : "foo" }''') - headers { - header('BOOK-NAME', 'foo') - } + headers { header('BOOK-NAME', 'foo') } } } // end::sample_dsl[] @@ -193,39 +189,39 @@ class StreamStubRunnerSpec extends Specification { input { messageFrom('bookStorage') messageBody([ - bookName: 'foo' + bookName: 'foo' ]) - messageHeaders { - header('sample', 'header') - } + messageHeaders { header('sample', 'header') } } outputMessage { sentTo('returnBook') body([ - bookName: 'foo' + bookName: 'foo' ]) - headers { - header('BOOK-NAME', 'foo') - } + headers { header('BOOK-NAME', 'foo') } } } // end::sample_dsl_2[] Contract dsl3 = - // tag::sample_dsl_3[] - Contract.make { - label 'delete_book' - input { - messageFrom('delete') - messageBody([ - bookName: 'foo' - ]) - messageHeaders { - header('sample', 'header') - } - assertThat('bookWasDeleted()') - } - } + // tag::sample_dsl_3[] + Contract.make { + label 'delete_book' + input { + messageFrom('delete') + messageBody([ + bookName: 'foo' + ]) + messageHeaders { header('sample', 'header') } + assertThat('bookWasDeleted()') + } + } // end::sample_dsl_3[] + + @EnableBinding([Sink, Source]) + @Configuration + @EnableAutoConfiguration + protected static class Config {} + } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/BatchStubRunnerFactory.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/BatchStubRunnerFactory.java index a984157ceb..e2fc2c4a2f 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/BatchStubRunnerFactory.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/BatchStubRunnerFactory.java @@ -16,7 +16,7 @@ package org.springframework.cloud.contract.stubrunner; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessaging; /** @@ -29,13 +29,13 @@ public class BatchStubRunnerFactory { private final StubRunnerOptions stubRunnerOptions; private final StubDownloader stubDownloader; - private final ContractVerifierMessaging contractVerifierMessaging; + private final ContractVerifierMessageExchange contractVerifierMessaging; public BatchStubRunnerFactory(StubRunnerOptions stubRunnerOptions) { this(stubRunnerOptions, new AetherStubDownloader(stubRunnerOptions), new NoOpContractVerifierMessaging()); } - public BatchStubRunnerFactory(StubRunnerOptions stubRunnerOptions, ContractVerifierMessaging contractVerifierMessaging) { + public BatchStubRunnerFactory(StubRunnerOptions stubRunnerOptions, ContractVerifierMessageExchange contractVerifierMessaging) { this(stubRunnerOptions, new AetherStubDownloader(stubRunnerOptions), contractVerifierMessaging); } @@ -43,7 +43,7 @@ public class BatchStubRunnerFactory { this(stubRunnerOptions, stubDownloader, new NoOpContractVerifierMessaging()); } - public BatchStubRunnerFactory(StubRunnerOptions stubRunnerOptions, StubDownloader stubDownloader, ContractVerifierMessaging contractVerifierMessaging) { + public BatchStubRunnerFactory(StubRunnerOptions stubRunnerOptions, StubDownloader stubDownloader, ContractVerifierMessageExchange contractVerifierMessaging) { this.stubRunnerOptions = stubRunnerOptions; this.stubDownloader = stubDownloader; this.contractVerifierMessaging = contractVerifierMessaging; diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunner.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunner.java index 283ee60b9c..429f286196 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunner.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunner.java @@ -23,7 +23,7 @@ import java.util.Collection; import java.util.Map; import org.springframework.cloud.contract.spec.Contract; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessaging; /** @@ -52,7 +52,7 @@ public class StubRunner implements StubRunning { public StubRunner(StubRunnerOptions stubRunnerOptions, String repositoryPath, StubConfiguration stubsConfiguration, - ContractVerifierMessaging contractVerifierMessaging) { + ContractVerifierMessageExchange contractVerifierMessaging) { this.stubsConfiguration = stubsConfiguration; this.stubRunnerOptions = stubRunnerOptions; this.stubRepository = new StubRepository(new File(repositoryPath)); diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java index 920003c5aa..b772ba099e 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerExecutor.java @@ -32,7 +32,7 @@ import org.springframework.cloud.contract.spec.internal.DslProperty; import org.springframework.cloud.contract.spec.internal.Headers; import org.springframework.cloud.contract.spec.internal.OutputMessage; import org.springframework.cloud.contract.stubrunner.AvailablePortScanner.PortCallback; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessaging; import org.springframework.cloud.contract.verifier.util.BodyExtractor; @@ -45,11 +45,11 @@ public class StubRunnerExecutor implements StubFinder { private static final Logger log = LoggerFactory.getLogger(StubRunnerExecutor.class); private final AvailablePortScanner portScanner; - private final ContractVerifierMessaging contractVerifierMessaging; + private final ContractVerifierMessageExchange contractVerifierMessaging; private StubServer stubServer; public StubRunnerExecutor(AvailablePortScanner portScanner, - ContractVerifierMessaging contractVerifierMessaging) { + ContractVerifierMessageExchange contractVerifierMessaging) { this.portScanner = portScanner; this.contractVerifierMessaging = contractVerifierMessaging; } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerFactory.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerFactory.java index f7f427b0d4..253bf825e8 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerFactory.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/StubRunnerFactory.java @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Map; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; /** * Factory of StubRunners. Basing on the options and passed collaborators downloads the @@ -31,11 +31,11 @@ public class StubRunnerFactory { private final StubRunnerOptions stubRunnerOptions; private final StubDownloader stubDownloader; - private final ContractVerifierMessaging contractVerifierMessaging; + private final ContractVerifierMessageExchange contractVerifierMessaging; public StubRunnerFactory(StubRunnerOptions stubRunnerOptions, StubDownloader stubDownloader, - ContractVerifierMessaging contractVerifierMessaging) { + ContractVerifierMessageExchange contractVerifierMessaging) { this.stubRunnerOptions = stubRunnerOptions; this.stubDownloader = stubDownloader; this.contractVerifierMessaging = contractVerifierMessaging; diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBackupAutoConfiguration.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBackupAutoConfiguration.java index e7194c9d76..a3cfbbf0c0 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBackupAutoConfiguration.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/server/StubRunnerBackupAutoConfiguration.java @@ -18,7 +18,8 @@ package org.springframework.cloud.contract.stubrunner.server; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessageBuilder; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessaging; import org.springframework.context.annotation.Bean; @@ -32,13 +33,20 @@ public class StubRunnerBackupAutoConfiguration { @Bean @ConditionalOnMissingBean - public ContractVerifierMessaging noOpContractVerifierMessaging() { + public ContractVerifierMessageExchange contractVerifierMessageExchange() { return new NoOpContractVerifierMessaging(); } @Bean @ConditionalOnMissingBean - public ContractVerifierMessageBuilder noOpContractVerifierMessageBuilder() { + public ContractVerifierMessageBuilder contractVerifierMessageBuilder() { return new NoOpContractVerifierMessageBuilder(); } + + @Bean + public ContractVerifierMessaging contractVerifierMessaging( + ContractVerifierMessageExchange exchange) { + return new ContractVerifierMessaging(exchange); + } + } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java index 803afc0e01..51fdbe00a1 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/spring/StubRunnerConfiguration.java @@ -28,7 +28,7 @@ import org.springframework.cloud.contract.stubrunner.StubDownloader; import org.springframework.cloud.contract.stubrunner.StubRunner; import org.springframework.cloud.contract.stubrunner.StubRunnerOptions; import org.springframework.cloud.contract.stubrunner.StubRunnerOptionsBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessaging; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -44,7 +44,7 @@ import org.springframework.core.io.Resource; public class StubRunnerConfiguration { @Autowired(required = false) - private ContractVerifierMessaging contractVerifierMessaging; + private ContractVerifierMessageExchange contractVerifierMessaging; @Autowired(required = false) private StubDownloader stubDownloader; @Autowired diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories index 58f417a908..acec82308a 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/main/resources/META-INF/spring.factories @@ -3,6 +3,3 @@ org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner=\ org.springframework.cloud.contract.stubrunner.spring.StubRunnerConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.StubRunnerSpringCloudAutoConfiguration,\ org.springframework.cloud.contract.stubrunner.spring.cloud.ribbon.StubRunnerRibbonAutoConfiguration - -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.contract.stubrunner.server.StubRunnerBackupAutoConfiguration diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerExecutorSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerExecutorSpec.groovy index acc3f2ccd7..3b50085f4b 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerExecutorSpec.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/StubRunnerExecutorSpec.groovy @@ -18,10 +18,13 @@ package org.springframework.cloud.contract.stubrunner import groovy.json.JsonOutput -import java.util.concurrent.TimeUnit +import java.util.Map; +import java.util.concurrent.TimeUnit; import org.springframework.cloud.contract.stubrunner.util.StubsParser -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging import spock.lang.Specification @@ -99,29 +102,29 @@ class StubRunnerExecutorSpec extends Specification { } } - private class AssertingContractVerifierMessaging implements ContractVerifierMessaging { - + private class AssertingContractVerifierMessaging implements ContractVerifierMessageExchange { + @Override - void send(Object message, String destination) { - + public void send(Object message, String destination) { + throw new UnsupportedOperationException() } @Override - Object receiveMessage(String destination, long timeout, TimeUnit timeUnit) { - return null - } - - @Override - Object receiveMessage(String destination) { - return null - } - - @Override - void send(Object o, Map headers, String destination) { - assert !(JsonOutput.toJson(o).contains("serverValue")) + public void send(T payload, Map headers, String destination) { + assert !(JsonOutput.toJson(payload).contains("serverValue")) assert headers.entrySet().every { !(it.value.toString().contains("serverValue")) } } + @Override + public Object receive(String destination, long timeout, TimeUnit timeUnit) { + throw new UnsupportedOperationException() + } + + @Override + public Object receive(String destination) { + throw new UnsupportedOperationException() + } + } } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy index cf79eeed51..99667475c3 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner/src/test/groovy/org/springframework/cloud/contract/stubrunner/spring/cloud/StubRunnerSpringCloudAutoConfigurationSpec.groovy @@ -16,11 +16,9 @@ package org.springframework.cloud.contract.stubrunner.spring.cloud -import groovy.util.logging.Slf4j - import org.apache.curator.test.TestingServer -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.AfterClass +import org.junit.BeforeClass import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.EnableAutoConfiguration import org.springframework.boot.test.IntegrationTest diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy index 25063a8d7f..dae3f3479a 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy @@ -93,7 +93,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { @Override protected void validateResponseHeadersBlock(BlockBuilder bb) { - bb.addLine("""ContractVerifierMessage response = contractVerifierMessaging.receiveMessage("${outputMessage.sentTo.serverValue}");""") + bb.addLine("""ContractVerifierMessage response = contractVerifierMessaging.receive("${outputMessage.sentTo.serverValue}");""") bb.addLine("""assertThat(response).isNotNull();""") outputMessage.headers?.executeForEachHeader { Header header ->\ processHeaderElement(bb, header.name, header.serverValue) diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.groovy index dcfa2d4757..ef360cb6a4 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGenerator.groovy @@ -156,11 +156,11 @@ class SingleTestGenerator { 'ContractVerifierObjectMapper contractVerifierObjectMapper = new ContractVerifierObjectMapper()' ]) clazz.addImport([ 'javax.inject.Inject', - 'org.springframework.cloud.contract.verifier.messaging.ContractVerifierObjectMapper', - 'org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessage', - 'org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging', + 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierObjectMapper', + 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage', + 'org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging', ]) - clazz.addStaticImport('org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessagingUtil.headers') + clazz.addStaticImport('org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil.headers') } private static boolean jsonAssertPresent() { diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy index 639d28bbd6..071cbbe54e 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy @@ -79,7 +79,7 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { @Override protected void validateResponseCodeBlock(BlockBuilder bb) { if (outputMessage) { - bb.addLine("""def response = contractVerifierMessaging.receiveMessage('${outputMessage.sentTo.serverValue}')""") + bb.addLine("""ContractVerifierMessage response = contractVerifierMessaging.receive('${outputMessage.sentTo.serverValue}')""") bb.addLine("""assert response != null""") } else { bb.addLine('noExceptionThrown()') @@ -130,7 +130,7 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { @Override protected String getInputString() { - String request = 'def inputMessage = contractVerifierMessaging.create(' + String request = 'ContractVerifierMessage inputMessage = contractVerifierMessaging.create(' if (inputMessage.messageBody) { request = "${request}'''${bodyAsString}'''\n " } diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy index 2257459583..4346f36bd8 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MessagingMethodBodyBuilderSpec.groovy @@ -57,7 +57,7 @@ def contractDsl = Contract.make { bookReturnedTriggered() then: - def response = contractVerifierMessaging.receiveMessage('activemq:output') + ContractVerifierMessage response = contractVerifierMessaging.receive('activemq:output') assert response != null response.getHeader('BOOK-NAME') == 'foo' and: @@ -97,7 +97,7 @@ def contractDsl = Contract.make { bookReturnedTriggered(); // then: - ContractVerifierMessage response = contractVerifierMessaging.receiveMessage("activemq:output"); + ContractVerifierMessage response = contractVerifierMessaging.receive("activemq:output"); assertThat(response).isNotNull(); assertThat(response.getHeader("BOOK-NAME")).isEqualTo("foo"); // and: @@ -143,7 +143,7 @@ def contractDsl = Contract.make { // tag::trigger_message_spock[] """\ given: - def inputMessage = contractVerifierMessaging.create( + ContractVerifierMessage inputMessage = contractVerifierMessaging.create( '''{"bookName":"foo"}''', ['sample': 'header'] ) @@ -152,7 +152,7 @@ when: contractVerifierMessaging.send(inputMessage, 'jms:input') then: - def response = contractVerifierMessaging.receiveMessage('jms:output') + ContractVerifierMessage response = contractVerifierMessaging.receive('jms:output') assert response !- null response.getHeader('BOOK-NAME') == 'foo' and: @@ -205,7 +205,7 @@ and: contractVerifierMessaging.send(inputMessage, "jms:input"); // then: - ContractVerifierMessage response = contractVerifierMessaging.receiveMessage("jms:output"); + ContractVerifierMessage response = contractVerifierMessaging.receive("jms:output"); assertThat(response).isNotNull(); assertThat(response.getHeader("BOOK-NAME")).isEqualTo("foo"); // and: @@ -243,7 +243,7 @@ def contractDsl = Contract.make { // tag::trigger_no_output_spock[] ''' given: - def inputMessage = contractVerifierMessaging.create( + ContractVerifierMessage inputMessage = contractVerifierMessaging.create( \'\'\'{"bookName":"foo"}\'\'\', ['sample': 'header'] ) @@ -337,7 +337,7 @@ then: contractVerifierMessaging.send(inputMessage, "jms:input"); // then: - ContractVerifierMessage response = contractVerifierMessaging.receiveMessage("jms:output"); + ContractVerifierMessage response = contractVerifierMessaging.receive("jms:output"); assertThat(response).isNotNull(); DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.getPayload())); assertThatJson(parsedJson).field("bookName").isEqualTo("foo"); @@ -374,7 +374,7 @@ then: String expectedMsg = """ given: - def inputMessage = contractVerifierMessaging.create('''{"bookName":"foo"}''' + ContractVerifierMessage inputMessage = contractVerifierMessaging.create('''{"bookName":"foo"}''' ,[ 'sample': 'header' ]) @@ -383,7 +383,7 @@ then: contractVerifierMessaging.send(inputMessage, 'jms:input') then: - def response = contractVerifierMessaging.receiveMessage('jms:output') + ContractVerifierMessage response = contractVerifierMessaging.receive('jms:output') assert response != null DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.payload)) assertThatJson(parsedJson).field("bookName").isEqualTo("foo") @@ -436,7 +436,7 @@ Contract.make { contractVerifierMessaging.send(inputMessage, "jms:input"); // then: - ContractVerifierMessage response = contractVerifierMessaging.receiveMessage("jms:output"); + ContractVerifierMessage response = contractVerifierMessaging.receive("jms:output"); assertThat(response).isNotNull(); DocumentContext parsedJson = JsonPath.parse(contractVerifierObjectMapper.writeValueAsString(response.getPayload())); assertThatJson(parsedJson).field("bookName").isEqualTo("foo"); diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelConfiguration.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelConfiguration.java index 4036457aa1..13fae8ff8f 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelConfiguration.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelConfiguration.java @@ -18,8 +18,12 @@ package org.springframework.cloud.contract.verifier.messaging.camel; import org.apache.camel.CamelContext; import org.apache.camel.Message; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,14 +31,36 @@ import org.springframework.context.annotation.Configuration; * @author Marcin Grzejszczak */ @Configuration +@AutoConfigureBefore(NoOpContractVerifierAutoConfiguration.class) public class ContractVerifierCamelConfiguration { - @Bean ContractVerifierMessaging contractVerifierMessaging(CamelContext context, - ContractVerifierMessageBuilder builder) { + @Bean + ContractVerifierMessageExchange contractVerifierMessageExchange( + CamelContext context, ContractVerifierMessageBuilder builder) { return new ContractVerifierCamelMessaging(context, builder); } - @Bean ContractVerifierMessageBuilder contractVerifierMessageBuilder() { + @Bean + ContractVerifierMessageBuilder contractVerifierMessageBuilder() { return new ContractVerifierCamelMessageBuilder(); } + + @Bean + public ContractVerifierMessaging contractVerifierMessaging( + ContractVerifierMessageExchange exchange) { + return new ContractVerifierCamelHelper(exchange); + } +} + +class ContractVerifierCamelHelper extends ContractVerifierMessaging { + + public ContractVerifierCamelHelper( + ContractVerifierMessageExchange exchange) { + super(exchange); + } + + @Override + protected ContractVerifierMessage convert(Message receive) { + return new ContractVerifierMessage(receive.getBody(), receive.getHeaders()); + } } diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelMessaging.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelMessaging.java index 5944f225ce..c3aa47ac8a 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelMessaging.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-camel/src/main/java/org/springframework/cloud/contract/verifier/messaging/camel/ContractVerifierCamelMessaging.java @@ -29,7 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.stereotype.Component; /** @@ -37,7 +37,7 @@ import org.springframework.stereotype.Component; */ @Component public class ContractVerifierCamelMessaging implements - ContractVerifierMessaging { + ContractVerifierMessageExchange { private static final Logger log = LoggerFactory.getLogger( ContractVerifierCamelMessaging.class); @@ -74,7 +74,7 @@ public class ContractVerifierCamelMessaging implements @Override @SuppressWarnings("unchecked") - public Message receiveMessage(String destination, long timeout, TimeUnit timeUnit) { + public Message receive(String destination, long timeout, TimeUnit timeUnit) { try { ConsumerTemplate consumerTemplate = context.createConsumerTemplate(); Exchange exchange = consumerTemplate.receive(destination, timeUnit.toMillis(timeout)); @@ -87,8 +87,8 @@ public class ContractVerifierCamelMessaging implements } @Override - public Message receiveMessage(String destination) { - return receiveMessage(destination, 5, TimeUnit.SECONDS); + public Message receive(String destination) { + return receive(destination, 5, TimeUnit.SECONDS); } } diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationConfiguration.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationConfiguration.java index 6b7ce9a583..daf553ee9c 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationConfiguration.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationConfiguration.java @@ -16,8 +16,12 @@ package org.springframework.cloud.contract.verifier.messaging.integration; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,10 +31,11 @@ import org.springframework.messaging.Message; * @author Marcin Grzejszczak */ @Configuration +@AutoConfigureBefore(NoOpContractVerifierAutoConfiguration.class) public class ContractVerifierIntegrationConfiguration { @Bean - public ContractVerifierMessaging> contractVerifierMessaging( + public ContractVerifierMessageExchange> contractVerifierMessageExchange( ApplicationContext applicationContext, ContractVerifierMessageBuilder> contractVerifierMessageBuilder) { return new ContractVerifierIntegrationMessaging(applicationContext, @@ -41,4 +46,24 @@ public class ContractVerifierIntegrationConfiguration { public ContractVerifierMessageBuilder> contractVerifierMessageBuilder() { return new ContractVerifierIntegrationMessageBuilder(); } + + @Bean + public ContractVerifierMessaging> contractVerifierMessaging( + ContractVerifierMessageExchange> exchange) { + return new ContractVerifierHelper(exchange); + } } + +class ContractVerifierHelper extends ContractVerifierMessaging> { + + public ContractVerifierHelper( + ContractVerifierMessageExchange> exchange) { + super(exchange); + } + + @Override + protected ContractVerifierMessage convert(Message receive) { + return new ContractVerifierMessage(receive.getPayload(), receive.getHeaders()); + } +} + diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationMessaging.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationMessaging.java index 60b7795038..9e0076f258 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationMessaging.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-integration/src/main/java/org/springframework/cloud/contract/verifier/messaging/integration/ContractVerifierIntegrationMessaging.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.context.ApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; @@ -35,7 +35,7 @@ import org.springframework.stereotype.Component; */ @Component public class ContractVerifierIntegrationMessaging implements - ContractVerifierMessaging> { + ContractVerifierMessageExchange> { private static final Logger log = LoggerFactory.getLogger( ContractVerifierIntegrationMessaging.class); @@ -67,7 +67,7 @@ public class ContractVerifierIntegrationMessaging implements } @Override - public Message receiveMessage(String destination, long timeout, TimeUnit timeUnit) { + public Message receive(String destination, long timeout, TimeUnit timeUnit) { try { PollableChannel messageChannel = context.getBean(destination, PollableChannel.class); return messageChannel.receive(timeUnit.toMillis(timeout)); @@ -79,8 +79,8 @@ public class ContractVerifierIntegrationMessaging implements } @Override - public Message receiveMessage(String destination) { - return receiveMessage(destination, 5, TimeUnit.SECONDS); + public Message receive(String destination) { + return receive(destination, 5, TimeUnit.SECONDS); } } diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessaging.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessageExchange.java similarity index 90% rename from spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessaging.java rename to spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessageExchange.java index e529cc1c41..981e043ab0 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessaging.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessageExchange.java @@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit; * * @author Marcin Grzejszczak */ -public interface ContractVerifierMessaging { +public interface ContractVerifierMessageExchange { /** * Sends the {@link ContractVerifierMessage} to the given destination. */ @@ -41,10 +41,10 @@ public interface ContractVerifierMessaging { * Receives the {@link ContractVerifierMessage} from the given destination. You can provide the timeout * for receiving that message. */ - M receiveMessage(String destination, long timeout, TimeUnit timeUnit); + M receive(String destination, long timeout, TimeUnit timeUnit); /** * Receives the {@link ContractVerifierMessage} from the given destination. A default timeout will be applied. */ - M receiveMessage(String destination); + M receive(String destination); } diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessage.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessage.java new file mode 100644 index 0000000000..2467df933a --- /dev/null +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessage.java @@ -0,0 +1,65 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.verifier.messaging.internal; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Yet another message abstraction. Provides generated tests with a layer that is + * independent of the message provider. + * + * @author Dave Syer + * + */ +public class ContractVerifierMessage { + + private Object payload; + + private Map headers = new LinkedHashMap<>(); + + public ContractVerifierMessage() { + } + + public ContractVerifierMessage(Object payload, Map headers) { + this.payload = payload; + if (headers!=null) { + this.headers.putAll(headers); + } + } + + public Object getPayload() { + return payload; + } + + public void setPayload(Object payload) { + this.payload = payload; + } + + public Map getHeaders() { + return headers; + } + + public Object getHeader(String name) { + return headers.get(name); + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + +} diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessaging.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessaging.java new file mode 100644 index 0000000000..19fdbf04c3 --- /dev/null +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierMessaging.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.verifier.messaging.internal; + +import java.util.Map; + +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; + +/** + * @author Dave Syer + * + */ +public class ContractVerifierMessaging { + + private ContractVerifierMessageExchange exchange; + + public ContractVerifierMessaging(ContractVerifierMessageExchange exchange) { + this.exchange = exchange; + } + + public void send(ContractVerifierMessage message, String destination) { + exchange.send(message.getPayload(), message.getHeaders(), destination); + } + + public ContractVerifierMessage receive(String destination) { + return convert(exchange.receive(destination)); + } + + public ContractVerifierMessage create(T payload, Map headers) { + return new ContractVerifierMessage(payload, headers); + } + + protected ContractVerifierMessage convert(M receive) { + return new ContractVerifierMessage(receive, null); + } + +} diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierObjectMapper.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierObjectMapper.java similarity index 95% rename from spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierObjectMapper.java rename to spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierObjectMapper.java index dfbdcf461d..064de4f28f 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierObjectMapper.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/internal/ContractVerifierObjectMapper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.contract.verifier.messaging; +package org.springframework.cloud.contract.verifier.messaging.internal; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierAutoConfiguration.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierAutoConfiguration.java new file mode 100644 index 0000000000..113070e75e --- /dev/null +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierAutoConfiguration.java @@ -0,0 +1,56 @@ +/* + * Copyright 2013-2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.verifier.messaging.noop; + +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessageBuilder; +import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierMessaging; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; + +/** + * @author Marcin Grzejszczak + */ +@Configuration +@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE) +public class NoOpContractVerifierAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public ContractVerifierMessageExchange contractVerifierMessageExchange() { + return new NoOpContractVerifierMessaging(); + } + + @Bean + @ConditionalOnMissingBean + public ContractVerifierMessageBuilder contractVerifierMessageBuilder() { + return new NoOpContractVerifierMessageBuilder(); + } + + @Bean + @ConditionalOnMissingBean + public ContractVerifierMessaging contractVerifierMessaging( + ContractVerifierMessageExchange exchange) { + return new ContractVerifierMessaging(exchange); + } + +} diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierMessaging.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierMessaging.java index 73a342e3c5..189a29458d 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierMessaging.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/noop/NoOpContractVerifierMessaging.java @@ -19,12 +19,12 @@ package org.springframework.cloud.contract.verifier.messaging.noop; import java.util.Map; import java.util.concurrent.TimeUnit; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; /** * @author Marcin Grzejszczak */ -public class NoOpContractVerifierMessaging implements ContractVerifierMessaging { +public class NoOpContractVerifierMessaging implements ContractVerifierMessageExchange { @Override public void send(Object message, String destination) { } @@ -34,12 +34,12 @@ public class NoOpContractVerifierMessaging implements ContractVerifierMessaging< } @Override - public Object receiveMessage(String destination, long timeout, TimeUnit timeUnit) { + public Object receive(String destination, long timeout, TimeUnit timeUnit) { return null; } @Override - public Object receiveMessage(String destination) { + public Object receive(String destination) { return null; } diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessagingUtil.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/util/ContractVerifierMessagingUtil.java similarity index 97% rename from spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessagingUtil.java rename to spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/util/ContractVerifierMessagingUtil.java index 18de368aa5..307e0457ac 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/ContractVerifierMessagingUtil.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/java/org/springframework/cloud/contract/verifier/messaging/util/ContractVerifierMessagingUtil.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.contract.verifier.messaging; +package org.springframework.cloud.contract.verifier.messaging.util; import java.util.Collection; import java.util.HashMap; diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..a9589fd118 --- /dev/null +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-messaging-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configuration +org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging=\ +org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamAutoConfiguration.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamAutoConfiguration.java index 22686a8c6c..bac9659b49 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamAutoConfiguration.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamAutoConfiguration.java @@ -16,8 +16,13 @@ package org.springframework.cloud.contract.verifier.messaging.stream; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessage; +import org.springframework.cloud.contract.verifier.messaging.internal.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -27,10 +32,12 @@ import org.springframework.messaging.Message; * @author Marcin Grzejszczak */ @Configuration +@ConditionalOnProperty(name="stubrunner.stream.enabled", havingValue="true", matchIfMissing=true) +@AutoConfigureBefore(NoOpContractVerifierAutoConfiguration.class) public class ContractVerifierStreamAutoConfiguration { @Bean - ContractVerifierMessaging> contractVerifierMessaging( + ContractVerifierMessageExchange> contractVerifierMessageExchange( ApplicationContext applicationContext, ContractVerifierMessageBuilder> contractVerifierMessageBuilder) { return new ContractVerifierStreamMessaging(applicationContext, @@ -41,4 +48,24 @@ public class ContractVerifierStreamAutoConfiguration { ContractVerifierMessageBuilder> contractVerifierMessageBuilder() { return new ContractVerifierStreamMessageBuilder(); } + + @Bean + public ContractVerifierMessaging contractVerifierMessagingConverter( + ContractVerifierMessageExchange> exchange) { + return new ContractVerifierHelper(exchange); + } } + +class ContractVerifierHelper extends ContractVerifierMessaging> { + + public ContractVerifierHelper( + ContractVerifierMessageExchange> exchange) { + super(exchange); + } + + @Override + protected ContractVerifierMessage convert(Message receive) { + return new ContractVerifierMessage(receive.getPayload(), receive.getHeaders()); + } +} + diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamMessaging.java b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamMessaging.java index fafdf2673f..0113a484af 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamMessaging.java +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-messaging/spring-cloud-contract-verifier-stream/src/main/java/org/springframework/cloud/contract/verifier/messaging/stream/ContractVerifierStreamMessaging.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageBuilder; -import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessaging; +import org.springframework.cloud.contract.verifier.messaging.ContractVerifierMessageExchange; import org.springframework.cloud.stream.config.BindingProperties; import org.springframework.cloud.stream.config.ChannelBindingServiceProperties; import org.springframework.cloud.stream.test.binder.MessageCollector; @@ -35,7 +35,7 @@ import org.springframework.messaging.MessageChannel; * @author Marcin Grzejszczak */ public class ContractVerifierStreamMessaging implements - ContractVerifierMessaging> { + ContractVerifierMessageExchange> { private static final Logger log = LoggerFactory.getLogger(ContractVerifierStreamMessaging.class); @@ -68,7 +68,7 @@ public class ContractVerifierStreamMessaging implements } @Override - public Message receiveMessage(String destination, long timeout, TimeUnit timeUnit) { + public Message receive(String destination, long timeout, TimeUnit timeUnit) { try { MessageChannel messageChannel = context.getBean(resolvedDestination(destination), MessageChannel.class); return messageCollector.forChannel(messageChannel).poll(timeout, timeUnit); @@ -93,8 +93,8 @@ public class ContractVerifierStreamMessaging implements } @Override - public Message receiveMessage(String destination) { - return receiveMessage(destination, 5, TimeUnit.SECONDS); + public Message receive(String destination) { + return receive(destination, 5, TimeUnit.SECONDS); } }