Commit 7804e1bd by Dave Syer

Add Spring Cloud Contract for hystrix stream

parent 6b6889b8
......@@ -14,6 +14,7 @@
<description>Spring Cloud Netflix Hystrix Stream</description>
<properties>
<main.basedir>${basedir}/..</main.basedir>
<spring-cloud-contract.version>1.1.0.RELEASE</spring-cloud-contract.version>
</properties>
<dependencies>
<dependency>
......@@ -56,11 +57,6 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
......@@ -80,5 +76,59 @@
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-verifier</artifactId>
<version>${spring-cloud-contract.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>${spring-cloud-contract.version}</version>
<extensions>true</extensions>
<configuration>
<baseClassMappings>
<baseClassMapping>
<contractPackageRegex>.*</contractPackageRegex>
<baseClassFQN>org.springframework.cloud.netflix.hystrix.stream.StreamSourceTestBase</baseClassFQN>
</baseClassMapping>
</baseClassMappings>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<versionRange>[1.1.0.RELEASE,)</versionRange>
<goals>
<goal>convert</goal>
<goal>generateTests</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
......@@ -16,23 +16,30 @@
package org.springframework.cloud.netflix.hystrix.stream;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.stream.test.binder.MessageCollector;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import static org.assertj.core.api.Assertions.assertThat;
/**
......@@ -49,10 +56,20 @@ public class HystrixStreamTests {
@Autowired
private Application application;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private ObjectMapper mapper;
@Autowired
private MessageCollector collector;
@Autowired
@Qualifier(HystrixStreamClient.OUTPUT)
private MessageChannel output;
@EnableAutoConfiguration
@EnableCircuitBreaker
@RestController
......@@ -67,14 +84,19 @@ public class HystrixStreamTests {
}
@Test
public void contextLoads() {
public void contextLoads() throws Exception {
this.application.hello();
//It is important that local service instance resolves for metrics
//origin details to be populated
// It is important that local service instance resolves for metrics
// origin details to be populated
ServiceInstance localServiceInstance = discoveryClient.getLocalServiceInstance();
assertThat(localServiceInstance).isNotNull();
assertThat(localServiceInstance.getServiceId()).isEqualTo("mytestapp");
this.task.gatherMetrics();
Message<?> message = this.collector.forChannel(output).take();
assertThat(message.getPayload()).isInstanceOf(String.class);
JsonNode tree = mapper.readTree((String) message.getPayload());
assertThat(tree.hasNonNull("origin"));
assertThat(tree.hasNonNull("data"));
}
}
/*
* Copyright 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.netflix.hystrix.stream;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier;
import org.springframework.cloud.netflix.hystrix.stream.StreamSourceTestBase.Application;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Base class for sensor autogenerated tests (used by Spring Cloud Contract).
*
* This bootstraps the Spring Boot application code.
*
* @author Marius Bogoevici
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class, properties = "spring.cloud.stream.bindings.output.destination=sensor-data")
@AutoConfigureMessageVerifier
public abstract class StreamSourceTestBase {
@Autowired
Application application;
public void createMetricsData() {
application.hello();
}
@EnableAutoConfiguration
@EnableCircuitBreaker
@RestController
public static class Application {
@HystrixCommand
@RequestMapping("/")
public String hello() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
}
package contracts
org.springframework.cloud.contract.spec.Contract.make {
// Human readable description
description 'Should produce valid metrics data'
// Label by means of which the output message can be triggered
label 'metrics'
// input to the contract
input {
// the contract will be triggered by a method
triggeredBy('createMetricsData()')
}
// output message of the contract
outputMessage {
// destination to which the output message will be sent
sentTo 'hystrixStreamOutput'
headers {
header('contentType': 'application/json')
}
// the body of the output message
body ([
])
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment