Extract utility class into shared library for contract tests
This commit is contained in:
1
pom.xml
1
pom.xml
@@ -124,6 +124,7 @@
|
||||
</dependencyManagement>
|
||||
<modules>
|
||||
<module>spring-cloud-netflix-dependencies</module>
|
||||
<module>spring-cloud-netflix-hystrix-contract</module>
|
||||
<module>spring-cloud-netflix-core</module>
|
||||
<module>spring-cloud-netflix-hystrix-dashboard</module>
|
||||
<module>spring-cloud-netflix-hystrix-amqp</module>
|
||||
|
||||
35
spring-cloud-netflix-hystrix-contract/pom.xml
Normal file
35
spring-cloud-netflix-hystrix-contract/pom.xml
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix</artifactId>
|
||||
<version>1.3.1.BUILD-SNAPSHOT</version>
|
||||
<relativePath>..</relativePath> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<artifactId>spring-cloud-netflix-hystrix-contract</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>spring-cloud-netflix-hystrix-contract</name>
|
||||
<description>Spring Cloud Netflix Hystrix Contract</description>
|
||||
<properties>
|
||||
<main.basedir>${basedir}/..</main.basedir>
|
||||
<spring-cloud-contract.version>1.0.5.RELEASE</spring-cloud-contract.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-contract-verifier</artifactId>
|
||||
<version>${spring-cloud-contract.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright 2016-2017 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.contract;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.core.io.DefaultResourceLoader;
|
||||
import org.springframework.util.StreamUtils;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public class HystrixContractUtils {
|
||||
|
||||
public static String simpleBody() {
|
||||
try {
|
||||
return StreamUtils.copyToString(new DefaultResourceLoader()
|
||||
.getResource("classpath:/stubs/simpleBody.json").getInputStream(),
|
||||
StandardCharsets.UTF_8);
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new IllegalStateException("Cannot read stub", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkOrigin(Map<String, Object> origin) {
|
||||
assertThat(origin.get("host")).isNotNull();
|
||||
assertThat(origin.get("port")).isNotNull();
|
||||
assertThat(origin.get("serviceId")).isEqualTo("application");
|
||||
// TODO: should be server.port?
|
||||
assertThat(origin.get("id")).isEqualTo("application:-1");
|
||||
}
|
||||
|
||||
public static void checkData(Map<String, Object> data) {
|
||||
assertThat(data.get("type")).isEqualTo("HystrixCommand");
|
||||
// TODO: should be application.hello
|
||||
assertThat(data.get("name")).asString().startsWith("application.");
|
||||
assertThat(data.get("group")).isNotNull();
|
||||
// TODO: should be TestApplication
|
||||
// assertThat(data.get("group")).isEqualTo(TestApplication.class.getSimpleName());
|
||||
assertThat(data.get("errorCount")).isEqualTo(0);
|
||||
assertThat(data.get("errorPercentage")).isEqualTo(0);
|
||||
assertThat(data.get("requestCount")).isInstanceOf(java.lang.Integer.class);
|
||||
assertThat(data.get("currentConcurrentExecutionCount"))
|
||||
.isInstanceOf(java.lang.Integer.class);
|
||||
assertThat(data.get("rollingCountFailure")).isEqualTo(0);
|
||||
assertThat(data.get("rollingCountSuccess")).isInstanceOf(java.lang.Integer.class);
|
||||
assertThat(data.get("rollingCountShortCircuited")).isEqualTo(0);
|
||||
assertThat(data.get("rollingCountFallbackSuccess")).isEqualTo(0);
|
||||
assertThat(data.get("isCircuitBreakerOpen")).isEqualTo(false);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"origin":{
|
||||
"host":"192.168.1.192",
|
||||
"port":0,
|
||||
"serviceId":"application",
|
||||
"id":"application:0"
|
||||
},
|
||||
"data":{
|
||||
"type":"HystrixCommand",
|
||||
"name":"application.hello",
|
||||
"group":"Application",
|
||||
"currentTime":1494840901153,
|
||||
"isCircuitBreakerOpen":false,
|
||||
"errorPercentage":0,
|
||||
"errorCount":0,
|
||||
"requestCount":1,
|
||||
"rollingCountCollapsedRequests":0,
|
||||
"rollingCountExceptionsThrown":0,
|
||||
"rollingCountFailure":0,
|
||||
"rollingCountFallbackFailure":0,
|
||||
"rollingCountFallbackRejection":0,
|
||||
"rollingCountFallbackSuccess":0,
|
||||
"rollingCountResponsesFromCache":0,
|
||||
"rollingCountSemaphoreRejected":0,
|
||||
"rollingCountShortCircuited":0,
|
||||
"rollingCountSuccess":0,
|
||||
"rollingCountThreadPoolRejected":0,
|
||||
"rollingCountTimeout":0,
|
||||
"currentConcurrentExecutionCount":0,
|
||||
"latencyExecute_mean":0,
|
||||
"latencyExecute":{
|
||||
"0":0,
|
||||
"25":0,
|
||||
"50":0,
|
||||
"75":0,
|
||||
"90":0,
|
||||
"95":0,
|
||||
"99":0,
|
||||
"99.5":0,
|
||||
"100":0
|
||||
},
|
||||
"latencyTotal_mean":0,
|
||||
"latencyTotal":{
|
||||
"0":0,
|
||||
"25":0,
|
||||
"50":0,
|
||||
"75":0,
|
||||
"90":0,
|
||||
"95":0,
|
||||
"99":0,
|
||||
"99.5":0,
|
||||
"100":0
|
||||
},
|
||||
"propertyValue_circuitBreakerRequestVolumeThreshold":20,
|
||||
"propertyValue_circuitBreakerSleepWindowInMilliseconds":5000,
|
||||
"propertyValue_circuitBreakerErrorThresholdPercentage":50,
|
||||
"propertyValue_circuitBreakerForceOpen":false,
|
||||
"propertyValue_circuitBreakerForceClosed":false,
|
||||
"propertyValue_circuitBreakerEnabled":true,
|
||||
"propertyValue_executionIsolationStrategy":"THREAD",
|
||||
"propertyValue_executionIsolationThreadTimeoutInMilliseconds":1000,
|
||||
"propertyValue_executionIsolationThreadInterruptOnTimeout":true,
|
||||
"propertyValue_executionIsolationThreadPoolKeyOverride":null,
|
||||
"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests":10,
|
||||
"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests":10,
|
||||
"propertyValue_metricsRollingStatisticalWindowInMilliseconds":10000,
|
||||
"propertyValue_requestCacheEnabled":true,
|
||||
"propertyValue_requestLogEnabled":true,
|
||||
"reportingHosts":1
|
||||
}
|
||||
}
|
||||
@@ -78,8 +78,8 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-contract-verifier</artifactId>
|
||||
<version>${spring-cloud-contract.version}</version>
|
||||
<artifactId>spring-cloud-netflix-hystrix-contract</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
@@ -98,11 +98,19 @@
|
||||
</baseClassMapping>
|
||||
</baseClassMappings>
|
||||
</configuration>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix-hystrix-contract</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</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.-->
|
||||
<!--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>
|
||||
|
||||
@@ -28,13 +28,12 @@ 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.contract.HystrixContractUtils;
|
||||
import org.springframework.cloud.netflix.hystrix.stream.StreamSourceTestBase.TestApplication;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Base class for sensor autogenerated tests (used by Spring Cloud Contract).
|
||||
*
|
||||
@@ -57,23 +56,14 @@ public abstract class StreamSourceTestBase {
|
||||
public void assertOrigin(Object input) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> origin = (Map<String, Object>) input;
|
||||
assertThat(origin.get("host")).isNotNull();
|
||||
assertThat(origin.get("port")).isNotNull();
|
||||
assertThat(origin.get("serviceId")).isEqualTo("application");
|
||||
// TODO: should be server.port?
|
||||
assertThat(origin.get("id")).isEqualTo("application:-1");
|
||||
HystrixContractUtils.checkOrigin(origin);
|
||||
}
|
||||
|
||||
public void assertData(Object input) {
|
||||
System.err.println(input);
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> data = (Map<String, Object>) input;
|
||||
assertThat(data.get("type")).isEqualTo("HystrixCommand");
|
||||
// TODO: should be application.hello
|
||||
assertThat(data.get("name")).asString().startsWith("application.");
|
||||
assertThat(data.get("group")).isNotNull();
|
||||
// TODO: should be TestApplication
|
||||
// assertThat(data.get("group")).isEqualTo(TestApplication.class.getSimpleName());
|
||||
HystrixContractUtils.checkData(data);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package contracts
|
||||
|
||||
import org.springframework.cloud.netflix.hystrix.contract.HystrixContractUtils
|
||||
|
||||
org.springframework.cloud.contract.spec.Contract.make {
|
||||
// Human readable description
|
||||
description 'Should produce valid metrics data'
|
||||
@@ -17,91 +19,10 @@ org.springframework.cloud.contract.spec.Contract.make {
|
||||
headers {
|
||||
header('contentType': 'application/json')
|
||||
}
|
||||
body("""
|
||||
{
|
||||
"origin":{
|
||||
"host":"192.168.1.192",
|
||||
"port":0,
|
||||
"serviceId":"application",
|
||||
"id":"application:0"
|
||||
},
|
||||
"data":{
|
||||
"type":"HystrixCommand",
|
||||
"name":"application.hello",
|
||||
"group":"Application",
|
||||
"currentTime":1494840901153,
|
||||
"isCircuitBreakerOpen":false,
|
||||
"errorPercentage":0,
|
||||
"errorCount":0,
|
||||
"requestCount":1,
|
||||
"rollingCountCollapsedRequests":0,
|
||||
"rollingCountExceptionsThrown":0,
|
||||
"rollingCountFailure":0,
|
||||
"rollingCountFallbackFailure":0,
|
||||
"rollingCountFallbackRejection":0,
|
||||
"rollingCountFallbackSuccess":0,
|
||||
"rollingCountResponsesFromCache":0,
|
||||
"rollingCountSemaphoreRejected":0,
|
||||
"rollingCountShortCircuited":0,
|
||||
"rollingCountSuccess":0,
|
||||
"rollingCountThreadPoolRejected":0,
|
||||
"rollingCountTimeout":0,
|
||||
"currentConcurrentExecutionCount":0,
|
||||
"latencyExecute_mean":0,
|
||||
"latencyExecute":{
|
||||
"0":0,
|
||||
"25":0,
|
||||
"50":0,
|
||||
"75":0,
|
||||
"90":0,
|
||||
"95":0,
|
||||
"99":0,
|
||||
"99.5":0,
|
||||
"100":0
|
||||
},
|
||||
"latencyTotal_mean":0,
|
||||
"latencyTotal":{
|
||||
"0":0,
|
||||
"25":0,
|
||||
"50":0,
|
||||
"75":0,
|
||||
"90":0,
|
||||
"95":0,
|
||||
"99":0,
|
||||
"99.5":0,
|
||||
"100":0
|
||||
},
|
||||
"propertyValue_circuitBreakerRequestVolumeThreshold":20,
|
||||
"propertyValue_circuitBreakerSleepWindowInMilliseconds":5000,
|
||||
"propertyValue_circuitBreakerErrorThresholdPercentage":50,
|
||||
"propertyValue_circuitBreakerForceOpen":false,
|
||||
"propertyValue_circuitBreakerForceClosed":false,
|
||||
"propertyValue_circuitBreakerEnabled":true,
|
||||
"propertyValue_executionIsolationStrategy":"THREAD",
|
||||
"propertyValue_executionIsolationThreadTimeoutInMilliseconds":1000,
|
||||
"propertyValue_executionIsolationThreadInterruptOnTimeout":true,
|
||||
"propertyValue_executionIsolationThreadPoolKeyOverride":null,
|
||||
"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests":10,
|
||||
"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests":10,
|
||||
"propertyValue_metricsRollingStatisticalWindowInMilliseconds":10000,
|
||||
"propertyValue_requestCacheEnabled":true,
|
||||
"propertyValue_requestLogEnabled":true,
|
||||
"reportingHosts":1
|
||||
}
|
||||
}
|
||||
""")
|
||||
body(HystrixContractUtils.simpleBody())
|
||||
testMatchers {
|
||||
jsonPath('$.origin', byCommand('assertOrigin($it)'))
|
||||
jsonPath('$.data', byCommand('assertData($it)'))
|
||||
jsonPath('$.data.errorCount', byEquality())
|
||||
jsonPath('$.data.errorPercentage', byEquality())
|
||||
jsonPath('$.data.requestCount', byType())
|
||||
jsonPath('$.data.currentConcurrentExecutionCount', byType())
|
||||
jsonPath('$.data.rollingCountFailure', byEquality())
|
||||
jsonPath('$.data.rollingCountSuccess', byType())
|
||||
jsonPath('$.data.rollingCountShortCircuited', byEquality())
|
||||
jsonPath('$.data.rollingCountFallbackSuccess', byEquality())
|
||||
jsonPath('$.data.isCircuitBreakerOpen', byEquality())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,5 +111,11 @@
|
||||
<version>${spring-cloud-contract.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix-hystrix-contract</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -63,7 +63,6 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
// TODO: we don't need this if we harmonize the turbine and hystrix destinations
|
||||
// https://github.com/spring-cloud/spring-cloud-netflix/issues/1948
|
||||
"spring.cloud.stream.bindings.turbineStreamInput.destination=hystrixStreamOutput",
|
||||
"logging.level.org.springframework.cloud.netflix.turbine=DEBUG",
|
||||
"spring.jmx.enabled=true", "stubrunner.workOffline=true",
|
||||
"stubrunner.ids=org.springframework.cloud:spring-cloud-netflix-hystrix-stream" })
|
||||
@AutoConfigureStubRunner
|
||||
@@ -140,9 +139,9 @@ public class TurbineStreamTests {
|
||||
latch.countDown();
|
||||
builder.append(new String(bytes, 0, read));
|
||||
}
|
||||
log.info("Building: " + builder);
|
||||
log.debug("Building: " + builder);
|
||||
}
|
||||
log.info("Done: " + builder);
|
||||
log.debug("Done: " + builder);
|
||||
return ResponseEntity.status(response.getStatusCode())
|
||||
.headers(response.getHeaders()).body(builder.toString());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user