NodeJS container support for alternative entry points.

The container itself was already supporting it. This commit adds tests.
diff --git a/tests/src/actionContainers/ActionContainer.scala b/tests/src/actionContainers/ActionContainer.scala
index c5350a3..1937b3f 100644
--- a/tests/src/actionContainers/ActionContainer.scala
+++ b/tests/src/actionContainers/ActionContainer.scala
@@ -54,7 +54,7 @@
 trait ActionProxyContainerTestUtils extends FlatSpec with Matchers {
     import ActionContainer.{ filterSentinel, sentinel }
 
-    def initPayload(code: String) = JsObject("value" -> JsObject("code" -> JsString(code)))
+    def initPayload(code: String, main: String = "main") = JsObject("value" -> JsObject("code" -> JsString(code), "main" -> JsString(main)))
     def runPayload(args: JsValue, other: Option[JsObject] = None) = {
         JsObject(Map("value" -> args) ++ (other map { _.fields } getOrElse Map()))
     }
diff --git a/tests/src/actionContainers/JavaActionContainerTests.scala b/tests/src/actionContainers/JavaActionContainerTests.scala
index 876f0b4..c8f6c84 100644
--- a/tests/src/actionContainers/JavaActionContainerTests.scala
+++ b/tests/src/actionContainers/JavaActionContainerTests.scala
@@ -33,7 +33,8 @@
 
     // Helpers specific to javaaction
     def withJavaContainer(code: ActionContainer => Unit, env: Map[String, String] = Map.empty) = withContainer("javaaction", env)(code)
-    def initPayload(mainClass: String, jar64: String) = JsObject(
+
+    override def initPayload(mainClass: String, jar64: String) = JsObject(
         "value" -> JsObject(
             "name" -> JsString("dummyAction"),
             "main" -> JsString(mainClass),
diff --git a/tests/src/actionContainers/NodeJsActionContainerTests.scala b/tests/src/actionContainers/NodeJsActionContainerTests.scala
index f33e3e2..00cbf25 100644
--- a/tests/src/actionContainers/NodeJsActionContainerTests.scala
+++ b/tests/src/actionContainers/NodeJsActionContainerTests.scala
@@ -41,14 +41,14 @@
 
     def exec(code: String): NodeJSAbstractExec = NodeJSExec(code)
 
-    override def initPayload(code: String) = {
+    override def initPayload(code: String, main: String = "main") = {
         val e = exec(code)
         JsObject(
             "value" -> JsObject(
                 "name" -> JsString("dummyAction"),
                 "code" -> JsString(e.code),
                 "binary" -> JsBoolean(e.binary),
-                "main" -> JsString("main")))
+                "main" -> JsString(main)))
     }
 
     behavior of nodejsContainerImageName
@@ -513,18 +513,20 @@
         })
     }
 
+    val examplePackageDotJson: String = """
+        | {
+        |   "name": "wskaction",
+        |   "version": "1.0.0",
+        |   "description": "An OpenWhisk action as an npm package.",
+        |   "main": "index.js",
+        |   "author": "info@openwhisk.org",
+        |   "license": "Apache-2.0"
+        | }
+    """.stripMargin
+
     it should "support zip-encoded npm package actions" in {
         val srcs = Seq(
-            Seq("package.json") -> """
-                | {
-                |   "name": "wskaction",
-                |   "version": "1.0.0",
-                |   "description": "An OpenWhisk action as an npm package.",
-                |   "main": "index.js",
-                |   "author": "info@openwhisk.org",
-                |   "license": "Apache-2.0"
-                | }
-            """.stripMargin,
+            Seq("package.json") -> examplePackageDotJson,
             Seq("index.js") -> """
                 | exports.main = function (args) {
                 |     var name = typeof args["name"] === "string" ? args["name"] : "stranger";
@@ -587,4 +589,37 @@
                 (o + e).toLowerCase should include("module_not_found")
         })
     }
+
+    it should "support actions using non-default entry point" in {
+        val (out, err) = withNodeJsContainer { c =>
+            val code = """
+            | function niam(args) {
+            |     return { result: "it works" };
+            | }
+            """.stripMargin
+
+            c.init(initPayload(code, main = "niam"))._1 should be(200)
+            val (runCode, runRes) = c.run(runPayload(JsObject()))
+            runRes.get.fields.get("result") shouldBe Some(JsString("it works"))
+        }
+    }
+
+    it should "support zipped actions using non-default entry point" in {
+        val srcs = Seq(
+            Seq("package.json") -> examplePackageDotJson,
+            Seq("index.js") -> """
+                | exports.niam = function (args) {
+                |     return { result: "it works" };
+                | }
+            """.stripMargin)
+
+        val code = ZipBuilder.mkBase64Zip(srcs)
+
+        val (out, err) = withNodeJsContainer { c =>
+            c.init(initPayload(code, main = "niam"))._1 should be(200)
+
+            val (runCode, runRes) = c.run(runPayload(JsObject()))
+            runRes.get.fields.get("result") shouldBe Some(JsString("it works"))
+        }
+    }
 }