Normalize initializer for all execs. (#1938)

* Normalize initializer for all execs.

* Handle empty code for blackbox.

* Do not include code if null.
diff --git a/core/javaAction/proxy/src/main/java/openwhisk/java/action/Proxy.java b/core/javaAction/proxy/src/main/java/openwhisk/java/action/Proxy.java
index 3dc9542..bdcbcab 100644
--- a/core/javaAction/proxy/src/main/java/openwhisk/java/action/Proxy.java
+++ b/core/javaAction/proxy/src/main/java/openwhisk/java/action/Proxy.java
@@ -80,7 +80,7 @@
 
                 JsonObject message = inputObject.getAsJsonObject("value");
                 String mainClass = message.getAsJsonPrimitive("main").getAsString();
-                String base64Jar = message.getAsJsonPrimitive("jar").getAsString();
+                String base64Jar = message.getAsJsonPrimitive("code").getAsString();
 
                 // FIXME: this is obviously not very useful. The idea is that we
                 // will implement/use
diff --git a/tests/src/actionContainers/ActionContainer.scala b/tests/src/actionContainers/ActionContainer.scala
index fe68ff8..d2f2f76 100644
--- a/tests/src/actionContainers/ActionContainer.scala
+++ b/tests/src/actionContainers/ActionContainer.scala
@@ -54,7 +54,7 @@
 
     def initPayload(code: String, main: String = "main") = {
         JsObject("value" -> JsObject(
-            "code" -> JsString(code),
+            "code" -> { if (code != null) JsString(code) else JsNull },
             "main" -> JsString(main),
             "binary" -> JsBoolean(Exec.isBinaryCode(code))))
     }
diff --git a/tests/src/actionContainers/ActionProxyContainerTests.scala b/tests/src/actionContainers/ActionProxyContainerTests.scala
index 8584b85..7c1e5a2 100644
--- a/tests/src/actionContainers/ActionProxyContainerTests.scala
+++ b/tests/src/actionContainers/ActionProxyContainerTests.scala
@@ -122,6 +122,21 @@
         })
     }
 
+    it should "run sample with 'null' init" in {
+        val (out, err) = withActionContainer() { c =>
+            val (initCode, _) = c.init(initPayload(null))
+            initCode should be(200)
+
+            val (runCode, out) = c.run(JsObject())
+            runCode should be(200)
+            out should be(Some(JsObject("error" -> JsString("This is a stub action. Replace it with custom logic."))))
+        }
+
+        checkStreams(out, err, {
+            case (o, _) => o should include("This is a stub action")
+        })
+    }
+
     it should "run sample with init that does nothing" in {
         val (out, err) = withActionContainer() { c =>
             val (initCode, _) = c.init(JsObject())
diff --git a/tests/src/actionContainers/JavaActionContainerTests.scala b/tests/src/actionContainers/JavaActionContainerTests.scala
index 5125b4c..1eba705 100644
--- a/tests/src/actionContainers/JavaActionContainerTests.scala
+++ b/tests/src/actionContainers/JavaActionContainerTests.scala
@@ -38,7 +38,7 @@
         "value" -> JsObject(
             "name" -> JsString("dummyAction"),
             "main" -> JsString(mainClass),
-            "jar" -> JsString(jar64)))
+            "code" -> JsString(jar64)))
 
     behavior of "Java action"
 
diff --git a/tests/src/whisk/core/entity/test/SchemaTests.scala b/tests/src/whisk/core/entity/test/SchemaTests.scala
index 4cb0c7d..d250c58 100644
--- a/tests/src/whisk/core/entity/test/SchemaTests.scala
+++ b/tests/src/whisk/core/entity/test/SchemaTests.scala
@@ -337,14 +337,33 @@
         val contents = b64.encodeToString("tarball".getBytes)
         val json = Seq[JsObject](
             JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> false.toJson),
-            JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> true.toJson, "code" -> contents.toJson))
+            JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> true.toJson, "code" -> contents.toJson),
+            JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> true.toJson, "code" -> contents.toJson, "main" -> "naim".toJson))
 
         val execs = json.map { e => Exec.serdes.read(e) }
 
-        assert(execs(0) == Exec.bb("container1") && json(0).compactPrint == Exec.bb("container1").toString)
-        assert(execs(1) == Exec.bb("container1", contents) && json(1).compactPrint == Exec.bb("container1", contents).toString)
-        assert(execs(0) == Exec.serdes.read(JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> false.toJson, "code" -> " ".toJson)))
-        assert(execs(0) == Exec.serdes.read(JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> false.toJson, "code" -> "".toJson)))
+        execs(0) shouldBe Exec.bb("container1")
+        execs(1) shouldBe Exec.bb("container1", contents)
+        execs(2) shouldBe Exec.bb("container1", contents, Some("naim"))
+
+        json(0).compactPrint shouldBe Exec.bb("container1").toString
+        json(1).compactPrint shouldBe Exec.bb("container1", contents).toString
+        json(2).compactPrint shouldBe Exec.bb("container1", contents, Some("naim")).toString
+
+        execs(0) shouldBe Exec.serdes.read(JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> false.toJson, "code" -> " ".toJson))
+        execs(0) shouldBe Exec.serdes.read(JsObject("kind" -> "blackbox".toJson, "image" -> "container1".toJson, "binary" -> false.toJson, "code" -> "".toJson))
+    }
+
+    it should "exclude undefined code in whisk action initializer" in {
+        WhiskAction(EntityPath("a"), EntityName("b"), Exec.bb("container1")).containerInitializer shouldBe {
+            Some(JsObject("name" -> "b".toJson, "binary" -> false.toJson, "main" -> "main".toJson))
+        }
+        WhiskAction(EntityPath("a"), EntityName("b"), Exec.bb("container1", "xyz")).containerInitializer shouldBe {
+            Some(JsObject("name" -> "b".toJson, "binary" -> false.toJson, "main" -> "main".toJson, "code" -> "xyz".toJson))
+        }
+        WhiskAction(EntityPath("a"), EntityName("b"), Exec.bb("container1", "", Some("naim"))).containerInitializer shouldBe {
+            Some(JsObject("name" -> "b".toJson, "binary" -> false.toJson, "main" -> "naim".toJson))
+        }
     }
 
     it should "reject malformed JSON" in {