You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/05/26 07:54:36 UTC
[2/3] brooklyn-server git commit: BROOKLYN-490: propagate failure in
LoopOverGroupMembersTestCase
BROOKLYN-490: propagate failure in LoopOverGroupMembersTestCase
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/730241e0
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/730241e0
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/730241e0
Branch: refs/heads/master
Commit: 730241e015ce339637942626b84136268342503a
Parents: 0356345
Author: Aled Sage <al...@gmail.com>
Authored: Thu May 25 17:13:19 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu May 25 17:13:19 2017 +0100
----------------------------------------------------------------------
.../framework/LoopOverGroupMembersTestCase.java | 1 +
.../LoopOverGroupMembersTestCaseImpl.java | 33 ++++++++---------
.../LoopOverGroupMembersTestCaseTest.java | 38 ++++++++++++++++++--
3 files changed, 50 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/730241e0/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCase.java
----------------------------------------------------------------------
diff --git a/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCase.java b/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCase.java
index 4b2b0a3..46372f2 100644
--- a/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCase.java
+++ b/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCase.java
@@ -33,6 +33,7 @@ public interface LoopOverGroupMembersTestCase extends TargetableTestComponent {
* The test spec that will be run against each member of the group
*/
@SetFromFlag("testSpec")
+ @SuppressWarnings("serial")
ConfigKey<EntitySpec<? extends TargetableTestComponent>> TEST_SPEC = ConfigKeys.newConfigKey(
new TypeToken<EntitySpec<? extends TargetableTestComponent>>(){},
"test.spec",
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/730241e0/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseImpl.java
----------------------------------------------------------------------
diff --git a/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseImpl.java b/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseImpl.java
index 46edf2e..d64b270 100644
--- a/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseImpl.java
+++ b/test-framework/src/main/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseImpl.java
@@ -18,7 +18,9 @@
*/
package org.apache.brooklyn.test.framework;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.EntitySpec;
@@ -47,26 +49,27 @@ public class LoopOverGroupMembersTestCaseImpl extends TargetableTestComponentImp
Maybe<Entity> target = tryResolveTarget();
if (!target.isPresent()) {
logger.debug("Tasks NOT successfully run. LoopOverGroupMembersTestCaseImpl group not set");
- setServiceState(false, Lifecycle.ON_FIRE);
+ setUpAndRunState(false, Lifecycle.ON_FIRE);
return;
}
if (!(target.get() instanceof Group)) {
logger.debug("Tasks NOT successfully run. LoopOverGroupMembersTestCaseImpl target is not a group");
- setServiceState(false, Lifecycle.ON_FIRE);
+ setUpAndRunState(false, Lifecycle.ON_FIRE);
return;
}
EntitySpec<? extends TargetableTestComponent> testSpec = config().get(TEST_SPEC);
if (testSpec == null) {
logger.debug("Tasks NOT successfully run. LoopOverGroupMembersTestCaseImpl test spec not set");
- setServiceState(false, Lifecycle.ON_FIRE);
+ setUpAndRunState(false, Lifecycle.ON_FIRE);
return;
}
// Create the child-assertions (one per group-member)
Group group = (Group) target.get();
Collection<Entity> members = group.getMembers();
+ List<Throwable> exceptions = new ArrayList<>();
boolean allSuccesful = true;
for (Entity member : members) {
EntitySpec<? extends TargetableTestComponent> testSpecCopy = EntitySpec.create(testSpec)
@@ -84,6 +87,7 @@ public class LoopOverGroupMembersTestCaseImpl extends TargetableTestComponentImp
} catch (Throwable t) {
Exceptions.propagateIfFatal(t);
logger.warn("Problem in child test-case of "+this+", targetting "+member, t);
+ exceptions.add(t);
allSuccesful = false;
}
}
@@ -91,11 +95,13 @@ public class LoopOverGroupMembersTestCaseImpl extends TargetableTestComponentImp
if (allSuccesful) {
// Let everyone know we've started up successfully (changes the icon in the GUI).
logger.debug("Tasks successfully run. Update state of {} to RUNNING.", this);
- setServiceState(true, Lifecycle.RUNNING);
+ setUpAndRunState(true, Lifecycle.RUNNING);
} else {
- // Let everyone know we've npt started up successfully (changes the icon in the GUI).
+ // Let everyone know we've not started up successfully (changes the icon in the GUI).
+ // Important to fail the start() method, so that parent TestCase entity also reports failure.
logger.debug("Tasks NOT successfully run. Update state of {} to ON_FIRE.", this);
- setServiceState(false, Lifecycle.ON_FIRE);
+ setUpAndRunState(false, Lifecycle.ON_FIRE);
+ throw Exceptions.propagate("Test failed on group member(s)", exceptions);
}
}
@@ -112,10 +118,10 @@ public class LoopOverGroupMembersTestCaseImpl extends TargetableTestComponentImp
// Let everyone know we've stopped successfully (changes the icon in the GUI).
logger.debug("Tasks successfully run. Update state of {} to STOPPED.", this);
- setServiceState(false, Lifecycle.STOPPED);
+ setUpAndRunState(false, Lifecycle.STOPPED);
} catch (Throwable t) {
logger.debug("Tasks NOT successfully run. Update state of {} to ON_FIRE.", this);
- setServiceState(false, Lifecycle.ON_FIRE);
+ setUpAndRunState(false, Lifecycle.ON_FIRE);
throw Exceptions.propagate(t);
}
}
@@ -126,15 +132,4 @@ public class LoopOverGroupMembersTestCaseImpl extends TargetableTestComponentImp
stop();
start(locations);
}
-
- /**
- * Sets the state of the Entity. Useful so that the GUI shows the correct icon.
- *
- * @param serviceUpState Whether or not the entity is up.
- * @param serviceStateActual The actual state of the entity.
- */
- private void setServiceState(final boolean serviceUpState, final Lifecycle serviceStateActual) {
- sensors().set(SERVICE_UP, serviceUpState);
- sensors().set(Attributes.SERVICE_STATE_ACTUAL, serviceStateActual);
- }
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/730241e0/test-framework/src/test/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseTest.java
----------------------------------------------------------------------
diff --git a/test-framework/src/test/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseTest.java b/test-framework/src/test/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseTest.java
index 198ad26..261ded1 100644
--- a/test-framework/src/test/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseTest.java
+++ b/test-framework/src/test/java/org/apache/brooklyn/test/framework/LoopOverGroupMembersTestCaseTest.java
@@ -30,12 +30,14 @@ import java.util.Set;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.entity.Group;
+import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.entity.group.DynamicGroup;
import org.apache.brooklyn.entity.software.base.EmptySoftwareProcess;
+import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.collections.MutableSet;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
@@ -43,6 +45,7 @@ import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
public class LoopOverGroupMembersTestCaseTest {
@@ -115,7 +118,7 @@ public class LoopOverGroupMembersTestCaseTest {
.configure(LoopOverGroupMembersTestCase.TEST_SPEC, testSpec)
.configure(LoopOverGroupMembersTestCase.TARGET_ENTITY, testGroup));
- app.start(ImmutableList.of(app.newSimulatedLocation()));
+ startAppAssertingFailure(app, app.newSimulatedLocation());
assertThat(loopOverGroupMembersTestCase.getChildren().size()).isEqualTo(4);
assertThat(loopOverGroupMembersTestCase.sensors().get(SERVICE_UP)).isFalse();
@@ -140,7 +143,7 @@ public class LoopOverGroupMembersTestCaseTest {
.configure(LoopOverGroupMembersTestCase.TEST_SPEC, testSpec)
.configure(LoopOverGroupMembersTestCase.TARGET_ENTITY, testGroup));
- app.start(ImmutableList.of(app.newSimulatedLocation()));
+ startAppAssertingFailure(app, app.newSimulatedLocation());
assertThat(loopOverGroupMembersTestCase.getChildren().size()).isEqualTo(4);
assertThat(loopOverGroupMembersTestCase.sensors().get(SERVICE_UP)).isFalse();
@@ -170,7 +173,7 @@ public class LoopOverGroupMembersTestCaseTest {
.configure(LoopOverGroupMembersTestCase.TEST_SPEC, testSpec)
.configure(LoopOverGroupMembersTestCase.TARGET_ENTITY, testGroup));
- app.start(ImmutableList.of(app.newSimulatedLocation()));
+ startAppAssertingFailure(app, app.newSimulatedLocation());
assertThat(loopOverGroupMembersTestCase.getChildren().size()).isEqualTo(1);
assertThat(loopOverGroupMembersTestCase.sensors().get(SERVICE_UP)).isFalse();
@@ -181,6 +184,27 @@ public class LoopOverGroupMembersTestCaseTest {
assertThat(loopChildEntity.config().get(LoopOverGroupMembersTestCase.TARGET_ENTITY)).isEqualTo(emptySoftwareProcess);
}
+ // See https://issues.apache.org/jira/browse/BROOKLYN-490
+ @Test
+ public void testParentTestCaseReportsFailureIfLooperFails() {
+ addEmptySoftwareProcessToGroup();
+ EntitySpec<TestSensor> testSpec = createFailingTestSensorSpec();
+
+ TestCase parentTest = app.addChild(EntitySpec.create(TestCase.class)
+ .child(EntitySpec.create(LoopOverGroupMembersTestCase.class)
+ .configure(LoopOverGroupMembersTestCase.TEST_SPEC, testSpec)
+ .configure(LoopOverGroupMembersTestCase.TARGET_ENTITY, testGroup)));
+
+ LoopOverGroupMembersTestCase loopOverGroupMembersTestCase = (LoopOverGroupMembersTestCase) Iterables.getOnlyElement(parentTest.getChildren());
+
+ startAppAssertingFailure(app, app.newSimulatedLocation());
+ Entity loopChildEntity = Iterables.getOnlyElement(loopOverGroupMembersTestCase.getChildren());
+
+ assertThat(loopOverGroupMembersTestCase.sensors().get(SERVICE_UP)).isFalse();
+ assertThat(loopChildEntity.sensors().get(SERVICE_UP)).isFalse();
+ assertThat(parentTest.sensors().get(SERVICE_UP)).isFalse();
+ }
+
//negative
// without test spec
// without target + taget id
@@ -265,4 +289,12 @@ public class LoopOverGroupMembersTestCaseTest {
return emptySoftwareProcess;
}
+ private void startAppAssertingFailure(TestApplication app, Location loc) {
+ try {
+ app.start(ImmutableList.of(loc));
+ Asserts.shouldHaveFailedPreviously();
+ } catch (Throwable t) {
+ Asserts.expectedFailureContains(t, "Test failed on group member");
+ }
+ }
}