Move to Java 11 for building and running (#4706)

* Move to use JDK11 containers for running
* Switch to JDK11 for build
* Remove timestamps from generated code to work with JDK11
* Update gatling to support JDK11
* Fix up gradle tests to work with later version and JDK11
* Allow for gradle to target correct JDK

Co-authored-by: Chetan Mehrotra <chetanm@apache.org>
diff --git a/.travis.yml b/.travis.yml
index 40d85f8..7d9cfd6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,8 +18,13 @@
 sudo: required
 
 dist: xenial
-jdk: openjdk8
-language: java
+
+language: scala
+scala:
+   - 2.12.7
+
+jdk:
+  - openjdk11
 
 services:
   - docker
diff --git a/common/scala/Dockerfile b/common/scala/Dockerfile
index 6aa9637..8f52eff 100644
--- a/common/scala/Dockerfile
+++ b/common/scala/Dockerfile
@@ -14,8 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
-FROM adoptopenjdk/openjdk8:x86_64-alpine-jdk8u172-b11
+FROM adoptopenjdk/openjdk11:x86_64-alpine-jdk-11.0.3_7
 
 ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
diff --git a/tests/performance/gatling_tests/build.gradle b/tests/performance/gatling_tests/build.gradle
index 04c1b05..2600776 100644
--- a/tests/performance/gatling_tests/build.gradle
+++ b/tests/performance/gatling_tests/build.gradle
@@ -16,11 +16,18 @@
  */
 
 plugins {
-    id 'com.github.lkishalmi.gatling' version '0.7.2'
+    id 'com.github.lkishalmi.gatling' version '3.2.1'
     id 'eclipse'
     id 'scala'
 }
 
+sourceSets {
+    gatling {
+        scala.srcDirs = ["src/gatling/scala/"]
+        resources.srcDirs = ["src/gatling/resources/"]
+    }
+}
+
 dependencies {
     gatling "io.spray:spray-json_${gradle.scala.depVersion}:1.3.4"
     gatling "commons-io:commons-io:2.6"
diff --git a/tests/performance/gatling_tests/build.sh b/tests/performance/gatling_tests/build.sh
index 02cd3fa..8c60dea 100755
--- a/tests/performance/gatling_tests/build.sh
+++ b/tests/performance/gatling_tests/build.sh
@@ -25,13 +25,7 @@
   exit 0
 fi
 
-# need java 8 to build java actions since that's the version of the runtime currently
-jv=$(java -version 2>&1 | head -1 | awk -F'"' '{print $2}')
-if [[ $jv == 1.8.* ]]; then
-  echo "java version is $jv (ok)"
-  (cd src/gatling/resources/data/src/java && "$GRADLEW_PATH/gradlew" build && cp build/libs/gatling-1.0.jar ../../javaAction.jar)
-  touch .built
-else
-  echo "java version is $jv (not ok)"
-  echo "skipping java actions"
-fi
+# Let gradle set the source and target versions to let it sort out if it can produce
+# byte code that is compatible with java8.
+(cd src/gatling/resources/data/src/java && "$GRADLEW_PATH/gradlew" build && cp build/libs/gatling-1.0.jar ../../javaAction.jar)
+touch .built
diff --git a/tests/performance/gatling_tests/src/gatling/resources/data/src/java/build.gradle b/tests/performance/gatling_tests/src/gatling/resources/data/src/java/build.gradle
index c6df5f6..390d17d 100644
--- a/tests/performance/gatling_tests/src/gatling/resources/data/src/java/build.gradle
+++ b/tests/performance/gatling_tests/src/gatling/resources/data/src/java/build.gradle
@@ -19,6 +19,11 @@
     id 'java'
 }
 
+compileJava   {
+  sourceCompatibility = '1.8'
+  targetCompatibility = '1.8'
+}
+
 version = '1.0'
 
 repositories {
diff --git a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/BlockingInvokeOneActionSimulation.scala b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/BlockingInvokeOneActionSimulation.scala
index 4fb2540..fc053d6 100644
--- a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/BlockingInvokeOneActionSimulation.scala
+++ b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/BlockingInvokeOneActionSimulation.scala
@@ -23,8 +23,7 @@
 import org.apache.openwhisk.extension.whisk.Predef._
 import io.gatling.core.Predef._
 import io.gatling.core.structure.ScenarioBuilder
-import io.gatling.core.util.Resource
-import org.apache.commons.io.FileUtils
+import io.gatling.core.util.ClasspathPackagedResource
 
 import scala.concurrent.duration._
 
@@ -51,17 +50,15 @@
   val async = sys.env.getOrElse("ASYNC", "false").toBoolean
 
   val actionName = "testActionForBlockingInvokeOneAction"
-  val actionfile = if (async) "nodeJSAsyncAction.js" else "nodeJSAction.js"
+  val actionfile = if (async) "/data/nodeJSAsyncAction.js" else "/data/nodeJSAction.js"
 
   // Define scenario
   val test: ScenarioBuilder = scenario(s"Invoke one ${if (async) "async" else "sync"} action blocking")
     .doIf(_.userId == 1) {
-      exec(
-        openWhisk("Create action")
-          .authenticate(uuid, key)
-          .action(actionName)
-          .create(FileUtils
-            .readFileToString(Resource.body(actionfile).get.file, StandardCharsets.UTF_8)))
+      exec(openWhisk("Create action")
+        .authenticate(uuid, key)
+        .action(actionName)
+        .create(ClasspathPackagedResource(actionfile, getClass.getResource(actionfile)).string(StandardCharsets.UTF_8)))
     }
     .rendezVous(connections)
     .during(5.seconds) {
diff --git a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/ColdBlockingInvokeSimulation.scala b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/ColdBlockingInvokeSimulation.scala
index 81acdb0..610c8ed 100644
--- a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/ColdBlockingInvokeSimulation.scala
+++ b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/ColdBlockingInvokeSimulation.scala
@@ -24,8 +24,7 @@
 import io.gatling.core.Predef._
 import io.gatling.core.session.Expression
 import io.gatling.core.structure.ScenarioBuilder
-import io.gatling.core.util.Resource
-import org.apache.commons.io.FileUtils
+import io.gatling.core.util.ClasspathPackagedResource
 
 import scala.concurrent.duration._
 
@@ -47,7 +46,7 @@
   // Generate the OpenWhiskProtocol
   val openWhiskProtocol: OpenWhiskProtocolBuilder = openWhisk.apiHost(host)
 
-  val feeder = csv("users.csv").queue
+  val feeder = csv("data/users.csv").queue
 
   // Define scenario
   val test: ScenarioBuilder = scenario("Invoke one action blocking")
@@ -84,8 +83,8 @@
     }
 
   private def actionCode = {
-    val code = FileUtils
-      .readFileToString(Resource.body("nodeJSAction.js").get.file, StandardCharsets.UTF_8)
+    val code = ClasspathPackagedResource("nodeJSAction.js", getClass.getResource("/data/nodeJSAction.js"))
+      .string(StandardCharsets.UTF_8)
     //Pad the code with empty space to increase the stored code size
     if (codeSize > 0) code + " " * codeSize else code
   }
diff --git a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/LatencySimulation.scala b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/LatencySimulation.scala
index 34eeee2..c3c4d79 100644
--- a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/LatencySimulation.scala
+++ b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/LatencySimulation.scala
@@ -23,8 +23,7 @@
 import org.apache.openwhisk.extension.whisk.Predef._
 import io.gatling.core.Predef._
 import io.gatling.core.session.Expression
-import io.gatling.core.util.Resource
-import org.apache.commons.io.FileUtils
+import io.gatling.core.util.ClasspathPackagedResource
 
 import scala.concurrent.duration._
 
@@ -65,14 +64,15 @@
    * `main` is only needed for java. This is the name of the class where the main method is located.
    */
   val actions: Seq[(String, String, String, String)] = Map(
-    "nodejs:default" -> (FileUtils
-      .readFileToString(Resource.body("nodeJSAction.js").get.file, StandardCharsets.UTF_8), "latencyTest_node", ""),
-    "python:default" -> (FileUtils
-      .readFileToString(Resource.body("pythonAction.py").get.file, StandardCharsets.UTF_8), "latencyTest_python", ""),
-    "swift:default" -> (FileUtils
-      .readFileToString(Resource.body("swiftAction.swift").get.file, StandardCharsets.UTF_8), "latencyTest_swift", ""),
-    "java:default" -> (Base64.getEncoder.encodeToString(
-      FileUtils.readFileToByteArray(Resource.body("javaAction.jar").get.file)), "latencyTest_java", "JavaAction"))
+    "nodejs:default" -> (ClasspathPackagedResource("nodeJSAction.js", getClass.getResource("/data/nodeJSAction.js"))
+      .string(StandardCharsets.UTF_8), "latencyTest_node", ""),
+    "python:default" -> (ClasspathPackagedResource("pythonAction.py", getClass.getResource("/data/pythonAction.py"))
+      .string(StandardCharsets.UTF_8), "latencyTest_python", ""),
+    "swift:default" -> (ClasspathPackagedResource("swiftAction.swift", getClass.getResource("/data/swiftAction.swift"))
+      .string(StandardCharsets.UTF_8), "latencyTest_swift", ""),
+    "java:default" -> (Base64.getEncoder.encodeToString(ClasspathPackagedResource(
+      "javaAction.jar",
+      getClass.getResource("/data/javaAction.jar")).bytes), "latencyTest_java", "JavaAction"))
     .filterNot(e => excludedKinds.contains(e._1))
     .map {
       case (kind, (code, name, main)) =>
diff --git a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/extension/whisk/OpenWhiskProtocolBuilder.scala b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/extension/whisk/OpenWhiskProtocolBuilder.scala
index a3564e9..8a0ac13 100644
--- a/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/extension/whisk/OpenWhiskProtocolBuilder.scala
+++ b/tests/performance/gatling_tests/src/gatling/scala/org/apache/openwhisk/extension/whisk/OpenWhiskProtocolBuilder.scala
@@ -20,9 +20,9 @@
 import java.net.URL
 
 import com.softwaremill.quicklens._
-import io.gatling.core.Predef._
 import io.gatling.core.config.GatlingConfiguration
 import io.gatling.http.Predef._
+import io.gatling.core.Predef._
 import io.gatling.http.protocol.HttpProtocol
 
 import scala.language.implicitConversions
@@ -72,7 +72,7 @@
   /** build the http protocol with the parameters provided by the openwhisk-protocol. */
   def build(implicit configuration: GatlingConfiguration) = {
     http
-      .baseURL(s"${protocol.protocol}://${protocol.apiHost}:${protocol.port}")
+      .baseUrl(s"${protocol.protocol}://${protocol.apiHost}:${protocol.port}")
       .contentTypeHeader("application/json")
       .userAgentHeader("gatlingLoadTest")
       .warmUp("http://google.com")
diff --git a/tests/src/test/resources/swagger-config.json b/tests/src/test/resources/swagger-config.json
index f8696d3..3bb7d7e 100644
--- a/tests/src/test/resources/swagger-config.json
+++ b/tests/src/test/resources/swagger-config.json
@@ -1,4 +1,5 @@
 {
     "library": "okhttp-gson",
-    "dateLibrary": "java8"
+    "dateLibrary": "java8",
+    "hideGenerationTimestamp": true
 }