You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2017/04/06 16:19:22 UTC

[1/2] brooklyn-server git commit: Adds TestCase.continueOnFailure

Repository: brooklyn-server
Updated Branches:
  refs/heads/master ff7cde116 -> ee367e24d


Adds TestCase.continueOnFailure

Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/c1422ed1
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/c1422ed1
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/c1422ed1

Branch: refs/heads/master
Commit: c1422ed13136b02490f68c97dfa0d7863f8de598
Parents: b608635
Author: Aled Sage <al...@gmail.com>
Authored: Thu Apr 6 12:34:43 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 6 12:34:43 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/test/framework/TestCase.java       |  8 ++
 .../brooklyn/test/framework/TestCaseImpl.java   | 47 ++++++++--
 .../brooklyn/test/framework/TestCaseTest.java   | 92 ++++++++++++++++++--
 3 files changed, 133 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c1422ed1/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCase.java
----------------------------------------------------------------------
diff --git a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCase.java b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCase.java
index 7095f00..cd53993 100644
--- a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCase.java
+++ b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCase.java
@@ -38,4 +38,12 @@ public interface TestCase extends TargetableTestComponent {
             .description("Spec of entity to instantiate (and start, if startable) if the test-case fails")
             .runtimeInheritance(BasicConfigInheritance.NOT_REINHERITED)
             .build();
+
+    ConfigKey<Boolean> CONTINUE_ON_FAILURE = ConfigKeys.builder(Boolean.class)
+            .name("continueOnFailure")
+            .description("Whether to continue executing subsequent children if an earlier child fails")
+            .runtimeInheritance(BasicConfigInheritance.NOT_REINHERITED)
+            .defaultValue(false)
+            .build();
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c1422ed1/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCaseImpl.java
----------------------------------------------------------------------
diff --git a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCaseImpl.java b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCaseImpl.java
index 849d018..2b7351a 100644
--- a/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCaseImpl.java
+++ b/test-framework/src/main/java/org/apache/brooklyn/test/framework/TestCaseImpl.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.test.framework;
 
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
@@ -47,14 +48,32 @@ public class TestCaseImpl extends TargetableTestComponentImpl implements TestCas
     public void start(Collection<? extends Location> locations) {
         ServiceStateLogic.setExpectedState(this, Lifecycle.STARTING);
         try {
-            for (final Entity childEntity : getChildren()) {
-                Boolean serviceUp = childEntity.sensors().get(Attributes.SERVICE_UP);
-                if (childEntity instanceof Startable && !Boolean.TRUE.equals(serviceUp)){
-                    ((Startable) childEntity).start(locations);
+            boolean continueOnFailure = Boolean.TRUE.equals(config().get(CONTINUE_ON_FAILURE));
+            List<Throwable> childErrors = Lists.newArrayList();
+            for (Entity child : getChildren()) {
+                Boolean serviceUp = child.sensors().get(Attributes.SERVICE_UP);
+                if (child instanceof Startable && !Boolean.TRUE.equals(serviceUp)){
+                    try {
+                        ((Startable) child).start(locations);
+                    } catch (Throwable t) {
+                        Exceptions.propagateIfFatal(t);
+                        if (continueOnFailure) {
+                            LOG.warn("Problem starting child "+child+" (continuing, and will throw at end)", t);
+                            childErrors.add(t);
+                        } else {
+                            throw t;
+                        }
+                    }
                 }
             }
+            
+            if (childErrors.size() > 0) {
+                throw Exceptions.propagate(childErrors);
+            }
+            
             sensors().set(Attributes.SERVICE_UP, true);
             ServiceStateLogic.setExpectedState(this, Lifecycle.RUNNING);
+            
         } catch (Throwable t) {
             Exceptions.propagateIfInterrupt(t);
             try {
@@ -77,10 +96,28 @@ public class TestCaseImpl extends TargetableTestComponentImpl implements TestCas
         ServiceStateLogic.setExpectedState(this, Lifecycle.STOPPING);
         sensors().set(Attributes.SERVICE_UP, false);
         try {
+            boolean continueOnFailure = Boolean.TRUE.equals(config().get(CONTINUE_ON_FAILURE));
+            List<Throwable> childErrors = Lists.newArrayList();
             for (Entity child : getChildren()) {
-                if (child instanceof Startable) ((Startable) child).stop();
+                try {
+                    if (child instanceof Startable) ((Startable) child).stop();
+                } catch (Throwable t) {
+                    Exceptions.propagateIfFatal(t);
+                    if (continueOnFailure) {
+                        LOG.warn("Problem stopping child "+child+" (continuing, and will throw at end)", t);
+                        childErrors.add(t);
+                    } else {
+                        throw t;
+                    }
+                }
             }
+            
+            if (childErrors.size() > 0) {
+                throw Exceptions.propagate(childErrors);
+            }
+
             ServiceStateLogic.setExpectedState(this, Lifecycle.STOPPED);
+            
         } catch (Exception e) {
             ServiceStateLogic.setExpectedState(this, Lifecycle.ON_FIRE);
             throw Exceptions.propagate(e);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c1422ed1/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestCaseTest.java
----------------------------------------------------------------------
diff --git a/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestCaseTest.java b/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestCaseTest.java
index d211076..d599f9f 100644
--- a/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestCaseTest.java
+++ b/test-framework/src/test/java/org/apache/brooklyn/test/framework/TestCaseTest.java
@@ -29,6 +29,7 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.core.entity.Attributes;
+import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityAsserts;
 import org.apache.brooklyn.core.entity.EntityPredicates;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
@@ -38,6 +39,7 @@ import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.core.test.entity.TestEntityImpl;
 import org.apache.brooklyn.test.Asserts;
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Optional;
@@ -54,17 +56,28 @@ public class TestCaseTest extends BrooklynAppUnitTestSupport {
         super.setUp();
     }
 
-    @Test
-    public void testSucceedsWhenEmpty() throws Exception {
-        TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class));
+    @DataProvider(name = "continueOnFailurePermutations")
+    public Object[][] continueOnFailurePermutations() {
+        return new Object[][] {
+                { (Boolean)null },
+                { Boolean.FALSE },
+                { Boolean.TRUE }
+        };
+    }
+    
+    @Test(dataProvider = "continueOnFailurePermutations")
+    public void testSucceedsWhenEmpty(Boolean continueOnFailure) throws Exception {
+        TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .configure(TestCase.CONTINUE_ON_FAILURE, continueOnFailure));
         app.start(locs);
 
         assertTestCaseSucceeds(testCase);
     }
     
-    @Test
-    public void testCallsChildrenSequentially() throws Exception {
+    @Test(dataProvider = "continueOnFailurePermutations")
+    public void testCallsChildrenSequentially(Boolean continueOnFailure) throws Exception {
         TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .configure(TestCase.CONTINUE_ON_FAILURE, continueOnFailure)
                 .child(EntitySpec.create(TestEntity.class).impl(TestEntityConcurrencyTrackerImpl.class))
                 .child(EntitySpec.create(TestEntity.class).impl(TestEntityConcurrencyTrackerImpl.class)));
         TestEntity child1 = (TestEntity) Iterables.get(testCase.getChildren(), 0);
@@ -77,9 +90,10 @@ public class TestCaseTest extends BrooklynAppUnitTestSupport {
         assertEquals(TestEntityConcurrencyTrackerImpl.getMaxConcurrent(), 1);
     }
     
-    @Test
-    public void testDoesNotCallsOnErrorEntityIfSuccessful() throws Exception {
+    @Test(dataProvider = "continueOnFailurePermutations")
+    public void testDoesNotCallOnErrorEntityIfSuccessful(Boolean continueOnFailure) throws Exception {
         TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .configure(TestCase.CONTINUE_ON_FAILURE, continueOnFailure)
                 .configure(TestCase.ON_ERROR_SPEC, EntitySpec.create(TestEntity.class).displayName("onerr"))
                 .child(EntitySpec.create(TestEntity.class)));
         app.start(locs);
@@ -90,9 +104,10 @@ public class TestCaseTest extends BrooklynAppUnitTestSupport {
         assertTestCaseSucceeds(testCase);
     }
     
-    @Test
-    public void testCallsOnErrorEntity() throws Exception {
+    @Test(dataProvider = "continueOnFailurePermutations")
+    public void testCallsOnErrorEntity(Boolean continueOnFailure) throws Exception {
         TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .configure(TestCase.CONTINUE_ON_FAILURE, continueOnFailure)
                 .configure(TestCase.ON_ERROR_SPEC, EntitySpec.create(TestEntity.class).displayName("onerr"))
                 .child(EntitySpec.create(FailingEntity.class)
                         .configure(FailingEntity.FAIL_ON_START, true)));
@@ -130,6 +145,65 @@ public class TestCaseTest extends BrooklynAppUnitTestSupport {
         Optional<Entity> innerOnErrEntity = Iterables.tryFind(innerTestCase.getChildren(), EntityPredicates.displayNameEqualTo("onerr"));
         assertFalse(innerOnErrEntity.isPresent(), "innerOnErrEntity="+innerOnErrEntity);
     }
+   
+    @Test
+    public void testAbortsOnFailure() throws Exception {
+        // continueOnFailure defaults to false
+        TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .child(EntitySpec.create(FailingEntity.class)
+                        .configure(FailingEntity.FAIL_ON_START, true))
+                .child(EntitySpec.create(TestEntity.class).displayName("child2")));
+        
+        try {
+            app.start(locs);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Throwable t) {
+            Asserts.expectedFailureContains(t, "Simulating entity start failure for test");
+        }
+
+        TestEntity child2 = (TestEntity) Iterables.tryFind(testCase.getChildren(), EntityPredicates.displayNameEqualTo("child2")).get();
+        assertEquals(child2.getCallHistory(), ImmutableList.of());
+    }
+    
+
+    @Test
+    public void testContinuesOnFailure() throws Exception {
+        TestCase testCase = app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .configure(TestCase.CONTINUE_ON_FAILURE, true)
+                .child(EntitySpec.create(FailingEntity.class)
+                        .configure(FailingEntity.FAIL_ON_START, true))
+                .child(EntitySpec.create(TestEntity.class).displayName("child2")));
+        
+        try {
+            app.start(locs);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Throwable t) {
+            Asserts.expectedFailureContains(t, "Simulating entity start failure for test");
+        }
+
+        TestEntity child2 = (TestEntity) Iterables.tryFind(testCase.getChildren(), EntityPredicates.displayNameEqualTo("child2")).get();
+        assertEquals(child2.getCallHistory(), ImmutableList.of("start"));
+    }
+    
+    @Test
+    public void testContinueOnFailureNotInherited() throws Exception {
+        app.createAndManageChild(EntitySpec.create(TestCase.class)
+                .configure(TestCase.CONTINUE_ON_FAILURE, true)
+                .child(EntitySpec.create(TestCase.class)
+                        .child(EntitySpec.create(FailingEntity.class)
+                                .configure(FailingEntity.FAIL_ON_START, true))
+                        .child(EntitySpec.create(TestEntity.class).displayName("grandchild2"))));
+        
+        try {
+            app.start(locs);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Throwable t) {
+            Asserts.expectedFailureContains(t, "Simulating entity start failure for test");
+        }
+
+        TestEntity grandchild2 = (TestEntity) Iterables.tryFind(Entities.descendantsAndSelf(app), EntityPredicates.displayNameEqualTo("grandchild2")).get();
+        assertEquals(grandchild2.getCallHistory(), ImmutableList.of());
+    }
     
     protected void assertTestCaseSucceeds(TestCase entity) {
         EntityAsserts.assertAttributeEqualsEventually(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);


[2/2] brooklyn-server git commit: This closes #621

Posted by al...@apache.org.
This closes #621


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/ee367e24
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/ee367e24
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/ee367e24

Branch: refs/heads/master
Commit: ee367e24de95ce2fb30734b2ce006f5d89a33ae1
Parents: ff7cde1 c1422ed
Author: Aled Sage <al...@gmail.com>
Authored: Thu Apr 6 17:19:13 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Apr 6 17:19:13 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/test/framework/TestCase.java       |  8 ++
 .../brooklyn/test/framework/TestCaseImpl.java   | 47 ++++++++--
 .../brooklyn/test/framework/TestCaseTest.java   | 92 ++++++++++++++++++--
 3 files changed, 133 insertions(+), 14 deletions(-)
----------------------------------------------------------------------