You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by du...@apache.org on 2018/03/11 23:58:17 UTC
[incubator-openwhisk-package-alarms] branch master updated: fix
failing test and refactor others into appropriate suites (#139)
This is an automated email from the ASF dual-hosted git repository.
dubeejw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-package-alarms.git
The following commit(s) were added to refs/heads/master by this push:
new b8f8731 fix failing test and refactor others into appropriate suites (#139)
b8f8731 is described below
commit b8f8731a6052f55b0a8022c4bba494f0c6268b6b
Author: Jason Peterson <ja...@us.ibm.com>
AuthorDate: Sun Mar 11 19:58:15 2018 -0400
fix failing test and refactor others into appropriate suites (#139)
---
.../system/health/AlarmsHealthFeedTests.scala | 277 +------------
...edTests.scala => AlarmsFeedNegativeTests.scala} | 47 +--
.../scala/system/packages/AlarmsFeedTests.scala | 439 ++++++++-------------
.../system/packages/AlarmsMultiWorkersTests.scala | 40 +-
4 files changed, 192 insertions(+), 611 deletions(-)
diff --git a/tests/src/test/scala/system/health/AlarmsHealthFeedTests.scala b/tests/src/test/scala/system/health/AlarmsHealthFeedTests.scala
index 90ae224..3db4b0b 100644
--- a/tests/src/test/scala/system/health/AlarmsHealthFeedTests.scala
+++ b/tests/src/test/scala/system/health/AlarmsHealthFeedTests.scala
@@ -18,10 +18,10 @@ package system.health
import common._
import org.junit.runner.RunWith
+import org.scalatest.FlatSpec
import org.scalatest.junit.JUnitRunner
-import org.scalatest.{FlatSpec, Inside}
-import spray.json.DefaultJsonProtocol.{BooleanJsonFormat, IntJsonFormat, LongJsonFormat, StringJsonFormat}
-import spray.json.{JsObject, JsString, pimpAny}
+import spray.json.DefaultJsonProtocol.{IntJsonFormat, LongJsonFormat, StringJsonFormat}
+import spray.json.pimpAny
/**
* Tests for alarms trigger service
@@ -30,7 +30,6 @@ import spray.json.{JsObject, JsString, pimpAny}
class AlarmsHealthFeedTests
extends FlatSpec
with TestHelpers
- with Inside
with WskTestHelpers {
val wskprops = WskProps()
@@ -196,274 +195,4 @@ class AlarmsHealthFeedTests
activationsAfterInterval should be(2)
}
- it should "update cron, startDate and stopDate parameters" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskProps = wp
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
-
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
-
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
-
- val cron = "* * * * *"
- val startDate = System.currentTimeMillis + (1000 * 30)
- val stopDate = startDate + (1000 * 100)
-
- // create trigger feed
- println(s"Creating trigger: $triggerName")
- assetHelper.withCleaner(wsk.trigger, triggerName) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/alarm"), parameters = Map(
- "cron" -> cron.toJson,
- "startDate" -> startDate.toJson,
- "stopDate" -> stopDate.toJson))
- }
-
-
- val actionName = s"$packageName/alarm"
- val readRunResult = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "READ".toJson,
- "authKey" -> wskProps.authKey.toJson
- ))
-
- withActivation(wsk.activation, readRunResult) {
- activation => activation.response.success shouldBe true
-
- inside(activation.response.result) {
- case Some(result) =>
- val config = result.getFields("config").head.asInstanceOf[JsObject].fields
- val status = result.getFields("status").head.asInstanceOf[JsObject].fields
-
- config should contain("cron" -> cron.toJson)
- config should contain("startDate" -> startDate.toJson)
- config should contain("stopDate" -> stopDate.toJson)
-
- status should contain("active" -> true.toJson)
- status should contain key "dateChanged"
- status should contain key "dateChangedISO"
- status should not(contain key "reason")
- }
- }
-
- val updatedCron = "*/2 * * * *"
- val updatedStartDate = System.currentTimeMillis + (1000 * 30)
- val updatedStopDate = updatedStartDate + (1000 * 100)
-
- val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "UPDATE".toJson,
- "authKey" -> wskProps.authKey.toJson,
- "cron" -> updatedCron.toJson,
- "startDate" -> updatedStartDate.toJson,
- "stopDate" -> updatedStopDate.toJson
- ))
-
- withActivation(wsk.activation, updateRunAction) {
- activation => activation.response.success shouldBe true
- }
-
- val runResult = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "READ".toJson,
- "authKey" -> wskProps.authKey.toJson
- ))
-
- withActivation(wsk.activation, runResult) {
- activation => activation.response.success shouldBe true
-
- inside(activation.response.result) {
- case Some(result) =>
- val config = result.getFields("config").head.asInstanceOf[JsObject].fields
-
- config should contain("cron" -> updatedCron.toJson)
- config should contain("startDate" -> updatedStartDate.toJson)
- config should contain("stopDate" -> updatedStopDate.toJson)
- }
- }
- }
-
- it should "update fireOnce and payload parameters" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskProps = wp
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
-
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
-
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
-
- val futureDate = System.currentTimeMillis + (1000 * 30)
- val payload = JsObject(
- "test" -> JsString("alarmsTest")
- )
-
- // create trigger feed
- println(s"Creating trigger: $triggerName")
- assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/once"), parameters = Map(
- "trigger_payload" -> payload,
- "date" -> futureDate.toJson,
- "deleteAfterFire" -> "true".toJson))
- }
-
- val actionName = s"$packageName/alarm"
- val readRunResult = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "READ".toJson,
- "authKey" -> wskProps.authKey.toJson
- ))
-
- withActivation(wsk.activation, readRunResult) {
- activation => activation.response.success shouldBe true
-
- inside(activation.response.result) {
- case Some(result) =>
- val config = result.getFields("config").head.asInstanceOf[JsObject].fields
-
- config should contain("date" -> futureDate.toJson)
- config should contain("payload" -> payload)
- config should contain("deleteAfterFire" -> "true".toJson)
- }
- }
-
- val updatedFutureDate = System.currentTimeMillis + (1000 * 30)
- val updatedPayload = JsObject(
- "update_test" -> JsString("alarmsTest")
- )
-
- val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "UPDATE".toJson,
- "authKey" -> wskProps.authKey.toJson,
- "trigger_payload" ->updatedPayload,
- "date" -> updatedFutureDate.toJson,
- "deleteAfterFire" -> "rules".toJson
- ))
-
- withActivation(wsk.activation, updateRunAction) {
- activation => activation.response.success shouldBe true
- }
-
- val runResult = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "READ".toJson,
- "authKey" -> wskProps.authKey.toJson
- ))
-
- withActivation(wsk.activation, runResult) {
- activation => activation.response.success shouldBe true
-
- inside(activation.response.result) {
- case Some(result) =>
- val config = result.getFields("config").head.asInstanceOf[JsObject].fields
-
- config should contain("date" -> updatedFutureDate.toJson)
- config should contain("payload" -> updatedPayload)
- config should contain("deleteAfterFire" -> "rules".toJson)
- }
- }
- }
-
- it should "update minutes parameter for interval feed" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskProps = wp
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
-
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
-
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
-
- val minutes = 1
- val startDate = System.currentTimeMillis + (1000 * 30)
- val stopDate = startDate + (1000 * 100)
-
- // create trigger feed
- println(s"Creating trigger: $triggerName")
- assetHelper.withCleaner(wsk.trigger, triggerName) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/interval"), parameters = Map(
- "minutes" -> minutes.toJson,
- "startDate" -> startDate.toJson,
- "stopDate" -> stopDate.toJson))
- }
-
-
- val actionName = s"$packageName/alarm"
- val readRunResult = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "READ".toJson,
- "authKey" -> wskProps.authKey.toJson
- ))
-
- withActivation(wsk.activation, readRunResult) {
- activation => activation.response.success shouldBe true
-
- inside(activation.response.result) {
- case Some(result) =>
- val config = result.getFields("config").head.asInstanceOf[JsObject].fields
-
- config should contain("minutes" -> minutes.toJson)
- config should contain("startDate" -> startDate.toJson)
- config should contain("stopDate" -> stopDate.toJson)
- }
- }
-
- val updatedMinutes = 2
- val updatedStartDate = System.currentTimeMillis + (1000 * 30)
- val updatedStopDate = updatedStartDate + (1000 * 100)
-
- val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "UPDATE".toJson,
- "authKey" -> wskProps.authKey.toJson,
- "minutes" -> updatedMinutes.toJson,
- "startDate" -> updatedStartDate.toJson,
- "stopDate" -> updatedStopDate.toJson
- ))
-
- withActivation(wsk.activation, updateRunAction) {
- activation => activation.response.success shouldBe true
- }
-
- val runResult = wsk.action.invoke(actionName, parameters = Map(
- "triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "READ".toJson,
- "authKey" -> wskProps.authKey.toJson
- ))
-
- withActivation(wsk.activation, runResult) {
- activation => activation.response.success shouldBe true
-
- inside(activation.response.result) {
- case Some(result) =>
- val config = result.getFields("config").head.asInstanceOf[JsObject].fields
-
- config should contain("minutes" -> updatedMinutes.toJson)
- config should contain("startDate" -> updatedStartDate.toJson)
- config should contain("stopDate" -> updatedStopDate.toJson)
- }
- }
- }
}
diff --git a/tests/src/test/scala/system/packages/AlarmsFeedTests.scala b/tests/src/test/scala/system/packages/AlarmsFeedNegativeTests.scala
similarity index 90%
copy from tests/src/test/scala/system/packages/AlarmsFeedTests.scala
copy to tests/src/test/scala/system/packages/AlarmsFeedNegativeTests.scala
index 56e7e74..d5730b1 100644
--- a/tests/src/test/scala/system/packages/AlarmsFeedTests.scala
+++ b/tests/src/test/scala/system/packages/AlarmsFeedNegativeTests.scala
@@ -27,7 +27,7 @@ import spray.json.{JsString, pimpAny}
* Tests for alarms trigger service
*/
@RunWith(classOf[JUnitRunner])
-class AlarmsFeedTests
+class AlarmsFeedNegativeTests
extends FlatSpec
with TestHelpers
with WskTestHelpers {
@@ -37,50 +37,7 @@ class AlarmsFeedTests
val defaultAction = Some(TestUtils.getTestActionFilename("hello.js"))
- behavior of "Alarms trigger service"
-
- it should "should disable after reaching max triggers" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val ruleName = s"dummyAlarmsRule-${System.currentTimeMillis}"
- val actionName = s"dummyAlarmsAction-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
-
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
-
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
-
- // create action
- assetHelper.withCleaner(wsk.action, actionName) { (action, name) =>
- action.create(name, defaultAction)
- }
-
- // create trigger with feed
- assetHelper.withCleaner(wsk.trigger, triggerName) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/alarm"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson,
- "cron" -> "* * * * * *".toJson,
- "maxTriggers" -> 3.toJson))
- }
-
- // create rule
- assetHelper.withCleaner(wsk.rule, ruleName) { (rule, name) =>
- rule.create(name, trigger = triggerName, action = actionName)
- }
-
- // get activation list of the trigger
- val activations = wsk.activation.pollFor(N = 4, Some(triggerName)).length
- println(s"Found activation size: $activations")
- activations should be(3)
- }
+ behavior of "Alarms feed negative tests"
it should "return error message when alarm action does not include cron parameter" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
diff --git a/tests/src/test/scala/system/packages/AlarmsFeedTests.scala b/tests/src/test/scala/system/packages/AlarmsFeedTests.scala
index 56e7e74..b9c9fbf 100644
--- a/tests/src/test/scala/system/packages/AlarmsFeedTests.scala
+++ b/tests/src/test/scala/system/packages/AlarmsFeedTests.scala
@@ -18,10 +18,10 @@ package system.packages
import common._
import org.junit.runner.RunWith
-import org.scalatest.FlatSpec
+import org.scalatest.{FlatSpec, Inside}
import org.scalatest.junit.JUnitRunner
import spray.json.DefaultJsonProtocol.{BooleanJsonFormat, IntJsonFormat, LongJsonFormat, StringJsonFormat}
-import spray.json.{JsString, pimpAny}
+import spray.json.{JsObject, JsString, pimpAny}
/**
* Tests for alarms trigger service
@@ -29,6 +29,7 @@ import spray.json.{JsString, pimpAny}
@RunWith(classOf[JUnitRunner])
class AlarmsFeedTests
extends FlatSpec
+ with Inside
with TestHelpers
with WskTestHelpers {
@@ -82,12 +83,11 @@ class AlarmsFeedTests
activations should be(3)
}
- it should "return error message when alarm action does not include cron parameter" in withAssetCleaner(wskprops) {
+ it should "update cron, startDate and stopDate parameters" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
+ implicit val wskProps = wp
val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
val packageName = "dummyAlarmsPackage"
- val feed = "alarm"
// the package alarms should be there
val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
@@ -99,142 +99,89 @@ class AlarmsFeedTests
(pkg, name) => pkg.bind("/whisk.system/alarms", name)
}
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson),
- expectedExitCode = 246)
- }
- feedCreationResult.stderr should include("alarms trigger feed is missing the cron parameter")
-
- }
-
- it should "return error message when alarms once action does not include date parameter" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "once"
-
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
-
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
+ val cron = "* * * * *"
+ val startDate = System.currentTimeMillis + (1000 * 30)
+ val stopDate = startDate + (1000 * 100)
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
+ // create trigger feed
+ println(s"Creating trigger: $triggerName")
+ assetHelper.withCleaner(wsk.trigger, triggerName) {
(trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson),
- expectedExitCode = 246)
+ trigger.create(name, feed = Some(s"$packageName/alarm"), parameters = Map(
+ "cron" -> cron.toJson,
+ "startDate" -> startDate.toJson,
+ "stopDate" -> stopDate.toJson))
}
- feedCreationResult.stderr should include("alarms once trigger feed is missing the date parameter")
- }
- it should "return error message when alarm action includes invalid cron parameter" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "alarm"
+ val actionName = s"$packageName/alarm"
+ val readRunResult = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "READ".toJson,
+ "authKey" -> wskProps.authKey.toJson
+ ))
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ withActivation(wsk.activation, readRunResult) {
+ activation => activation.response.success shouldBe true
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
+ inside(activation.response.result) {
+ case Some(result) =>
+ val config = result.getFields("config").head.asInstanceOf[JsObject].fields
+ val status = result.getFields("status").head.asInstanceOf[JsObject].fields
- val cron = System.currentTimeMillis
+ config should contain("cron" -> cron.toJson)
+ config should contain("startDate" -> startDate.toJson)
+ config should contain("stopDate" -> stopDate.toJson)
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson,
- "cron" -> cron.toJson),
- expectedExitCode = 246)
+ status should contain("active" -> true.toJson)
+ status should contain key "dateChanged"
+ status should contain key "dateChangedISO"
+ status should not(contain key "reason")
+ }
}
- feedCreationResult.stderr should include(s"cron pattern '${cron}' is not valid")
- }
-
- it should "return error message when alarms once action includes an invalid date parameter" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "once"
+ val updatedCron = "*/2 * * * *"
+ val updatedStartDate = System.currentTimeMillis + (1000 * 30)
+ val updatedStopDate = updatedStartDate + (1000 * 100)
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
-
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
+ val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "UPDATE".toJson,
+ "authKey" -> wskProps.authKey.toJson,
+ "cron" -> updatedCron.toJson,
+ "startDate" -> updatedStartDate.toJson,
+ "stopDate" -> updatedStopDate.toJson
+ ))
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson,
- "date" -> "tomorrow".toJson),
- expectedExitCode = 246)
+ withActivation(wsk.activation, updateRunAction) {
+ activation => activation.response.success shouldBe true
}
- feedCreationResult.stderr should include("date parameter 'tomorrow' is not a valid Date")
- }
+ val runResult = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "READ".toJson,
+ "authKey" -> wskProps.authKey.toJson
+ ))
- it should "return error message when alarms once action date parameter is not a future date" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "once"
+ withActivation(wsk.activation, runResult) {
+ activation => activation.response.success shouldBe true
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ inside(activation.response.result) {
+ case Some(result) =>
+ val config = result.getFields("config").head.asInstanceOf[JsObject].fields
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
+ config should contain("cron" -> updatedCron.toJson)
+ config should contain("startDate" -> updatedStartDate.toJson)
+ config should contain("stopDate" -> updatedStopDate.toJson)
+ }
}
-
- val pastDate = System.currentTimeMillis - 5000
-
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson,
- "date" -> pastDate.toJson),
- expectedExitCode = 246)
- }
- feedCreationResult.stderr should include(s"date parameter '${pastDate}' must be in the future")
-
}
- it should "return error message when alarms startDate parameter is not a future date" in withAssetCleaner(wskprops) {
+ it should "update fireOnce and payload parameters" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
+ implicit val wskProps = wp
val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
val packageName = "dummyAlarmsPackage"
- val feed = "alarm"
// the package alarms should be there
val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
@@ -246,111 +193,80 @@ class AlarmsFeedTests
(pkg, name) => pkg.bind("/whisk.system/alarms", name)
}
- val pastDate = System.currentTimeMillis - 5000
+ val futureDate = System.currentTimeMillis + (1000 * 30)
+ val payload = JsObject(
+ "test" -> JsString("alarmsTest")
+ )
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
+ // create trigger feed
+ println(s"Creating trigger: $triggerName")
+ assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
(trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "startDate" -> pastDate.toJson,
- "cron" -> "* * * * *".toJson),
- expectedExitCode = 246)
+ trigger.create(name, feed = Some(s"$packageName/once"), parameters = Map(
+ "trigger_payload" -> payload,
+ "date" -> futureDate.toJson,
+ "deleteAfterFire" -> "true".toJson))
}
- feedCreationResult.stderr should include(s"startDate parameter '${pastDate}' must be in the future")
- }
+ val actionName = s"$packageName/alarm"
+ val readRunResult = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "READ".toJson,
+ "authKey" -> wskProps.authKey.toJson
+ ))
- it should "return error message when alarms stopDate parameter is not greater than startDate" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "alarm"
+ withActivation(wsk.activation, readRunResult) {
+ activation => activation.response.success shouldBe true
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ inside(activation.response.result) {
+ case Some(result) =>
+ val config = result.getFields("config").head.asInstanceOf[JsObject].fields
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
-
- val stopDate = System.currentTimeMillis + 30000
- val startDate = stopDate
-
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "startDate" -> startDate.toJson,
- "stopDate" -> stopDate.toJson,
- "cron" -> "* * * * *".toJson),
- expectedExitCode = 246)
+ config should contain("date" -> futureDate.toJson)
+ config should contain("payload" -> payload)
+ config should contain("deleteAfterFire" -> "true".toJson)
+ }
}
- feedCreationResult.stderr should include(s"stopDate parameter '${stopDate}' must be greater than the startDate")
-
- }
-
- it should "return error message when interval action does not include minutes parameter" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "interval"
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ val updatedFutureDate = System.currentTimeMillis + (1000 * 30)
+ val updatedPayload = JsObject(
+ "update_test" -> JsString("alarmsTest")
+ )
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
+ val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "UPDATE".toJson,
+ "authKey" -> wskProps.authKey.toJson,
+ "trigger_payload" ->updatedPayload,
+ "date" -> updatedFutureDate.toJson,
+ "deleteAfterFire" -> "rules".toJson
+ ))
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson),
- expectedExitCode = 246)
+ withActivation(wsk.activation, updateRunAction) {
+ activation => activation.response.success shouldBe true
}
- feedCreationResult.stderr should include("interval trigger feed is missing the minutes parameter")
- }
+ val runResult = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "READ".toJson,
+ "authKey" -> wskProps.authKey.toJson
+ ))
- it should "return error message when interval action includes invalid minutes parameter" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "interval"
+ withActivation(wsk.activation, runResult) {
+ activation => activation.response.success shouldBe true
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ inside(activation.response.result) {
+ case Some(result) =>
+ val config = result.getFields("config").head.asInstanceOf[JsObject].fields
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
+ config should contain("date" -> updatedFutureDate.toJson)
+ config should contain("payload" -> updatedPayload)
+ config should contain("deleteAfterFire" -> "rules".toJson)
+ }
}
-
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "trigger_payload" -> "alarmTest".toJson,
- "minutes" -> "five".toJson),
- expectedExitCode = 246)
- }
- feedCreationResult.stderr should include("the minutes parameter must be an integer")
-
}
- it should "return error message when alarms trigger update contains no updatable parameters" in withAssetCleaner(wskprops) {
+ it should "update minutes parameter for interval feed" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskProps = wp
val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
@@ -366,110 +282,75 @@ class AlarmsFeedTests
(pkg, name) => pkg.bind("/whisk.system/alarms", name)
}
- val futureDate = System.currentTimeMillis + (1000 * 20)
+ val minutes = 1
+ val startDate = System.currentTimeMillis + (1000 * 30)
+ val stopDate = startDate + (1000 * 100)
// create trigger feed
println(s"Creating trigger: $triggerName")
assetHelper.withCleaner(wsk.trigger, triggerName) {
(trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/once"), parameters = Map(
- "date" -> futureDate.toJson))
+ trigger.create(name, feed = Some(s"$packageName/interval"), parameters = Map(
+ "minutes" -> minutes.toJson,
+ "startDate" -> startDate.toJson,
+ "stopDate" -> stopDate.toJson))
}
- val actionName = s"$packageName/alarm"
- val updatedStartDate = System.currentTimeMillis + (1000 * 20)
- val updatedStopDate = updatedStartDate + (1000 * 10)
- val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
+ val actionName = s"$packageName/alarm"
+ val readRunResult = wsk.action.invoke(actionName, parameters = Map(
"triggerName" -> triggerName.toJson,
- "lifecycleEvent" -> "UPDATE".toJson,
- "authKey" -> wskProps.authKey.toJson,
- "startDate" -> updatedStartDate.toJson,
- "stopDate" -> updatedStopDate.toJson
+ "lifecycleEvent" -> "READ".toJson,
+ "authKey" -> wskProps.authKey.toJson
))
- withActivation(wsk.activation, updateRunAction) {
- activation =>
- activation.response.success shouldBe false
- val error = activation.response.result.get.fields("error").asJsObject
- error.fields("error") shouldBe JsString("no updatable parameters were specified")
- }
- }
-
- it should "return error message when startDate is updated to be greater than the stopDate" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskProps = wp
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
+ withActivation(wsk.activation, readRunResult) {
+ activation => activation.response.success shouldBe true
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ inside(activation.response.result) {
+ case Some(result) =>
+ val config = result.getFields("config").head.asInstanceOf[JsObject].fields
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
+ config should contain("minutes" -> minutes.toJson)
+ config should contain("startDate" -> startDate.toJson)
+ config should contain("stopDate" -> stopDate.toJson)
+ }
}
- val minutes = 1
- val startDate = System.currentTimeMillis + (1000 * 20)
- val stopDate = startDate + (1000 * 10)
-
- // create trigger feed
- println(s"Creating trigger: $triggerName")
- assetHelper.withCleaner(wsk.trigger, triggerName) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/interval"), parameters = Map(
- "minutes" -> minutes.toJson,
- "startDate" -> startDate.toJson,
- "stopDate" -> stopDate.toJson))
- }
-
- val actionName = s"$packageName/alarm"
- val updatedStartDate = System.currentTimeMillis + (1000 * 2000)
+ val updatedMinutes = 2
+ val updatedStartDate = System.currentTimeMillis + (1000 * 30)
+ val updatedStopDate = updatedStartDate + (1000 * 100)
val updateRunAction = wsk.action.invoke(actionName, parameters = Map(
"triggerName" -> triggerName.toJson,
"lifecycleEvent" -> "UPDATE".toJson,
"authKey" -> wskProps.authKey.toJson,
- "startDate" -> updatedStartDate.toJson
+ "minutes" -> updatedMinutes.toJson,
+ "startDate" -> updatedStartDate.toJson,
+ "stopDate" -> updatedStopDate.toJson
))
withActivation(wsk.activation, updateRunAction) {
- activation =>
- activation.response.success shouldBe false
- val error = activation.response.result.get.fields("error").asJsObject
- error.fields("error") shouldBe JsString(s"startDate parameter '${updatedStartDate}' must be less than the stopDate parameter '${stopDate}'")
+ activation => activation.response.success shouldBe true
}
- }
- it should "return error message when limitCronFields is true and 6 cron fields are used" in withAssetCleaner(wskprops) {
- (wp, assetHelper) =>
- implicit val wskprops = wp // shadow global props and make implicit
- val triggerName = s"dummyAlarmsTrigger-${System.currentTimeMillis}"
- val packageName = "dummyAlarmsPackage"
- val feed = "alarm"
+ val runResult = wsk.action.invoke(actionName, parameters = Map(
+ "triggerName" -> triggerName.toJson,
+ "lifecycleEvent" -> "READ".toJson,
+ "authKey" -> wskProps.authKey.toJson
+ ))
- // the package alarms should be there
- val packageGetResult = wsk.pkg.get("/whisk.system/alarms")
- println("fetched package alarms")
- packageGetResult.stdout should include("ok")
+ withActivation(wsk.activation, runResult) {
+ activation => activation.response.success shouldBe true
- // create package binding
- assetHelper.withCleaner(wsk.pkg, packageName) {
- (pkg, name) => pkg.bind("/whisk.system/alarms", name)
- }
+ inside(activation.response.result) {
+ case Some(result) =>
+ val config = result.getFields("config").head.asInstanceOf[JsObject].fields
- // create trigger with feed
- val feedCreationResult = assetHelper.withCleaner(wsk.trigger, triggerName, confirmDelete = false) {
- (trigger, name) =>
- trigger.create(name, feed = Some(s"$packageName/$feed"), parameters = Map(
- "cron" -> "* * * * * *".toJson,
- "limitCronFields" -> true.toJson),
- expectedExitCode = 246)
+ config should contain("minutes" -> updatedMinutes.toJson)
+ config should contain("startDate" -> updatedStartDate.toJson)
+ config should contain("stopDate" -> updatedStopDate.toJson)
+ }
}
- feedCreationResult.stderr should include("cron pattern is limited to 5 fields with 1 minute as the finest granularity")
-
}
}
diff --git a/tests/src/test/scala/system/packages/AlarmsMultiWorkersTests.scala b/tests/src/test/scala/system/packages/AlarmsMultiWorkersTests.scala
index 83e4f6d..d7cdd0f 100644
--- a/tests/src/test/scala/system/packages/AlarmsMultiWorkersTests.scala
+++ b/tests/src/test/scala/system/packages/AlarmsMultiWorkersTests.scala
@@ -27,8 +27,12 @@ import org.scalatest.{FlatSpec, Matchers}
import spray.json.DefaultJsonProtocol.StringJsonFormat
import spray.json.DefaultJsonProtocol._
import spray.json.{pimpAny, _}
-import whisk.core.database.test.DatabaseScriptTestUtils
-import whisk.utils.JsHelpers
+import whisk.core.WhiskConfig
+import whisk.core.database.test.ExtendedCouchDbRestClient
+import whisk.utils.{JsHelpers, retry}
+
+import scala.concurrent.Await
+import scala.concurrent.duration.DurationInt
@RunWith(classOf[JUnitRunner])
@@ -36,8 +40,7 @@ class AlarmsMultiWorkersTests extends FlatSpec
with Matchers
with WskActorSystem
with WskTestHelpers
- with StreamLogging
- with DatabaseScriptTestUtils {
+ with StreamLogging {
val wskprops = WskProps()
val wsk = new Wsk
@@ -45,6 +48,13 @@ class AlarmsMultiWorkersTests extends FlatSpec
val user = auth.fst
val password = auth.snd
+ val dbProtocol = WhiskProperties.getProperty("db.protocol")
+ val dbHost = WhiskProperties.getProperty("db.host")
+ val dbPort = WhiskProperties.getProperty("db.port").toInt
+ val dbUsername = WhiskProperties.getProperty("db.username")
+ val dbPassword = WhiskProperties.getProperty("db.password")
+ val dbPrefix = WhiskProperties.getProperty(WhiskConfig.dbPrefix)
+
val webAction = "/whisk.system/alarmsWeb/alarmWebAction"
val webActionURL = s"https://${wskprops.apihost}/api/v1/web${webAction}.http"
@@ -81,14 +91,19 @@ class AlarmsMultiWorkersTests extends FlatSpec
makePostCallWithExpectedResult(worker11Params, 200)
val dbName = s"${dbPrefix}alarmservice"
- val documents = getAllDocs(dbName)
-
- val worker1Doc = documents
- .fields("rows")
- .convertTo[List[JsObject]]
- .filter(_.fields("id").convertTo[String].equals(s"$user:$password/_/$worker11Trigger"))
-
- JsHelpers.getFieldPath(worker1Doc(0), "doc", "worker") shouldBe Some(JsString("worker11"))
+ val client = new ExtendedCouchDbRestClient(dbProtocol, dbHost, dbPort, dbUsername, dbPassword, dbName)
+
+ retry({
+ val result = Await.result(client.getAllDocs(includeDocs = Some(true)), 15.seconds)
+ result should be('right)
+ val documents = result.right.get
+ val worker1Doc = documents
+ .fields("rows")
+ .convertTo[List[JsObject]]
+ .filter(_.fields("id").convertTo[String].equals(s"$user:$password/_/$worker11Trigger"))
+
+ JsHelpers.getFieldPath(worker1Doc.head, "doc", "worker") shouldBe Some(JsString("worker11"))
+ })
} finally {
//delete trigger feeds and triggers
makeDeleteCallWithExpectedResult(worker10Params, DONTCARE_EXIT)
@@ -117,5 +132,4 @@ class AlarmsMultiWorkersTests extends FlatSpec
assert(expectedCode == DONTCARE_EXIT || response.statusCode() == expectedCode)
}
-
}
--
To stop receiving notification emails like this one, please contact
dubeejw@apache.org.