Fixes two errors in invoke path:

1. if docker pull fails for black box container, do not attempt to run container
2. if action is a black box, set appropriate bits correctly

Added test for running docker action with bogus name.
diff --git a/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala b/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala
index 6e89030..b0b2e04 100644
--- a/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala
+++ b/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala
@@ -22,6 +22,7 @@
 import scala.language.postfixOps
 import scala.concurrent.duration.Duration
 import scala.concurrent.duration.DurationInt
+import scala.util.Random
 
 import org.apache.commons.io.FileUtils
 import org.junit.runner.RunWith
@@ -401,6 +402,24 @@
             }
     }
 
+    it should "create, and invoke an action that utilizes an invalid docker container with appropriate error" in withAssetCleaner(wskprops) {
+        val name = "invalid dockerContainer"
+        val containerName = s"bogus${Random.alphanumeric.take(16).mkString.toLowerCase}"
+
+        (wp, assetHelper) =>
+            assetHelper.withCleaner(wsk.action, name) {
+                // docker name is a randomly generate string
+                (action, _) => action.create(name, Some(containerName), kind = Some("docker"))
+            }
+
+            val run = wsk.action.invoke(name)
+            withActivation(wsk.activation, run) {
+                activation =>
+                    activation.response.status shouldBe ActivationResponse.messageForCode(ActivationResponse.ApplicationError)
+                    activation.response.result.get.fields("error") shouldBe s"Failed to pull container image '$containerName'.".toJson
+            }
+    }
+
     behavior of "Wsk packages"
 
     it should "create, and get a package to verify annotation parsing" in withAssetCleaner(wskprops) {
diff --git a/tests/src/whisk/core/dispatcher/test/DispatcherTests.scala b/tests/src/whisk/core/dispatcher/test/DispatcherTests.scala
index 7c96f3e..0948d42 100644
--- a/tests/src/whisk/core/dispatcher/test/DispatcherTests.scala
+++ b/tests/src/whisk/core/dispatcher/test/DispatcherTests.scala
@@ -33,19 +33,21 @@
 import common.WskActorSystem
 import spray.json.JsNumber
 import spray.json.JsObject
+import whisk.common.Logging
 import whisk.common.TransactionId
 import whisk.core.connector.{ ActivationMessage => Message }
 import whisk.core.dispatcher.ActivationFeed
-import whisk.core.dispatcher.MessageHandler
 import whisk.core.dispatcher.Dispatcher
+import whisk.core.dispatcher.MessageHandler
 import whisk.core.entity.ActivationId
-import whisk.core.entity.Subject
-import whisk.utils.retry
+import whisk.core.entity.AuthKey
+import whisk.core.entity.DocRevision
 import whisk.core.entity.EntityName
 import whisk.core.entity.EntityPath
 import whisk.core.entity.FullyQualifiedEntityName
-import whisk.common.Logging
-import whisk.core.entity.AuthKey
+import whisk.core.entity.SemVer
+import whisk.core.entity.Subject
+import whisk.utils.retry
 
 @RunWith(classOf[JUnitRunner])
 class DispatcherTests extends FlatSpec with Matchers with WskActorSystem {
@@ -66,8 +68,8 @@
         val content = JsObject("payload" -> JsNumber(count))
         val subject = Subject()
         val authkey = AuthKey()
-        val path = FullyQualifiedEntityName(EntityPath("test"), EntityName(s"count-$count"), None)
-        val msg = Message(TransactionId.testing, path, subject, authkey, ActivationId(), EntityPath(subject()), Some(content))
+        val path = FullyQualifiedEntityName(EntityPath("test"), EntityName(s"count-$count"), SemVer())
+        val msg = Message(TransactionId.testing, path, DocRevision(), subject, authkey, ActivationId(), EntityPath(subject()), Some(content))
         connector.send(msg)
     }
 
@@ -100,7 +102,7 @@
                 Console.withErr(stream) {
                     retry({
                         val logs = stream.toString()
-                        logs should include regex (s"exception while pulling new records: commit failed")
+                        logs should include regex (s"exception while pulling new records *.* commit failed")
                     }, 10, Some(100 milliseconds))
 
                     connector.throwCommitException = false
diff --git a/tests/src/whisk/core/entity/test/SchemaTests.scala b/tests/src/whisk/core/entity/test/SchemaTests.scala
index 2a0f2d3..ae65593 100644
--- a/tests/src/whisk/core/entity/test/SchemaTests.scala
+++ b/tests/src/whisk/core/entity/test/SchemaTests.scala
@@ -45,6 +45,7 @@
 import whisk.core.entity.AuthKey
 import whisk.core.entity.DocId
 import whisk.core.entity.DocInfo
+import whisk.core.entity.DocRevision
 import whisk.core.entity.EntityName
 import whisk.core.entity.Exec
 import whisk.core.entity.LogLimit
@@ -89,6 +90,22 @@
         }
     }
 
+    it should "accept any string as doc revision" in {
+        Seq("a", " a", "a ", "", null).foreach { i =>
+            val d = DocRevision(i)
+            assert(d.rev == (if (i != null) i.trim else null))
+        }
+
+        DocRevision.serdes.read(JsNull) shouldBe DocRevision()
+        DocRevision.serdes.read(JsString("")) shouldBe DocRevision("")
+        DocRevision.serdes.read(JsString("a")) shouldBe DocRevision("a")
+        DocRevision.serdes.read(JsString(" a")) shouldBe DocRevision("a")
+        DocRevision.serdes.read(JsString("a ")) shouldBe DocRevision("a")
+        intercept[DeserializationException] {
+            DocRevision.serdes.read(JsNumber(1))
+        }
+    }
+
     it should "reject malformed doc info" in {
         Seq(null, "", " ").foreach { i =>
             intercept[IllegalArgumentException] {