Adding Knative Tests Files (#121)

* adding knative tests files

* starting with basic tests first
diff --git a/tests/src/test/knative/README.md b/tests/src/test/knative/README.md
new file mode 100644
index 0000000..63d37e3
--- /dev/null
+++ b/tests/src/test/knative/README.md
@@ -0,0 +1,280 @@
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+# Tests for OpenWhisk NodeJS Runtime using Knative
+
+## Test summary
+
+<table cellpadding="8">
+  <tbody>
+    <tr valign="top" align="left">
+      <th width="33%">Name / Description</th>
+      <th width="33%">Knative Resource Templates</th>
+      <th width="33%">Runtime Payload Data<br><sub>(e.g., Curl, VSCode, etc.)</sub></th>
+    </tr>
+    <!-- HelloWorld -->
+    <tr align="left" valign="top">
+      <td>
+        <a href="helloworld">helloworld</a>
+        <p><sub>A simple "Hello world" function with no parameters.</sub></p>
+      </td>
+      <td>
+        <ul>
+          <li><sub>Build: <a href="helloworld/build.yaml.tmpl">build.yaml.tmpl</a></sub></li>
+          <li><sub>Service: <a href="helloworld/build.yaml.tmpl">build.yaml.tmpl</a></sub></li>
+        </ul>
+      </td>
+      <td>
+        <ul>
+          <li><sub>Knative data: <a href="helloworld/data-init.json">data-init-run.json</a></sub></li>
+          <li><sub>OpenWhisk /init data: <a href="helloworld/data-init.json">data-init.json</a></sub></li>
+          <li><sub>OpenWhisk /run data: <a href="helloworld/data-run.json">data-run.json</a></sub></li>
+          <li><sub>Knative Payload: <a href="helloworld/payload-knative-init-run.http">payload-knative-init-run.http</a></sub></li>
+          <li><sub>OpenWhisk /init Payload: <a href="helloworld/payload-openwhisk-init.http">payload-openwhisk-init.http</a></sub></li>
+          <li><sub>OpenWhisk /run Payload: <a href="helloworld/payload-openwhisk-run.http">payload-openwhisk-run.http</a></sub></li>
+        </ul>
+      </td>
+    </tr>
+    <!-- HelloWorld with Params -->
+    <tr align="left" valign="top">
+      <td>
+        <a href="helloworldwithparams">helloworldwithparams</a>
+        <p><sub>A simple "Hello world" function with <em>NAME</em> and <em>PLACE</em> parameters passed via <em>main</em> function args.</sub></p>
+      </td>
+      <td>
+        <ul>
+          <li><sub>Build: <a href="helloworldwithparams/build.yaml.tmpl">build.yaml.tmpl</a></sub></li>
+          <li><sub>Service: <a href="helloworldwithparams/service.yaml.tmpl">service.yaml.tmpl</a></sub></li>
+        </ul>
+      </td>
+      <td>
+        <ul>
+          <li><sub>Knative data: <a href="helloworldwithparams/data-init.json">data-init-run.json</a></sub></li>
+          <li><sub>OpenWhisk /init data: <a href="helloworldwithparams/data-init.json">data-init.json</a></sub></li>
+          <li><sub>OpenWhisk /run data: <a href="helloworldwithparams/data-run.json">data-run.json</a></sub></li>
+          <li><sub>Knative Payload: <a href="helloworldwithparams/payload-knative-init-run.http">payload-knative-init-run.http</a></sub></li>
+          <li><sub>OpenWhisk /init Payload: <a href="helloworldwithparams/payload-openwhisk-init.http">payload-openwhisk-init.http</a></sub></li>
+          <li><sub>OpenWhisk /run Payload: <a href="helloworldwithparams/payload-openwhisk-run.http">payload-openwhisk-run.http</a></sub></li>
+        </ul>
+      </td>
+    </tr>
+    <!-- webactionhelloworld -->
+    <tr align="left" valign="top">
+      <td>
+        <a href="webactionhelloworld">webactionhelloworld</a>
+        <p><sub>A Web Action that takes the HTTP request's query parameters and makes them available as arguments to
+        the <em>main</em> function. In this case, the value for the <em>name</em> query parameter is used in a
+        Hello World function.</sub></p>
+      </td>
+      <td>
+        <ul>
+          <li><sub>Build: <a href="webactionhelloworld/build.yaml.tmpl">build.yaml.tmpl</a></sub></li>
+          <li><sub>Service: <a href="webactionhelloworld/service.yaml.tmpl">service.yaml.tmpl</a></sub></li>
+        </ul>
+      </td>
+      <td>
+        <ul>
+          <li><sub>Knative data: <a href="webactionhelloworld/data-init.json">data-init-run.json</a></sub></li>
+          <li><sub>Knative Payload: <a href="webactionhelloworld/payload-knative-init-run.http">payload-knative-init-run.http</a></sub></li>
+          <li><sub>OpenWhisk /init Payload: <a href="webactionhelloworld/payload-openwhisk-init.http">payload-openwhisk-init.http</a></sub></li>
+          <li><sub>OpenWhisk /run Payload: <a href="webactionhelloworld/payload-openwhisk-run.http">payload-openwhisk-run.http</a></sub></li>
+        </ul>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+# Running the Tests
+
+This is the typical process for running each of the tests under this directory.
+
+### Pre-requisite
+
+```
+kubectl get buildtemplate
+NAME                       CREATED AT
+openwhisk-nodejs-runtime   10m
+```
+
+### Configure and Deploy Build YAML
+
+```
+export DOCKER_USERNAME="myusername"
+sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' build.yaml.tmpl > build.yaml
+kubectl apply -f build.yaml
+```
+
+### Configure and Deploy Service YAML
+
+```
+export DOCKER_USERNAME="myusername"
+sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' service.yaml.tmpl > service.yaml
+kubectl apply -f service.yaml
+```
+
+## Running the Test on different platforms
+
+Depending on the value you set in [buildtemplate.yaml](../buildtemplate.yaml) for the ```OW_RUNTIME_PLATFORM``` parameter, you will need to invoke different endpoints to execute the test.
+
+Currently, the following platform (values) are supported:
+- openwhisk
+- knative
+
+---
+
+## Running with OW_RUNTIME_PLATFORM set to "knative"
+
+Under the Knative platform, the developer has 2 choices:
+1. Use the Knative "build" step to "bake the function" into the runtime resulting in a dedicated runtime
+(service) container for your running a specific function.
+2. Use Knative build to create a "stem cell" runtime that allows some control plane to inject the function
+dynamically.
+
+The test case cases under this directory presume option 2 ("stem cells") where both the both runtime
+initialization, as well as function execution (Activation) happen sequentially.
+
+However, as OW runtimes do not allow "re-initialization" at this time, once you send the "init data" once to the runtime you
+cannot send it again or it will result in an error.
+
+Below are some options for invoking the endpoint (route) manually using common developer tooling
+in conjunction with prepared data:
+
+#### Using the 'curl' command
+
+Simply send the *"init-run"* data to the base *'/'* route on the runtime (service) endpoint.
+
+If your function requires no input data on the request:
+
+```
+curl -H "Host: <hostname>" -X POST http://localhost/
+```
+
+otherwise, you can supply the request data and ```Content-Type``` on the command and pass the JSON data to your function via data file:
+
+```
+curl -H "Host: <hostname>" -d "@data-init-run.json" -H "Content-Type: application/json" http://localhost/
+```
+
+#### Using Http Clients
+
+If using an IDE such as VSCode or IntelliJ you can simply "run" the HTTP payload files named
+*'payload-knative-init-run.http'* which both initializes the runtime with the function and
+configuration and executes the function with the provided *"values"* data.
+
+For example, the HelloWorld with parameters payload looks like this:
+
+```
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "init": {
+    "name": "nodejs-helloworld",
+    "main": "main",
+    "binary": false,
+    "code": "function main() {return {payload: 'Hello World!'};}"
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-helloworld",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe",
+    "place": "TX"
+  }
+}
+```
+
+please note that the *"activation"* data is also provided, but defaulted in most cases as these would
+be provided by a control-plane which would manage pools of the runtimes and track Activations.
+
+---
+
+## Running with OW_RUNTIME_PLATFORM set to "openwhisk"
+
+The standard OW methods used to run functions is done through calls to 2 separte endpoints.
+In short, The control plane would:
+
+1. first, invoke the */init* route with strictly the OW "init. data" (JSON format) including the funtional
+code itself.
+2. then, invoke */run* route which executes the function (i.e., Activates the function) with caller-provided
+parameters via OW "value data" (JSON format) along with per-activation information which would normally be
+provided and tracked by the control plane (default/dummy key-values provided for tests).
+
+Below are some options for invoking these routes manually using common developer tooling
+in conjunction with prepared data:
+
+### Using the 'curl' command
+
+#### Initialize the runtime
+
+Initialize the runtime with the function and other configuration data using the ```/init``` endpoint.
+
+```
+curl -H "Host: <hostname>" -d "@data-init.json" -H "Content-Type: application/json" http://localhost/init
+```
+
+#### Run the function
+
+Execute the function using the ```/run``` endpoint.
+
+with no request data:
+
+```
+curl -H "Host: <hostname>" -X POST http://localhost/run
+```
+
+or with request data and its ```Content-Type```:
+
+```
+curl -H "Host: <hostname>" -d "@data-run.json" -H "Content-Type: <content-type>" -X POST http://localhost/run
+```
+
+# Troubleshooting
+
+## Pod will not Terminate
+
+In some cases, you may need to force the pod to be deleted when the normal delete shown below does not work.
+```
+# Normal service delete
+kubectl delete -f service.yaml
+```
+
+you will see something like the following for a long period of time:
+```
+$ kubectl get pods --namespace default
+
+NAME                                                  READY   STATUS      RESTARTS   AGE
+nodejs-helloworld-00001-deployment-78c6bfbf4c-8cgtd   2/3     Terminating  0         81s
+```
+
+In this case, you can force the pod with your service to delete as follows:
+```
+kubectl delete pod nodejs-helloworld-00001-deployment-78c6bfbf4c-8cgtd --grace-period=0 --force
+```
+
+Also, be sure your service is completely deleted from the system:
+```
+kubectl delete -f service.yaml
+```
+
diff --git a/tests/src/test/knative/helloworld/README.md b/tests/src/test/knative/helloworld/README.md
new file mode 100644
index 0000000..ba16b84
--- /dev/null
+++ b/tests/src/test/knative/helloworld/README.md
@@ -0,0 +1,74 @@
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+# Hello World Test for OpenWhisk NodeJS Runtime using Knative
+
+## Running the test using the "Curl" command
+
+Depending on the value you set in [buildtemplate.yaml](../../../../../core/nodejsActionBase/buildtemplate.yaml) for the ```OW_RUNTIME_PLATFORM``` parameter, you will need to invoke different endpoints to execute the test.
+
+### Running with OW_RUNTIME_PLATFORM set to "knative"
+
+#### Invoke / endpoint on the Service
+
+```
+curl -H "Host: nodejs-helloworld.default.example.com" -X POST http://localhost/
+```
+
+#### Initialize the runtime
+
+You have an option to initialize the runtime with the function and other configuration data if its not initialized (i.e. built using [build-without-code.yaml.tmpl](build-without-code.yaml.tmpl))
+
+```
+curl -H "Host: nodejs-helloworld.default.example.com" -d "@knative-data-init.json" -H "Content-Type: application/json" http://localhost/
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function.
+
+```
+curl -H "Host: nodejs-helloworld.default.example.com" -d "@knative-data-run.json" -H "Content-Type: application/json" -X POST http://localhost/
+
+{"payload":"Hello World!"};
+```
+
+### Running with OW_RUNTIME_PLATFORM set to "openwhisk"
+
+#### Initialize the runtime
+
+Initialize the runtime with the function and other configuration data using the ```/init``` endpoint.
+
+```
+curl -H "Host: nodejs-helloworld.default.example.com" -d "@openwhisk-data-init.json" -H "Content-Type: application/json" http://localhost/init
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function using the ```/run``` endpoint.
+
+```
+curl -H "Host: nodejs-helloworld.default.example.com" -d "@openwhisk-data-run.json" -H "Content-Type: application/json" -X POST http://localhost/run
+
+{"payload":"Hello World!"}
+```
diff --git a/tests/src/test/knative/helloworld/build.yaml.tmpl b/tests/src/test/knative/helloworld/build.yaml.tmpl
new file mode 100644
index 0000000..fb327dc
--- /dev/null
+++ b/tests/src/test/knative/helloworld/build.yaml.tmpl
@@ -0,0 +1,23 @@
+apiVersion: build.knative.dev/v1alpha1
+kind: Build
+metadata:
+  name: nodejs-10-helloworld
+spec:
+  serviceAccountName: openwhisk-runtime-builder
+  source:
+    git:
+      url: "https://github.com/apache/incubator-openwhisk-runtime-nodejs.git"
+      revision: "master"
+  template:
+    name: openwhisk-nodejs-runtime
+    arguments:
+      - name: TARGET_IMAGE_NAME
+        value: "docker.io/${DOCKER_USERNAME}/nodejs-10-helloworld"
+      - name: DOCKERFILE
+        value: "./knative-build/runtimes/javascript/Dockerfile"
+      - name: OW_RUNTIME_DEBUG
+        value: "true"
+      - name: OW_ACTION_NAME
+        value: "nodejs-helloworld"
+      - name: OW_ACTION_CODE
+        value: "function main() {return {payload: 'Hello World!'};}"
diff --git a/tests/src/test/knative/helloworld/payload-knative-init-run.http b/tests/src/test/knative/helloworld/payload-knative-init-run.http
new file mode 100644
index 0000000..a48ea10
--- /dev/null
+++ b/tests/src/test/knative/helloworld/payload-knative-init-run.http
@@ -0,0 +1,25 @@
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "init": {
+    "name": "nodejs-helloworld",
+    "main": "main",
+    "binary": false,
+    "code": "function main() {return {payload: 'Hello World!'};}"
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-helloworld",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe",
+    "place": "TX"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/helloworld/payload-openwhisk-init.http b/tests/src/test/knative/helloworld/payload-openwhisk-init.http
new file mode 100644
index 0000000..9d8206d
--- /dev/null
+++ b/tests/src/test/knative/helloworld/payload-openwhisk-init.http
@@ -0,0 +1,13 @@
+POST http://localhost:8080/init HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "nodejs-helloworld",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main() {return {payload: 'Hello World!'};}"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/helloworld/payload-openwhisk-run.http b/tests/src/test/knative/helloworld/payload-openwhisk-run.http
new file mode 100644
index 0000000..6c4c094
--- /dev/null
+++ b/tests/src/test/knative/helloworld/payload-openwhisk-run.http
@@ -0,0 +1,15 @@
+POST http://localhost:8080/run HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+  },
+  "namespace": "default",
+  "action_name": "nodejs-helloworld",
+  "api_host": "",
+  "api_key": "",
+  "activation_id": "",
+  "deadline": "4102498800000"
+}
+
+###
diff --git a/tests/src/test/knative/helloworld/service.yaml.tmpl b/tests/src/test/knative/helloworld/service.yaml.tmpl
new file mode 100644
index 0000000..18eb93c
--- /dev/null
+++ b/tests/src/test/knative/helloworld/service.yaml.tmpl
@@ -0,0 +1,12 @@
+apiVersion: serving.knative.dev/v1alpha1
+kind: Service
+metadata:
+  name: nodejs-helloworld
+  namespace: default
+spec:
+  runLatest:
+    configuration:
+      revisionTemplate:
+        spec:
+          container:
+            image: docker.io/${DOCKER_USERNAME}/nodejs-10-helloworld
diff --git a/tests/src/test/knative/helloworldwithparams/README.md b/tests/src/test/knative/helloworldwithparams/README.md
new file mode 100644
index 0000000..5476897
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/README.md
@@ -0,0 +1,74 @@
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+# Hello World with Params Test for OpenWhisk NodeJS Runtime using Knative
+
+## Running the test using the "Curl" command
+
+Depending on the value you set in [buildtemplate.yaml](../../../../../core/nodejsActionBase/buildtemplate.yaml) for the ```OW_RUNTIME_PLATFORM``` parameter, you will need to invoke different endpoints to execute the test.
+
+### Running with OW_RUNTIME_PLATFORM set to "knative"
+
+#### Invoke / endpoint on the Service
+
+```
+curl -H "Host: nodejs-helloworld-with-params.default.example.com" -d '{"value": {"name": "Joe", "place": "TX"}}' -H "Content-Type: application/json" http://localhost/
+```
+
+#### Initialize the runtime
+
+You have an option to initialize the runtime with the function and other configuration data if its not initialized (i.e. built using [build-without-code.yaml.tmpl](build-without-code.yaml.tmpl))
+
+```
+curl -H "Host: nodejs-helloworld-with-params.default.example.com" -d "@knative-data-init.json" -H "Content-Type: application/json" http://localhost/
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function.
+
+```
+curl -H "Host: nodejs-helloworld-with-params.default.example.com" -d "@knative-data-run.json" -H "Content-Type: application/json" -X POST http://localhost/
+
+{"payload":"Hello Jill from OK!"};
+```
+
+### Running with OW_RUNTIME_PLATFORM set to "openwhisk"
+
+#### Initialize the runtime
+
+Initialize the runtime with the function and other configuration data using the ```/init``` endpoint.
+
+```
+curl -H "Host: nodejs-helloworld-with-params.default.example.com" -d "@openwhisk-data-init.json" -H "Content-Type: application/json" http://localhost/init
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function using the ```/run``` endpoint.
+
+```
+curl -H "Host: nodejs-helloworld-with-params.default.example.com" -d "@openwhisk-data-run.json" -H "Content-Type: application/json" -X POST http://localhost/run
+
+{"payload":"Hello Joe from TX!"};
+```
diff --git a/tests/src/test/knative/helloworldwithparams/build-without-code.yaml.tmpl b/tests/src/test/knative/helloworldwithparams/build-without-code.yaml.tmpl
new file mode 100644
index 0000000..623c9e2
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/build-without-code.yaml.tmpl
@@ -0,0 +1,19 @@
+apiVersion: build.knative.dev/v1alpha1
+kind: Build
+metadata:
+  name: nodejs-10-helloworld-with-params
+spec:
+  serviceAccountName: openwhisk-runtime-builder
+  source:
+    git:
+      url: "https://github.com/apache/incubator-openwhisk-runtime-nodejs.git"
+      revision: "master"
+  template:
+    name: openwhisk-nodejs-runtime
+    arguments:
+      - name: TARGET_IMAGE_NAME
+        value: "docker.io/${DOCKER_USERNAME}/nodejs-10-helloworld-with-params"
+      - name: DOCKERFILE
+        value: "./knative-build/runtimes/javascript/Dockerfile"
+      - name: OW_RUNTIME_DEBUG
+        value: "true"
diff --git a/tests/src/test/knative/helloworldwithparams/build.yaml.tmpl b/tests/src/test/knative/helloworldwithparams/build.yaml.tmpl
new file mode 100644
index 0000000..3d68459
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/build.yaml.tmpl
@@ -0,0 +1,23 @@
+apiVersion: build.knative.dev/v1alpha1
+kind: Build
+metadata:
+  name: nodejs-10-helloworld-with-params
+spec:
+  serviceAccountName: openwhisk-runtime-builder
+  source:
+    git:
+      url: "https://github.com/apache/incubator-openwhisk-runtime-nodejs.git"
+      revision: "master"
+  template:
+    name: openwhisk-nodejs-runtime
+    arguments:
+      - name: TARGET_IMAGE_NAME
+        value: "docker.io/${DOCKER_USERNAME}/nodejs-10-helloworld-with-params"
+      - name: DOCKERFILE
+        value: "./knative-build/runtimes/javascript/Dockerfile"
+      - name: OW_RUNTIME_DEBUG
+        value: "true"
+      - name: OW_ACTION_NAME
+        value: "nodejs-helloworld-with-params"
+      - name: OW_ACTION_CODE
+        value: "function main() {return {payload: 'Hello ' + params.name + ' from ' + params.place + '!'};}"
diff --git a/tests/src/test/knative/helloworldwithparams/knative-data-init-run.json b/tests/src/test/knative/helloworldwithparams/knative-data-init-run.json
new file mode 100644
index 0000000..5fc3c1f
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/knative-data-init-run.json
@@ -0,0 +1,20 @@
+{
+    "init": {
+        "name" : "nodejs-helloworld-with-params",
+        "main" : "main",
+        "binary": false,
+        "code" : "function main(params) {return {payload: 'Hello ' + params.name + ' from ' + params.place +  '!'};}"
+    },
+    "activation": {
+        "namespace": "default",
+        "action_name": "nodejs-helloworld-with-params",
+        "api_host": "",
+        "api_key": "",
+        "activation_id": "",
+        "deadline": "4102498800000"
+    },
+    "value": {
+        "name" : "Joe",
+        "place" : "TX"
+    }
+}
diff --git a/tests/src/test/knative/helloworldwithparams/knative-data-init.json b/tests/src/test/knative/helloworldwithparams/knative-data-init.json
new file mode 100644
index 0000000..93fba33
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/knative-data-init.json
@@ -0,0 +1,8 @@
+{
+    "init": {
+        "name" : "nodejs-helloworld-with-params",
+        "main" : "main",
+        "binary": false,
+        "code" : "function main(params) {return {payload: 'Hello ' + params.name + ' from ' + params.place +  '!'};}"
+    }
+}
diff --git a/tests/src/test/knative/helloworldwithparams/knative-data-run.json b/tests/src/test/knative/helloworldwithparams/knative-data-run.json
new file mode 100644
index 0000000..c498345
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/knative-data-run.json
@@ -0,0 +1,14 @@
+{
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-helloworld-with-params",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name" : "Jill",
+    "place" : "OK"
+  }
+}
diff --git a/tests/src/test/knative/helloworldwithparams/openwhisk-data-init.json b/tests/src/test/knative/helloworldwithparams/openwhisk-data-init.json
new file mode 100644
index 0000000..08ee77c
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/openwhisk-data-init.json
@@ -0,0 +1,8 @@
+{
+  "value": {
+    "name" : "nodejs-helloworld-with-params",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) {return {payload: 'Hello ' + params.name + ' from ' + params.place +  '!'};}"
+  }
+}
diff --git a/tests/src/test/knative/helloworldwithparams/openwhisk-data-run.json b/tests/src/test/knative/helloworldwithparams/openwhisk-data-run.json
new file mode 100644
index 0000000..7b4aa34
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/openwhisk-data-run.json
@@ -0,0 +1,12 @@
+{
+  "value": {
+    "name" : "Joe",
+    "place" : "TX"
+  },
+  "namespace": "default",
+  "action_name": "nodejs-helloworld-with-params",
+  "api_host": "",
+  "api_key": "",
+  "activation_id": "",
+  "deadline": "4102498800000"
+}
diff --git a/tests/src/test/knative/helloworldwithparams/payload-knative-init-run.http b/tests/src/test/knative/helloworldwithparams/payload-knative-init-run.http
new file mode 100644
index 0000000..7b4a421
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/payload-knative-init-run.http
@@ -0,0 +1,25 @@
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "init": {
+    "name" : "nodejs-helloworld-with-params",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) {return {payload: 'Hello ' + params.name + ' from ' + params.place +  '!'};}"
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-helloworld-with-params",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name" : "Joe",
+    "place" : "TX"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/helloworldwithparams/payload-knative-init.http b/tests/src/test/knative/helloworldwithparams/payload-knative-init.http
new file mode 100644
index 0000000..28b4957
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/payload-knative-init.http
@@ -0,0 +1,13 @@
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "init": {
+    "name" : "nodejs-helloworld-with-params",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) {return {payload: 'Hello ' + params.name + ' from ' + params.place +  '!'};}"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/helloworldwithparams/payload-knative-run.http b/tests/src/test/knative/helloworldwithparams/payload-knative-run.http
new file mode 100644
index 0000000..7a88f2c
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/payload-knative-run.http
@@ -0,0 +1,19 @@
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-helloworld-with-params",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name" : "Jill",
+    "place" : "OK"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/helloworldwithparams/payload-openwhisk-init.http b/tests/src/test/knative/helloworldwithparams/payload-openwhisk-init.http
new file mode 100644
index 0000000..691042c
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/payload-openwhisk-init.http
@@ -0,0 +1,13 @@
+POST http://localhost:8080/init HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "nodejs-helloworld-with-params",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) {return {payload: 'Hello ' + params.name + ' from ' + params.place +  '!'};}"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/helloworldwithparams/payload-openwhisk-run.http b/tests/src/test/knative/helloworldwithparams/payload-openwhisk-run.http
new file mode 100644
index 0000000..30bd652
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/payload-openwhisk-run.http
@@ -0,0 +1,17 @@
+POST http://localhost:8080/run HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "Joe",
+    "place" : "TX"
+  },
+  "namespace": "default",
+  "action_name": "nodejs-helloworld-with-params",
+  "api_host": "",
+  "api_key": "",
+  "activation_id": "",
+  "deadline": "4102498800000"
+}
+
+###
diff --git a/tests/src/test/knative/helloworldwithparams/service.yaml.tmpl b/tests/src/test/knative/helloworldwithparams/service.yaml.tmpl
new file mode 100644
index 0000000..1259f97
--- /dev/null
+++ b/tests/src/test/knative/helloworldwithparams/service.yaml.tmpl
@@ -0,0 +1,12 @@
+apiVersion: serving.knative.dev/v1alpha1
+kind: Service
+metadata:
+  name: nodejs-helloworld-with-params
+  namespace: default
+spec:
+  runLatest:
+    configuration:
+      revisionTemplate:
+        spec:
+          container:
+            image: docker.io/${DOCKER_USERNAME}/nodejs-10-helloworld-with-params
diff --git a/tests/src/test/knative/webactionhelloworld/README.md b/tests/src/test/knative/webactionhelloworld/README.md
new file mode 100644
index 0000000..c8dee35
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/README.md
@@ -0,0 +1,75 @@
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+# Hello World Web Action Test for OpenWhisk NodeJS Runtime using Knative
+
+## Running the test using the "Curl" command
+
+Depending on the value you set in [buildtemplate.yaml](../../../../../core/nodejsActionBase/buildtemplate.yaml) for the ```OW_RUNTIME_PLATFORM``` parameter, you will need to invoke different endpoints to execute the test.
+
+### Running with OW_RUNTIME_PLATFORM set to "knative"
+
+#### Invoke / endpoint on the Service
+
+```
+curl -H "Host: nodejs-web-action-helloworld.default.example.com" -X POST http://localhost/
+<html><body><h3>hello Joe</h3></body></html>
+```
+
+#### Initialize the runtime
+
+You have an option to initialize the runtime with the function and other configuration data if its not initialized (i.e. built using [build-without-code.yaml.tmpl](build-without-code.yaml.tmpl))
+
+```
+curl -H "Host: nodejs-web-action-helloworld.default.example.com" -d "@knative-data-init.json" -H "Content-Type: application/json" http://localhost/
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function.
+
+```
+curl -H "Host: nodejs-web-action-helloworld.default.example.com" -d "@knative-data-run.json" -H "Content-Type: application/json" -X POST http://localhost/
+
+<html><body><h3>hello Joe</h3></body></html>
+```
+
+
+### Running with OW_RUNTIME_PLATFORM set to "openwhisk"
+
+#### Initialize the runtime
+
+Initialize the runtime with the function and other configuration data using the ```/init``` endpoint.
+
+```
+curl -H "Host: nodejs-web-aciton-helloworld.default.example.com" -d "@openwhisk-data-init.json" -H "Content-Type: application/json" http://localhost/init
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function using the ```/run``` endpoint.
+
+```
+curl -H "Host: nodejs-web-action-helloworld.default.example.com" -d "@openwhisk-data-run.json" -H "Content-Type: application/json" -X POST http://localhost/run
+<html><body><h3>hello Joe</h3></body></html>
+```
diff --git a/tests/src/test/knative/webactionhelloworld/build-without-code.yaml.tmpl b/tests/src/test/knative/webactionhelloworld/build-without-code.yaml.tmpl
new file mode 100644
index 0000000..5892a29
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/build-without-code.yaml.tmpl
@@ -0,0 +1,20 @@
+apiVersion: build.knative.dev/v1alpha1
+kind: Build
+metadata:
+  name: nodejs-10-web-action-helloworld
+spec:
+  serviceAccountName: openwhisk-runtime-builder
+  source:
+    git:
+      url: "https://github.com/apache/incubator-openwhisk-runtime-nodejs.git"
+  revision: "master"
+  template:
+    name: openwhisk-nodejs-runtime
+    arguments:
+      - name: TARGET_IMAGE_NAME
+        value: "docker.io/${DOCKER_USERNAME}/nodejs-10-web-action-helloworld"
+      - name: DOCKERFILE
+        value: "./knative-build/runtimes/javascript/Dockerfile"
+      - name: OW_RUNTIME_DEBUG
+        value: "true"
+
diff --git a/tests/src/test/knative/webactionhelloworld/build.yaml.tmpl b/tests/src/test/knative/webactionhelloworld/build.yaml.tmpl
new file mode 100644
index 0000000..8c7a384
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/build.yaml.tmpl
@@ -0,0 +1,24 @@
+apiVersion: build.knative.dev/v1alpha1
+kind: Build
+metadata:
+  name: nodejs-10-web-action-helloworld
+spec:
+  serviceAccountName: openwhisk-runtime-builder
+  source:
+    git:
+      url: "https://github.com/apache/incubator-openwhisk-devtools.git"
+  revision: "master"
+  template:
+    name: openwhisk-nodejs-runtime
+    arguments:
+      - name: TARGET_IMAGE_NAME
+        value: "docker.io/${DOCKER_USERNAME}/nodejs-10-web-action-helloworld"
+      - name: DOCKERFILE
+        value: "./knative-build/runtimes/javascript/Dockerfile"
+      - name: OW_RUNTIME_DEBUG
+        value: "true"
+      - name: OW_ACTION_NAME
+        value: "nodejs-web-action-helloworld"
+      - name: OW_ACTION_CODE
+        "value" : "function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }"
+
diff --git a/tests/src/test/knative/webactionhelloworld/knative-data-init-run.json b/tests/src/test/knative/webactionhelloworld/knative-data-init-run.json
new file mode 100644
index 0000000..93accb4
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/knative-data-init-run.json
@@ -0,0 +1,19 @@
+{
+  "init": {
+    "name" : "nodejs-web-action-helloworld",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }"
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-web-action-helloworld",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe"
+  }
+}
diff --git a/tests/src/test/knative/webactionhelloworld/knative-data-init.json b/tests/src/test/knative/webactionhelloworld/knative-data-init.json
new file mode 100644
index 0000000..3dcd3c9
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/knative-data-init.json
@@ -0,0 +1,8 @@
+{
+  "init": {
+    "name" : "nodejs-web-action-helloworld",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }"
+  }
+}
diff --git a/tests/src/test/knative/webactionhelloworld/knative-data-run.json b/tests/src/test/knative/webactionhelloworld/knative-data-run.json
new file mode 100644
index 0000000..9188304
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/knative-data-run.json
@@ -0,0 +1,13 @@
+{
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-web-action-helloworld",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe"
+  }
+}
diff --git a/tests/src/test/knative/webactionhelloworld/openwhisk-data-init.json b/tests/src/test/knative/webactionhelloworld/openwhisk-data-init.json
new file mode 100644
index 0000000..94b3869
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/openwhisk-data-init.json
@@ -0,0 +1,8 @@
+{
+    "value": {
+        "name" : "nodejs-web-action-helloworld",
+        "main" : "main",
+        "binary": false,
+        "code" : "function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }"
+    }
+}
diff --git a/tests/src/test/knative/webactionhelloworld/openwhisk-data-run.json b/tests/src/test/knative/webactionhelloworld/openwhisk-data-run.json
new file mode 100644
index 0000000..5298eb6
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/openwhisk-data-run.json
@@ -0,0 +1,11 @@
+{ 
+    "value": {
+        "name": "Joe"
+    },
+    "namespace": "default",
+    "action_name": "nodejs-web-action-helloworld",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+}
diff --git a/tests/src/test/knative/webactionhelloworld/payload-knative-init-run.http b/tests/src/test/knative/webactionhelloworld/payload-knative-init-run.http
new file mode 100644
index 0000000..6920998
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/payload-knative-init-run.http
@@ -0,0 +1,24 @@
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "init": {
+    "name" : "nodejs-web-action-helloworld",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }"
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-web-action-helloworld",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/webactionhelloworld/payload-openwhisk-init.http b/tests/src/test/knative/webactionhelloworld/payload-openwhisk-init.http
new file mode 100644
index 0000000..e8e680d
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/payload-openwhisk-init.http
@@ -0,0 +1,13 @@
+POST http://localhost:8080/init HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "nodejs-web-action-helloworld",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main({name}) { var msg = 'you did not tell me who you are.'; if (name) { msg = `hello ${name}` } return {body: `<html><body><h3>${msg}</h3></body></html>`} }"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/webactionhelloworld/payload-openwhisk-run.http b/tests/src/test/knative/webactionhelloworld/payload-openwhisk-run.http
new file mode 100644
index 0000000..75721d5
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/payload-openwhisk-run.http
@@ -0,0 +1,16 @@
+POST http://localhost:8080/run HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "Joe"
+  },
+  "namespace": "default",
+  "action_name": "nodejs-web-action-helloworld",
+  "api_host": "",
+  "api_key": "",
+  "activation_id": "",
+  "deadline": "4102498800000"
+}
+
+###
diff --git a/tests/src/test/knative/webactionhelloworld/service.yaml.tmpl b/tests/src/test/knative/webactionhelloworld/service.yaml.tmpl
new file mode 100644
index 0000000..aa4a123
--- /dev/null
+++ b/tests/src/test/knative/webactionhelloworld/service.yaml.tmpl
@@ -0,0 +1,12 @@
+apiVersion: serving.knative.dev/v1alpha1
+kind: Service
+metadata:
+  name: nodejs-web-action-helloworld
+  namespace: default
+spec:
+  runLatest:
+    configuration:
+      revisionTemplate:
+        spec:
+          container:
+            image: docker.io/${DOCKER_USERNAME}/nodejs-10-web-action-helloworld
diff --git a/tests/src/test/knative/webactionraw/README.md b/tests/src/test/knative/webactionraw/README.md
new file mode 100644
index 0000000..dbe1d95
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/README.md
@@ -0,0 +1,76 @@
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+# Raw Web Action Test for OpenWhisk NodeJS Runtime using Knative
+
+## Running the test using the `curl` command
+
+Depending on the value you set in [buildtemplate.yaml](../../buildtemplate.yaml) for the ```OW_RUNTIME_PLATFORM``` parameter, you will need to invoke different endpoints to execute the test.
+
+### Running with OW_RUNTIME_PLATFORM set to "knative"
+
+#### Invoke / endpoint on the Service
+
+```
+curl -H "Host: nodejs-web-action-raw.default.example.com" -X POST http://localhost/
+{
+   "response":{
+      "__ow_body":"eyJuYW1lIjoiSm9lIn0=",
+      "__ow_query":{
+      },
+      "__ow_user":"",
+      "__ow_method":"POST",
+      "__ow_headers":{
+         "host":"localhost",
+         "user-agent":"curl/7.54.0",
+         "accept":"*/*",
+         "content-type":"application/json",
+         "content-length":"394"
+      },
+      "__ow_path":""
+   }
+}
+```
+
+### Running with OW_RUNTIME_PLATFORM set to "openwhisk"
+
+#### Initialize the runtime
+
+Initialize the runtime with the function and other configuration data using the ```/init``` endpoint.
+
+```
+curl -H "Host: nodejs-web-aciton-raw.default.example.com" -d "@data-init.json" -H "Content-Type: application/json" http://localhost/init
+
+{"OK":true}
+```
+
+#### Run the function
+
+Execute the function using the ```/run``` endpoint.
+
+```
+curl -H "Host: nodejs-web-action-raw.default.example.com" -d "@data-run.json" -H "Content-Type: application/json" -X POST http://localhost/run
+{
+   "response":{
+      "name":"Joe"
+   }
+}
+```
+
+**Note**: OpenWhisk controller plays an important role in handling web actions and that's why lacking `__ow_*` parameters from the response.
diff --git a/tests/src/test/knative/webactionraw/build.yaml.tmpl b/tests/src/test/knative/webactionraw/build.yaml.tmpl
new file mode 100644
index 0000000..f4df3db
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/build.yaml.tmpl
@@ -0,0 +1,26 @@
+apiVersion: build.knative.dev/v1alpha1
+kind: Build
+metadata:
+  name: nodejs-10-web-action-raw
+spec:
+  serviceAccountName: openwhisk-runtime-builder
+  source:
+    git:
+      url: "https://github.com/apache/incubator-openwhisk-runtime-nodejs.git"
+      revision: "master"
+  template:
+    name: openwhisk-nodejs-runtime
+    arguments:
+      - name: TARGET_IMAGE_NAME
+        value: "docker.io/${DOCKER_USERNAME}/nodejs-10-web-action-raw"
+      - name: DOCKERFILE
+        value: "./knative-build/runtimes/javascript/Dockerfile"
+      - name: OW_RUNTIME_DEBUG
+        value: "true"
+      - name: OW_ACTION_NAME
+        value: "nodejs-web-action-raw"
+      - name: OW_ACTION_CODE
+        value : "function main(params) { return { response: params }; }"
+      - name: OW_ACTION_RAW
+        value: "true"
+
diff --git a/tests/src/test/knative/webactionraw/data-init-run.json b/tests/src/test/knative/webactionraw/data-init-run.json
new file mode 100644
index 0000000..87082e5
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/data-init-run.json
@@ -0,0 +1,20 @@
+{
+  "init": {
+    "name" : "nodejs-web-action-raw",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) { return { response: params }; }",
+    "raw": true
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-web-action-raw",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe"
+  }
+}
diff --git a/tests/src/test/knative/webactionraw/data-init.json b/tests/src/test/knative/webactionraw/data-init.json
new file mode 100644
index 0000000..09fcbd6
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/data-init.json
@@ -0,0 +1,8 @@
+{
+    "value": {
+        "name" : "nodejs-web-action-raw",
+        "main" : "main",
+        "binary": false,
+        "code" : "function main(params) { return { response: params }; }"
+    }
+}
diff --git a/tests/src/test/knative/webactionraw/data-run.json b/tests/src/test/knative/webactionraw/data-run.json
new file mode 100644
index 0000000..f020547
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/data-run.json
@@ -0,0 +1,11 @@
+{ 
+    "value": {
+        "name": "Joe"
+    },
+    "namespace": "default",
+    "action_name": "nodejs-web-action-raw",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+}
diff --git a/tests/src/test/knative/webactionraw/payload-knative-init-run.http b/tests/src/test/knative/webactionraw/payload-knative-init-run.http
new file mode 100644
index 0000000..b8c3bb7
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/payload-knative-init-run.http
@@ -0,0 +1,25 @@
+POST http://localhost:8080/ HTTP/1.1
+content-type: application/json
+
+{
+  "init": {
+    "name" : "nodejs-web-action-raw",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) { return { response: params }; }",
+    "raw": true
+  },
+  "activation": {
+    "namespace": "default",
+    "action_name": "nodejs-web-action-raw",
+    "api_host": "",
+    "api_key": "",
+    "activation_id": "",
+    "deadline": "4102498800000"
+  },
+  "value": {
+    "name": "Joe"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/webactionraw/payload-openwhisk-init.http b/tests/src/test/knative/webactionraw/payload-openwhisk-init.http
new file mode 100644
index 0000000..bc64d95
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/payload-openwhisk-init.http
@@ -0,0 +1,13 @@
+POST http://localhost:8080/init HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "nodejs-web-action-raw",
+    "main" : "main",
+    "binary": false,
+    "code" : "function main(params) { return { response: params }; }"
+  }
+}
+
+###
diff --git a/tests/src/test/knative/webactionraw/payload-openwhisk-run.http b/tests/src/test/knative/webactionraw/payload-openwhisk-run.http
new file mode 100644
index 0000000..4baff6b
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/payload-openwhisk-run.http
@@ -0,0 +1,16 @@
+POST http://localhost:8080/run HTTP/1.1
+content-type: application/json
+
+{
+  "value": {
+    "name" : "Joe"
+  },
+  "namespace": "default",
+  "action_name": "nodejs-web-action-raw",
+  "api_host": "",
+  "api_key": "",
+  "activation_id": "",
+  "deadline": "4102498800000"
+}
+
+###
diff --git a/tests/src/test/knative/webactionraw/service.yaml.tmpl b/tests/src/test/knative/webactionraw/service.yaml.tmpl
new file mode 100644
index 0000000..73c9ffb
--- /dev/null
+++ b/tests/src/test/knative/webactionraw/service.yaml.tmpl
@@ -0,0 +1,12 @@
+apiVersion: serving.knative.dev/v1alpha1
+kind: Service
+metadata:
+  name: nodejs-web-action-raw
+  namespace: default
+spec:
+  runLatest:
+    configuration:
+      revisionTemplate:
+        spec:
+          container:
+            image: docker.io/${DOCKER_USERNAME}/nodejs-10-web-action-raw