diff options
author | zpencer <spencerfang@google.com> | 2017-10-06 10:44:58 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-06 10:44:58 -0700 |
commit | b07c70a09f2e45e578d315d7aa9f0f9fedda6d1a (patch) | |
tree | bf0f65cd5541799fea7c947c6a1ccf996d13b6f9 | |
parent | 80ac407c6c59fe9833f8f25f3876becbce245ab0 (diff) | |
download | grpc-grpc-java-b07c70a09f2e45e578d315d7aa9f0f9fedda6d1a.tar.gz |
gae-interop-testing: add GAE interop tests (#3535)
See `gae-interop-testing/README.md` for details on how to run the tests.
23 files changed, 1241 insertions, 1 deletions
diff --git a/build.gradle b/build.gradle index ce47acb8b..b697be3b4 100644 --- a/build.gradle +++ b/build.gradle @@ -318,6 +318,7 @@ subprojects { repository(url: stagingUrl, configureAuth) snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/', configureAuth) } + uploadArchives.onlyIf { !name.contains("grpc-gae-interop-testing") } [ install.repositories.mavenInstaller, diff --git a/gae-interop-testing/README.md b/gae-interop-testing/README.md new file mode 100644 index 000000000..1f9bea364 --- /dev/null +++ b/gae-interop-testing/README.md @@ -0,0 +1,49 @@ +Google App Engine interop tests +===================================== + +This directory contains interop tests that runs in Google App Engine +as gRPC clients. + +Prerequisites +========================== + +- Install the Google Cloud SDK and ensure that `gcloud` is in the path +- Set up an [App Engine app](http://appengine.google.com) with your + choice of a PROJECT_ID. +- Associate your `gcloud` environment with your app: + ```bash + # Log into Google Cloud + $ gcloud auth login + + # Associate this codebase with a GAE project + $ gcloud config set project PROJECT_ID + ``` + +Running the tests in GAE +========================== + +You can run the gradle task to execute the interop tests. +```bash +# cd into either gae-jdk7 or gae-jdk8 +$ ./gradlew runInteropTestRemote + +# Or run one of these from the root gRPC Java directory: +$ ./gradlew :grpc-gae-interop-testing-jdk7:runInteropTestRemote +$ ./gradlew :grpc-gae-interop-testing-jdk8:runInteropTestRemote +``` + +Optional: + +You can also browse to `http://${PROJECT_ID}.appspot.google.com` to +see the result of the interop test. + + +Debugging +========================== + +You can find the server side logs by logging into +`http://appengine.google.com` and scrolling down to the section titled +`Application Errors` and `Server Errors`. + +Click on the `/` URI to view the log entries for each test run. + diff --git a/gae-interop-testing/gae-jdk7/build.gradle b/gae-interop-testing/gae-jdk7/build.gradle new file mode 100644 index 000000000..6d662460b --- /dev/null +++ b/gae-interop-testing/gae-jdk7/build.gradle @@ -0,0 +1,100 @@ +// Copyright 2017, gRPC Authors All rights reserved. +// +// 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. +description = 'gRPC: gae interop testing (jdk7)' + +buildscript { // Configuration for building + repositories { + jcenter() // Bintray's repository - a fast Maven Central mirror & more + mavenCentral() + } + dependencies { + classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3' + classpath 'com.squareup.okhttp:okhttp:2.5.0' + } +} + +repositories { // repositories for Jar's you access in your code + mavenLocal() + maven { + url 'https://maven-central.storage.googleapis.com' // Google's mirror of Maven Central + } + jcenter() + mavenCentral() +} + +apply plugin: 'java' // standard Java tasks +apply plugin: 'war' // standard Web Archive plugin +apply plugin: 'com.google.cloud.tools.appengine' // App Engine tasks + +dependencies { + providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5' + compile 'com.google.appengine:appengine:+' + // Deps needed by all gRPC apps in GAE + compile libraries.google_api_protos + compile project(":grpc-okhttp") + compile project(":grpc-protobuf") + compile project(":grpc-stub") + compile (project(":grpc-interop-testing")) { + // We want the gRPC and service definitions but NOT grpc-netty for jdk7 + exclude module: ":grpc-netty" + } +} + +// [START model] +appengine { // App Engine tasks configuration + run { // local (dev_appserver) configuration (standard environments only) + port = 8080 // default + } + + deploy { // deploy configuration + stopPreviousVersion = true // default - stop the current version + promote = true // default - & make this the current version + } +} +// [END model] + +group = 'io.grpc' // Generated output GroupId +version = '1.0-SNAPSHOT' // Version in generated output + +sourceCompatibility = 1.7 +targetCompatibility = 1.7 + +def getAppName() { + def stream = new ByteArrayOutputStream() + exec { + executable 'gcloud' + args = ['config', 'get-value', 'project'] + standardOutput = stream + } + return stream.toString().trim() +} + +task runInteropTestRemote(dependsOn: 'appengineDeploy') { + doLast { + // give remote app some time to settle down + sleep(5000) + + def appName = getAppName() + def client = new com.squareup.okhttp.OkHttpClient() + // The test suite can take a while to run + client.setReadTimeout(3, java.util.concurrent.TimeUnit.MINUTES) + // The '?jdk7' argument is ignored by the server, it exists only to tag the request log entry + def request = new com.squareup.okhttp.Request.Builder() + .url("http://${appName}.appspot.com/?jdk7").build() + def result = client.newCall(request).execute() + if (result.code() != 200) { + throw new GradleException("Interop test failed: " + result.body().string()) + } + } +} diff --git a/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.jar b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 000000000..736fb7d3f --- /dev/null +++ b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.jar diff --git a/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.properties b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..52dd1f044 --- /dev/null +++ b/gae-interop-testing/gae-jdk7/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip diff --git a/gae-interop-testing/gae-jdk7/gradlew b/gae-interop-testing/gae-jdk7/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/gae-interop-testing/gae-jdk7/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +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 +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +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 + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gae-interop-testing/gae-jdk7/gradlew.bat b/gae-interop-testing/gae-jdk7/gradlew.bat new file mode 100644 index 000000000..e95643d6a --- /dev/null +++ b/gae-interop-testing/gae-jdk7/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gae-interop-testing/gae-jdk7/settings.gradle b/gae-interop-testing/gae-jdk7/settings.gradle new file mode 100644 index 000000000..44b5ed8d8 --- /dev/null +++ b/gae-interop-testing/gae-jdk7/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/4.2/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'gae-jdk7' diff --git a/gae-interop-testing/gae-jdk7/src/main/java/io/grpc/testing/integration/OkHttpClientInteropServlet.java b/gae-interop-testing/gae-jdk7/src/main/java/io/grpc/testing/integration/OkHttpClientInteropServlet.java new file mode 100644 index 000000000..0e9437f29 --- /dev/null +++ b/gae-interop-testing/gae-jdk7/src/main/java/io/grpc/testing/integration/OkHttpClientInteropServlet.java @@ -0,0 +1,163 @@ +/* + * Copyright 2017, gRPC Authors All rights reserved. + * + * 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 io.grpc.testing.integration; + +import static junit.framework.TestCase.assertTrue; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.okhttp.OkHttpChannelBuilder; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.internal.AssumptionViolatedException; + +/** + * This servlet communicates with {@code grpc-test.sandbox.googleapis.com}, which is a server + * managed by the gRPC team. For more information, see + * <a href="https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md"> + * Interoperability Test Case Descriptions</a>. + */ +@SuppressWarnings("serial") +public final class OkHttpClientInteropServlet extends HttpServlet { + private static final String INTEROP_TEST_ADDRESS = "grpc-test.sandbox.googleapis.com:443"; + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setContentType("text/plain"); + PrintWriter writer = resp.getWriter(); + writer.println("Test invoked at: "); + writer.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z") + .format(Calendar.getInstance().getTime())); + + // We can not use JUnit because it tries to spawn backgrounds threads. + // GAE+JDK7 does not allow arbitrary background threads. + // Let's use reflection to run test methods. + Tester tester = new Tester(); + List<Method> befores = new ArrayList<>(); + List<Method> afters = new ArrayList<>(); + List<Method> testMethods = new ArrayList<>(); + int ignored = 0; + for (Method method : tester.getClass().getMethods()) { + if (method.getAnnotation(Test.class) != null) { + if (method.getAnnotation(Ignore.class) != null) { + ignored++; + } else { + testMethods.add(method); + } + } else if (method.getAnnotation(Before.class) != null) { + befores.add(method); + } else if (method.getAnnotation(After.class) != null) { + afters.add(method); + } + } + + StringBuilder sb = new StringBuilder(); + int failures = 0; + for (Method method : testMethods) { + try { + for (Method before : befores) { + before.invoke(tester); + } + method.invoke(tester); + for (Method after : afters) { + after.invoke(tester); + } + } catch (Exception e) { + // The default JUnit4 test runner skips tests with failed assumptions. + // We will do the same here. + boolean assumptionViolated = false; + for (Throwable iter = e; iter != null; iter = iter.getCause()) { + if (iter instanceof AssumptionViolatedException) { + assumptionViolated = true; + break; + } + } + if (assumptionViolated) { + continue; + } + + sb.append("================\n"); + sb.append("Test method: ").append(method).append("\n"); + failures++; + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + e.printStackTrace(printWriter); + sb.append(stringWriter); + } + } + if (failures == 0) { + resp.setStatus(200); + writer.println( + String.format( + "PASS! Tests ran %d, tests ignored %d", + testMethods.size(), + ignored)); + } else { + resp.setStatus(500); + writer.println( + String.format( + "FAILED! Tests ran %d, tests failed %d, tests ignored %d", + testMethods.size(), + failures, + ignored)); + } + writer.println(sb); + } + + public static final class Tester extends AbstractInteropTest { + @Override + protected ManagedChannel createChannel() { + ManagedChannelBuilder<?> builder = + ManagedChannelBuilder.forTarget(INTEROP_TEST_ADDRESS) + .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE); + assertTrue(builder instanceof OkHttpChannelBuilder); + return builder.build(); + } + + @Override + protected boolean metricsExpected() { + // Server-side metrics won't be found because the server is running remotely. + return false; + } + + // grpc-test.sandbox.googleapis.com does not support these tests + @Override + public void customMetadata() { } + + @Override + public void statusCodeAndMessage() { } + + @Override + public void exchangeMetadataUnaryCall() { } + + @Override + public void exchangeMetadataStreamingCall() { } + } +} diff --git a/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/appengine-web.xml b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 000000000..f874981a0 --- /dev/null +++ b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2017, gRPC Authors All rights reserved. + 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. +--> +<!-- [START config] --> +<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> + <application>YOUR-PROJECT-ID</application> + <version>YOUR-VERSION-ID</version> + <threadsafe>true</threadsafe> + <runtime>java7</runtime> +</appengine-web-app> +<!-- [END config] --> diff --git a/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/web.xml b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..35d6f8336 --- /dev/null +++ b/gae-interop-testing/gae-jdk7/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + version="2.5"> + <servlet> + <servlet-name>interoptest</servlet-name> + <servlet-class>io.grpc.testing.integration.OkHttpClientInteropServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>interoptest</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> +</web-app> diff --git a/gae-interop-testing/gae-jdk8/build.gradle b/gae-interop-testing/gae-jdk8/build.gradle new file mode 100644 index 000000000..449e13c1a --- /dev/null +++ b/gae-interop-testing/gae-jdk8/build.gradle @@ -0,0 +1,108 @@ +// Copyright 2017, gRPC Authors All rights reserved. +// +// 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. +description = 'gRPC: gae interop testing (jdk8)' + +buildscript { // Configuration for building + repositories { + jcenter() // Bintray's repository - a fast Maven Central mirror & more + mavenCentral() + } + dependencies { + classpath 'com.google.cloud.tools:appengine-gradle-plugin:1.3.3' + classpath 'com.squareup.okhttp:okhttp:2.5.0' + } +} + +repositories { // repositories for Jar's you access in your code + mavenLocal() + maven { + url 'https://maven-central.storage.googleapis.com' // Google's mirror of Maven Central + } + jcenter() + mavenCentral() +} + +apply plugin: 'java' // standard Java tasks +apply plugin: 'war' // standard Web Archive plugin +apply plugin: 'com.google.cloud.tools.appengine' // App Engine tasks + +dependencies { + providedCompile group: 'javax.servlet', name: 'servlet-api', version:'2.5' + compile 'com.google.appengine:appengine:+' + // Deps needed by all gRPC apps in GAE + compile libraries.google_api_protos + compile project(":grpc-okhttp") + compile project(":grpc-protobuf") + compile project(":grpc-stub") + compile (project(":grpc-interop-testing")) + compile libraries.netty_tcnative +} + +// [START model] +appengine { // App Engine tasks configuration + run { // local (dev_appserver) configuration (standard environments only) + port = 8080 // default + } + + deploy { // deploy configuration + stopPreviousVersion = true // default - stop the current version + promote = true // default - & make this the current version + } +} +// [END model] + +group = 'io.grpc' // Generated output GroupId +version = '1.0-SNAPSHOT' // Version in generated output + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +def getAppName() { + def stream = new ByteArrayOutputStream() + exec { + executable 'gcloud' + args = ['config', 'get-value', 'project'] + standardOutput = stream + } + return stream.toString().trim() +} + +task runInteropTestRemote(dependsOn: 'appengineDeploy') { + doLast { + // give remote app some time to settle down + sleep(5000) + + def appName = getAppName() + def client = new com.squareup.okhttp.OkHttpClient() + // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry + client.setReadTimeout(30, java.util.concurrent.TimeUnit.SECONDS) + def request = new com.squareup.okhttp.Request.Builder() + .url("http://${appName}.appspot.com/long_lived_channel?jdk8").build() + def result1 = client.newCall(request).execute() + def result2 = client.newCall(request).execute() + if (result1.code() != 200 || result2.code() != 200) { + throw new GradleException("Unable to reuse same channel across requests") + } + + // The test suite can take a while to run + client.setReadTimeout(3, java.util.concurrent.TimeUnit.MINUTES) + // The '?jdk8' argument is ignored by the server, it exists only to tag the request log entry + def interopRequest = new com.squareup.okhttp.Request.Builder() + .url("http://${appName}.appspot.com/?jdk8").build() + def result = client.newCall(interopRequest).execute() + if (result.code() != 200) { + throw new GradleException("Interop test failed: " + result.body().string()) + } + } +} diff --git a/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.jar b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 000000000..736fb7d3f --- /dev/null +++ b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.jar diff --git a/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.properties b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..52dd1f044 --- /dev/null +++ b/gae-interop-testing/gae-jdk8/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip diff --git a/gae-interop-testing/gae-jdk8/gradlew b/gae-interop-testing/gae-jdk8/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/gae-interop-testing/gae-jdk8/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +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 +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +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 + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gae-interop-testing/gae-jdk8/gradlew.bat b/gae-interop-testing/gae-jdk8/gradlew.bat new file mode 100644 index 000000000..e95643d6a --- /dev/null +++ b/gae-interop-testing/gae-jdk8/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gae-interop-testing/gae-jdk8/settings.gradle b/gae-interop-testing/gae-jdk8/settings.gradle new file mode 100644 index 000000000..149fb9ab8 --- /dev/null +++ b/gae-interop-testing/gae-jdk8/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/4.2/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'gae-jdk8' diff --git a/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/LongLivedChannel.java b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/LongLivedChannel.java new file mode 100644 index 000000000..b4e37fdbd --- /dev/null +++ b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/LongLivedChannel.java @@ -0,0 +1,66 @@ +/* + * Copyright 2017, gRPC Authors All rights reserved. + * + * 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 io.grpc.testing.integration; + +import com.google.protobuf.ByteString; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.testing.integration.Messages.Payload; +import io.grpc.testing.integration.Messages.SimpleRequest; +import io.grpc.testing.integration.Messages.SimpleResponse; +import java.io.IOException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * A test class that checks we can reuse a channel across requests. + * + * <p>This servlet communicates with {@code grpc-test.sandbox.googleapis.com}, which is a server + * managed by the gRPC team. For more information, see + * <a href="https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md"> + * Interoperability Test Case Descriptions</a>. + */ +@SuppressWarnings("serial") +public final class LongLivedChannel extends HttpServlet { + private static final String INTEROP_TEST_ADDRESS = "grpc-test.sandbox.googleapis.com:443"; + private final ManagedChannel channel = + ManagedChannelBuilder.forTarget(INTEROP_TEST_ADDRESS).build(); + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + int requestSize = 1234; + int responseSize = 5678; + SimpleRequest request = SimpleRequest.newBuilder() + .setResponseSize(responseSize) + .setResponseType(Messages.PayloadType.COMPRESSABLE) + .setPayload(Payload.newBuilder() + .setBody(ByteString.copyFrom(new byte[requestSize]))) + .build(); + TestServiceGrpc.TestServiceBlockingStub blockingStub = + TestServiceGrpc.newBlockingStub(channel); + SimpleResponse simpleResponse = blockingStub.unaryCall(request); + resp.setContentType("text/plain"); + if (simpleResponse.getPayload().getBody().size() == responseSize) { + resp.setStatus(200); + resp.getWriter().println("PASS!"); + } else { + resp.setStatus(500); + resp.getWriter().println("FAILED!"); + } + } +} diff --git a/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/NettyClientInteropServlet.java b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/NettyClientInteropServlet.java new file mode 100644 index 000000000..3b9ff4620 --- /dev/null +++ b/gae-interop-testing/gae-jdk8/src/main/java/io/grpc/testing/integration/NettyClientInteropServlet.java @@ -0,0 +1,113 @@ +/* + * Copyright 2017, gRPC Authors All rights reserved. + * + * 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 io.grpc.testing.integration; + +import static junit.framework.TestCase.assertTrue; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.netty.NettyChannelBuilder; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.junit.runner.JUnitCore; +import org.junit.runner.Result; +import org.junit.runner.notification.Failure; + +/** + * This servlet communicates with {@code grpc-test.sandbox.googleapis.com}, which is a server + * managed by the gRPC team. For more information, see + * <a href="https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md"> + * Interoperability Test Case Descriptions</a>. + */ +@SuppressWarnings("serial") +public final class NettyClientInteropServlet extends HttpServlet { + private static final String INTEROP_TEST_ADDRESS = "grpc-test.sandbox.googleapis.com:443"; + + @Override + public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setContentType("text/plain"); + PrintWriter writer = resp.getWriter(); + writer.println("Test invoked at: "); + writer.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z") + .format(Calendar.getInstance().getTime())); + + Result result = new JUnitCore().run(Tester.class); + if (result.wasSuccessful()) { + resp.setStatus(200); + writer.println( + String.format( + "PASS! Tests ran %d, tests ignored %d", + result.getRunCount(), + result.getIgnoreCount())); + } else { + resp.setStatus(500); + writer.println( + String.format( + "FAILED! Tests ran %d, tests failed %d, tests ignored %d", + result.getRunCount(), + result.getFailureCount(), + result.getIgnoreCount())); + for (Failure failure : result.getFailures()) { + writer.println("================================"); + writer.println(failure.getTestHeader()); + Throwable thrown = failure.getException(); + StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter); + thrown.printStackTrace(printWriter); + writer.println(stringWriter); + } + } + } + + public static final class Tester extends AbstractInteropTest { + @Override + protected ManagedChannel createChannel() { + ManagedChannelBuilder<?> builder = + ManagedChannelBuilder.forTarget(INTEROP_TEST_ADDRESS) + .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE); + + assertTrue(builder instanceof NettyChannelBuilder); + ((NettyChannelBuilder) builder).flowControlWindow(65 * 1024); + return builder.build(); + } + + @Override + protected boolean metricsExpected() { + // Server-side metrics won't be found because the server is running remotely. + return false; + } + + // grpc-test.sandbox.googleapis.com does not support these tests + @Override + public void customMetadata() { } + + @Override + public void statusCodeAndMessage() { } + + @Override + public void exchangeMetadataUnaryCall() { } + + @Override + public void exchangeMetadataStreamingCall() { } + } +} diff --git a/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/appengine-web.xml b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 000000000..70e05f597 --- /dev/null +++ b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2017, gRPC Authors All rights reserved. + 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. +--> +<!-- [START config] --> +<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> + <application>YOUR-PROJECT-ID</application> + <version>YOUR-VERSION-ID</version> + <threadsafe>true</threadsafe> + <runtime>java8</runtime> +</appengine-web-app> +<!-- [END config] --> diff --git a/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/web.xml b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..2d825eb02 --- /dev/null +++ b/gae-interop-testing/gae-jdk8/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" + version="2.5"> + <servlet> + <servlet-name>interoptest</servlet-name> + <servlet-class>io.grpc.testing.integration.NettyClientInteropServlet</servlet-class> + </servlet> + <servlet> + <servlet-name>longlivedchannel</servlet-name> + <servlet-class>io.grpc.testing.integration.LongLivedChannel</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>interoptest</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> + <servlet-mapping> + <servlet-name>longlivedchannel</servlet-name> + <url-pattern>/long_lived_channel</url-pattern> + </servlet-mapping> +</web-app> diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java index c9f16218a..b66abd3de 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/AbstractInteropTest.java @@ -974,7 +974,7 @@ public abstract class AbstractInteropTest { @Test public void sendsTimeoutHeader() { - Assume.assumeTrue("can not capture server side request headers", server != null); + Assume.assumeTrue("can not capture request headers on server side", server != null); long configuredTimeoutMinutes = 100; TestServiceGrpc.TestServiceBlockingStub stub = blockingStub.withDeadlineAfter(configuredTimeoutMinutes, TimeUnit.MINUTES); diff --git a/settings.gradle b/settings.gradle index dbe8ab718..780e8c69d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,6 +12,8 @@ include ":grpc-grpclb" include ":grpc-testing" include ":grpc-testing-proto" include ":grpc-interop-testing" +include ":grpc-gae-interop-testing-jdk7" +include ":grpc-gae-interop-testing-jdk8" include ":grpc-all" include ":grpc-benchmarks" include ":grpc-services" @@ -29,6 +31,8 @@ project(':grpc-grpclb').projectDir = "$rootDir/grpclb" as File project(':grpc-testing').projectDir = "$rootDir/testing" as File project(':grpc-testing-proto').projectDir = "$rootDir/testing-proto" as File project(':grpc-interop-testing').projectDir = "$rootDir/interop-testing" as File +project(':grpc-gae-interop-testing-jdk7').projectDir = "$rootDir/gae-interop-testing/gae-jdk7" as File +project(':grpc-gae-interop-testing-jdk8').projectDir = "$rootDir/gae-interop-testing/gae-jdk8" as File project(':grpc-all').projectDir = "$rootDir/all" as File project(':grpc-benchmarks').projectDir = "$rootDir/benchmarks" as File project(':grpc-services').projectDir = "$rootDir/services" as File |