From d58ca616ebcc7b0806809162bc11c5215ee836c4 Mon Sep 17 00:00:00 2001 From: Soby Chacko Date: Thu, 16 Aug 2018 16:37:03 -0400 Subject: [PATCH] CF Acceptance Tests Move CF Acceptance tests from spring-cloud-stream-samples repository to here --- mvnw | 226 ++++++++++++++++++ mvnw.cmd | 145 +++++++++++ pom.xml | 2 +- spring-cloud-stream-cf-acceptance-tests/.mvn | 1 + .../README.adoc | 10 + .../manifests/log-sink-manifest.yml | 20 ++ .../partitioning-consumer1-manifest.yml | 14 ++ .../partitioning-consumer2-manifest.yml | 15 ++ .../partitioning-consumer3-manifest.yml | 15 ++ .../partitioning-consumer4-manifest.yml | 15 ++ .../partitioning-producer-manifest.yml | 14 ++ .../manifests/time-source-manifest.yml | 18 ++ .../uppercase-processor-manifest.yml | 14 ++ spring-cloud-stream-cf-acceptance-tests/mvnw | 226 ++++++++++++++++++ .../mvnw.cmd | 145 +++++++++++ .../pom.xml | 34 +++ .../runAcceptanceTests.sh | 218 +++++++++++++++++ .../tests/AbstractCFAcceptanceTests.java | 90 +++++++ .../tests/PartitioningCFAcceptanceTests.java | 104 ++++++++ .../tests/TickTockCFAcceptanceTests.java | 50 ++++ ...UppercaseTransformerCFAcceptanceTests.java | 48 ++++ ... => PartitioningLocalAcceptanceTests.java} | 4 +- ...aRegistryVanillaLocalAcceptanceTests.java} | 4 +- 23 files changed, 1427 insertions(+), 5 deletions(-) create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 120000 spring-cloud-stream-cf-acceptance-tests/.mvn create mode 100644 spring-cloud-stream-cf-acceptance-tests/README.adoc create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/log-sink-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer1-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer2-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer3-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer4-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-producer-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/time-source-manifest.yml create mode 100644 spring-cloud-stream-cf-acceptance-tests/manifests/uppercase-processor-manifest.yml create mode 100755 spring-cloud-stream-cf-acceptance-tests/mvnw create mode 100644 spring-cloud-stream-cf-acceptance-tests/mvnw.cmd create mode 100644 spring-cloud-stream-cf-acceptance-tests/pom.xml create mode 100755 spring-cloud-stream-cf-acceptance-tests/runAcceptanceTests.sh create mode 100644 spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/AbstractCFAcceptanceTests.java create mode 100644 spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningCFAcceptanceTests.java create mode 100644 spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/TickTockCFAcceptanceTests.java create mode 100644 spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/UppercaseTransformerCFAcceptanceTests.java rename spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/{PartitioningAcceptanceTests.java => PartitioningLocalAcceptanceTests.java} (98%) rename spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/{SchemaRegistryVanillaTests.java => SchemaRegistryVanillaLocalAcceptanceTests.java} (97%) diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..6efc7bd --- /dev/null +++ b/mvnw @@ -0,0 +1,226 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +echo $MAVEN_PROJECTBASEDIR +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +"$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" + diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..b0dc0e7 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml index b72597f..d4d6080 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ spring-cloud-stream-local-acceptance-tests - + spring-cloud-stream-cf-acceptance-tests diff --git a/spring-cloud-stream-cf-acceptance-tests/.mvn b/spring-cloud-stream-cf-acceptance-tests/.mvn new file mode 120000 index 0000000..19172e1 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/.mvn @@ -0,0 +1 @@ +../.mvn \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/README.adoc b/spring-cloud-stream-cf-acceptance-tests/README.adoc new file mode 100644 index 0000000..0fe236e --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/README.adoc @@ -0,0 +1,10 @@ +=== Samples Acceptance Tests + +This is an acceptance test module for the samples in this repo. +The tests launch the Spring Cloud Stream samples as stand alone Spring Boot applications and then verify their correctness. + +By default, these tests are not run as part of the normal build, as they are mainly intended for continuous integration testing with ongoing changes in the framework. + +In order to run the tests, we recommend to run the script `./runAcceptanceTest.sh` in this directory. +The script will launch all the middleware and other components in docker containers first. +Then it builds the applications and run them. \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/log-sink-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/log-sink-manifest.yml new file mode 100644 index 0000000..416c166 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/log-sink-manifest.yml @@ -0,0 +1,20 @@ +--- +applications: +- name: ticktock-log-sink + host: ticktock-log-sink + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/ticktock-log-sink.jar + env: +# LOGGING_FILE: ticktocklog.log +# MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile +# ENDPOINTS_LOGFILE_SENSITIVE: false +# SPRING_CLOUD_STREAM_BINDINGS_INPUT_DESTINATION: ticktock + logging.file: ticktocklog.log + endpoints.logfile.sensitive: false + spring.cloud.stream.bindings.input.destination: ticktock + #LOG_EXPRESSION: "'TICKTOCK - TIMESTAMP: '.concat(payload)" + log.expression: "'TICKTOCK - TIMESTAMP: '.concat(payload)" +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer1-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer1-manifest.yml new file mode 100644 index 0000000..474e9ea --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer1-manifest.yml @@ -0,0 +1,14 @@ +--- +applications: +- name: partitioning-consumer1 + host: partitioning-consumer1 + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/partitioning-consumer-rabbit.jar + env: + SPRING_APPLICATION_JSON: '{"maven": { "remote-repositories": { "repo1": { "url": "https://repo.spring.io/libs-snapshot"} } } }' + LOGGING_FILE: partconsumer1.log + MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer2-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer2-manifest.yml new file mode 100644 index 0000000..89f5d15 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer2-manifest.yml @@ -0,0 +1,15 @@ +--- +applications: +- name: partitioning-consumer2 + host: partitioning-consumer2 + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/partitioning-consumer-rabbit.jar + env: + SPRING_APPLICATION_JSON: '{"maven": { "remote-repositories": { "repo1": { "url": "https://repo.spring.io/libs-snapshot"} } } }' + LOGGING_FILE: partconsumer2.log + MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile + SPRING_CLOUD_STREAM_BINDINGS_INPUT_CONSUMER_INSTANCEINDEX: 1 +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer3-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer3-manifest.yml new file mode 100644 index 0000000..516c30b --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer3-manifest.yml @@ -0,0 +1,15 @@ +--- +applications: +- name: partitioning-consumer3 + host: partitioning-consumer3 + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/partitioning-consumer-rabbit.jar + env: + SPRING_APPLICATION_JSON: '{"maven": { "remote-repositories": { "repo1": { "url": "https://repo.spring.io/libs-snapshot"} } } }' + LOGGING_FILE: partconsumer3.log + MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile + SPRING_CLOUD_STREAM_BINDINGS_INPUT_CONSUMER_INSTANCEINDEX: 2 +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer4-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer4-manifest.yml new file mode 100644 index 0000000..0b2cdef --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-consumer4-manifest.yml @@ -0,0 +1,15 @@ +--- +applications: +- name: partitioning-consumer4 + host: partitioning-consumer4 + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/partitioning-consumer-rabbit.jar + env: + SPRING_APPLICATION_JSON: '{"maven": { "remote-repositories": { "repo1": { "url": "https://repo.spring.io/libs-snapshot"} } } }' + LOGGING_FILE: partconsumer4.log + MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile + SPRING_CLOUD_STREAM_BINDINGS_INPUT_CONSUMER_INSTANCEINDEX: 3 +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-producer-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-producer-manifest.yml new file mode 100644 index 0000000..3ce9be2 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/partitioning-producer-manifest.yml @@ -0,0 +1,14 @@ +--- +applications: +- name: partitioning-producer + host: partitioning-producer + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/partitioning-producer-rabbit.jar + env: + SPRING_APPLICATION_JSON: '{"maven": { "remote-repositories": { "repo1": { "url": "https://repo.spring.io/libs-snapshot"} } } }' + LOGGING_FILE: partproducer.log + MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/time-source-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/time-source-manifest.yml new file mode 100644 index 0000000..c15cc4a --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/time-source-manifest.yml @@ -0,0 +1,18 @@ +--- +applications: +- name: ticktock-time-source + host: ticktock-time-source + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/ticktock-time-source.jar + env: +# LOGGING_FILE: ticktocktime.log +# MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile +# ENDPOINTS_LOGFILE_SENSITIVE: false + logging.file: ticktocklog.log + endpoints.logfile.sensitive: false + #SPRING_CLOUD_STREAM_BINDINGS_OUTPUT_DESTINATION: ticktock + spring.cloud.stream.bindings.output.destination: ticktock +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/manifests/uppercase-processor-manifest.yml b/spring-cloud-stream-cf-acceptance-tests/manifests/uppercase-processor-manifest.yml new file mode 100644 index 0000000..5c772dc --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/manifests/uppercase-processor-manifest.yml @@ -0,0 +1,14 @@ +--- +applications: +- name: uppercase-transformer + host: uppercase-transformer + memory: 2G + disk_quota: 2G + instances: 1 + path: /tmp/uppercase-transformer-rabbit.jar + env: + SPRING_APPLICATION_JSON: '{"maven": { "remote-repositories": { "repo1": { "url": "https://repo.spring.io/libs-snapshot"} } } }' + LOGGING_FILE: uppercase.log + MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: logfile +services: +- scst-rabbit \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/mvnw b/spring-cloud-stream-cf-acceptance-tests/mvnw new file mode 100755 index 0000000..6efc7bd --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/mvnw @@ -0,0 +1,226 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +echo $MAVEN_PROJECTBASEDIR +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +"$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" + diff --git a/spring-cloud-stream-cf-acceptance-tests/mvnw.cmd b/spring-cloud-stream-cf-acceptance-tests/mvnw.cmd new file mode 100644 index 0000000..b0dc0e7 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/spring-cloud-stream-cf-acceptance-tests/pom.xml b/spring-cloud-stream-cf-acceptance-tests/pom.xml new file mode 100644 index 0000000..160ec26 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + spring-cloud-stream-cf-acceptance-tests + 0.0.1-SNAPSHOT + jar + spring-cloud-stream-cf-acceptance-tests + Spring Cloud Stream CF Acceptance Tests + + + org.springframework.cloud + spring-cloud-build + 2.0.0.BUILD-SNAPSHOT + + + + true + + + + + org.springframework.boot + spring-boot-starter-web + test + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/spring-cloud-stream-cf-acceptance-tests/runAcceptanceTests.sh b/spring-cloud-stream-cf-acceptance-tests/runAcceptanceTests.sh new file mode 100755 index 0000000..ae90f7e --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/runAcceptanceTests.sh @@ -0,0 +1,218 @@ + +#!/bin/bash + +# First argument is CF URL ($1) +# Second argument is CF User ($2) +# Third argument is CF Passwrod ($3) +# Fourth argument is CF Org ($4) +# Fifth argument is CF Space ($5) +# Optional sixth argument to skip ssl validation: skip-ssl-validation (No double hiphens (--) in the front) + +pushd () { + command pushd "$@" > /dev/null +} + +popd () { + command popd "$@" > /dev/null +} + +function prepare_ticktock_13_with_rabbit_binder() { + + wget -O /tmp/ticktock-time-source.jar http://repo.spring.io/release/org/springframework/cloud/stream/app/time-source-rabbit/1.3.1.RELEASE/time-source-rabbit-1.3.1.RELEASE.jar + + wget -O /tmp/ticktock-log-sink.jar http://repo.spring.io/release/org/springframework/cloud/stream/app/log-sink-rabbit/1.3.1.RELEASE/log-sink-rabbit-1.3.1.RELEASE.jar + + if [ $6 == "skip-ssl-validation" ] + then + cf login -a $1 --skip-ssl-validation -u $2 -p $3 -o $4 -s $5 + else + cf login -a $1 -u $2 -p $3 -o $4 -s $5 + fi + + cf push -f ./manifests/time-source-manifest.yml + + cf app ticktock-time-source > /tmp/ticktock-time-source-route.txt + + TICKTOCK_TIME_SOURCE_ROUTE=`grep routes /tmp/ticktock-time-source-route.txt | awk '{ print $2 }'` + + FULL_TICKTOCK_TIME_SOURCE_ROUTE=http://$TICKTOCK_TIME_SOURCE_ROUTE + + cf push -f ./manifests/log-sink-manifest.yml + + cf app ticktock-log-sink > /tmp/ticktock-log-sink-route.txt + + TICKTOCK_LOG_SINK_ROUTE=`grep routes /tmp/ticktock-log-sink-route.txt | awk '{ print $2 }'` + + FULL_TICKTOCK_LOG_SINK_ROUTE=http://$TICKTOCK_LOG_SINK_ROUTE +} + +function prepare_uppercase_transformer_with_rabbit_binder() { + + wget -O /tmp/uppercase-transformer-rabbit.jar http://repo.spring.io/libs-snapshot-local/io/spring/cloud/stream/sample/uppercase-transformer/0.0.1-SNAPSHOT/uppercase-transformer-0.0.1-SNAPSHOT-rabbit.jar + + if [ $6 == "skip-ssl-validation" ] + then + cf login -a $1 --skip-ssl-validation -u $2 -p $3 -o $4 -s $5 + else + cf login -a $1 -u $2 -p $3 -o $4 -s $5 + fi + + cf push -f ./manifests/uppercase-processor-manifest.yml + + cf app uppercase-transformer > /tmp/uppercase-route.txt + + UPPERCASE_PROCESSOR_ROUTE=`grep routes /tmp/uppercase-route.txt | awk '{ print $2 }'` + + FULL_UPPERCASE_ROUTE=http://$UPPERCASE_PROCESSOR_ROUTE +} + +function prepare_partitioning_test_with_rabbit_binder() { + + wget -O /tmp/partitioning-producer-rabbit.jar http://repo.spring.io/libs-snapshot-local/io/spring/cloud/stream/sample/partitioning-producer/0.0.1-SNAPSHOT/partitioning-producer-0.0.1-SNAPSHOT-rabbit.jar + wget -O /tmp/partitioning-consumer-rabbit.jar http://repo.spring.io/libs-snapshot-local/io/spring/cloud/stream/sample/partitioning-consumer-rabbit/0.0.1-SNAPSHOT/partitioning-consumer-rabbit-0.0.1-SNAPSHOT.jar + + if [ $6 == "skip-ssl-validation" ] + then + cf login -a $1 --skip-ssl-validation -u $2 -p $3 -o $4 -s $5 + else + cf login -a $1 -u $2 -p $3 -o $4 -s $5 + fi + + cf push -f ./manifests/partitioning-producer-manifest.yml + + cf app partitioning-producer > /tmp/part-producer-route.txt + + PARTITIONING_PRODUCER_ROUTE=`grep routes /tmp/part-producer-route.txt | awk '{ print $2 }'` + + FULL_PARTITIONING_PRODUCER_ROUTE=http://$PARTITIONING_PRODUCER_ROUTE + + # consumer 1 + + cf push -f ./manifests/partitioning-consumer1-manifest.yml + + cf app partitioning-consumer1 > /tmp/part-consumer1-route.txt + + PARTITIONING_CONSUMER1_ROUTE=`grep routes /tmp/part-consumer1-route.txt | awk '{ print $2 }'` + + FULL_PARTITIONING_CONSUMER1_ROUTE=http://$PARTITIONING_CONSUMER1_ROUTE + + #consumer 2 + + cf push -f ./manifests/partitioning-consumer2-manifest.yml + + cf app partitioning-consumer2 > /tmp/part-consumer2-route.txt + + PARTITIONING_CONSUMER2_ROUTE=`grep routes /tmp/part-consumer2-route.txt | awk '{ print $2 }'` + + FULL_PARTITIONING_CONSUMER2_ROUTE=http://$PARTITIONING_CONSUMER2_ROUTE + + #consumer 3 + + cf push -f ./manifests/partitioning-consumer3-manifest.yml + + cf app partitioning-consumer3 > /tmp/part-consumer3-route.txt + + PARTITIONING_CONSUMER3_ROUTE=`grep routes /tmp/part-consumer3-route.txt | awk '{ print $2 }'` + + FULL_PARTITIONING_CONSUMER3_ROUTE=http://$PARTITIONING_CONSUMER3_ROUTE + + #consumer 4 + + cf push -f ./manifests/partitioning-consumer4-manifest.yml + + cf app partitioning-consumer4 > /tmp/part-consumer4-route.txt + + PARTITIONING_CONSUMER4_ROUTE=`grep routes /tmp/part-consumer4-route.txt | awk '{ print $2 }'` + + FULL_PARTITIONING_CONSUMER4_ROUTE=http://$PARTITIONING_CONSUMER4_ROUTE +} + +#Main script starting + +SECONDS=0 + +echo "Prepare artifacts for ticktock testing" + +prepare_ticktock_13_with_rabbit_binder $1 $2 $3 $4 $5 $6 + +./mvnw clean package -Dtest=TickTockAcceptanceTests -Dmaven.test.skip=false -Dtime.source.route=$FULL_TICKTOCK_TIME_SOURCE_ROUTE -Dlog.sink.route=$FULL_TICKTOCK_LOG_SINK_ROUTE +BUILD_RETURN_VALUE=$? + +cf stop ticktock-time-source +cf stop ticktock-log-sink + +cf delete ticktock-time-source -f +cf delete ticktock-log-sink -f + +cf logout + +rm /tmp/ticktock-time-source-route.txt +rm /tmp/ticktock-log-sink-route.txt + +if [ "$BUILD_RETURN_VALUE" != 0 ] +then + echo "Early exit due to test failure in ticktock tests" + duration=$SECONDS + + echo "Total time: Build took $(($duration / 60)) minutes and $(($duration % 60)) seconds to complete." + + exit $BUILD_RETURN_VALUE +fi + +echo "Prepare artifacts for uppercase transformer testing" + +prepare_uppercase_transformer_with_rabbit_binder $1 $2 $3 $4 $5 $6 + +./mvnw clean package -Dtest=SimpleProcessorTests -Dmaven.test.skip=false -Duppercase.processor.route=$FULL_UPPERCASE_ROUTE +BUILD_RETURN_VALUE=$? + +cf stop uppercase-transformer + +cf delete uppercase-transformer -f + +cf logout + +rm /tmp/uppercase-route.txt + +if [ "$BUILD_RETURN_VALUE" != 0 ] +then + echo "Early exit due to test failure in uppercase transformer" + duration=$SECONDS + + echo "Total time: Build took $(($duration / 60)) minutes and $(($duration % 60)) seconds to complete." + + exit $BUILD_RETURN_VALUE +fi + +echo "Prepare artifacts for partitions testing" + +prepare_partitioning_test_with_rabbit_binder $1 $2 $3 $4 $5 $6 + +./mvnw clean package -Dtest=PartitionAcceptanceTests -Dmaven.test.skip=false -Duppercase.processor.route=$FULL_UPPERCASE_ROUTE -Dpartitioning.producer.route=$FULL_PARTITIONING_PRODUCER_ROUTE -Dpartitioning.consumer1.route=$FULL_PARTITIONING_CONSUMER1_ROUTE -Dpartitioning.consumer2.route=$FULL_PARTITIONING_CONSUMER2_ROUTE -Dpartitioning.consumer3.route=$FULL_PARTITIONING_CONSUMER3_ROUTE -Dpartitioning.consumer4.route=$FULL_PARTITIONING_CONSUMER4_ROUTE +BUILD_RETURN_VALUE=$? + +cf stop partitioning-producer +cf stop partitioning-consumer1 +cf stop partitioning-consumer2 +cf stop partitioning-consumer3 +cf stop partitioning-consumer4 + +cf delete partitioning-producer -f +cf delete partitioning-consumer1 -f +cf delete partitioning-consumer2 -f +cf delete partitioning-consumer3 -f +cf delete partitioning-consumer4 -f + +cf logout + +rm /tmp/part-producer-route.txt +rm /tmp/part-consumer1-route.txt +rm /tmp/part-consumer2-route.txt +rm /tmp/part-consumer3-route.txt +rm /tmp/part-consumer4-route.txt + +duration=$SECONDS + +echo "Cumulative Build Time Across All Tests: Build took $(($duration / 60)) minutes and $(($duration % 60)) seconds to complete." + +exit $BUILD_RETURN_VALUE \ No newline at end of file diff --git a/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/AbstractCFAcceptanceTests.java b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/AbstractCFAcceptanceTests.java new file mode 100644 index 0000000..8d22cad --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/AbstractCFAcceptanceTests.java @@ -0,0 +1,90 @@ +/* + * Copyright 2018 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 sample.acceptance.tests; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; + +import java.util.stream.Stream; + + +/** + * @author Soby Chacko + */ +abstract class AbstractCFAcceptanceTests { + + private static final Logger logger = LoggerFactory.getLogger(AbstractCFAcceptanceTests.class); + + boolean waitForLogEntry(boolean noBoot2, String app, String route, String... entries) { + return waitForLogEntryInResource(noBoot2, app, route, entries); + } + + boolean waitForLogEntry(String app, String route, String... entries) { + return waitForLogEntryInResource(false, app, route, entries); + } + + private String getLog(String url) { + RestTemplate restTemplate = new RestTemplate(); + String logFileUrl = String.format("%s/logfile", url); + String log = null; + try { + log = restTemplate.getForObject(logFileUrl, String.class); + if (log == null) { + logger.info("Unable to retrieve logfile from '" + logFileUrl); + } else { + logger.info("Retrieved logfile from '" + logFileUrl); + } + } catch (HttpClientErrorException e) { + logger.info("Failed to access logfile from '" + logFileUrl + "' due to : " + e.getMessage()); + } catch (Exception e) { + logger.warn("Error while trying to access logfile from '" + logFileUrl + "' due to : " + e); + } + return log; + } + + private boolean waitForLogEntryInResource(boolean noBoot2, String app, String route, String... entries) { + logger.info("Looking for '" + StringUtils.arrayToCommaDelimitedString(entries) + "' in logfile for " + app + " - " + route); + long timeout = System.currentTimeMillis() + (30 * 1000); + boolean exists = false; + while (!exists && System.currentTimeMillis() < timeout) { + try { + Thread.sleep(7 * 1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IllegalStateException(e.getMessage(), e); + } + logger.info("Polling to get log file. Remaining poll time = " + + (timeout - System.currentTimeMillis() + " ms.")); + String log = noBoot2 ? getLog(route) : getLog(route + "/actuator"); + if (log != null) { + if (Stream.of(entries).allMatch(s -> log.contains(s))) { + exists = true; + } + } + } + if (exists) { + logger.info("Matched all '" + StringUtils.arrayToCommaDelimitedString(entries) + "' in logfile for app " + app); + } else { + logger.error("ERROR: Couldn't find all '" + StringUtils.arrayToCommaDelimitedString(entries) + "' in logfile for " + app); + } + return exists; + } + +} diff --git a/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningCFAcceptanceTests.java b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningCFAcceptanceTests.java new file mode 100644 index 0000000..4bcca4e --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningCFAcceptanceTests.java @@ -0,0 +1,104 @@ +/* + * Copyright 2018 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 sample.acceptance.tests; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import static org.junit.Assert.fail; + +/** + * Do not run these tests as part of an IDE build or individually. + * These are acceptance tests for the spring cloud stream samples. + * The recommended way to run these tests are using the runAcceptanceTests.sh script in this module. + * More about running that script can be found in the README. + * + * @author Soby Chacko + */ +public class PartitioningCFAcceptanceTests extends AbstractCFAcceptanceTests { + + private static final Logger logger = LoggerFactory.getLogger(PartitioningCFAcceptanceTests.class); + + @Test + public void testPartitioningWith4ConsumersRabbit() throws Exception { + + Thread.sleep(10_000); + + String prodUrl = System.getProperty("partitioning.producer.route"); + + boolean foundLogs = waitForLogEntry("Partitioning producer", prodUrl, "Started PartProducerApplication in"); + if(!foundLogs) { + fail("Did not find the logging messages."); + } + + String consumer1Url = System.getProperty("partitioning.consumer1.route"); + String consumer2Url = System.getProperty("partitioning.consumer2.route"); + String consumer3Url = System.getProperty("partitioning.consumer3.route"); + String consumer4Url = System.getProperty("partitioning.consumer4.route"); + + Future future1 = verifyPartitions("Partitioning Consumer-1", consumer1Url, + "f received from partition partitioned.destination.myGroup-0", + "g received from partition partitioned.destination.myGroup-0", + "h received from partition partitioned.destination.myGroup-0"); + Future future2 = verifyPartitions("Partitioning Consumer-2", consumer2Url, + "fo received from partition partitioned.destination.myGroup-1", + "go received from partition partitioned.destination.myGroup-1", + "ho received from partition partitioned.destination.myGroup-1"); + Future future3 = verifyPartitions("Partitioning Consumer-3",consumer3Url, + "foo received from partition partitioned.destination.myGroup-2", + "goo received from partition partitioned.destination.myGroup-2", + "hoo received from partition partitioned.destination.myGroup-2"); + Future future4 = verifyPartitions("Partitioning Consumer-4",consumer4Url, + "fooz received from partition partitioned.destination.myGroup-3", + "gooz received from partition partitioned.destination.myGroup-3", + "hooz received from partition partitioned.destination.myGroup-3"); + + verifyResults(future1, future2, future3, future4); + } + + private Future verifyPartitions(String consumer1Msg, String consumerRoute, + String... entries) { + + ExecutorService executorService = Executors.newSingleThreadExecutor(); + + Future submit = executorService.submit(() -> { + boolean found = waitForLogEntry(consumer1Msg, consumerRoute, entries); + if (!found) { + fail("Could not find the test data in the logs"); + } + }); + + executorService.shutdown(); + return submit; + } + + private void verifyResults(Future... futures) throws Exception { + for (Future future : futures) { + try { + future.get(); + } + catch (Exception e) { + throw e; + } + } + } +} diff --git a/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/TickTockCFAcceptanceTests.java b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/TickTockCFAcceptanceTests.java new file mode 100644 index 0000000..72f3957 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/TickTockCFAcceptanceTests.java @@ -0,0 +1,50 @@ +/* + * Copyright 2018 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 sample.acceptance.tests; + +import org.junit.Test; + +import static org.junit.Assert.fail; + +/** + * @author Soby Chacko + */ +public class TickTockCFAcceptanceTests extends AbstractCFAcceptanceTests { + + @Test + public void testTickTock13Rabbit() { + + String timeSourceUrl = System.getProperty("time.source.route"); + String logSinkUrl = System.getProperty("log.sink.route"); + + boolean foundLogs = waitForLogEntry(true, "Time Source", timeSourceUrl, "Started TimeSource"); + if(!foundLogs) { + fail("Did not find the time source started logging message."); + } + + foundLogs = waitForLogEntry(true,"Log Sink", logSinkUrl, "Started LogSink"); + if(!foundLogs) { + fail("Did not find the log sink started logging message."); + } + + foundLogs = waitForLogEntry(true,"Log Sink", logSinkUrl, "TICKTOCK - TIMESTAMP:"); + if(!foundLogs) { + fail("Did not find the ticktock messages in log sink"); + } + } + +} diff --git a/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/UppercaseTransformerCFAcceptanceTests.java b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/UppercaseTransformerCFAcceptanceTests.java new file mode 100644 index 0000000..ce17422 --- /dev/null +++ b/spring-cloud-stream-cf-acceptance-tests/src/test/java/sample/acceptance/tests/UppercaseTransformerCFAcceptanceTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2018 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 sample.acceptance.tests; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.junit.Assert.fail; + +/** + * Do not run these tests as part of an IDE build or individually. + * These are acceptance tests for the spring cloud stream samples. + * The recommended way to run these tests are using the runAcceptanceTests.sh script in this module. + * More about running that script can be found in the README. + * + * @author Soby Chacko + */ +public class UppercaseTransformerCFAcceptanceTests extends AbstractCFAcceptanceTests { + + private static final Logger logger = LoggerFactory.getLogger(UppercaseTransformerCFAcceptanceTests.class); + + @Test + public void testUppercaseTransformerRabbit() { + + String url = System.getProperty("uppercase.processor.route"); + + boolean foundLogs = waitForLogEntry("Uppercase Transformer", url, "Started UppercaseTransformerApplication in", + "Data received: FOO", "Data received: BAR"); + if(!foundLogs) { + fail("Did not find the logging messages."); + } + } +} diff --git a/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningAcceptanceTests.java b/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningLocalAcceptanceTests.java similarity index 98% rename from spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningAcceptanceTests.java rename to spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningLocalAcceptanceTests.java index b69e97d..c6b0ef5 100644 --- a/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningAcceptanceTests.java +++ b/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/PartitioningLocalAcceptanceTests.java @@ -15,9 +15,9 @@ import static org.junit.Assert.fail; /** * @author Soby Chacko */ -public class PartitioningAcceptanceTests extends AbstractLocalTests { +public class PartitioningLocalAcceptanceTests extends AbstractLocalTests { - private static final Logger logger = LoggerFactory.getLogger(PartitioningAcceptanceTests.class); + private static final Logger logger = LoggerFactory.getLogger(PartitioningLocalAcceptanceTests.class); @Test public void testPartitioningKafka() throws Exception { diff --git a/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/SchemaRegistryVanillaTests.java b/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/SchemaRegistryVanillaLocalAcceptanceTests.java similarity index 97% rename from spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/SchemaRegistryVanillaTests.java rename to spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/SchemaRegistryVanillaLocalAcceptanceTests.java index c17b4ea..8a806c4 100644 --- a/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/SchemaRegistryVanillaTests.java +++ b/spring-cloud-stream-local-acceptance-tests/src/test/java/sample/acceptance/tests/SchemaRegistryVanillaLocalAcceptanceTests.java @@ -15,9 +15,9 @@ import static org.junit.Assert.fail; /** * @author Soby Chacko */ -public class SchemaRegistryVanillaTests extends AbstractLocalTests { +public class SchemaRegistryVanillaLocalAcceptanceTests extends AbstractLocalTests { - private static final Logger logger = LoggerFactory.getLogger(SchemaRegistryVanillaTests.class); + private static final Logger logger = LoggerFactory.getLogger(SchemaRegistryVanillaLocalAcceptanceTests.class); @Test public void testSchemaRegistryVanillaKafka() throws Exception {