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.
This commit is contained in:
Dave Syer
2016-07-19 07:21:00 +01:00
parent a3712e77c4
commit 03d8554adb
36 changed files with 446 additions and 191 deletions

View File

@@ -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<Message> contractVerifierMessaging
@Inject ContractVerifierMessageExchange<Message> 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))

View File

@@ -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<Message<?>> contractVerifierMessaging
@Inject ContractVerifierMessageExchange<Message<?>> 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))

View File

@@ -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<Message<?>> contractVerifierMessaging
@Inject ContractVerifierMessageExchange<Message<?>> 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))

View File

@@ -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<Message<?>> contractVerifierMessaging
@Inject ContractVerifierMessageExchange<Message<?>> 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))

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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;

View File

@@ -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<Message<?>> messaging
@Autowired ContractVerifierMessageExchange<Message<?>> 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 {}
}

View File

@@ -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;

View File

@@ -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));

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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<Object> contractVerifierMessaging(
ContractVerifierMessageExchange<Object> exchange) {
return new ContractVerifierMessaging<Object>(exchange);
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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<Object> {
private class AssertingContractVerifierMessaging implements ContractVerifierMessageExchange<Object> {
@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 <T> void send(T payload, Map<String, Object> 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()
}
}
}

View File

@@ -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

View File

@@ -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)

View File

@@ -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() {

View File

@@ -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 "
}

View File

@@ -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");

View File

@@ -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<Message> contractVerifierMessaging(CamelContext context,
ContractVerifierMessageBuilder<Message> builder) {
@Bean
ContractVerifierMessageExchange<Message> contractVerifierMessageExchange(
CamelContext context, ContractVerifierMessageBuilder<Message> builder) {
return new ContractVerifierCamelMessaging(context, builder);
}
@Bean ContractVerifierMessageBuilder<Message> contractVerifierMessageBuilder() {
@Bean
ContractVerifierMessageBuilder<Message> contractVerifierMessageBuilder() {
return new ContractVerifierCamelMessageBuilder();
}
@Bean
public ContractVerifierMessaging<Message> contractVerifierMessaging(
ContractVerifierMessageExchange<Message> exchange) {
return new ContractVerifierCamelHelper(exchange);
}
}
class ContractVerifierCamelHelper extends ContractVerifierMessaging<Message> {
public ContractVerifierCamelHelper(
ContractVerifierMessageExchange<Message> exchange) {
super(exchange);
}
@Override
protected ContractVerifierMessage convert(Message receive) {
return new ContractVerifierMessage(receive.getBody(), receive.getHeaders());
}
}

View File

@@ -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<Message> {
ContractVerifierMessageExchange<Message> {
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);
}
}

View File

@@ -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<T> {
@Bean
public ContractVerifierMessaging<Message<?>> contractVerifierMessaging(
public ContractVerifierMessageExchange<Message<?>> contractVerifierMessageExchange(
ApplicationContext applicationContext,
ContractVerifierMessageBuilder<Message<?>> contractVerifierMessageBuilder) {
return new ContractVerifierIntegrationMessaging(applicationContext,
@@ -41,4 +46,24 @@ public class ContractVerifierIntegrationConfiguration<T> {
public ContractVerifierMessageBuilder<Message<?>> contractVerifierMessageBuilder() {
return new ContractVerifierIntegrationMessageBuilder();
}
@Bean
public ContractVerifierMessaging<Message<?>> contractVerifierMessaging(
ContractVerifierMessageExchange<Message<?>> exchange) {
return new ContractVerifierHelper(exchange);
}
}
class ContractVerifierHelper extends ContractVerifierMessaging<Message<?>> {
public ContractVerifierHelper(
ContractVerifierMessageExchange<Message<?>> exchange) {
super(exchange);
}
@Override
protected ContractVerifierMessage convert(Message<?> receive) {
return new ContractVerifierMessage(receive.getPayload(), receive.getHeaders());
}
}

View File

@@ -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<Message<?>> {
ContractVerifierMessageExchange<Message<?>> {
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);
}
}

View File

@@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit;
*
* @author Marcin Grzejszczak
*/
public interface ContractVerifierMessaging<M> {
public interface ContractVerifierMessageExchange<M> {
/**
* Sends the {@link ContractVerifierMessage} to the given destination.
*/
@@ -41,10 +41,10 @@ public interface ContractVerifierMessaging<M> {
* 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);
}

View File

@@ -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<String, Object> headers = new LinkedHashMap<>();
public ContractVerifierMessage() {
}
public ContractVerifierMessage(Object payload, Map<String, Object> 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<String, Object> getHeaders() {
return headers;
}
public Object getHeader(String name) {
return headers.get(name);
}
public void setHeaders(Map<String, Object> headers) {
this.headers = headers;
}
}

View File

@@ -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<M> {
private ContractVerifierMessageExchange<M> exchange;
public ContractVerifierMessaging(ContractVerifierMessageExchange<M> 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 <T> ContractVerifierMessage create(T payload, Map<String, Object> headers) {
return new ContractVerifierMessage(payload, headers);
}
protected ContractVerifierMessage convert(M receive) {
return new ContractVerifierMessage(receive, null);
}
}

View File

@@ -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;

View File

@@ -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<Object> exchange) {
return new ContractVerifierMessaging<Object>(exchange);
}
}

View File

@@ -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<Object> {
public class NoOpContractVerifierMessaging implements ContractVerifierMessageExchange<Object> {
@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;
}

View File

@@ -0,0 +1,3 @@
# Auto Configuration
org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureContractVerifierMessaging=\
org.springframework.cloud.contract.verifier.messaging.noop.NoOpContractVerifierAutoConfiguration

View File

@@ -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<Message<?>> contractVerifierMessaging(
ContractVerifierMessageExchange<Message<?>> contractVerifierMessageExchange(
ApplicationContext applicationContext,
ContractVerifierMessageBuilder<Message<?>> contractVerifierMessageBuilder) {
return new ContractVerifierStreamMessaging(applicationContext,
@@ -41,4 +48,24 @@ public class ContractVerifierStreamAutoConfiguration {
ContractVerifierMessageBuilder<Message<?>> contractVerifierMessageBuilder() {
return new ContractVerifierStreamMessageBuilder();
}
@Bean
public ContractVerifierMessaging<?> contractVerifierMessagingConverter(
ContractVerifierMessageExchange<Message<?>> exchange) {
return new ContractVerifierHelper(exchange);
}
}
class ContractVerifierHelper extends ContractVerifierMessaging<Message<?>> {
public ContractVerifierHelper(
ContractVerifierMessageExchange<Message<?>> exchange) {
super(exchange);
}
@Override
protected ContractVerifierMessage convert(Message<?> receive) {
return new ContractVerifierMessage(receive.getPayload(), receive.getHeaders());
}
}

View File

@@ -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<Message<?>> {
ContractVerifierMessageExchange<Message<?>> {
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);
}
}