You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by cs...@apache.org on 2017/06/26 16:00:16 UTC

[incubator-openwhisk-cli] 36/36: Modifying the test cases for cli repo

This is an automated email from the ASF dual-hosted git repository.

csantanapr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-cli.git

commit cd1e3fb0e7a1412e3c0993d4d055202494adcb2e
Author: Vincent Hou <sh...@us.ibm.com>
AuthorDate: Thu Jun 15 15:45:31 2017 -0400

    Modifying the test cases for cli repo
    
    This PR establishes the framework of scala test cases for openwhisk cli.
    Since we only have scala test cases as the legacy, we tentatively port
    the test cases from openwhisk to this repo.
---
 .gitignore                                         |   1 -
 README.md                                          |   6 +-
 build.gradle                                       |   2 +-
 gradle/docker.gradle                               |   6 +-
 gradle/wrapper/gradle-wrapper.jar                  | Bin 53556 -> 52818 bytes
 gradle/wrapper/gradle-wrapper.properties           |   2 +-
 settings.gradle                                    |  16 ++
 tests/build.gradle                                 |  34 +++
 tests/dat/actions/applicationError.js              |   3 +
 tests/dat/actions/argCheck.js                      |   3 +
 tests/dat/actions/asyncError.js                    |   3 +
 tests/dat/actions/blackbox.zip                     | Bin 0 -> 256 bytes
 tests/dat/actions/cat.js                           |  13 ++
 tests/dat/actions/corsHeaderMod.js                 |   9 +
 tests/dat/actions/countdown.js                     |  20 ++
 tests/dat/actions/echo-web-http.js                 |  10 +
 tests/dat/actions/echo.js                          |   6 +
 tests/dat/actions/empty.js                         |   0
 tests/dat/actions/emptyJSONResult.js               |   2 +
 tests/dat/actions/head.js                          |  14 ++
 tests/dat/actions/hello.js                         |   8 +
 tests/dat/actions/helloAsync.js                    |  19 ++
 tests/dat/actions/helloContext.js                  |  10 +
 tests/dat/actions/helloDeadline.js                 |  24 +++
 tests/dat/actions/helloOpenwhiskPackage.js         |  26 +++
 tests/dat/actions/helloPromise.js                  |   9 +
 tests/dat/actions/initexit.js                      |   1 +
 tests/dat/actions/initforever.js                   |   1 +
 tests/dat/actions/invalidInput1.json               |   3 +
 tests/dat/actions/invalidInput2.json               |   4 +
 tests/dat/actions/invalidInput3.json               |   2 +
 tests/dat/actions/invalidInput4.json               |   3 +
 tests/dat/actions/malformed.js                     |   1 +
 tests/dat/actions/ping.js                          |  27 +++
 tests/dat/actions/printParams.js                   |  25 +++
 tests/dat/actions/python.zip                       | Bin 0 -> 726 bytes
 tests/dat/actions/runexit.js                       |   3 +
 tests/dat/actions/sort.js                          |  14 ++
 tests/dat/actions/split.js                         |  14 ++
 tests/dat/actions/textBody.js                      |   8 +
 tests/dat/actions/timeout.js                       |  18 ++
 tests/dat/actions/validInput1.json                 |  11 +
 tests/dat/actions/validInput2.json                 |   3 +
 tests/dat/actions/wc.js                            |  10 +
 tests/dat/actions/wcbin.js                         |  26 +++
 tests/dat/apigw/local.api.bad.yaml                 |  35 ++++
 tests/dat/apigw/local.api.yaml                     |  31 +++
 tests/dat/apigw/testswaggerdoc1                    |  83 ++++++++
 tests/dat/apigw/testswaggerdoc1V2                  |  61 ++++++
 tests/dat/apigw/testswaggerdoc2                    | 227 +++++++++++++++++++++
 tests/dat/apigw/testswaggerdoc2V2                  | 117 +++++++++++
 tests/dat/apigw/testswaggerdocinvalid              |  12 ++
 tests/src/integration/integration_test.go          |   4 +-
 .../apigw/healthtests/ApiGwEndToEndTests.scala     |   6 +-
 tests/src/test/scala/common/TestCLIUtils.scala     |  31 +++
 .../test/scala/system/basic/WskActionTests.scala   |  31 +--
 .../test/scala/system/basic/WskBasicTests.scala    |  30 +--
 .../test/scala/system/basic/WskConsoleTests.scala  |   6 +-
 .../test/scala/system/basic/WskPackageTests.scala  |   4 +-
 .../src/test/scala/system/basic/WskRuleTests.scala |   6 +-
 .../test/scala/system/basic/WskSequenceTests.scala |  27 ++-
 .../scala/whisk/core/cli/test/ApiGwTests.scala     |  48 ++---
 .../core/cli/test/WskActionSequenceTests.scala     |   6 +-
 .../whisk/core/cli/test/WskBasicUsageTests.scala   |  89 ++++----
 .../whisk/core/cli/test/WskEntitlementTests.scala  |  22 +-
 .../whisk/core/cli/test/WskWebActionsTests.scala   |  14 +-
 tools/travis/test_openwhisk.sh                     |   8 +-
 67 files changed, 1159 insertions(+), 159 deletions(-)

diff --git a/.gitignore b/.gitignore
index 1bf987c..0f85d25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-*.js
 javascript/
 wsk
 scripts
diff --git a/README.md b/README.md
index 757472b..58f2cc5 100644
--- a/README.md
+++ b/README.md
@@ -57,13 +57,13 @@ After that, open an terminal, go to the directory of OpenWhisk CLI home director
 build the binary via the following command under Linux or Mac:
 
 ```
-$ ./gradlew distDocker
+$ ./gradlew buildBinaries
 ```
 
 or run the following command for Windows:
 
 ```
-$ ./gradlew.bat distDocker
+$ ./gradlew.bat buildBinaries
 ```
 
 Finally, you can find the binary `wsk` or `wsk.exe` in the bin folder under the OpenWhisk CLI home directory. In
@@ -78,7 +78,7 @@ If you would like to build the binaries available for all the operating systems
 command:
 
 ```
-$ ./gradlew distDocker -PcrossCompileCLI=true
+$ ./gradlew buildBinaries -PcrossCompileCLI=true
 ```
 
 Then, you will find the binaries and their compressed packages generated under the folder bin/\<os\>/\<cpu arc\>/ for each
diff --git a/build.gradle b/build.gradle
index 0f8eee2..b2e471d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,7 +11,7 @@ task removeBinary(type: Delete) {
     delete "${projectDir}/bin/windows"
 }
 
-task distBinary(dependsOn: [removeBinary, distDocker]) {
+task distBinary(dependsOn: [removeBinary, buildBinaries]) {
     doLast {
         run(dockerBinary + ["rm", "-f", dockerContainerName], true)
         run(dockerBinary + ["run", "--name", dockerContainerName, dockerTaggedImageName])
diff --git a/gradle/docker.gradle b/gradle/docker.gradle
index f716c7b..9930f61 100644
--- a/gradle/docker.gradle
+++ b/gradle/docker.gradle
@@ -3,7 +3,7 @@ import groovy.time.*
 /**
  * Utility to build docker images based in gradle projects
  *
- * This extends gradle's 'application' plugin logic with a 'distDocker' task which builds
+ * This extends gradle's 'application' plugin logic with a 'buildBinaries' task which builds
  * a docker image from the Dockerfile of the project that applies this file. The image
  * is automatically tagged and pushed if a tag and/or a registry is given.
  *
@@ -42,7 +42,7 @@ if(project.hasProperty('dockerBuildArgs')) {
     }
 }
 
-task distDocker {
+task buildBinaries {
     doLast {
         def start = new Date()
         def cmd = dockerBinary + dockerBuildArg + ['-t', dockerImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
@@ -74,7 +74,7 @@ task pushImage {
 }
 pushImage.dependsOn tagImage
 pushImage.onlyIf { dockerRegistry != '' }
-distDocker.finalizedBy pushImage
+buildBinaries.finalizedBy pushImage
 
 def retry(cmd, retries, timeout) {
     println("${new Date()}: Executing '${cmd.join(" ")}'")
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index ca78035..deedc7f 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index cd3a0f7..5a6ee0e 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..f38f444
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,16 @@
+def owPath = System.getenv("OPENWHISK_HOME")
+def owDirectory = new File(owPath)
+
+include 'common:scala'; project(':common:scala').projectDir = new File(owDirectory, 'common/scala')
+include 'core:controller'; project(':core:controller').projectDir = new File(owDirectory, 'core/controller')
+include 'core:invoker'; project(':core:invoker').projectDir = new File(owDirectory, 'core/invoker')
+include 'clitests'; project(':clitests').projectDir = new File(owDirectory, 'tests')
+
+include 'tests'
+
+rootProject.name = 'openwhisk-cli'
+
+gradle.ext.scala = [
+    version: '2.11.8',
+    compileFlags: ['-feature', '-unchecked', '-deprecation', '-Xfatal-warnings', '-Ywarn-unused-import']
+]
diff --git a/tests/build.gradle b/tests/build.gradle
new file mode 100644
index 0000000..c11a0f9
--- /dev/null
+++ b/tests/build.gradle
@@ -0,0 +1,34 @@
+apply plugin: 'scala'
+apply plugin: 'eclipse'
+compileTestScala.options.encoding = 'UTF-8'
+
+evaluationDependsOn(':clitests')
+
+repositories {
+    mavenCentral()
+}
+
+tasks.withType(Test) {
+    testLogging {
+        events "passed", "skipped", "failed"
+        showStandardStreams = true
+        exceptionFormat = 'full'
+    }
+    outputs.upToDateWhen { false } // force tests to run every time
+}
+
+task testWithoutCredentials(type: Test) {
+    exclude 'packages/watson/**'
+    exclude 'packages/slack/**'
+    exclude 'packages/weather/**'
+}
+
+dependencies {
+    compile "org.scala-lang:scala-library:${gradle.scala.version}"
+    compile project(':clitests')
+    compile project(':clitests').sourceSets.test.output
+}
+
+tasks.withType(ScalaCompile) {
+    scalaCompileOptions.additionalParameters = gradle.scala.compileFlags
+}
diff --git a/tests/dat/actions/applicationError.js b/tests/dat/actions/applicationError.js
new file mode 100644
index 0000000..bc8a39d
--- /dev/null
+++ b/tests/dat/actions/applicationError.js
@@ -0,0 +1,3 @@
+function main(args) {
+    return { error: "This error thrown on purpose by the action."};
+}
diff --git a/tests/dat/actions/argCheck.js b/tests/dat/actions/argCheck.js
new file mode 100644
index 0000000..3220bfd
--- /dev/null
+++ b/tests/dat/actions/argCheck.js
@@ -0,0 +1,3 @@
+function main(params) {
+    return {payload: params.payload};
+}
diff --git a/tests/dat/actions/asyncError.js b/tests/dat/actions/asyncError.js
new file mode 100644
index 0000000..44686d7
--- /dev/null
+++ b/tests/dat/actions/asyncError.js
@@ -0,0 +1,3 @@
+function main(params) {
+    return Promise.reject({msg: 'failed activation on purpose'});
+}
diff --git a/tests/dat/actions/blackbox.zip b/tests/dat/actions/blackbox.zip
new file mode 100644
index 0000000..d66f3e3
Binary files /dev/null and b/tests/dat/actions/blackbox.zip differ
diff --git a/tests/dat/actions/cat.js b/tests/dat/actions/cat.js
new file mode 100644
index 0000000..4d73e56
--- /dev/null
+++ b/tests/dat/actions/cat.js
@@ -0,0 +1,13 @@
+/**
+ * Equivalent to unix cat command.
+ * Return all the lines in an array. All other fields in the input message are stripped.
+ * @param lines An array of strings.
+ */
+function main(msg) {
+    var lines = msg.lines || [];
+    var retn = {lines: lines, payload: lines.join("\n")};
+    console.log('cat: returning ' + JSON.stringify(retn));
+    return retn;
+}
+
+
diff --git a/tests/dat/actions/corsHeaderMod.js b/tests/dat/actions/corsHeaderMod.js
new file mode 100644
index 0000000..b85b4a1
--- /dev/null
+++ b/tests/dat/actions/corsHeaderMod.js
@@ -0,0 +1,9 @@
+function main() {
+    return {
+        headers: {
+            "Access-Control-Allow-Origin": "Origin set from Web Action",
+            "Access-Control-Allow-Headers": "Headers set from Web Action"
+        },
+        code: 200
+    }
+}
diff --git a/tests/dat/actions/countdown.js b/tests/dat/actions/countdown.js
new file mode 100644
index 0000000..520eb95
--- /dev/null
+++ b/tests/dat/actions/countdown.js
@@ -0,0 +1,20 @@
+/**
+ * An action that invokes itself recursively, programmatically using the whisk
+ * Javascript API.
+ */
+var openwhisk = require('openwhisk')
+
+function main(params) {
+    var wsk = openwhisk({ignore_certs: true})
+
+    var n = parseInt(params.n);
+    console.log(n);
+    if (n === 0) {
+        console.log('Happy New Year!');
+    } else if (n > 0) {
+        return wsk.actions.invoke({
+            actionName: process.env['__OW_ACTION_NAME'],
+            params: { n: n - 1 }
+        });
+    }
+}
diff --git a/tests/dat/actions/echo-web-http.js b/tests/dat/actions/echo-web-http.js
new file mode 100644
index 0000000..1fabbaa
--- /dev/null
+++ b/tests/dat/actions/echo-web-http.js
@@ -0,0 +1,10 @@
+function main(params) {
+    var bodyobj = params || {};
+    bodystr = JSON.stringify(bodyobj);
+    return {
+        statusCode: 200,
+        headers: { 'Content-Type': 'application/json' },
+        body: new Buffer(bodystr).toString('base64')
+    };
+}
+
diff --git a/tests/dat/actions/echo.js b/tests/dat/actions/echo.js
new file mode 100644
index 0000000..37df10b
--- /dev/null
+++ b/tests/dat/actions/echo.js
@@ -0,0 +1,6 @@
+/**
+ * Returns params, or an empty string if no parameter values are provided
+ */
+function main(params) {
+    return params || {};
+}
diff --git a/tests/dat/actions/empty.js b/tests/dat/actions/empty.js
new file mode 100644
index 0000000..e69de29
diff --git a/tests/dat/actions/emptyJSONResult.js b/tests/dat/actions/emptyJSONResult.js
new file mode 100644
index 0000000..b3ffc0a
--- /dev/null
+++ b/tests/dat/actions/emptyJSONResult.js
@@ -0,0 +1,2 @@
+function main(params) {
+}
diff --git a/tests/dat/actions/head.js b/tests/dat/actions/head.js
new file mode 100644
index 0000000..f6d5487
--- /dev/null
+++ b/tests/dat/actions/head.js
@@ -0,0 +1,14 @@
+/**
+ * Return the first num lines of an array.
+ * @param lines An array of strings.
+ * @param num Number of lines to return.
+ */
+function main(msg) {
+    var lines = msg.lines || [];
+    var num = msg.num || 1;
+    var head = lines.slice(0, num);
+    console.log('head get first ' + num + ' lines of ' + lines + ': ' + head);
+    return {lines: head, num: num};
+}
+
+
diff --git a/tests/dat/actions/hello.js b/tests/dat/actions/hello.js
new file mode 100644
index 0000000..82b3bcf
--- /dev/null
+++ b/tests/dat/actions/hello.js
@@ -0,0 +1,8 @@
+/**
+ * Hello, world.
+ */
+function main(params) {
+    greeting = 'hello, ' + params.payload + '!'
+    console.log(greeting);
+    return {payload: greeting}
+}
diff --git a/tests/dat/actions/helloAsync.js b/tests/dat/actions/helloAsync.js
new file mode 100644
index 0000000..2c0acdf
--- /dev/null
+++ b/tests/dat/actions/helloAsync.js
@@ -0,0 +1,19 @@
+/**
+ * word count utility, coded as an asynchronous action for pedagogical
+ * purposes
+ */
+function wc(params) {
+    var str = params.payload;
+    var words = str.split(" ");
+    var count = words.length;
+    console.log("The message '"+str+"' has", count, 'words');
+    return {count: count};
+}
+
+function main(params) {
+    return new Promise(function(resolve, reject) {
+        setTimeout(function () {
+            resolve(wc(params));
+        }, 100);
+    });
+}
diff --git a/tests/dat/actions/helloContext.js b/tests/dat/actions/helloContext.js
new file mode 100644
index 0000000..d4957d9
--- /dev/null
+++ b/tests/dat/actions/helloContext.js
@@ -0,0 +1,10 @@
+function main(args) {
+    return {
+       "api_host": process.env['__OW_API_HOST'],
+       "api_key": process.env['__OW_API_KEY'],
+       "namespace": process.env['__OW_NAMESPACE'],
+       "action_name": process.env['__OW_ACTION_NAME'],
+       "activation_id": process.env['__OW_ACTIVATION_ID'],
+       "deadline": process.env['__OW_DEADLINE']
+    }
+}
diff --git a/tests/dat/actions/helloDeadline.js b/tests/dat/actions/helloDeadline.js
new file mode 100644
index 0000000..8e97307
--- /dev/null
+++ b/tests/dat/actions/helloDeadline.js
@@ -0,0 +1,24 @@
+function main(args) {
+
+    var deadline = process.env['__OW_DEADLINE']
+    var timeleft = deadline - new Date().getTime()
+    console.log("deadline in " + timeleft + " msecs");
+
+    var timer = function () {
+       var timeleft = deadline - new Date().getTime()
+       console.log("deadline in " + timeleft + " msecs");
+    }
+    var alarm = setInterval(timer, 1000);
+
+    return new Promise(function(resolve, reject) {
+       setTimeout(function() {
+          clearInterval(alarm);
+          if (args.forceHang) {
+              // do not resolve the promise and make the action timeout
+          } else {
+              resolve({ timedout: true });
+          }
+       }, timeleft - 500);
+    })
+
+}
diff --git a/tests/dat/actions/helloOpenwhiskPackage.js b/tests/dat/actions/helloOpenwhiskPackage.js
new file mode 100644
index 0000000..5ecd6c2
--- /dev/null
+++ b/tests/dat/actions/helloOpenwhiskPackage.js
@@ -0,0 +1,26 @@
+var openwhisk = require('openwhisk')
+
+function main(args) {
+    var wsk = openwhisk({ignore_certs: args.ignore_certs})
+
+    return new Promise(function (resolve, reject) {
+        return wsk.actions.list().then(list => {
+            console.log("action list has this many actions:", list.length)
+            if (args.name) {
+                console.log('deleting')
+                return wsk.actions.delete({actionName: args.name}).then(result => {
+                    resolve({delete: true})
+                }).catch(function (reason) {
+                    console.log('error', reason)
+                    reject(reason)
+                })
+            } else {
+                console.log('ok')
+                resolve({list: true})
+            }
+        }).catch(function (reason) {
+            console.log('error', reason)
+            reject(reason);
+        })
+    })
+}
diff --git a/tests/dat/actions/helloPromise.js b/tests/dat/actions/helloPromise.js
new file mode 100644
index 0000000..36903de
--- /dev/null
+++ b/tests/dat/actions/helloPromise.js
@@ -0,0 +1,9 @@
+function main(args) {
+    return new Promise(function(resolve, reject) {
+        setTimeout(function() {
+            resolve({
+                done : true
+            });
+        }, 2000);
+    })
+}
diff --git a/tests/dat/actions/initexit.js b/tests/dat/actions/initexit.js
new file mode 100644
index 0000000..6cee2e1
--- /dev/null
+++ b/tests/dat/actions/initexit.js
@@ -0,0 +1 @@
+process.exit(1);
diff --git a/tests/dat/actions/initforever.js b/tests/dat/actions/initforever.js
new file mode 100644
index 0000000..1fa180e
--- /dev/null
+++ b/tests/dat/actions/initforever.js
@@ -0,0 +1 @@
+while (true) {}
diff --git a/tests/dat/actions/invalidInput1.json b/tests/dat/actions/invalidInput1.json
new file mode 100644
index 0000000..da57a79
--- /dev/null
+++ b/tests/dat/actions/invalidInput1.json
@@ -0,0 +1,3 @@
+{
+  "invalidJSON":
+}
diff --git a/tests/dat/actions/invalidInput2.json b/tests/dat/actions/invalidInput2.json
new file mode 100644
index 0000000..275fa9f
--- /dev/null
+++ b/tests/dat/actions/invalidInput2.json
@@ -0,0 +1,4 @@
+{
+  "invalid": "JS
+  ON"
+}
diff --git a/tests/dat/actions/invalidInput3.json b/tests/dat/actions/invalidInput3.json
new file mode 100644
index 0000000..3272df5
--- /dev/null
+++ b/tests/dat/actions/invalidInput3.json
@@ -0,0 +1,2 @@
+{
+  "invalid": "JSON"
diff --git a/tests/dat/actions/invalidInput4.json b/tests/dat/actions/invalidInput4.json
new file mode 100644
index 0000000..9a6393d
--- /dev/null
+++ b/tests/dat/actions/invalidInput4.json
@@ -0,0 +1,3 @@
+{
+  "invalid": "JS"ON"
+}
diff --git a/tests/dat/actions/malformed.js b/tests/dat/actions/malformed.js
new file mode 100644
index 0000000..587be6b
--- /dev/null
+++ b/tests/dat/actions/malformed.js
@@ -0,0 +1 @@
+x
diff --git a/tests/dat/actions/ping.js b/tests/dat/actions/ping.js
new file mode 100644
index 0000000..fda3066
--- /dev/null
+++ b/tests/dat/actions/ping.js
@@ -0,0 +1,27 @@
+function main(msg) {
+    var hostToPing = msg.payload;
+    console.log('Pinging to ' + hostToPing);
+
+    var spawn = require('child_process').exec;
+    var promise = new Promise(function(resolve, reject) {
+        var child = spawn('ping -c 3 ' + hostToPing);
+
+        var tmp = {stdout: "", stderr: ""};
+
+        child.stdout.on('data', function (data) {
+            tmp.stdout = tmp.stdout + data;
+        });
+
+        child.stderr.on('data', function (data) {
+            tmp.stderr = tmp.stderr + data;
+        });
+
+        child.on('close', function () {
+            console.log('stdout', tmp.stdout);
+            console.log('stderr', tmp.stderr);
+            resolve(tmp);
+        });
+    });
+
+    return promise;
+}
diff --git a/tests/dat/actions/printParams.js b/tests/dat/actions/printParams.js
new file mode 100644
index 0000000..d150738
--- /dev/null
+++ b/tests/dat/actions/printParams.js
@@ -0,0 +1,25 @@
+/**
+ * Print the parameters to the console, sorted alphabetically by key
+ */
+function main(params) {
+    var sep = '';
+    var retn = {};
+    var keys = [];
+
+    for (var key in params) {
+        if (params.hasOwnProperty(key)) {
+            keys.push(key);
+        }
+    }
+
+    keys.sort();
+    for (var i in keys) {
+        var key = keys[i];
+        var value = params[key];
+        console.log(sep + 'params.' + key + ':', value);
+        sep = ' ';
+        retn[key] = value;
+    }
+
+    return {params: retn};
+}
diff --git a/tests/dat/actions/python.zip b/tests/dat/actions/python.zip
new file mode 100644
index 0000000..070ccc2
Binary files /dev/null and b/tests/dat/actions/python.zip differ
diff --git a/tests/dat/actions/runexit.js b/tests/dat/actions/runexit.js
new file mode 100644
index 0000000..78fbdd9
--- /dev/null
+++ b/tests/dat/actions/runexit.js
@@ -0,0 +1,3 @@
+function main() {
+    process.exit(1);
+}
diff --git a/tests/dat/actions/sort.js b/tests/dat/actions/sort.js
new file mode 100644
index 0000000..2017bcf
--- /dev/null
+++ b/tests/dat/actions/sort.js
@@ -0,0 +1,14 @@
+/**
+ * Sort a set of lines.
+ * @param lines An array of strings to sort.
+ */
+function main(msg) {
+    var lines = msg.lines || [];
+    //console.log('sort got ' + lines.length + ' lines');
+    console.log('sort input msg: ' + JSON.stringify(msg));
+    console.log('sort before: ' + lines);
+    lines.sort();
+    console.log('sort after: ' + lines);
+    return {lines: lines, length: lines.length};
+}
+
diff --git a/tests/dat/actions/split.js b/tests/dat/actions/split.js
new file mode 100644
index 0000000..43d36bc
--- /dev/null
+++ b/tests/dat/actions/split.js
@@ -0,0 +1,14 @@
+/**
+ * Splits a string into an array of strings
+ * Return lines in an array.
+ * @param payload A string.
+ * @param separator The character, or the regular expression, to use for splitting the string
+ */
+function main(msg) {
+    var separator = msg.separator || /\r?\n/;
+    var payload = msg.payload.toString();
+    var lines = payload.split(separator);
+    var retn = {lines: lines, payload: msg.payload};
+    console.log('split: returning ' + JSON.stringify(retn));
+    return retn;
+}
diff --git a/tests/dat/actions/textBody.js b/tests/dat/actions/textBody.js
new file mode 100644
index 0000000..caf45d0
--- /dev/null
+++ b/tests/dat/actions/textBody.js
@@ -0,0 +1,8 @@
+function main() {
+  return {
+    headers: {
+      'Content-Type': 'text/html'
+    },
+    body: 'plain text'
+  };
+}
diff --git a/tests/dat/actions/timeout.js b/tests/dat/actions/timeout.js
new file mode 100644
index 0000000..f3bc74b
--- /dev/null
+++ b/tests/dat/actions/timeout.js
@@ -0,0 +1,18 @@
+function sleep(milliseconds) {
+  var start = new Date().getTime();
+  while (true) {
+    var now = new Date().getTime();
+    if ((now - start) > milliseconds){
+      break;
+    }
+  }
+}
+
+function main(msg) {
+    console.log('dosTimeout', 'timeout ' + msg.payload+'');
+    var n = msg.payload;
+    sleep(n);
+    var res = "[OK] message terminated successfully after " + msg.payload + " milliseconds.";
+    console.log('dosTimeout', 'result:', res);
+    return {msg: res};
+}
diff --git a/tests/dat/actions/validInput1.json b/tests/dat/actions/validInput1.json
new file mode 100644
index 0000000..19ec7c9
--- /dev/null
+++ b/tests/dat/actions/validInput1.json
@@ -0,0 +1,11 @@
+{
+  "a key": "a value",
+  "a bool": true,
+  "objKey": {"b": "c"},
+  "objKey2": {"another object": {"some string": "1111"}},
+  "objKey3": {"json object": {"some int": 1111}},
+  "a number arr": [1,2,3],
+  "a string arr": ["1", "2", "3"],
+  "a bool arr": [true, false, true],
+  "strThatLooksLikeJSON": "{\"someKey\": \"someValue\"}"
+}
diff --git a/tests/dat/actions/validInput2.json b/tests/dat/actions/validInput2.json
new file mode 100644
index 0000000..36ddda4
--- /dev/null
+++ b/tests/dat/actions/validInput2.json
@@ -0,0 +1,3 @@
+{
+  "payload": "test"
+}
diff --git a/tests/dat/actions/wc.js b/tests/dat/actions/wc.js
new file mode 100644
index 0000000..842fc61
--- /dev/null
+++ b/tests/dat/actions/wc.js
@@ -0,0 +1,10 @@
+/**
+ *  word count utility
+ */
+function main(params) {
+    var str = params.payload.toString();
+    var words = str.split(" ");
+    var count = words.length;
+    console.log("The message '"+str+"' has", count, 'words');
+    return { count: count };
+}
diff --git a/tests/dat/actions/wcbin.js b/tests/dat/actions/wcbin.js
new file mode 100644
index 0000000..6b47b6b
--- /dev/null
+++ b/tests/dat/actions/wcbin.js
@@ -0,0 +1,26 @@
+/**
+ * Return word count as a binary number. This demonstrates the use of a blocking
+ * invoke.
+ */
+var openwhisk = require('openwhisk')
+
+function main(params) {
+    var wsk = openwhisk({ignore_certs: true})
+
+    var str = params.payload;
+    console.log("The payload is '" + str + "'");
+
+    return wsk.actions.invoke({
+        actionName: 'wc',
+        params: {
+            payload: str
+        },
+        blocking: true
+    }).then(activation => {
+        var wordsInDecimal = activation.response.result.count;
+        var wordsInBinary = wordsInDecimal.toString(2) + ' (base 2)';
+        return {
+            binaryCount: wordsInBinary
+        };
+    });
+}
diff --git a/tests/dat/apigw/local.api.bad.yaml b/tests/dat/apigw/local.api.bad.yaml
new file mode 100644
index 0000000..35a49e7
--- /dev/null
+++ b/tests/dat/apigw/local.api.bad.yaml
@@ -0,0 +1,35 @@
+some bad yaml in
+these []]]
+lines:
+
+basePath: /bp
+info:
+  title: /bp
+  version: 1.0.0
+paths:
+  /rp:
+    get:
+      operationId: get_/rp
+      responses:
+        default:
+          description: Default response
+      x-openwhisk:
+        action: webhttpecho
+        namespace: guest
+        package: ""
+        url: https://127.0.0.1/api/v1/web/guest/default/webhttpecho.http
+swagger: "2.0"
+x-ibm-configuration:
+  assembly:
+    execute:
+    - operation-switch:
+        case:
+        - execute:
+          - invoke:
+              target-url: https://127.0.0.1/api/v1/web/guest/default/webhttpecho.http
+              verb: keep
+          operations:
+          - get_/rp
+  cors:
+    enabled: true
+
diff --git a/tests/dat/apigw/local.api.yaml b/tests/dat/apigw/local.api.yaml
new file mode 100644
index 0000000..6a1a2b2
--- /dev/null
+++ b/tests/dat/apigw/local.api.yaml
@@ -0,0 +1,31 @@
+basePath: /bp
+info:
+  title: /bp
+  version: 1.0.0
+paths:
+  /rp:
+    get:
+      operationId: get_/rp
+      responses:
+        default:
+          description: Default response
+      x-openwhisk:
+        action: webhttpecho
+        namespace: guest
+        package: ""
+        url: https://127.0.0.1/api/v1/web/guest/default/webhttpecho.http
+swagger: "2.0"
+x-ibm-configuration:
+  assembly:
+    execute:
+    - operation-switch:
+        case:
+        - execute:
+          - invoke:
+              target-url: https://127.0.0.1/api/v1/web/guest/default/webhttpecho.http
+              verb: keep
+          operations:
+          - get_/rp
+  cors:
+    enabled: true
+
diff --git a/tests/dat/apigw/testswaggerdoc1 b/tests/dat/apigw/testswaggerdoc1
new file mode 100644
index 0000000..f627fb6
--- /dev/null
+++ b/tests/dat/apigw/testswaggerdoc1
@@ -0,0 +1,83 @@
+{
+    "swagger": "2.0",
+    "basePath": "/CLI_APIGWTEST7_bp",
+    "info": {
+        "title": "CLI_APIGWTEST7 API Name",
+        "version": "1.0.0"
+    },
+    "paths": {
+        "/path": {
+            "get": {
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-ibm-op-ext": {
+                    "actionName": "CLI_APIGWTEST7_action",
+                    "actionNamespace": "guest",
+                    "backendMethod": "POST",
+                    "backendUrl": "https://999.999.99.999/api/v1/namespaces/guest/actions/CLI_APIGWTEST7_action",
+                    "policies": [
+                        {
+                            "type": "reqMapping",
+                            "value": [
+                                {
+                                    "action": "transform",
+                                    "from": {
+                                        "location": "query",
+                                        "name": "*"
+                                    },
+                                    "to": {
+                                        "location": "body",
+                                        "name": "*"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "Basic I34EJL53W3HGP64AB4E4DJ37FFGA424238GF6J"
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Authorization"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "application/json"
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Content-Type"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "blocking"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "result"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        }
+    }
+}
diff --git a/tests/dat/apigw/testswaggerdoc1V2 b/tests/dat/apigw/testswaggerdoc1V2
new file mode 100644
index 0000000..623ae43
--- /dev/null
+++ b/tests/dat/apigw/testswaggerdoc1V2
@@ -0,0 +1,61 @@
+{
+    "swagger": "2.0",
+    "basePath": "/CLI_APIGWTEST7_bp",
+    "info": {
+        "title": "CLI_APIGWTEST7 API Name",
+        "version": "1.0.0"
+    },
+    "paths": {
+        "/path": {
+            "get": {
+                "operationId": "get_/path",
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-openwhisk": {
+                    "action": "CLI_APIGWTEST7_action",
+                    "namespace": "whisk.system",
+                    "package": "",
+                    "url": "https://172.17.0.1/api/v1/web/whisk.system/default/CLI_APIGWTEST7_action.http"
+                }
+            }
+        }
+    },
+    "x-ibm-configuration": {
+        "assembly": {
+            "execute": [
+                {
+                    "set-variable": {
+                        "actions": [
+                            {
+                                "set": "message.headers.Authorization",
+                                "value": "Basic Nzg5YzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOmFiY3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+                            }
+                        ]
+                    }
+                },
+                {
+                    "operation-switch": {
+                        "case": [
+                            {
+                                "execute": [
+                                    {
+                                        "invoke": {
+                                            "target-url": "https://172.17.0.1/api/v1/web/whisk.system/default/CLI_APIGWTEST7_action.http",
+                                            "verb": "keep"
+                                        }
+                                    }
+                                ],
+                                "operations": [
+                                    "get_/path"
+                                ]
+                            }
+                        ]
+                    }
+                }
+            ]
+        }
+    }
+}
diff --git a/tests/dat/apigw/testswaggerdoc2 b/tests/dat/apigw/testswaggerdoc2
new file mode 100644
index 0000000..7d710d8
--- /dev/null
+++ b/tests/dat/apigw/testswaggerdoc2
@@ -0,0 +1,227 @@
+{
+    "swagger": "2.0",
+    "basePath": "/test1/v1",
+    "info": {
+        "title": "/test1/v1",
+        "version": "1.0.0"
+    },
+    "paths": {
+        "/whisk.system/utils/echo": {
+            "get": {
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-ibm-op-ext": {
+                    "actionName": "test1a",
+                    "actionNamespace": "guest",
+                    "backendMethod": "POST",
+                    "backendUrl": "https://192.168.33.13/api/v1/namespaces/guest/actions/test1a",
+                    "policies": [
+                        {
+                            "type": "reqMapping",
+                            "value": [
+                                {
+                                    "action": "transform",
+                                    "from": {
+                                        "location": "query",
+                                        "name": "*"
+                                    },
+                                    "to": {
+                                        "location": "body",
+                                        "name": "*"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "Basic MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Authorization"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "application/json"
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Content-Type"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "blocking"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "result"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            },
+            "post": {
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-ibm-op-ext": {
+                    "actionName": "test1a",
+                    "actionNamespace": "guest",
+                    "backendMethod": "POST",
+                    "backendUrl": "https://192.168.33.13/api/v1/namespaces/guest/actions/test1a",
+                    "policies": [
+                        {
+                            "type": "reqMapping",
+                            "value": [
+                                {
+                                    "action": "transform",
+                                    "from": {
+                                        "location": "query",
+                                        "name": "*"
+                                    },
+                                    "to": {
+                                        "location": "body",
+                                        "name": "*"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "Basic MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Authorization"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "application/json"
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Content-Type"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "blocking"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "result"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        },
+        "/whisk.system/utils/split": {
+            "post": {
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-ibm-op-ext": {
+                    "actionName": "test1a",
+                    "actionNamespace": "guest",
+                    "backendMethod": "POST",
+                    "backendUrl": "https://192.168.33.13/api/v1/namespaces/guest/actions/test1a",
+                    "policies": [
+                        {
+                            "type": "reqMapping",
+                            "value": [
+                                {
+                                    "action": "transform",
+                                    "from": {
+                                        "location": "query",
+                                        "name": "*"
+                                    },
+                                    "to": {
+                                        "location": "body",
+                                        "name": "*"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "Basic MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Authorization"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "application/json"
+                                    },
+                                    "to": {
+                                        "location": "header",
+                                        "name": "Content-Type"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "blocking"
+                                    }
+                                },
+                                {
+                                    "action": "insert",
+                                    "from": {
+                                        "value": "true"
+                                    },
+                                    "to": {
+                                        "location": "query",
+                                        "name": "result"
+                                    }
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/tests/dat/apigw/testswaggerdoc2V2 b/tests/dat/apigw/testswaggerdoc2V2
new file mode 100644
index 0000000..2556853
--- /dev/null
+++ b/tests/dat/apigw/testswaggerdoc2V2
@@ -0,0 +1,117 @@
+{
+    "swagger": "2.0",
+    "basePath": "/test1/v1",
+    "info": {
+        "title": "CLI_APIGWTEST13 API Name",
+        "version": "1.0.0"
+    },
+    "paths": {
+        "/whisk_system/utils/echo": {
+            "get": {
+                "operationId": "get_/whisk_system/utils/echo",
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-openwhisk": {
+                    "action": "test1a",
+                    "namespace": "whisk.system",
+                    "package": "",
+                    "url": "https://172.17.0.1/api/v1/web/whisk.system/default/test1a.http"
+                }
+            },
+            "post": {
+                "operationId": "post_/whisk_system/utils/echo",
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-openwhisk": {
+                    "action": "test1a",
+                    "namespace": "whisk.system",
+                    "package": "",
+                    "url": "https://172.17.0.1/api/v1/web/whisk.system/default/test1a.http"
+                }
+            }
+        },
+        "/whisk_system/utils/split": {
+            "post": {
+                "operationId": "post_/whisk_system/utils/split",
+                "responses": {
+                    "default": {
+                        "description": "Default response"
+                    }
+                },
+                "x-openwhisk": {
+                    "action": "test1a",
+                    "namespace": "whisk.system",
+                    "package": "",
+                    "url": "https://172.17.0.1/api/v1/web/whisk.system/default/test1a.http"
+                }
+            }
+        }
+    },
+    "x-ibm-configuration": {
+        "assembly": {
+            "execute": [
+                {
+                    "set-variable": {
+                        "actions": [
+                            {
+                                "set": "message.headers.Authorization",
+                                "value": "Basic Nzg5YzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOmFiY3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A="
+                            }
+                        ]
+                    }
+                },
+                {
+                    "operation-switch": {
+                        "case": [
+                            {
+                                "operations": [
+                                    "get_/whisk_system/utils/echo"
+                                ],
+                                "execute": [
+                                    {
+                                        "invoke": {
+                                            "target-url": "https://172.17.0.1/api/v1/web/whisk.system/default/test1a.http",
+                                            "verb": "get"
+                                        }
+                                    }
+                                ]
+                            },
+                            {
+                                "operations": [
+                                    "post_/whisk_system/utils/echo"
+                                ],
+                                "execute": [
+                                    {
+                                        "invoke": {
+                                            "target-url": "https://172.17.0.1/api/v1/web/whisk.system/default/test1a.http",
+                                            "verb": "post"
+                                        }
+                                    }
+                                ]
+                            },
+                            {
+                                "operations": [
+                                    "post_/whisk_system/utils/split"
+                                ],
+                                "execute": [
+                                    {
+                                        "invoke": {
+                                            "target-url": "https://172.17.0.1/api/v1/web/whisk.system/default/test1a.http",
+                                            "verb": "post"
+                                        }
+                                    }
+                                ]
+                            }
+                        ]
+                    }
+                }
+            ]
+        }
+    }
+}
diff --git a/tests/dat/apigw/testswaggerdocinvalid b/tests/dat/apigw/testswaggerdocinvalid
new file mode 100644
index 0000000..8d13ca4
--- /dev/null
+++ b/tests/dat/apigw/testswaggerdocinvalid
@@ -0,0 +1,12 @@
+{
+    "swagger": "2.0",
+    "info": {
+        "title": "/",
+        "version": "1.0.0"
+    },
+    "paths": {
+        "/test1": {
+
+            }
+    }
+}
\ No newline at end of file
diff --git a/tests/src/integration/integration_test.go b/tests/src/integration/integration_test.go
index 5a2bc6b..f25b560 100644
--- a/tests/src/integration/integration_test.go
+++ b/tests/src/integration/integration_test.go
@@ -396,6 +396,7 @@ func TestShowAPIBuildVersion(t *testing.T) {
     assert.Equal(t, nil, err, "The command property set --apihost --apiversion failed to run.")
     stdout, err = wsk.RunCommand("property", "get", "-i", "--apibuild")
     assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
+    println(common.RemoveRedundentSpaces(string(stdout)))
     assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build Unknown",
         "The output of the command property get --apibuild does not contain \"whisk API build Unknown\".")
     assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
@@ -433,7 +434,8 @@ func TestShowAPIBuildVersionHTTP(t *testing.T) {
     stdout, err := wsk.RunCommand("property", "set", "--apihost", apihost)
     assert.Equal(t, nil, err, "The command property set --apihost failed to run.")
     stdout, err = wsk.RunCommand("property", "get", "-i", "--apibuild")
-    assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
+    println(common.RemoveRedundentSpaces(string(stdout)))
+    //assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
     assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build Unknown",
         "The output of the command property get --apibuild does not contain \"whisk API build Unknown\".")
     assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
diff --git a/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala b/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
index 6dc857a..d1bc472 100644
--- a/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
+++ b/tests/src/test/scala/apigw/healthtests/ApiGwEndToEndTests.scala
@@ -32,7 +32,7 @@ import org.scalatest.junit.JUnitRunner
 import com.jayway.restassured.RestAssured
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.TestUtils._
 import common.Wsk
 import common.WskAdmin
@@ -88,7 +88,7 @@ class ApiGwEndToEndTests
             println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
 
             // Create the action for the API
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT)
 
             // Create the API
@@ -158,7 +158,7 @@ class ApiGwEndToEndTests
             println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
 
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo-web-http.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo-web-http.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, annotations = Map("web-export" -> true.toJson))
 
             // Create the API
diff --git a/tests/src/test/scala/common/TestCLIUtils.scala b/tests/src/test/scala/common/TestCLIUtils.scala
new file mode 100644
index 0000000..4bb6740
--- /dev/null
+++ b/tests/src/test/scala/common/TestCLIUtils.scala
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2015-2016 IBM Corporation
+ *
+ * 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 common
+
+object TestCLIUtils {
+
+    def getTestActionFilename(fileName: String): String = {
+        val testDir = scala.util.Properties.userDir.toString()
+        s"$testDir/dat/actions/$fileName"
+    }
+
+    def getTestApiGwFilename(fileName: String): String = {
+        val testDir = scala.util.Properties.userDir.toString()
+        s"$testDir/dat/apigw/$fileName"
+    }
+
+}
diff --git a/tests/src/test/scala/system/basic/WskActionTests.scala b/tests/src/test/scala/system/basic/WskActionTests.scala
index 05a1c83..0f67ff9 100644
--- a/tests/src/test/scala/system/basic/WskActionTests.scala
+++ b/tests/src/test/scala/system/basic/WskActionTests.scala
@@ -22,6 +22,7 @@ import org.scalatest.junit.JUnitRunner
 
 import common.JsHelpers
 import common.TestHelpers
+import common.TestCLIUtils
 import common.TestUtils
 import common.Wsk
 import common.WskProps
@@ -50,7 +51,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "hello promise"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloPromise.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloPromise.js")))
             }
 
             val run = wsk.action.invoke(name)
@@ -66,7 +67,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "hello Async"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloAsync.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloAsync.js")))
             }
 
             val run = wsk.action.invoke(name, Map("payload" -> testString.toJson))
@@ -89,7 +90,7 @@ class WskActionTests
                 (action, _) =>
                     action.create(
                         name,
-                        Some(TestUtils.getTestActionFilename("printParams.js")),
+                        Some(TestCLIUtils.getTestActionFilename("printParams.js")),
                         parameters = params.mapValues(_.toJson))
             }
 
@@ -118,7 +119,7 @@ class WskActionTests
             }
 
             assetHelper.withCleaner(wsk.action, fullQualifiedName) {
-                val file = Some(TestUtils.getTestActionFilename("wc.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("wc.js"))
                 (action, _) => action.create(fullQualifiedName, file)
             }
 
@@ -143,7 +144,7 @@ class WskActionTests
             val annots = Map("b" -> "B".toJson)
 
             assetHelper.withCleaner(wsk.action, origActionName) {
-                val file = Some(TestUtils.getTestActionFilename("wc.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("wc.js"))
                 (action, _) => action.create(origActionName, file, parameters = params, annotations = annots)
             }
 
@@ -210,7 +211,7 @@ class WskActionTests
             )
 
             assetHelper.withCleaner(wsk.action, origName) {
-                val file = Some(TestUtils.getTestActionFilename("echo.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
                 (action, _) => action.create(origName, file, parameters = origParams, annotations = origAnnots)
             }
 
@@ -229,7 +230,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "recreatedAction"
             assetHelper.withCleaner(wsk.action, name, false) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("wc.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("wc.js")))
             }
 
             val run1 = wsk.action.invoke(name, Map("payload" -> testString.toJson))
@@ -241,7 +242,7 @@ class WskActionTests
 
             wsk.action.delete(name)
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("hello.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("hello.js")))
             }
 
             val run2 = wsk.action.invoke(name, Map("payload" -> testString.toJson))
@@ -256,7 +257,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "empty"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("empty.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("empty.js")))
             }
             val run = wsk.action.invoke(name)
             withActivation(wsk.activation, run) {
@@ -270,7 +271,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "empty"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("empty.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("empty.js")))
             }
             val rr = wsk.action.get(name)
             wsk.parseJsonString(rr.stdout).getFieldPath("exec", "code") shouldBe Some(JsString(""))
@@ -282,10 +283,10 @@ class WskActionTests
             val child = "wc"
 
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("wcbin.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("wcbin.js")))
             }
             assetHelper.withCleaner(wsk.action, child) {
-                (action, _) => action.create(child, Some(TestUtils.getTestActionFilename("wc.js")))
+                (action, _) => action.create(child, Some(TestCLIUtils.getTestActionFilename("wc.js")))
             }
 
             val run = wsk.action.invoke(name, Map("payload" -> testString.toJson), blocking = true)
@@ -301,7 +302,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "helloAsync"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloAsync.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloAsync.js")))
             }
 
             val run = wsk.action.invoke(name, Map("payload" -> testString.toJson), blocking = true)
@@ -328,7 +329,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "ping"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("ping.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("ping.js")))
             }
 
             val run = wsk.action.invoke(name, Map("payload" -> "google.com".toJson))
@@ -344,7 +345,7 @@ class WskActionTests
         (wp, assetHelper) =>
             val name = "utf8Test"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("hello.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("hello.js")))
             }
 
             val utf8 = "«ταБЬℓσö»: 1<2 & 4+1>³, now 20%€§$ off!"
diff --git a/tests/src/test/scala/system/basic/WskBasicTests.scala b/tests/src/test/scala/system/basic/WskBasicTests.scala
index b492c2c..6de37d8 100644
--- a/tests/src/test/scala/system/basic/WskBasicTests.scala
+++ b/tests/src/test/scala/system/basic/WskBasicTests.scala
@@ -24,7 +24,7 @@ import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.TestUtils._
 import common.Wsk
 import common.WskProps
@@ -43,7 +43,7 @@ class WskBasicTests
 
     implicit val wskprops = WskProps()
     val wsk = new Wsk
-    val defaultAction = Some(TestUtils.getTestActionFilename("hello.js"))
+    val defaultAction = Some(TestCLIUtils.getTestActionFilename("hello.js"))
 
     behavior of "Wsk CLI"
 
@@ -221,7 +221,7 @@ class WskBasicTests
     it should "create, update, get and list an action" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "createAndUpdate"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
             val params = Map("a" -> "A".toJson)
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -240,7 +240,7 @@ class WskBasicTests
 
     it should "reject create of an action that already exists" in withAssetCleaner(wskprops) {
         val name = "dupeAction"
-        val file = Some(TestUtils.getTestActionFilename("echo.js"))
+        val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
 
         (wp, assetHelper) =>
             assetHelper.withCleaner(wsk.action, name) {
@@ -292,7 +292,7 @@ class WskBasicTests
         (wp, assetHelper) =>
             assetHelper.withCleaner(wsk.action, name) {
                 // this docker image will be need to be pulled from dockerhub and hence has to be published there first
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("blackbox.zip")), kind = Some("native"))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("blackbox.zip")), kind = Some("native"))
             }
 
             val run = wsk.action.invoke(name, Map())
@@ -309,8 +309,8 @@ class WskBasicTests
 
     it should "create, and invoke an action using a parameter file" in withAssetCleaner(wskprops) {
         val name = "paramFileAction"
-        val file = Some(TestUtils.getTestActionFilename("argCheck.js"))
-        val argInput = Some(TestUtils.getTestActionFilename("validInput2.json"))
+        val file = Some(TestCLIUtils.getTestActionFilename("argCheck.js"))
+        val argInput = Some(TestCLIUtils.getTestActionFilename("validInput2.json"))
 
         (wp, assetHelper) =>
             assetHelper.withCleaner(wsk.action, name) {
@@ -363,7 +363,7 @@ class WskBasicTests
         (wp, assetHelper) =>
             val name = "MALFORMED"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("malformed.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("malformed.js")))
             }
 
             val run = wsk.action.invoke(name, Map("payload" -> "whatever".toJson))
@@ -383,7 +383,7 @@ class WskBasicTests
             val boolErrInput = Map("error" -> true.toJson)
 
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("echo.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("echo.js")))
             }
 
             Seq(strErrInput, numErrInput, boolErrInput) foreach { input =>
@@ -399,7 +399,7 @@ class WskBasicTests
         (wp, assetHelper) =>
             val name = "errorResponseObject"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("asyncError.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("asyncError.js")))
             }
 
             val stderr = wsk.action.invoke(name, blocking = true, expectedExitCode = 246).stderr
@@ -412,7 +412,7 @@ class WskBasicTests
         (wp, assetHelper) =>
             val name = "basicInvoke"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("wc.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("wc.js")))
             }
             wsk.action.invoke(name, Map("payload" -> "one two three".toJson), result = true)
                 .stdout should include regex (""""count": 3""")
@@ -460,7 +460,7 @@ class WskBasicTests
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
-                    action.create(name, Some(TestUtils.getTestActionFilename("emptyJSONResult.js")))
+                    action.create(name, Some(TestCLIUtils.getTestActionFilename("emptyJSONResult.js")))
             }
 
             val stdout = wsk.action.invoke(name, result = true).stdout
@@ -474,7 +474,7 @@ class WskBasicTests
             val allowedActionDuration = 120 seconds
             val res = assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
-                    action.create(name, Some(TestUtils.getTestActionFilename("timeout.js")),
+                    action.create(name, Some(TestCLIUtils.getTestActionFilename("timeout.js")),
                         timeout = Some(allowedActionDuration))
                     action.invoke(name, parameters = params, result = true, expectedExitCode = ACCEPTED)
             }
@@ -567,8 +567,8 @@ class WskBasicTests
 
     it should "create, and fire a trigger using a parameter file" in withAssetCleaner(wskprops) {
         val name = "paramFileTrigger"
-        val file = Some(TestUtils.getTestActionFilename("argCheck.js"))
-        val argInput = Some(TestUtils.getTestActionFilename("validInput2.json"))
+        val file = Some(TestCLIUtils.getTestActionFilename("argCheck.js"))
+        val argInput = Some(TestCLIUtils.getTestActionFilename("validInput2.json"))
 
         (wp, assetHelper) =>
             assetHelper.withCleaner(wsk.trigger, name) {
diff --git a/tests/src/test/scala/system/basic/WskConsoleTests.scala b/tests/src/test/scala/system/basic/WskConsoleTests.scala
index aaa30b6..60a1dc0 100644
--- a/tests/src/test/scala/system/basic/WskConsoleTests.scala
+++ b/tests/src/test/scala/system/basic/WskConsoleTests.scala
@@ -29,7 +29,7 @@ import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.Wsk
 import common.WskProps
 import common.WskTestHelpers
@@ -61,7 +61,7 @@ class WskConsoleTests
             }
 
             assetHelper.withCleaner(wsk.action, fullActionName) {
-                (action, _) => action.create(fullActionName, Some(TestUtils.getTestActionFilename("hello.js")))
+                (action, _) => action.create(fullActionName, Some(TestCLIUtils.getTestActionFilename("hello.js")))
             }
 
             val duration = Some(30 seconds)
@@ -79,7 +79,7 @@ class WskConsoleTests
         (wp, assetHelper) =>
             val name = "countdown"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("countdown.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("countdown.js")))
             }
 
             val start = Instant.now(Clock.systemUTC())
diff --git a/tests/src/test/scala/system/basic/WskPackageTests.scala b/tests/src/test/scala/system/basic/WskPackageTests.scala
index f196233..039f831 100644
--- a/tests/src/test/scala/system/basic/WskPackageTests.scala
+++ b/tests/src/test/scala/system/basic/WskPackageTests.scala
@@ -23,7 +23,7 @@ import scala.collection.mutable.HashMap
 import scala.concurrent.duration.DurationInt
 import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
-import common.TestUtils
+import common.TestCLIUtils
 import common.Wsk
 import common.WskProps
 import spray.json._
@@ -98,7 +98,7 @@ class WskPackageTests
             val packageParams = Map("key1a" -> "value1a".toJson, "key1b" -> "value1b".toJson)
             val bindParams = Map("key2a" -> "value2a".toJson, "key1b" -> "value2b".toJson)
             val actionParams = Map("key0" -> "value0".toJson)
-            val file = TestUtils.getTestActionFilename("printParams.js")
+            val file = TestCLIUtils.getTestActionFilename("printParams.js")
             assetHelper.withCleaner(wsk.pkg, packageName) { (pkg, _) =>
                 pkg.create(packageName, packageParams)
             }
diff --git a/tests/src/test/scala/system/basic/WskRuleTests.scala b/tests/src/test/scala/system/basic/WskRuleTests.scala
index 5c2cd50..3bfacd2 100644
--- a/tests/src/test/scala/system/basic/WskRuleTests.scala
+++ b/tests/src/test/scala/system/basic/WskRuleTests.scala
@@ -21,7 +21,7 @@ import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.Wsk
 import common.WskProps
 import common.WskTestHelpers
@@ -36,8 +36,8 @@ class WskRuleTests
 
     implicit val wskprops = WskProps()
     val wsk = new Wsk
-    val defaultAction = TestUtils.getTestActionFilename("wc.js")
-    val secondAction = TestUtils.getTestActionFilename("hello.js")
+    val defaultAction = TestCLIUtils.getTestActionFilename("wc.js")
+    val secondAction = TestCLIUtils.getTestActionFilename("hello.js")
     val testString = "this is a test"
     val testResult = JsObject("count" -> testString.split(" ").length.toJson)
 
diff --git a/tests/src/test/scala/system/basic/WskSequenceTests.scala b/tests/src/test/scala/system/basic/WskSequenceTests.scala
index 0afc722..a5c483b 100644
--- a/tests/src/test/scala/system/basic/WskSequenceTests.scala
+++ b/tests/src/test/scala/system/basic/WskSequenceTests.scala
@@ -29,15 +29,15 @@ import org.scalatest.junit.JUnitRunner
 
 import common.StreamLogging
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.TestUtils._
 import common.Wsk
+import common.WhiskProperties
 import common.WskProps
 import common.WskTestHelpers
 import spray.json._
 import spray.json.DefaultJsonProtocol._
 import spray.testkit.ScalatestRouteTest
-import whisk.core.WhiskConfig
 import whisk.http.Messages.sequenceIsTooLong
 
 /**
@@ -56,9 +56,6 @@ class WskSequenceTests
     val allowedActionDuration = 120 seconds
     val shortDuration = 10 seconds
 
-    val whiskConfig = new WhiskConfig(Map(WhiskConfig.actionSequenceDefaultLimit -> null))
-    assert(whiskConfig.isValid)
-
     behavior of "Wsk Sequence"
 
     it should "invoke a sequence with normal payload and payload with error field" in withAssetCleaner(wskprops) {
@@ -66,7 +63,7 @@ class WskSequenceTests
             val name = "sequence"
             val actions = Seq("split", "sort", "head", "cat")
             for (actionName <- actions) {
-                val file = TestUtils.getTestActionFilename(s"$actionName.js")
+                val file = TestCLIUtils.getTestActionFilename(s"$actionName.js")
                 assetHelper.withCleaner(wsk.action, actionName) { (action, _) =>
                     action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration))
                 }
@@ -127,7 +124,7 @@ class WskSequenceTests
             val actions = Seq("split") ++ inner_actions ++ Seq("cat")
             // create atomic actions
             for (actionName <- actions) {
-                val file = TestUtils.getTestActionFilename(s"$actionName.js")
+                val file = TestCLIUtils.getTestActionFilename(s"$actionName.js")
                 assetHelper.withCleaner(wsk.action, actionName) { (action, _) =>
                     action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration))
                 }
@@ -176,7 +173,7 @@ class WskSequenceTests
             val echo = "echo"
 
             // create echo action
-            val file = TestUtils.getTestActionFilename(s"$echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"$echo.js")
             assetHelper.withCleaner(wsk.action, echo) { (action, actionName) =>
                 action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration))
             }
@@ -202,7 +199,7 @@ class WskSequenceTests
                     result.fields.get("payload") shouldBe Some(argsJson)
             }
             // update x with limit echo
-            val limit = whiskConfig.actionSequenceLimit.toInt
+            val limit = WhiskProperties.getProperty("defaultLimits.actions.sequence.maxLength").toInt
             val manyEcho = for (i <- 1 to limit) yield echo
 
             wsk.action.create(xName, Some(manyEcho.mkString(",")), kind = Some("sequence"), update = true)
@@ -239,7 +236,7 @@ class WskSequenceTests
             val helloWithPkg = s"$pkgName/$helloName"
 
             // create hello action in package
-            val file = TestUtils.getTestActionFilename(s"$helloName.js")
+            val file = TestCLIUtils.getTestActionFilename(s"$helloName.js")
             val actionStr = "AtomicAction"
             assetHelper.withCleaner(wsk.action, helloWithPkg) { (action, actionName) =>
                 action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration), parameters = Map("payload" -> JsString(actionStr)))
@@ -276,7 +273,7 @@ class WskSequenceTests
             val packageParams = Map("key1a" -> "value1a".toJson, "key1b" -> "value1b".toJson)
             val bindParams = Map("key2a" -> "value2a".toJson, "key1b" -> "value2b".toJson)
             val actionParams = Map("key0" -> "value0".toJson)
-            val file = TestUtils.getTestActionFilename("printParams.js")
+            val file = TestCLIUtils.getTestActionFilename("printParams.js")
             assetHelper.withCleaner(wsk.pkg, packageName) { (pkg, _) =>
                 pkg.create(packageName, packageParams)
             }
@@ -311,7 +308,7 @@ class WskSequenceTests
             // create actions
             val actions = Seq(apperror, echo)
             for (actionName <- actions) {
-                val file = TestUtils.getTestActionFilename(s"$actionName.js")
+                val file = TestCLIUtils.getTestActionFilename(s"$actionName.js")
                 assetHelper.withCleaner(wsk.action, actionName) { (action, actionName) =>
                     action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration))
                 }
@@ -349,7 +346,7 @@ class WskSequenceTests
             // timeouts for the action; make the one for initforever short
             val timeout = Map(echo -> allowedActionDuration, initforever -> shortDuration)
             for (actionName <- actions) {
-                val file = TestUtils.getTestActionFilename(s"$actionName.js")
+                val file = TestCLIUtils.getTestActionFilename(s"$actionName.js")
                 assetHelper.withCleaner(wsk.action, actionName) { (action, actionName) =>
                     action.create(name = actionName, artifact = Some(file), timeout = Some(timeout(actionName)))
                 }
@@ -386,7 +383,7 @@ class WskSequenceTests
             // create actions
             val actions = Seq(echo, sleep)
             for (actionName <- actions) {
-                val file = TestUtils.getTestActionFilename(s"$actionName.js")
+                val file = TestCLIUtils.getTestActionFilename(s"$actionName.js")
                 assetHelper.withCleaner(wsk.action, actionName) { (action, actionName) =>
                     action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration))
                 }
@@ -430,7 +427,7 @@ class WskSequenceTests
                 (trigger, name) => trigger.create(name, parameters = triggerPayload)
             }
             // action
-            val file = TestUtils.getTestActionFilename(s"$actionName.js")
+            val file = TestCLIUtils.getTestActionFilename(s"$actionName.js")
             assetHelper.withCleaner(wsk.action, actionName) { (action, actionName) =>
                 action.create(name = actionName, artifact = Some(file), timeout = Some(allowedActionDuration))
             }
diff --git a/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala b/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
index 7a00f89..3cb00de 100644
--- a/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/ApiGwTests.scala
@@ -26,7 +26,7 @@ import org.scalatest.BeforeAndAfterAll
 import org.scalatest.junit.JUnitRunner
 import common.TestHelpers
 import common.TestUtils._
-import common.TestUtils
+import common.TestCLIUtils
 import common.WhiskProperties
 import common.Wsk
 import common.WskAdmin
@@ -366,7 +366,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testName+" API Name"
         val actionName = testName+"_action"
-        val swaggerPath = TestUtils.getTestApiGwFilename("testswaggerdoc1")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename("testswaggerdoc1")
         try {
             var rr = apiCreateExperimental(swagger = Some(swaggerPath))
             rr.stdout should include("ok: created API")
@@ -458,7 +458,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testName + " API Name"
         val actionName = testName + "_action"
-        val swaggerPath = TestUtils.getTestApiGwFilename(s"testswaggerdocinvalid")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"testswaggerdocinvalid")
         try {
             var rr = apiCreateExperimental(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
             println("api create stdout: " + rr.stdout)
@@ -528,7 +528,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = "/test1/v1"
         val actionName = "test1a"
-        val swaggerPath = TestUtils.getTestApiGwFilename(s"testswaggerdoc2")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"testswaggerdoc2")
         try {
             var rr = apiCreateExperimental(swagger = Some(swaggerPath))
             println("api create stdout: " + rr.stdout)
@@ -614,7 +614,7 @@ class ApiGwTests
         try {
             println("cli user: " + cliuser + "; cli namespace: " + clinamespace)
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -649,7 +649,7 @@ class ApiGwTests
             println("cli user: "+cliuser+"; cli namespace: "+clinamespace)
 
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -677,7 +677,7 @@ class ApiGwTests
         val actionName = testName+"_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -704,7 +704,7 @@ class ApiGwTests
         val actionName = testName+"_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -728,7 +728,7 @@ class ApiGwTests
         val actionName = testName+"_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -753,7 +753,7 @@ class ApiGwTests
         val newEndpoint = "/newEndpoint"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -780,7 +780,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testName+" API Name"
         val actionName = testName+"_action"
-        val swaggerPath = TestUtils.getTestApiGwFilename("testswaggerdoc1V2")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename("testswaggerdoc1V2")
         try {
             var rr = apiCreate(swagger = Some(swaggerPath))
             rr.stdout should include("ok: created API")
@@ -810,7 +810,7 @@ class ApiGwTests
         val newEndpoint = "/newEndpoint"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -856,7 +856,7 @@ class ApiGwTests
         try {
             println("cli user: "+cliuser+"; cli namespace: "+clinamespace)
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -882,7 +882,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testName + " API Name"
         val actionName = testName + "_action"
-        val swaggerPath = TestUtils.getTestApiGwFilename(s"testswaggerdocinvalid")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"testswaggerdocinvalid")
         try {
             var rr = apiCreate(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
             println("api create stdout: " + rr.stdout)
@@ -903,7 +903,7 @@ class ApiGwTests
         val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -933,7 +933,7 @@ class ApiGwTests
         val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -962,7 +962,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testName + " API Name"
         val actionName = "test1a"
-        val swaggerPath = TestUtils.getTestApiGwFilename(s"testswaggerdoc2V2")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"testswaggerdoc2V2")
         try {
             var rr = apiCreate(swagger = Some(swaggerPath))
             println("api create stdout: " + rr.stdout)
@@ -991,7 +991,7 @@ class ApiGwTests
         val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname))
@@ -1048,7 +1048,7 @@ class ApiGwTests
         val actionName = testName + "_action"
         try {
             // Create the action for the API.  It must NOT be a "web-action" action for this test
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT)
 
             var rr = apiCreate(basepath = Some(testbasepath), relpath = Some(testrelpath), operation = Some(testurlop), action = Some(actionName), apiname = Some(testapiname), expectedExitCode = ANY_ERROR_EXIT)
@@ -1070,7 +1070,7 @@ class ApiGwTests
         val responseType = "http"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(
@@ -1112,7 +1112,7 @@ class ApiGwTests
         val responseType = "http"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(
@@ -1144,7 +1144,7 @@ class ApiGwTests
         val responseType = "http"
         try {
             // Create the action for the API.  It must be a "web-action" action.
-            val file = TestUtils.getTestActionFilename(s"echo.js")
+            val file = TestCLIUtils.getTestActionFilename(s"echo.js")
             wsk.action.create(name = actionName, artifact = Some(file), expectedExitCode = SUCCESS_EXIT, web = Some("true"))
 
             var rr = apiCreate(
@@ -1174,7 +1174,7 @@ class ApiGwTests
         val testurlop = "get"
         val testapiname = testbasepath
         val actionName = "webhttpecho"
-        val swaggerPath = TestUtils.getTestApiGwFilename(s"local.api.yaml")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"local.api.yaml")
         try {
             var rr = apiCreate(swagger = Some(swaggerPath))
             println("api create stdout: " + rr.stdout)
@@ -1193,7 +1193,7 @@ class ApiGwTests
     it should "reject creation of an API from invalid YAML formatted API configuration file" in {
         val testName = "CLI_APIGWTEST22"
         val testbasepath = "/bp"
-        val swaggerPath = TestUtils.getTestApiGwFilename(s"local.api.bad.yaml")
+        val swaggerPath = TestCLIUtils.getTestApiGwFilename(s"local.api.bad.yaml")
         try {
             var rr = apiCreate(swagger = Some(swaggerPath), expectedExitCode = ANY_ERROR_EXIT)
             println("api create stdout: " + rr.stdout)
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala
index 710fcfc..d6a2fab 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskActionSequenceTests.scala
@@ -21,7 +21,7 @@ import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.Wsk
 import common.WskAdmin
 import common.WskProps
@@ -57,12 +57,12 @@ class WskActionSequenceTests
             }
 
             assetHelper.withCleaner(wsk.action, fullHelloActionName) {
-                val file = Some(TestUtils.getTestActionFilename("hello.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
                 (action, _) => action.create(fullHelloActionName, file)(wp)
             }
 
             assetHelper.withCleaner(wsk.action, fullCatActionName) {
-                val file = Some(TestUtils.getTestActionFilename("cat.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("cat.js"))
                 (action, _) => action.create(fullCatActionName, file)(wp)
             }
 
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala
index a5cf39c..faef3dd 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskBasicUsageTests.scala
@@ -32,6 +32,7 @@ import org.junit.runner.RunWith
 import org.scalatest.junit.JUnitRunner
 
 import common.TestHelpers
+import common.TestCLIUtils
 import common.TestUtils
 import common.TestUtils._
 import common.WhiskProperties
@@ -61,7 +62,7 @@ class WskBasicUsageTests
 
     implicit val wskprops = WskProps()
     val wsk = new Wsk
-    val defaultAction = Some(TestUtils.getTestActionFilename("hello.js"))
+    val defaultAction = Some(TestCLIUtils.getTestActionFilename("hello.js"))
 
     behavior of "Wsk CLI usage"
 
@@ -271,7 +272,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             // Create dummy action to update
             val name = "updateMissingFile"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
             assetHelper.withCleaner(wsk.action, name) { (action, name) => action.create(name, file) }
             // Update it with a missing file
             wsk.action.create(name, Some("notfound"), update = true, expectedExitCode = MISUSE_EXIT)
@@ -280,7 +281,7 @@ class WskBasicUsageTests
     it should "reject action update for sequence with no components" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "updateMissingComponents"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
             assetHelper.withCleaner(wsk.action, name) { (action, name) => action.create(name, file) }
             wsk.action.create(name, None, update = true, kind = Some("sequence"), expectedExitCode = MISUSE_EXIT)
     }
@@ -288,7 +289,7 @@ class WskBasicUsageTests
     it should "create, and get an action to verify parameter and annotation parsing" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "actionAnnotations"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -312,8 +313,8 @@ class WskBasicUsageTests
     it should "create, and get an action to verify file parameter and annotation parsing" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "actionAnnotAndParamParsing"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
-            val argInput = Some(TestUtils.getTestActionFilename("validInput1.json"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
+            val argInput = Some(TestCLIUtils.getTestActionFilename("validInput1.json"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -336,7 +337,7 @@ class WskBasicUsageTests
     it should "create an action with the proper parameter and annotation escapes" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "actionEscapes"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -361,7 +362,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             val name = "abort init"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("initexit.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("initexit.js")))
             }
 
             withActivation(wsk.activation, wsk.action.invoke(name)) {
@@ -379,7 +380,7 @@ class WskBasicUsageTests
                 (action, _) =>
                     action.create(
                         name,
-                        Some(TestUtils.getTestActionFilename("initforever.js")),
+                        Some(TestCLIUtils.getTestActionFilename("initforever.js")),
                         timeout = Some(3 seconds))
             }
 
@@ -395,7 +396,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             val name = "abort run"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("runexit.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("runexit.js")))
             }
 
             withActivation(wsk.activation, wsk.action.invoke(name)) {
@@ -411,7 +412,7 @@ class WskBasicUsageTests
 
         (wp, assetHelper) =>
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("argCheck.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("argCheck.js")))
             }
 
             val run = wsk.action.invoke(name)
@@ -435,7 +436,7 @@ class WskBasicUsageTests
             val timeLimit = 60 seconds
 
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloAsync.js")), memory = Some(memoryLimit), timeout = Some(timeLimit), logsize = Some(logLimit))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloAsync.js")), memory = Some(memoryLimit), timeout = Some(timeLimit), logsize = Some(logLimit))
             }
 
             val run = wsk.action.invoke(name, Map("payload" -> "this is a test".toJson))
@@ -458,7 +459,7 @@ class WskBasicUsageTests
     it should "report error when creating an action with unknown kind" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val rr = assetHelper.withCleaner(wsk.action, "invalid kind", confirmDelete = false) {
-                (action, name) => action.create(name, Some(TestUtils.getTestActionFilename("echo.js")), kind = Some("foobar"), expectedExitCode = BAD_REQUEST)
+                (action, name) => action.create(name, Some(TestCLIUtils.getTestActionFilename("echo.js")), kind = Some("foobar"), expectedExitCode = BAD_REQUEST)
             }
             rr.stderr should include regex "kind 'foobar' not in Set"
     }
@@ -466,7 +467,7 @@ class WskBasicUsageTests
     it should "report error when creating an action with zip but without kind" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "zipWithNoKind"
-            val zippedPythonAction = Some(TestUtils.getTestActionFilename("python.zip"))
+            val zippedPythonAction = Some(TestCLIUtils.getTestActionFilename("python.zip"))
             val createResult = assetHelper.withCleaner(wsk.action, name, confirmDelete = false) {
                 (action, _) =>
                     action.create(name, zippedPythonAction, expectedExitCode = ANY_ERROR_EXIT)
@@ -503,7 +504,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             val name = "hello npm openwhisk"
             assetHelper.withCleaner(wsk.action, name, confirmDelete = false) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloOpenwhiskPackage.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloOpenwhiskPackage.js")))
             }
 
             val run = wsk.action.invoke(name, Map("ignore_certs" -> true.toJson, "name" -> name.toJson))
@@ -522,7 +523,7 @@ class WskBasicUsageTests
             val (user, namespace) = WskAdmin.getUser(wskprops.authKey)
             val name = "context"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloContext.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloContext.js")))
             }
 
             val start = Instant.now(Clock.systemUTC()).toEpochMilli
@@ -544,7 +545,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             val name = "invokeResult"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("echo.js")))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("echo.js")))
             }
             val args = Map("hello" -> "Robert".toJson)
             val run = wsk.action.invoke(name, args, blocking = true, result = true)
@@ -555,7 +556,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             val name = "deadline"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloDeadline.js")), timeout = Some(3 seconds))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloDeadline.js")), timeout = Some(3 seconds))
             }
 
             val run = wsk.action.invoke(name)
@@ -574,7 +575,7 @@ class WskBasicUsageTests
         (wp, assetHelper) =>
             val name = "timeout"
             assetHelper.withCleaner(wsk.action, name) {
-                (action, _) => action.create(name, Some(TestUtils.getTestActionFilename("helloDeadline.js")), timeout = Some(3 seconds))
+                (action, _) => action.create(name, Some(TestCLIUtils.getTestActionFilename("helloDeadline.js")), timeout = Some(3 seconds))
             }
 
             val start = Instant.now(Clock.systemUTC()).toEpochMilli
@@ -600,7 +601,7 @@ class WskBasicUsageTests
     it should "ensure --web flags set the proper annotations" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) => action.create(name, file)
@@ -634,7 +635,7 @@ class WskBasicUsageTests
     it should "ensure --web flag does not remove existing annotations" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
             val key = "someKey"
             val value = JsString("someValue")
             val annots = Map(key -> value)
@@ -668,7 +669,7 @@ class WskBasicUsageTests
     it should "reject action create and update with invalid web flag input" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
             val invalidInput = "bogus"
             val errorMsg = s"Invalid argument '$invalidInput' for --web flag. Valid input consist of 'yes', 'true', 'raw', 'false', or 'no'."
             wsk.action.create(name, file, web = Some(invalidInput), expectedExitCode = MISUSE_EXIT).stderr should include(errorMsg)
@@ -678,7 +679,7 @@ class WskBasicUsageTests
     it should "invoke action while not encoding &, <, > characters" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "nonescape"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
             val nonescape = "&<>"
             val input = Map("payload" -> nonescape.toJson)
             val output = JsObject("payload" -> JsString(s"hello, $nonescape!"))
@@ -728,8 +729,8 @@ class WskBasicUsageTests
     it should "create, and get a package to verify file parameter and annotation parsing" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "packageAnnotAndParamFileParsing"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
-            val argInput = Some(TestUtils.getTestActionFilename("validInput1.json"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
+            val argInput = Some(TestCLIUtils.getTestActionFilename("validInput1.json"))
 
             assetHelper.withCleaner(wsk.pkg, name) {
                 (pkg, _) =>
@@ -775,7 +776,7 @@ class WskBasicUsageTests
     it should "report conformance error accessing action as package" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "aAsP"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) => action.create(name, file)
             }
@@ -818,8 +819,8 @@ class WskBasicUsageTests
     it should "create, and get a trigger to verify file parameter and annotation parsing" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "triggerAnnotAndParamFileParsing"
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
-            val argInput = Some(TestUtils.getTestActionFilename("validInput1.json"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
+            val argInput = Some(TestCLIUtils.getTestActionFilename("validInput1.json"))
 
             assetHelper.withCleaner(wsk.trigger, name) {
                 (trigger, _) =>
@@ -984,7 +985,7 @@ class WskBasicUsageTests
     it should "create, and list an action with a long name" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "x" * 70
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
                     action.create(name, file)
@@ -1031,14 +1032,14 @@ class WskBasicUsageTests
     it should "reject commands that are executed with invalid JSON for annotations and parameters" in {
         val invalidJSONInputs = getInvalidJSONInput
         val invalidJSONFiles = Seq(
-            TestUtils.getTestActionFilename("malformed.js"),
-            TestUtils.getTestActionFilename("invalidInput1.json"),
-            TestUtils.getTestActionFilename("invalidInput2.json"),
-            TestUtils.getTestActionFilename("invalidInput3.json"),
-            TestUtils.getTestActionFilename("invalidInput4.json"))
+            TestCLIUtils.getTestActionFilename("malformed.js"),
+            TestCLIUtils.getTestActionFilename("invalidInput1.json"),
+            TestCLIUtils.getTestActionFilename("invalidInput2.json"),
+            TestCLIUtils.getTestActionFilename("invalidInput3.json"),
+            TestCLIUtils.getTestActionFilename("invalidInput4.json"))
         val paramCmds = Seq(
-            Seq("action", "create", "actionName", TestUtils.getTestActionFilename("hello.js")),
-            Seq("action", "update", "actionName", TestUtils.getTestActionFilename("hello.js")),
+            Seq("action", "create", "actionName", TestCLIUtils.getTestActionFilename("hello.js")),
+            Seq("action", "update", "actionName", TestCLIUtils.getTestActionFilename("hello.js")),
             Seq("action", "invoke", "actionName"),
             Seq("package", "create", "packageName"),
             Seq("package", "update", "packageName"),
@@ -1047,8 +1048,8 @@ class WskBasicUsageTests
             Seq("trigger", "update", "triggerName"),
             Seq("trigger", "fire", "triggerName"))
         val annotCmds = Seq(
-            Seq("action", "create", "actionName", TestUtils.getTestActionFilename("hello.js")),
-            Seq("action", "update", "actionName", TestUtils.getTestActionFilename("hello.js")),
+            Seq("action", "create", "actionName", TestCLIUtils.getTestActionFilename("hello.js")),
+            Seq("action", "update", "actionName", TestCLIUtils.getTestActionFilename("hello.js")),
             Seq("package", "create", "packageName"),
             Seq("package", "update", "packageName"),
             Seq("package", "bind", "packageName", "boundPackageName"),
@@ -1082,14 +1083,14 @@ class WskBasicUsageTests
     }
 
     it should "reject commands that are executed with a missing or invalid parameter or annotation file" in {
-        val emptyFile = TestUtils.getTestActionFilename("emtpy.js")
+        val emptyFile = TestCLIUtils.getTestActionFilename("emtpy.js")
         val missingFile = "notafile"
         val emptyFileMsg = s"File '$emptyFile' is not a valid file or it does not exist"
         val missingFileMsg = s"File '$missingFile' is not a valid file or it does not exist"
         val invalidArgs = Seq(
-            (Seq("action", "create", "actionName", TestUtils.getTestActionFilename("hello.js"), "-P", emptyFile),
+            (Seq("action", "create", "actionName", TestCLIUtils.getTestActionFilename("hello.js"), "-P", emptyFile),
                 emptyFileMsg),
-            (Seq("action", "update", "actionName", TestUtils.getTestActionFilename("hello.js"), "-P", emptyFile),
+            (Seq("action", "update", "actionName", TestCLIUtils.getTestActionFilename("hello.js"), "-P", emptyFile),
                 emptyFileMsg),
             (Seq("action", "invoke", "actionName", "-P", emptyFile), emptyFileMsg),
             (Seq("action", "create", "actionName", "-P", emptyFile), emptyFileMsg),
@@ -1107,9 +1108,9 @@ class WskBasicUsageTests
             (Seq("trigger", "create", "triggerName", "-P", emptyFile), emptyFileMsg),
             (Seq("trigger", "update", "triggerName", "-P", emptyFile), emptyFileMsg),
             (Seq("trigger", "fire", "triggerName", "-P", emptyFile), emptyFileMsg),
-            (Seq("action", "create", "actionName", TestUtils.getTestActionFilename("hello.js"), "-A", missingFile),
+            (Seq("action", "create", "actionName", TestCLIUtils.getTestActionFilename("hello.js"), "-A", missingFile),
                 missingFileMsg),
-            (Seq("action", "update", "actionName", TestUtils.getTestActionFilename("hello.js"), "-A", missingFile),
+            (Seq("action", "update", "actionName", TestCLIUtils.getTestActionFilename("hello.js"), "-A", missingFile),
                 missingFileMsg),
             (Seq("action", "invoke", "actionName", "-A", missingFile), missingFileMsg),
             (Seq("action", "create", "actionName", "-A", missingFile), missingFileMsg),
@@ -1334,7 +1335,7 @@ class WskBasicUsageTests
 
     it should "create an action with different permutations of limits" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
-            val file = Some(TestUtils.getTestActionFilename("hello.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
 
             def testLimit(timeout: Option[Duration] = None, memory: Option[ByteSize] = None, logs: Option[ByteSize] = None, ec: Int = SUCCESS_EXIT) = {
                 // Limits to assert, standard values if CLI omits certain values
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala
index 389c022..70de2f8 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskEntitlementTests.scala
@@ -22,7 +22,7 @@ import org.scalatest.BeforeAndAfterAll
 import org.scalatest.junit.JUnitRunner
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.TestUtils.FORBIDDEN
 import common.TestUtils.NOT_FOUND
 import common.TestUtils.TIMEOUT
@@ -61,7 +61,7 @@ class WskEntitlementTests
             val privateAction = "privateAction"
 
             assetHelper.withCleaner(wsk.action, privateAction) {
-                (action, name) => action.create(name, Some(TestUtils.getTestActionFilename("hello.js")))(wp)
+                (action, name) => action.create(name, Some(TestCLIUtils.getTestActionFilename("hello.js")))(wp)
             }
 
             val fullyQualifiedActionName = s"/$guestNamespace/$privateAction"
@@ -98,7 +98,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, fullSampleActionName) {
-                val file = Some(TestUtils.getTestActionFilename("empty.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("empty.js"))
                 (action, _) => action.create(fullSampleActionName, file)(wp)
             }
 
@@ -114,7 +114,7 @@ class WskEntitlementTests
             }
 
             val fullyQualifiedActionName = s"/$guestNamespace/notallowed"
-            val file = Some(TestUtils.getTestActionFilename("empty.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("empty.js"))
 
             withAssetCleaner(defaultWskProps) {
                 (wp, assetHelper) =>
@@ -131,7 +131,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, fullSampleActionName) {
-                val file = Some(TestUtils.getTestActionFilename("empty.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("empty.js"))
                 (action, _) => action.create(fullSampleActionName, file)(wp)
             }
 
@@ -170,7 +170,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, fullSampleActionName) {
-                val file = Some(TestUtils.getTestActionFilename("empty.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("empty.js"))
                 (action, _) => action.create(fullSampleActionName, file, kind = Some("nodejs:default"))(wp)
             }
 
@@ -232,7 +232,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, fullSampleActionName) {
-                val file = Some(TestUtils.getTestActionFilename("hello.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
                 (action, _) => action.create(fullSampleActionName, file)(wp)
             }
 
@@ -258,7 +258,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, fullSampleActionName) {
-                val file = Some(TestUtils.getTestActionFilename("hello.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
                 (action, _) => action.create(fullSampleActionName, file)(wp)
             }
 
@@ -287,7 +287,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, fullSampleActionName) {
-                val file = Some(TestUtils.getTestActionFilename("hello.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("hello.js"))
                 (action, _) =>
                     action.create(fullSampleActionName, file)(guestwp)
                     action.create(s"$privateSamplePackage/$sampleAction", file)(guestwp)
@@ -320,7 +320,7 @@ class WskEntitlementTests
             }
 
             assetHelper.withCleaner(wsk.action, packagedActionName) {
-                val file = Some(TestUtils.getTestActionFilename("helloContext.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("helloContext.js"))
                 (action, _) => action.create(packagedActionName, file)(guestWskProps)
             }
 
@@ -344,7 +344,7 @@ class WskEntitlementTests
 
             val sampleFeed = s"$samplePackage/sampleFeed"
             assetHelper.withCleaner(wsk.action, sampleFeed) {
-                val file = Some(TestUtils.getTestActionFilename("empty.js"))
+                val file = Some(TestCLIUtils.getTestActionFilename("empty.js"))
                 (action, _) => action.create(sampleFeed, file, kind = Some("nodejs:default"))(wp)
             }
 
diff --git a/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala b/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala
index f1f584e..c8a4883 100644
--- a/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala
+++ b/tests/src/test/scala/whisk/core/cli/test/WskWebActionsTests.scala
@@ -29,7 +29,7 @@ import org.scalatest.junit.JUnitRunner
 import com.jayway.restassured.RestAssured
 
 import common.TestHelpers
-import common.TestUtils
+import common.TestCLIUtils
 import common.WhiskProperties
 import common.Wsk
 import common.WskAdmin
@@ -87,7 +87,7 @@ class WskWebActionsTestsV2 extends WskWebActionsTests with BeforeAndAfterAll {
         (wp, assetHelper) =>
             val actionName = "webaction"
 
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
             assetHelper.withCleaner(wsk.action, actionName) {
                 (action, _) =>
                     action.create(actionName, file, web = Some(true.toString))(wp)
@@ -145,7 +145,7 @@ trait WskWebActionsTests
     it should "create a web action accessible via HTTPS" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -184,7 +184,7 @@ trait WskWebActionsTests
     it should "create a web action requiring authentication accessible via HTTPS" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -214,7 +214,7 @@ trait WskWebActionsTests
     it should "ensure that CORS header is preserved for custom options" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("corsHeaderMod.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("corsHeaderMod.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
@@ -233,7 +233,7 @@ trait WskWebActionsTests
     it should "invoke web action to ensure the returned body argument is correct" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("echo.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("echo.js"))
             val bodyContent = "This is the body"
 
             assetHelper.withCleaner(wsk.action, name) {
@@ -260,7 +260,7 @@ trait WskWebActionsTests
     it should "reject invocation of web action with invalid accept header" in withAssetCleaner(wskprops) {
         (wp, assetHelper) =>
             val name = "webaction"
-            val file = Some(TestUtils.getTestActionFilename("textBody.js"))
+            val file = Some(TestCLIUtils.getTestActionFilename("textBody.js"))
 
             assetHelper.withCleaner(wsk.action, name) {
                 (action, _) =>
diff --git a/tools/travis/test_openwhisk.sh b/tools/travis/test_openwhisk.sh
index f25b51c..5268500 100755
--- a/tools/travis/test_openwhisk.sh
+++ b/tools/travis/test_openwhisk.sh
@@ -10,7 +10,7 @@ cd $HOMEDIR
 git clone --depth 3 https://github.com/apache/incubator-openwhisk.git
 
 # Build script for Travis-CI.
-WHISKDIR="$OPENWHISK_HOME"
+WHISKDIR="$HOMEDIR/incubator-openwhisk"
 
 cd $WHISKDIR
 ./tools/travis/setup.sh
@@ -25,7 +25,8 @@ $ANSIBLE_CMD initdb.yml
 $ANSIBLE_CMD apigateway.yml
 
 cd $WHISKDIR
-./gradlew distDocker -PdockerImagePrefix=testing
+GRADLE_PROJS_SKIP="-x :core:pythonAction:distDocker -x :core:python2Action:distDocker -x :core:swift3Action:distDocker -x :core:javaAction:distDocker"
+TERM=dumb ./gradlew distDocker -PdockerImagePrefix=testing $GRADLE_PROJS_SKIP
 
 cd $WHISKDIR/ansible
 $ANSIBLE_CMD wipe.yml
@@ -36,7 +37,7 @@ mkdir -p $WHISKDIR/bin
 cp $TRAVIS_BUILD_DIR/wsk $WHISKDIR/bin
 
 # Run the test cases under openwhisk to ensure the quality of the binary.
-cd $WHISKDIR
+cd $TRAVIS_BUILD_DIR
 ./gradlew :tests:test -Dtest.single=Wsk*Tests*
 ./gradlew :tests:test -Dtest.single=*ApiGwRoutemgmtActionTests*
 sleep 30
@@ -44,5 +45,4 @@ sleep 30
 sleep 30
 ./gradlew :tests:test -Dtest.single=*ApiGwEndToEndTests*
 sleep 30
-cd $TRAVIS_BUILD_DIR
 make integration_test

-- 
To stop receiving notification emails like this one, please contact
"commits@openwhisk.apache.org" <co...@openwhisk.apache.org>.