diff --git a/tests/src/test/scala/common/WskTestHelpers.scala b/tests/src/test/scala/common/WskTestHelpers.scala index e8d216ba721..419fc673a91 100644 --- a/tests/src/test/scala/common/WskTestHelpers.scala +++ b/tests/src/test/scala/common/WskTestHelpers.scala @@ -95,6 +95,7 @@ object ActivationResponse extends DefaultJsonProtocol { * @param annotations a list of JSON objects to save the annotations of the activation */ case class ActivationResult(activationId: String, + namespace: String, logs: Option[List[String]], response: ActivationResponse, start: Instant, @@ -123,14 +124,14 @@ object ActivationResult extends DefaultJsonProtocol { } implicit val serdes = new RootJsonFormat[ActivationResult] { - private val format = jsonFormat8(ActivationResult.apply) + private val format = jsonFormat9(ActivationResult.apply) def write(result: ActivationResult) = format.write(result) def read(value: JsValue) = { val obj = value.asJsObject - obj.getFields("activationId", "response", "start") match { - case Seq(JsString(activationId), response, start) => + obj.getFields("activationId", "namespace", "response", "start") match { + case Seq(JsString(activationId), JsString(namespace), response, start) => Try { val logs = obj.fields.get("logs").map(_.convertTo[List[String]]) val end = obj.fields.get("end").map(_.convertTo[Instant]).getOrElse(Instant.EPOCH) @@ -139,6 +140,7 @@ object ActivationResult extends DefaultJsonProtocol { val annotations = obj.fields.get("annotations").map(_.convertTo[List[JsObject]]) new ActivationResult( activationId, + namespace, logs, response.convertTo[ActivationResponse], start.convertTo[Instant], diff --git a/tests/src/test/scala/system/basic/WskActivationTests.scala b/tests/src/test/scala/system/basic/WskActivationTests.scala index b5c39de4eb3..514f8aebb17 100644 --- a/tests/src/test/scala/system/basic/WskActivationTests.scala +++ b/tests/src/test/scala/system/basic/WskActivationTests.scala @@ -51,4 +51,32 @@ class WskActivationTests extends TestHelpers with WskTestHelpers with WskActorSy resultWithoutSize shouldBe expectedResult } } + + it should "invoke a shared action under a different invocation namespace" in withAssetCleaner(wskprops) { + (wp, assetHelper) => + val packageName = "shared-package" + val actionName = "echo" + var invocationNamesapce = if (wskprops.namespace == "_") "guest" else wskprops.namespace + val packageActionName = s"/${invocationNamesapce}/${packageName}/${actionName}" + + assetHelper.withCleaner(wsk.pkg, packageName) { (pkg, _) => + pkg.create(packageName, shared = Some(true))(wp) + } + + assetHelper.withCleaner(wsk.action, packageActionName) { (action, _) => + action.create(packageActionName, Some(TestUtils.getTestActionFilename("echo.js")))(wp) + } + + withActivation(wsk.activation, wsk.action.invoke(packageActionName)(wp)) { activation => + activation.namespace shouldBe invocationNamesapce + }(wp) + + val systemId = "whisk.system" + val wskprops2 = WskProps(authKey = WskAdmin.listKeys(systemId)(0)._1, namespace = systemId) + invocationNamesapce = if (wskprops2.namespace == "_") "guest" else wskprops2.namespace + + withActivation(wsk.activation, wsk.action.invoke(packageActionName)(wskprops2)) { activation => + activation.namespace shouldBe invocationNamesapce + }(wskprops2) + } }