Commit 7804e1bd by Dave Syer

Add Spring Cloud Contract for hystrix stream

parent 6b6889b8
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
<description>Spring Cloud Netflix Hystrix Stream</description> <description>Spring Cloud Netflix Hystrix Stream</description>
<properties> <properties>
<main.basedir>${basedir}/..</main.basedir> <main.basedir>${basedir}/..</main.basedir>
<spring-cloud-contract.version>1.1.0.RELEASE</spring-cloud-contract.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
...@@ -56,11 +57,6 @@ ...@@ -56,11 +57,6 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
...@@ -80,5 +76,59 @@ ...@@ -80,5 +76,59 @@
<artifactId>spring-cloud-stream-test-support</artifactId> <artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-verifier</artifactId>
<version>${spring-cloud-contract.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </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> </project>
...@@ -16,23 +16,30 @@ ...@@ -16,23 +16,30 @@
package org.springframework.cloud.netflix.hystrix.stream; 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.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.stream.test.binder.MessageCollector;
import org.springframework.context.annotation.Configuration; 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.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
...@@ -49,10 +56,20 @@ public class HystrixStreamTests { ...@@ -49,10 +56,20 @@ public class HystrixStreamTests {
@Autowired @Autowired
private Application application; private Application application;
@Autowired @Autowired
private DiscoveryClient discoveryClient; private DiscoveryClient discoveryClient;
@Autowired
private ObjectMapper mapper;
@Autowired
private MessageCollector collector;
@Autowired
@Qualifier(HystrixStreamClient.OUTPUT)
private MessageChannel output;
@EnableAutoConfiguration @EnableAutoConfiguration
@EnableCircuitBreaker @EnableCircuitBreaker
@RestController @RestController
...@@ -67,14 +84,19 @@ public class HystrixStreamTests { ...@@ -67,14 +84,19 @@ public class HystrixStreamTests {
} }
@Test @Test
public void contextLoads() { public void contextLoads() throws Exception {
this.application.hello(); this.application.hello();
//It is important that local service instance resolves for metrics // It is important that local service instance resolves for metrics
//origin details to be populated // origin details to be populated
ServiceInstance localServiceInstance = discoveryClient.getLocalServiceInstance(); ServiceInstance localServiceInstance = discoveryClient.getLocalServiceInstance();
assertThat(localServiceInstance).isNotNull(); assertThat(localServiceInstance).isNotNull();
assertThat(localServiceInstance.getServiceId()).isEqualTo("mytestapp"); assertThat(localServiceInstance.getServiceId()).isEqualTo("mytestapp");
this.task.gatherMetrics(); 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