Rewrite tests: donât rely on entity constructors
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/9a83a598 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/9a83a598 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/9a83a598 Branch: refs/heads/master Commit: 9a83a59858a7f89a6e392f0b4fa0d6dee6280855 Parents: 2a39400 Author: Aled Sage <[email protected]> Authored: Mon May 15 08:07:14 2017 +0100 Committer: Aled Sage <[email protected]> Committed: Mon May 15 13:49:26 2017 +0100 ---------------------------------------------------------------------- .../brooklyn/core/entity/AttributeTest.java | 31 +- .../brooklyn/core/entity/EntitySpecTest.java | 2 +- .../drivers/BasicEntityDriverManagerTest.java | 33 +-- .../drivers/EntityDriverRegistryTest.java | 35 +-- .../ReflectiveEntityDriverFactoryTest.java | 63 ++-- .../RegistryEntityDriverFactoryTest.java | 31 +- .../proxying/InternalEntityFactoryTest.java | 32 ++- .../core/mgmt/osgi/OsgiStandaloneTest.java | 2 +- .../mgmt/osgi/OsgiVersionMoreEntityTest.java | 28 +- .../brooklyn/core/test/entity/TestEntity.java | 4 + .../core/test/entity/TestEntityImpl.java | 14 + .../YamlRollingTimeWindowMeanEnricherTest.java | 23 +- .../brooklyn/entity/group/DynamicGroupTest.java | 285 +++++++++++-------- .../AbstractFollowTheSunPolicyTest.java | 42 ++- .../followthesun/FollowTheSunModelTest.java | 43 +-- .../AbstractLoadBalancingPolicyTest.java | 19 +- .../loadbalancing/LoadBalancingModelTest.java | 28 +- .../LoadBalancingPolicyConcurrencyTest.java | 8 +- .../loadbalancing/MockItemEntityImpl.java | 5 +- .../java/org/apache/brooklyn/cli/CliTest.java | 18 +- .../base/SoftwareProcessEntityTest.java | 5 +- .../MachineLifecycleEffectorTasksTest.java | 16 +- 22 files changed, 419 insertions(+), 348 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/AttributeTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/AttributeTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/AttributeTest.java index 8c4c3a0..e4e5699 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/AttributeTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/AttributeTest.java @@ -21,46 +21,47 @@ package org.apache.brooklyn.core.entity; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; +import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.core.sensor.BasicAttributeSensor; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; +import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.core.test.entity.TestEntityImpl; -import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class AttributeTest { +public class AttributeTest extends BrooklynAppUnitTestSupport { static AttributeSensor<String> COLOR = new BasicAttributeSensor<String>(String.class, "my.color"); - TestEntityImpl e; + TestEntity entity; + TestEntityImpl entityImpl; @BeforeMethod(alwaysRun=true) + @Override public void setUp() throws Exception { - e = new TestEntityImpl(); - } - - @AfterMethod(alwaysRun = true) - public void tearDown(){ - // nothing to tear down; entity was not managed (i.e. had no management context) + super.setUp(); + entity = app.addChild(EntitySpec.create(TestEntity.class)); + entityImpl = (TestEntityImpl) Entities.deproxy(entity); } @Test public void canGetAndSetAttribute() { - e.sensors().set(COLOR, "red"); - assertEquals(e.getAttribute(COLOR), "red"); + entity.sensors().set(COLOR, "red"); + assertEquals(entity.getAttribute(COLOR), "red"); } @Test public void missingAttributeIsNull() { - assertEquals(e.getAttribute(COLOR), null); + assertEquals(entity.getAttribute(COLOR), null); } @Test public void canGetAttributeByNameParts() { // Initially null - assertNull(e.getAttributeByNameParts(COLOR.getNameParts())); + assertNull(entityImpl.getAttributeByNameParts(COLOR.getNameParts())); // Once set, returns val - e.sensors().set(COLOR, "red"); - assertEquals(e.getAttributeByNameParts(COLOR.getNameParts()), "red"); + entity.sensors().set(COLOR, "red"); + assertEquals(entityImpl.getAttributeByNameParts(COLOR.getNameParts()), "red"); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/EntitySpecTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySpecTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySpecTest.java index fd693b4..fb84693 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySpecTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySpecTest.java @@ -149,7 +149,7 @@ public class EntitySpecTest extends BrooklynAppUnitTestSupport { @Test public void testCallsConfigureAfterConstruction() throws Exception { - AbstractEntityLegacyTest.MyEntity entity = app.createAndManageChild(EntitySpec.create(AbstractEntityLegacyTest.MyEntity.class)); + TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); assertEquals(entity.getConfigureCount(), 1); assertEquals(entity.getConfigureDuringConstructionCount(), 0); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/drivers/BasicEntityDriverManagerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/BasicEntityDriverManagerTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/BasicEntityDriverManagerTest.java index d42ccb9..589d199 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/BasicEntityDriverManagerTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/BasicEntityDriverManagerTest.java @@ -20,53 +20,50 @@ package org.apache.brooklyn.core.entity.drivers; import static org.testng.Assert.assertTrue; -import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity; -import org.apache.brooklyn.core.entity.drivers.BasicEntityDriverManager; +import org.apache.brooklyn.api.entity.EntitySpec; +import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MyDriver; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MyDriverDependentEntity; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MySshDriver; import org.apache.brooklyn.core.entity.drivers.RegistryEntityDriverFactoryTest.MyOtherSshDriver; import org.apache.brooklyn.core.location.SimulatedLocation; -import org.testng.annotations.AfterMethod; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; +import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import org.apache.brooklyn.location.ssh.SshMachineLocation; -import org.apache.brooklyn.util.collections.MutableMap; -public class BasicEntityDriverManagerTest { +public class BasicEntityDriverManagerTest extends BrooklynAppUnitTestSupport { private BasicEntityDriverManager manager; private SshMachineLocation sshLocation; private SimulatedLocation simulatedLocation; - - @BeforeMethod + private MyDriverDependentEntity entity; + + @BeforeMethod(alwaysRun=true) + @Override public void setUp() throws Exception { + super.setUp(); manager = new BasicEntityDriverManager(); - sshLocation = new SshMachineLocation(MutableMap.of("address", "localhost")); - simulatedLocation = new SimulatedLocation(); + sshLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) + .configure("address", "localhost")); + simulatedLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); + entity = app.addChild(EntitySpec.create(MyDriverDependentEntity.class) + .configure(MyDriverDependentEntity.DRIVER_CLASS, MyDriver.class)); } - @AfterMethod - public void tearDown(){ - // nothing to tear down; no management context created - } - @Test public void testPrefersRegisteredDriver() throws Exception { - DriverDependentEntity<MyDriver> entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); manager.registerDriver(MyDriver.class, SshMachineLocation.class, MyOtherSshDriver.class); assertTrue(manager.build(entity, sshLocation) instanceof MyOtherSshDriver); } @Test public void testFallsBackToReflectiveDriver() throws Exception { - DriverDependentEntity<MyDriver> entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); assertTrue(manager.build(entity, sshLocation) instanceof MySshDriver); } @Test public void testRespectsLocationWhenDecidingOnDriver() throws Exception { - DriverDependentEntity<MyDriver> entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); manager.registerDriver(MyDriver.class, SimulatedLocation.class, MyOtherSshDriver.class); assertTrue(manager.build(entity, simulatedLocation) instanceof MyOtherSshDriver); assertTrue(manager.build(entity, sshLocation) instanceof MySshDriver); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/drivers/EntityDriverRegistryTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/EntityDriverRegistryTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/EntityDriverRegistryTest.java index 977d380..997ae05 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/EntityDriverRegistryTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/EntityDriverRegistryTest.java @@ -20,40 +20,35 @@ package org.apache.brooklyn.core.entity.drivers; import static org.testng.Assert.assertTrue; -import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.entity.Entities; +import org.apache.brooklyn.api.entity.EntitySpec; +import org.apache.brooklyn.api.entity.drivers.EntityDriver; +import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MyDriver; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MyDriverDependentEntity; import org.apache.brooklyn.core.entity.drivers.RegistryEntityDriverFactoryTest.MyOtherSshDriver; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.util.collections.MutableMap; -import org.testng.annotations.AfterMethod; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; +import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import org.apache.brooklyn.location.ssh.SshMachineLocation; -public class EntityDriverRegistryTest { +public class EntityDriverRegistryTest extends BrooklynAppUnitTestSupport { - private ManagementContext managementContext; private SshMachineLocation sshLocation; - + private MyDriverDependentEntity entity; + @BeforeMethod public void setUp() throws Exception { - managementContext = new LocalManagementContextForTests(); - sshLocation = new SshMachineLocation(MutableMap.of("address", "localhost")); - } - - @AfterMethod - public void tearDown(){ - if (managementContext != null) Entities.destroyAll(managementContext); + super.setUp(); + sshLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) + .configure("address", "localhost")); + entity = app.addChild(EntitySpec.create(MyDriverDependentEntity.class) + .configure(MyDriverDependentEntity.DRIVER_CLASS, MyDriver.class)); } @Test public void testInstantiatesRegisteredDriver() throws Exception { - managementContext.getEntityDriverManager().registerDriver(MyDriver.class, SshMachineLocation.class, MyOtherSshDriver.class); - DriverDependentEntity<MyDriver> entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); - MyDriver driver = managementContext.getEntityDriverManager().build(entity, sshLocation); + mgmt.getEntityDriverManager().registerDriver(MyDriver.class, SshMachineLocation.class, MyOtherSshDriver.class); + EntityDriver driver = mgmt.getEntityDriverManager().build(entity, sshLocation); assertTrue(driver instanceof MyOtherSshDriver); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/drivers/ReflectiveEntityDriverFactoryTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/ReflectiveEntityDriverFactoryTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/ReflectiveEntityDriverFactoryTest.java index 0c7dcd1..889447c 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/ReflectiveEntityDriverFactoryTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/ReflectiveEntityDriverFactoryTest.java @@ -18,46 +18,48 @@ */ package org.apache.brooklyn.core.entity.drivers; -import org.apache.brooklyn.location.paas.PaasLocation; -import org.apache.brooklyn.location.paas.TestPaasLocation; -import org.apache.brooklyn.location.ssh.SshMachineLocation; -import org.apache.brooklyn.util.collections.MutableMap; +import static org.testng.Assert.assertTrue; + import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntityLocal; +import org.apache.brooklyn.api.entity.EntitySpec; +import org.apache.brooklyn.api.entity.ImplementedBy; import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity; import org.apache.brooklyn.api.entity.drivers.EntityDriver; import org.apache.brooklyn.api.location.Location; +import org.apache.brooklyn.api.location.LocationSpec; +import org.apache.brooklyn.config.ConfigKey; +import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.entity.AbstractEntity; -import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactory; -import org.testng.annotations.AfterMethod; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; +import org.apache.brooklyn.location.paas.PaasLocation; +import org.apache.brooklyn.location.paas.TestPaasLocation; +import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import static org.testng.Assert.assertTrue; +import com.google.common.reflect.TypeToken; -public class ReflectiveEntityDriverFactoryTest { +public class ReflectiveEntityDriverFactoryTest extends BrooklynAppUnitTestSupport { private ReflectiveEntityDriverFactory factory; private SshMachineLocation sshLocation; private PaasLocation paasLocation; - private DriverDependentEntity<MyDriver> entity; + private MyDriverDependentEntity entity; @BeforeMethod public void setUp() throws Exception { + super.setUp(); + sshLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) + .configure("address", "localhost")); + paasLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(TestPaasLocation.class)); factory = new ReflectiveEntityDriverFactory(); - sshLocation = new SshMachineLocation(MutableMap.of("address", "localhost")); - entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); - - paasLocation = new TestPaasLocation(); + entity = app.addChild(EntitySpec.create(MyDriverDependentEntity.class) + .configure(MyDriverDependentEntity.DRIVER_CLASS, MyDriver.class)); } - @AfterMethod - public void tearDown() { - // nothing to tear down; no management context created - } - protected void assertDriverIs(Class<?> clazz, Location location) { - MyDriver driver = factory.build(entity, location); + MyDriver driver = (MyDriver) factory.build(entity, location); assertTrue(driver.getClass().equals(clazz), "driver="+driver+"; should be "+clazz); } @@ -109,21 +111,24 @@ public class ReflectiveEntityDriverFactoryTest { factory.addClassSimpleNameMapping(MyDriver.class.getSimpleName()+"X", MyCustomDriver.class.getSimpleName()); assertDriverIs(MySshDriver.class, sshLocation); } - - public static class MyDriverDependentEntity<D extends EntityDriver> extends AbstractEntity implements DriverDependentEntity<D> { - private final Class<D> clazz; - public MyDriverDependentEntity(Class<D> clazz) { - this.clazz = clazz; - } - + @ImplementedBy(MyDriverDependentEntityImpl.class) + public static interface MyDriverDependentEntity extends Entity, DriverDependentEntity<EntityDriver> { + @SuppressWarnings("serial") + ConfigKey<Class<? extends EntityDriver>> DRIVER_CLASS = ConfigKeys.newConfigKey( + new TypeToken<Class<? extends EntityDriver>>() {}, + "driverClass"); + } + + public static class MyDriverDependentEntityImpl extends AbstractEntity implements MyDriverDependentEntity { @Override - public Class<D> getDriverInterface() { - return clazz; + @SuppressWarnings("unchecked") + public Class<EntityDriver> getDriverInterface() { + return (Class<EntityDriver>) config().get(DRIVER_CLASS); } @Override - public D getDriver() { + public EntityDriver getDriver() { throw new UnsupportedOperationException(); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/drivers/RegistryEntityDriverFactoryTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/RegistryEntityDriverFactoryTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/RegistryEntityDriverFactoryTest.java index 4f079a1..60f70fa 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/drivers/RegistryEntityDriverFactoryTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/drivers/RegistryEntityDriverFactoryTest.java @@ -23,39 +23,37 @@ import static org.testng.Assert.assertTrue; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntityLocal; -import org.apache.brooklyn.api.entity.drivers.DriverDependentEntity; +import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.core.entity.drivers.RegistryEntityDriverFactory; +import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MyDriver; import org.apache.brooklyn.core.entity.drivers.ReflectiveEntityDriverFactoryTest.MyDriverDependentEntity; import org.apache.brooklyn.core.location.SimulatedLocation; -import org.testng.annotations.AfterMethod; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; +import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import org.apache.brooklyn.location.ssh.SshMachineLocation; -import org.apache.brooklyn.util.collections.MutableMap; -public class RegistryEntityDriverFactoryTest { +public class RegistryEntityDriverFactoryTest extends BrooklynAppUnitTestSupport { private RegistryEntityDriverFactory factory; private SshMachineLocation sshLocation; private SimulatedLocation simulatedLocation; - + private MyDriverDependentEntity entity; + @BeforeMethod public void setUp() throws Exception { + super.setUp(); factory = new RegistryEntityDriverFactory(); - sshLocation = new SshMachineLocation(MutableMap.of("address", "localhost")); - simulatedLocation = new SimulatedLocation(); - } - - @AfterMethod - public void tearDown(){ - // nothing to tear down; no management context created + sshLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) + .configure("address", "localhost")); + simulatedLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); + entity = app.addChild(EntitySpec.create(MyDriverDependentEntity.class) + .configure(MyDriverDependentEntity.DRIVER_CLASS, MyDriver.class)); } @Test public void testHasDriver() throws Exception { - DriverDependentEntity<MyDriver> entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); factory.registerDriver(MyDriver.class, SshMachineLocation.class, MyOtherSshDriver.class); assertTrue(factory.hasDriver(entity, sshLocation)); assertFalse(factory.hasDriver(entity, simulatedLocation)); @@ -63,9 +61,8 @@ public class RegistryEntityDriverFactoryTest { @Test public void testInstantiatesRegisteredDriver() throws Exception { - DriverDependentEntity<MyDriver> entity = new MyDriverDependentEntity<MyDriver>(MyDriver.class); factory.registerDriver(MyDriver.class, SshMachineLocation.class, MyOtherSshDriver.class); - MyDriver driver = factory.build(entity, sshLocation); + MyDriver driver = (MyDriver) factory.build(entity, sshLocation); assertTrue(driver instanceof MyOtherSshDriver); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/entity/proxying/InternalEntityFactoryTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/proxying/InternalEntityFactoryTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/proxying/InternalEntityFactoryTest.java index 9cb7060..7439b71 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/proxying/InternalEntityFactoryTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/proxying/InternalEntityFactoryTest.java @@ -43,19 +43,19 @@ import org.testng.annotations.Test; public class InternalEntityFactoryTest { - private ManagementContextInternal managementContext; + private ManagementContextInternal mgmt; private InternalEntityFactory factory; @BeforeMethod(alwaysRun=true) public void setUp() throws Exception { - managementContext = new LocalManagementContextForTests(); - InternalPolicyFactory policyFactory = new InternalPolicyFactory(managementContext); - factory = new InternalEntityFactory(managementContext, managementContext.getEntityManager().getEntityTypeRegistry(), policyFactory); + mgmt = new LocalManagementContextForTests(); + InternalPolicyFactory policyFactory = new InternalPolicyFactory(mgmt); + factory = new InternalEntityFactory(mgmt, mgmt.getEntityManager().getEntityTypeRegistry(), policyFactory); } @AfterMethod(alwaysRun=true) public void tearDown() throws Exception { - if (managementContext != null) Entities.destroyAll(managementContext); + if (mgmt != null) Entities.destroyAll(mgmt); } @Test @@ -73,12 +73,19 @@ public class InternalEntityFactoryTest { @Test public void testCreatesProxy() throws Exception { - TestApplicationImpl app = new TestApplicationImpl(); EntitySpec<Application> spec = EntitySpec.create(Application.class).impl(TestApplicationImpl.class); + Application app = factory.createEntity(spec); Application proxy = factory.createEntityProxy(spec, app); + TestApplicationImpl deproxied = (TestApplicationImpl) Entities.deproxy(proxy); - assertFalse(proxy instanceof TestApplicationImpl, "proxy="+app); - assertTrue(proxy instanceof EntityProxy, "proxy="+app); + assertTrue(app instanceof TestApplicationImpl, "app="+app); + + assertFalse(proxy instanceof TestApplicationImpl, "proxy="+proxy); + assertTrue(proxy instanceof EntityProxy, "proxy="+proxy); + assertTrue(proxy instanceof Application, "proxy="+proxy); + + assertTrue(deproxied instanceof TestApplicationImpl, "deproxied="+deproxied); + assertFalse(deproxied instanceof EntityProxy, "deproxied="+deproxied); } @Test @@ -92,13 +99,14 @@ public class InternalEntityFactoryTest { @Test public void testCreatesProxyImplementingAdditionalInterfaces() throws Exception { - MyApplicationImpl app = new MyApplicationImpl(); EntitySpec<Application> spec = EntitySpec.create(Application.class).impl(MyApplicationImpl.class).additionalInterfaces(MyInterface.class); + Application app = factory.createEntity(spec); Application proxy = factory.createEntityProxy(spec, app); - assertFalse(proxy instanceof MyApplicationImpl, "proxy="+app); - assertTrue(proxy instanceof MyInterface, "proxy="+app); - assertTrue(proxy instanceof EntityProxy, "proxy="+app); + assertFalse(proxy instanceof MyApplicationImpl, "proxy="+proxy); + assertTrue(proxy instanceof Application, "proxy="+proxy); + assertTrue(proxy instanceof MyInterface, "proxy="+proxy); + assertTrue(proxy instanceof EntityProxy, "proxy="+proxy); } public interface MyInterface { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiStandaloneTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiStandaloneTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiStandaloneTest.java index 15b9ae9..b21ba28 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiStandaloneTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiStandaloneTest.java @@ -170,7 +170,7 @@ public class OsgiStandaloneTest extends OsgiTestBase { public void testLoadOsgiBundleDependencies() throws Exception { Bundle bundle = installFromClasspath(BROOKLYN_TEST_OSGI_ENTITIES_PATH); Assert.assertNotNull(bundle); - Class<?> aClass = bundle.loadClass("org.apache.brooklyn.test.osgi.entities.SimpleApplicationImpl"); + Class<?> aClass = bundle.loadClass("org.apache.brooklyn.test.osgi.entities.SimpleObject"); Object aInst = aClass.newInstance(); Assert.assertNotNull(aInst); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java index f19556e..83b48c2 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/osgi/OsgiVersionMoreEntityTest.java @@ -18,6 +18,8 @@ */ package org.apache.brooklyn.core.mgmt.osgi; +import static org.testng.Assert.assertTrue; + import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; @@ -35,9 +37,11 @@ import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder; import org.apache.brooklyn.core.catalog.internal.CatalogItemDtoAbstract; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; import org.apache.brooklyn.core.effector.Effectors; +import org.apache.brooklyn.core.entity.AbstractEntity; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; +import org.apache.brooklyn.core.objs.proxy.EntityProxy; import org.apache.brooklyn.core.objs.proxy.InternalEntityFactory; import org.apache.brooklyn.core.objs.proxy.InternalPolicyFactory; import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; @@ -93,18 +97,17 @@ public class OsgiVersionMoreEntityTest implements OsgiTestResources { */ @Test public void testEntityProxy() throws Exception { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_OSGI_ENTITIES_PATH); + File storageTempDir = Os.newTempDir("osgi-standalone"); Framework framework = Osgis.getFramework(storageTempDir.getAbsolutePath(), true); + ManagementContextInternal managementContext = null; try { - ManagementContextInternal managementContext; - InternalEntityFactory factory; - managementContext = new LocalManagementContextForTests(); InternalPolicyFactory policyFactory = new InternalPolicyFactory(managementContext); - factory = new InternalEntityFactory(managementContext, managementContext.getEntityManager().getEntityTypeRegistry(), policyFactory); + InternalEntityFactory factory = new InternalEntityFactory(managementContext, managementContext.getEntityManager().getEntityTypeRegistry(), policyFactory); - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_OSGI_ENTITIES_PATH); Bundle bundle = Osgis.install(framework, BROOKLYN_TEST_OSGI_ENTITIES_PATH); @SuppressWarnings("unchecked") Class<? extends Entity> bundleCls = (Class<? extends Entity>) bundle.loadClass("org.apache.brooklyn.test.osgi.entities.SimpleEntityImpl"); @@ -113,12 +116,19 @@ public class OsgiVersionMoreEntityTest implements OsgiTestResources { @SuppressWarnings("unchecked") EntitySpec<Entity> spec = (((EntitySpec<Entity>)EntitySpec.create(bundleInterface))).impl(bundleCls); - Entity entity = bundleCls.newInstance(); - factory.createEntityProxy(spec, entity); + AbstractEntity entityImpl = (AbstractEntity) factory.createEntity(spec); + Entity entityProxy = factory.createEntityProxy(spec, entityImpl); + + assertTrue(entityProxy instanceof EntityProxy, "proxy="+entityProxy); + assertTrue(entityProxy instanceof Entity, "proxy="+entityProxy); + assertTrue(bundleInterface.isInstance(entityProxy), "proxy="+entityProxy); - if (managementContext != null) Entities.destroyAll(managementContext); } finally { - OsgiTestBase.tearDownOsgiFramework(framework, storageTempDir); + try { + if (managementContext != null) Entities.destroyAll(managementContext); + } finally { + OsgiTestBase.tearDownOsgiFramework(framework, storageTempDir); + } } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java index 85cc9e2..bfada48 100644 --- a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java +++ b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java @@ -112,6 +112,10 @@ public interface TestEntity extends Entity, Startable, EntityLocal, EntityIntern public Map<?,?> getConfigureProperties(); + public int getConfigureCount(); + + public int getConfigureDuringConstructionCount(); + public int getSequenceValue(); public void setSequenceValue(int value); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java index 2331b48..a2a64b9 100644 --- a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java +++ b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java @@ -58,6 +58,8 @@ public class TestEntityImpl extends AbstractEntity implements TestEntity { protected AtomicInteger counter = new AtomicInteger(0); protected Map<?,?> constructorProperties; protected Map<?,?> configureProperties; + protected int configureCount; + protected int configureDuringConstructionCount; protected List<String> callHistory = Collections.synchronizedList(Lists.<String>newArrayList()); public TestEntityImpl() { @@ -69,11 +71,13 @@ public class TestEntityImpl extends AbstractEntity implements TestEntity { public TestEntityImpl(Map properties, Entity parent) { super(properties, parent); this.constructorProperties = properties; + this.configureDuringConstructionCount = configureCount; } @Override public AbstractEntity configure(Map flags) { this.configureProperties = flags; + configureCount++; return super.configure(flags); } @@ -133,6 +137,16 @@ public class TestEntityImpl extends AbstractEntity implements TestEntity { } @Override + public int getConfigureCount() { + return configureCount; + } + + @Override + public int getConfigureDuringConstructionCount() { + return configureDuringConstructionCount; + } + + @Override public synchronized int getSequenceValue() { return sequenceValue; } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/enricher/stock/YamlRollingTimeWindowMeanEnricherTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/enricher/stock/YamlRollingTimeWindowMeanEnricherTest.java b/core/src/test/java/org/apache/brooklyn/enricher/stock/YamlRollingTimeWindowMeanEnricherTest.java index 58eed85..a6b8208 100644 --- a/core/src/test/java/org/apache/brooklyn/enricher/stock/YamlRollingTimeWindowMeanEnricherTest.java +++ b/core/src/test/java/org/apache/brooklyn/enricher/stock/YamlRollingTimeWindowMeanEnricherTest.java @@ -24,22 +24,16 @@ import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.SubscriptionContext; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.api.sensor.EnricherSpec; -import org.apache.brooklyn.core.entity.AbstractApplication; -import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.sensor.BasicAttributeSensor; import org.apache.brooklyn.core.sensor.BasicSensorEvent; -import org.apache.brooklyn.enricher.stock.YamlRollingTimeWindowMeanEnricher; -import org.apache.brooklyn.enricher.stock.YamlTimeWeightedDeltaEnricher; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.enricher.stock.YamlRollingTimeWindowMeanEnricher.ConfidenceQualifiedNumber; import org.apache.brooklyn.entity.stock.BasicEntity; import org.apache.brooklyn.util.time.Duration; -import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class YamlRollingTimeWindowMeanEnricherTest { - - AbstractApplication app; +public class YamlRollingTimeWindowMeanEnricherTest extends BrooklynAppUnitTestSupport { BasicEntity producer; @@ -55,10 +49,10 @@ public class YamlRollingTimeWindowMeanEnricherTest { SubscriptionContext subscription; @SuppressWarnings("unchecked") - @BeforeMethod - public void before() { - app = new AbstractApplication() {}; - Entities.startManagement(app); + @BeforeMethod(alwaysRun=true) + @Override + public void setUp() throws Exception { + super.setUp(); producer = app.addChild(EntitySpec.create(BasicEntity.class)); intSensor = new BasicAttributeSensor<Integer>(Integer.class, "int sensor"); @@ -77,11 +71,6 @@ public class YamlRollingTimeWindowMeanEnricherTest { .configure(YamlRollingTimeWindowMeanEnricher.WINDOW_DURATION, timePeriod)); } - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (app != null) Entities.destroyAll(app.getManagementContext()); - } - @Test public void testDefaultAverageWhenEmpty() { ConfidenceQualifiedNumber average = averager.getAverage(0, 0); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/core/src/test/java/org/apache/brooklyn/entity/group/DynamicGroupTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/entity/group/DynamicGroupTest.java b/core/src/test/java/org/apache/brooklyn/entity/group/DynamicGroupTest.java index 6fd133b..f785865 100644 --- a/core/src/test/java/org/apache/brooklyn/entity/group/DynamicGroupTest.java +++ b/core/src/test/java/org/apache/brooklyn/entity/group/DynamicGroupTest.java @@ -31,17 +31,21 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; +import org.apache.brooklyn.api.entity.ImplementedBy; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.api.sensor.Sensor; import org.apache.brooklyn.api.sensor.SensorEvent; import org.apache.brooklyn.api.sensor.SensorEventListener; -import org.apache.brooklyn.core.entity.AbstractEntity; +import org.apache.brooklyn.config.ConfigKey; +import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.EntityPredicates; import org.apache.brooklyn.core.sensor.Sensors; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.core.test.entity.TestApplication; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.test.Asserts; @@ -51,7 +55,6 @@ import org.apache.brooklyn.util.time.Duration; import org.apache.brooklyn.util.time.Time; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -62,29 +65,23 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; -public class DynamicGroupTest { +public class DynamicGroupTest extends BrooklynAppUnitTestSupport { private static final Logger LOG = LoggerFactory.getLogger(DynamicGroupTest.class); private static final int TIMEOUT_MS = 50*1000; private static final int VERY_SHORT_WAIT_MS = 100; - private TestApplication app; private DynamicGroup group; private TestEntity e1; private TestEntity e2; @BeforeMethod(alwaysRun=true) - public void setUp() { - app = TestApplication.Factory.newManagedInstanceForTests(); - group = app.createAndManageChild(EntitySpec.create(DynamicGroup.class)); - e1 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - e2 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (app != null) Entities.destroyAll(app.getManagementContext()); + public void setUp() throws Exception { + super.setUp(); + group = app.addChild(EntitySpec.create(DynamicGroup.class)); + e1 = app.addChild(EntitySpec.create(TestEntity.class)); + e2 = app.addChild(EntitySpec.create(TestEntity.class)); } @Test @@ -219,13 +216,11 @@ public class DynamicGroupTest { // is deleted! @Test public void testStoppedGroupIgnoresComingAndGoingsOfEntities() throws Exception { - Entity e3 = new AbstractEntity() {}; group.setEntityFilter(Predicates.instanceOf(TestEntity.class)); assertEqualsIgnoringOrder(group.getMembers(), ImmutableSet.of(e1, e2)); group.stop(); - e3.setParent(app); - Entities.manage(e3); + Entity e3 = app.addChild(EntitySpec.create(TestEntity.class)); Asserts.succeedsContinually(MutableMap.of("timeout", VERY_SHORT_WAIT_MS), new Runnable() { @Override public void run() { @@ -242,13 +237,13 @@ public class DynamicGroupTest { @Test public void testUnmanagedGroupIgnoresComingAndGoingsOfEntities() { - Entity e3 = new AbstractEntity() {}; group.setEntityFilter(Predicates.instanceOf(TestEntity.class)); assertEqualsIgnoringOrder(group.getMembers(), ImmutableSet.of(e1, e2)); Entities.unmanage(group); - e3.setParent(app); - Entities.manage(e3); + @SuppressWarnings("unused") + Entity e3 = app.addChild(EntitySpec.create(TestEntity.class)); + Asserts.succeedsContinually(MutableMap.of("timeout", VERY_SHORT_WAIT_MS), new Runnable() { @Override public void run() { @@ -344,106 +339,99 @@ public class DynamicGroupTest { @Test(groups="Integration") public void testEntityAddedAndRemovedCalledSequentially() throws Exception { final int NUM_CYCLES = 10; - final Set<Entity> knownMembers = Sets.newLinkedHashSet(); - final AtomicInteger notificationCount = new AtomicInteger(0); - final AtomicInteger concurrentCallsCount = new AtomicInteger(0); - final List<Exception> exceptions = new CopyOnWriteArrayList<Exception>(); - DynamicGroupImpl group2 = new DynamicGroupImpl() { - @Override protected void onEntityAdded(Entity item) { - try { - onCall("Member added: member="+item); - assertTrue(knownMembers.add(item)); - } catch (Throwable t) { - exceptions.add(new Exception("Error detected adding "+item, t)); - throw Exceptions.propagate(t); - } - } - @Override protected void onEntityRemoved(Entity item) { - try { - onCall("Member removed: member="+item); - assertTrue(knownMembers.remove(item)); - } catch (Throwable t) { - exceptions.add(new Exception("Error detected adding "+item, t)); - throw Exceptions.propagate(t); - } - } - private void onCall(String msg) { - LOG.debug(msg+", thread="+Thread.currentThread().getName()); - try { - assertEquals(concurrentCallsCount.incrementAndGet(), 1); - Time.sleep(100); - } finally { - concurrentCallsCount.decrementAndGet(); - } - notificationCount.incrementAndGet(); - } - }; - group2.config().set(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(TestEntity.class)); - app.addChild(group2); - Entities.manage(group2); + DynamicGroup group2 = app.addChild(EntitySpec.create(DynamicGroup.class) + .impl(DynamicGroupCheckingEntityAddedAndRemovedSequentially.class) + .configure(DynamicGroup.ENTITY_FILTER, Predicates.instanceOf(TestEntity.class))); for (int i = 0; i < NUM_CYCLES; i++) { TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); Entities.unmanage(entity); } + final DynamicGroupCheckingEntityAddedAndRemovedSequentially group2impl = + (DynamicGroupCheckingEntityAddedAndRemovedSequentially) Entities.deproxy(group2); + Asserts.succeedsEventually(new Runnable() { @Override public void run() { - assertTrue(notificationCount.get() == (NUM_CYCLES*2) || exceptions.size() > 0); + assertTrue(group2impl.notificationCount.get() == (NUM_CYCLES*2) || group2impl.exceptions.size() > 0); }}); - if (exceptions.size() > 0) { - throw exceptions.get(0); + if (group2impl.exceptions.size() > 0) { + throw group2impl.exceptions.get(0); } - assertEquals(notificationCount.get(), NUM_CYCLES*2); + assertEquals(group2impl.notificationCount.get(), NUM_CYCLES*2); + } + public static class DynamicGroupCheckingEntityAddedAndRemovedSequentially extends DynamicGroupImpl { + final Set<Entity> knownMembers = Sets.newLinkedHashSet(); + final AtomicInteger notificationCount = new AtomicInteger(0); + final AtomicInteger concurrentCallsCount = new AtomicInteger(0); + final List<Exception> exceptions = new CopyOnWriteArrayList<Exception>(); + + @Override + protected void onEntityAdded(Entity item) { + try { + onCall("Member added: member="+item); + assertTrue(knownMembers.add(item)); + } catch (Throwable t) { + exceptions.add(new Exception("Error detected adding "+item, t)); + throw Exceptions.propagate(t); + } + } + @Override + protected void onEntityRemoved(Entity item) { + try { + onCall("Member removed: member="+item); + assertTrue(knownMembers.remove(item)); + } catch (Throwable t) { + exceptions.add(new Exception("Error detected adding "+item, t)); + throw Exceptions.propagate(t); + } + } + private void onCall(String msg) { + LOG.debug(msg+", thread="+Thread.currentThread().getName()); + try { + assertEquals(concurrentCallsCount.incrementAndGet(), 1); + Time.sleep(100); + } finally { + concurrentCallsCount.decrementAndGet(); + } + notificationCount.incrementAndGet(); + } } // See Deadlock in https://github.com/brooklyncentral/brooklyn/issues/378 - // TODO Now that entities are auto-managed, this test is no longer appropriate. - // Should it be re-written or deleted? - @Test(groups="WIP") + // Rewritten to avoid using entity-constructors and explicit "manage" call, so possibly not + // as directly applicable to the deadlock in the github issue, but that old code path is no + // longer possible! + @Test public void testDoesNotDeadlockOnManagedAndMemberAddedConcurrently() throws Exception { final CountDownLatch rescanReachedLatch = new CountDownLatch(1); final CountDownLatch entityAddedReachedLatch = new CountDownLatch(1); final CountDownLatch rescanLatch = new CountDownLatch(1); final CountDownLatch entityAddedLatch = new CountDownLatch(1); - final TestEntity e3 = app.addChild(EntitySpec.create(TestEntity.class)); - - final DynamicGroupImpl group2 = new DynamicGroupImpl() { - @Override public void rescanEntities() { - rescanReachedLatch.countDown(); - try { - rescanLatch.await(); - } catch (InterruptedException e) { - Exceptions.propagate(e); - } - super.rescanEntities(); - } - @Override protected void onEntityAdded(Entity item) { - entityAddedReachedLatch.countDown(); - try { - entityAddedLatch.await(); - } catch (InterruptedException e) { - Exceptions.propagate(e); - } - super.onEntityAdded(item); - } - }; - group2.config().set(DynamicGroup.ENTITY_FILTER, Predicates.<Object>equalTo(e3)); - app.addChild(group2); + final AtomicReference<DynamicGroup> group2ref = new AtomicReference<>(); + final AtomicReference<TestEntity> e3ref = new AtomicReference<>(); Thread t1 = new Thread(new Runnable() { @Override public void run() { - Entities.manage(group2); + DynamicGroup group2 = app.addChild(EntitySpec.create(DynamicGroupTestManagedAndMemberAddedConcurrently.class) + .configure("rescanReachedLatch", rescanReachedLatch) + .configure("entityAddedReachedLatch", entityAddedReachedLatch) + .configure("rescanLatch", rescanLatch) + .configure("entityAddedLatch", entityAddedLatch) + .configure(DynamicGroup.ENTITY_FILTER, EntityPredicates.displayNameEqualTo("e3"))); + group2ref.set(group2); }}); Thread t2 = new Thread(new Runnable() { @Override public void run() { - Entities.manage(e3); + TestEntity e3 = app.addChild(EntitySpec.create(TestEntity.class) + .displayName("e3")); + e3ref.set(e3); }}); t1.start(); @@ -469,48 +457,66 @@ public class DynamicGroupTest { Asserts.succeedsEventually(new Runnable() { @Override public void run() { - assertEqualsIgnoringOrder(group2.getMembers(), ImmutableSet.of(e3)); + assertEqualsIgnoringOrder(group2ref.get().getMembers(), ImmutableSet.of(e3ref.get())); }}); } + @ImplementedBy(DynamicGroupTestManagedAndMemberAddedConcurrentlyImpl.class) + public interface DynamicGroupTestManagedAndMemberAddedConcurrently extends DynamicGroup { + ConfigKey<CountDownLatch> RESCAN_REACHED_LATCH = ConfigKeys.newConfigKey(CountDownLatch.class, "rescanReachedLatch"); + ConfigKey<CountDownLatch> ENTITY_ADDED_REACHED_LATCH = ConfigKeys.newConfigKey(CountDownLatch.class, "entityAddedReachedLatch"); + ConfigKey<CountDownLatch> RESCAN_LATCH = ConfigKeys.newConfigKey(CountDownLatch.class, "rescanLatch"); + ConfigKey<CountDownLatch> ENTITY_ADDED_LATCH = ConfigKeys.newConfigKey(CountDownLatch.class, "entityAddedLatch"); + } + public static class DynamicGroupTestManagedAndMemberAddedConcurrentlyImpl extends DynamicGroupImpl implements DynamicGroupTestManagedAndMemberAddedConcurrently { + CountDownLatch rescanReachedLatch; + CountDownLatch entityAddedReachedLatch; + CountDownLatch rescanLatch; + CountDownLatch entityAddedLatch; + + @Override + public void init() { + super.init(); + rescanReachedLatch = config().get(RESCAN_REACHED_LATCH); + entityAddedReachedLatch = config().get(ENTITY_ADDED_REACHED_LATCH); + rescanLatch = config().get(RESCAN_LATCH); + entityAddedLatch = config().get(ENTITY_ADDED_LATCH); + } + + @Override public void rescanEntities() { + rescanReachedLatch.countDown(); + try { + rescanLatch.await(); + } catch (InterruptedException e) { + Exceptions.propagate(e); + } + super.rescanEntities(); + } + @Override protected void onEntityAdded(Entity item) { + entityAddedReachedLatch.countDown(); + try { + entityAddedLatch.await(); + } catch (InterruptedException e) { + Exceptions.propagate(e); + } + super.onEntityAdded(item); + } + } // See deadlock in https://issues.apache.org/jira/browse/BROOKLYN-66 @Test public void testDoesNotDeadlockOnUnmanageWhileOtherMemberBeingAdded() throws Exception { - final CountDownLatch removingMemberReachedLatch = new CountDownLatch(1); - final CountDownLatch addingMemberReachedLatch = new CountDownLatch(1); - final CountDownLatch addingMemberContinueLatch = new CountDownLatch(1); - final AtomicBoolean addingMemberDoLatching = new AtomicBoolean(false); final List<Entity> membersAdded = new CopyOnWriteArrayList<Entity>(); - final DynamicGroupImpl group2 = new DynamicGroupImpl() { - private final BasicSensorSupport interceptedSensors = new BasicSensorSupport() { - @Override - public <T> void emit(Sensor<T> sensor, T val) { - // intercept inside AbstractGroup.addMember, while it still holds lock on members - if (sensor == AbstractGroup.MEMBER_ADDED && addingMemberDoLatching.get()) { - addingMemberReachedLatch.countDown(); - try { - addingMemberContinueLatch.await(); - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - } - super.emit(sensor, val); - } - }; - @Override - public BasicSensorSupport sensors() { - return interceptedSensors; - } - @Override - public boolean removeMember(final Entity member) { - removingMemberReachedLatch.countDown(); - return super.removeMember(member); - } - }; - group2.config().set(DynamicGroup.MEMBER_DELEGATE_CHILDREN, true); - app.addChild(group2); - Entities.manage(group2); + final DynamicGroup group2 = app.addChild(EntitySpec.create(DynamicGroup.class) + .impl(DynamicGroupTestingUnmanageWhileOtherMemberBeingAdded.class) + .configure(DynamicGroup.MEMBER_DELEGATE_CHILDREN, true)); + + DynamicGroupTestingUnmanageWhileOtherMemberBeingAdded group2impl = + (DynamicGroupTestingUnmanageWhileOtherMemberBeingAdded) Entities.deproxy(group2); + final CountDownLatch removingMemberReachedLatch = group2impl.removingMemberReachedLatch; + final CountDownLatch addingMemberReachedLatch = group2impl.addingMemberReachedLatch; + final CountDownLatch addingMemberContinueLatch = group2impl.addingMemberContinueLatch; + final AtomicBoolean addingMemberDoLatching = group2impl.addingMemberDoLatching; app.subscriptions().subscribe(group2, AbstractGroup.MEMBER_ADDED, new SensorEventListener<Entity>() { @Override public void onEvent(SensorEvent<Entity> event) { @@ -553,6 +559,37 @@ public class DynamicGroupTest { t2.interrupt(); } } + public static class DynamicGroupTestingUnmanageWhileOtherMemberBeingAdded extends DynamicGroupImpl { + final CountDownLatch removingMemberReachedLatch = new CountDownLatch(1); + final CountDownLatch addingMemberReachedLatch = new CountDownLatch(1); + final CountDownLatch addingMemberContinueLatch = new CountDownLatch(1); + final AtomicBoolean addingMemberDoLatching = new AtomicBoolean(false); + + private final BasicSensorSupport interceptedSensors = new BasicSensorSupport() { + @Override + public <T> void emit(Sensor<T> sensor, T val) { + // intercept inside AbstractGroup.addMember, while it still holds lock on members + if (sensor == AbstractGroup.MEMBER_ADDED && addingMemberDoLatching.get()) { + addingMemberReachedLatch.countDown(); + try { + addingMemberContinueLatch.await(); + } catch (InterruptedException e) { + throw Exceptions.propagate(e); + } + } + super.emit(sensor, val); + } + }; + @Override + public BasicSensorSupport sensors() { + return interceptedSensors; + } + @Override + public boolean removeMember(final Entity member) { + removingMemberReachedLatch.countDown(); + return super.removeMember(member); + } + }; @Test public void testOnlyMatchesEntitiesInSameApplication() { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/policy/src/test/java/org/apache/brooklyn/policy/followthesun/AbstractFollowTheSunPolicyTest.java ---------------------------------------------------------------------- diff --git a/policy/src/test/java/org/apache/brooklyn/policy/followthesun/AbstractFollowTheSunPolicyTest.java b/policy/src/test/java/org/apache/brooklyn/policy/followthesun/AbstractFollowTheSunPolicyTest.java index b973c11..dff0f25 100644 --- a/policy/src/test/java/org/apache/brooklyn/policy/followthesun/AbstractFollowTheSunPolicyTest.java +++ b/policy/src/test/java/org/apache/brooklyn/policy/followthesun/AbstractFollowTheSunPolicyTest.java @@ -30,13 +30,15 @@ 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.api.location.LocationSpec; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.entity.factory.ApplicationBuilder; import org.apache.brooklyn.core.location.SimulatedLocation; -import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.core.test.entity.TestApplication; import org.apache.brooklyn.entity.group.DynamicGroup; +import org.apache.brooklyn.policy.loadbalancing.BalanceableContainer; +import org.apache.brooklyn.policy.loadbalancing.MockContainerEntity; +import org.apache.brooklyn.policy.loadbalancing.MockItemEntity; +import org.apache.brooklyn.policy.loadbalancing.MockItemEntityImpl; +import org.apache.brooklyn.policy.loadbalancing.Movable; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.time.Time; @@ -44,11 +46,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import org.apache.brooklyn.policy.loadbalancing.BalanceableContainer; -import org.apache.brooklyn.policy.loadbalancing.MockContainerEntity; -import org.apache.brooklyn.policy.loadbalancing.MockItemEntity; -import org.apache.brooklyn.policy.loadbalancing.MockItemEntityImpl; -import org.apache.brooklyn.policy.loadbalancing.Movable; import com.google.common.base.Function; import com.google.common.base.Predicates; @@ -57,7 +54,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; -public class AbstractFollowTheSunPolicyTest { +public abstract class AbstractFollowTheSunPolicyTest extends BrooklynAppUnitTestSupport { private static final Logger LOG = LoggerFactory.getLogger(AbstractFollowTheSunPolicyTest.class); @@ -66,8 +63,6 @@ public class AbstractFollowTheSunPolicyTest { protected static final long CONTAINER_STARTUP_DELAY_MS = 100; - protected TestApplication app; - protected ManagementContext managementContext; protected SimulatedLocation loc1; protected SimulatedLocation loc2; protected FollowTheSunPool pool; @@ -78,17 +73,16 @@ public class AbstractFollowTheSunPolicyTest { protected Random random = new Random(); @BeforeMethod(alwaysRun=true) + @Override public void setUp() throws Exception { + super.setUp(); LOG.debug("In AbstractFollowTheSunPolicyTest.setUp()"); MockItemEntityImpl.totalMoveCount.set(0); MockItemEntityImpl.lastMoveTime.set(0); - managementContext = LocalManagementContextForTests.newInstance(); - app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext); - - loc1 = managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class).configure("name", "loc1")); - loc2 = managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class).configure("name", "loc2")); + loc1 = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class).configure("name", "loc1")); + loc2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class).configure("name", "loc2")); containerGroup = app.createAndManageChild(EntitySpec.create(DynamicGroup.class) .displayName("containerGroup") @@ -106,11 +100,15 @@ public class AbstractFollowTheSunPolicyTest { } @AfterMethod(alwaysRun=true) - public void tearDown() { - if (pool != null && policy != null) pool.policies().remove(policy); - if (app != null) Entities.destroyAll(app.getManagementContext()); - MockItemEntityImpl.totalMoveCount.set(0); - MockItemEntityImpl.lastMoveTime.set(0); + @Override + public void tearDown() throws Exception { + try { + if (pool != null && policy != null) pool.policies().remove(policy); + } finally { + super.tearDown(); + MockItemEntityImpl.totalMoveCount.set(0); + MockItemEntityImpl.lastMoveTime.set(0); + } } /** http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/policy/src/test/java/org/apache/brooklyn/policy/followthesun/FollowTheSunModelTest.java ---------------------------------------------------------------------- diff --git a/policy/src/test/java/org/apache/brooklyn/policy/followthesun/FollowTheSunModelTest.java b/policy/src/test/java/org/apache/brooklyn/policy/followthesun/FollowTheSunModelTest.java index 29344aa..c0956f0 100644 --- a/policy/src/test/java/org/apache/brooklyn/policy/followthesun/FollowTheSunModelTest.java +++ b/policy/src/test/java/org/apache/brooklyn/policy/followthesun/FollowTheSunModelTest.java @@ -22,41 +22,48 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; +import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.Location; +import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.core.location.SimulatedLocation; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.policy.loadbalancing.MockContainerEntity; -import org.apache.brooklyn.policy.loadbalancing.MockContainerEntityImpl; import org.apache.brooklyn.policy.loadbalancing.MockItemEntity; -import org.apache.brooklyn.policy.loadbalancing.MockItemEntityImpl; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -public class FollowTheSunModelTest { +public class FollowTheSunModelTest extends BrooklynAppUnitTestSupport { - private Location loc1 = new SimulatedLocation(DefaultFollowTheSunModel.newHashMap("name","loc1")); - private Location loc2 = new SimulatedLocation(DefaultFollowTheSunModel.newHashMap("name","loc2")); - private MockContainerEntity container1 = new MockContainerEntityImpl(); - private MockContainerEntity container2 = new MockContainerEntityImpl(); - private MockItemEntity item1 = new MockItemEntityImpl(); - private MockItemEntity item2 = new MockItemEntityImpl(); - private MockItemEntity item3 = new MockItemEntityImpl(); + private Location loc1; + private Location loc2; + private MockContainerEntity container1; + private MockContainerEntity container2; + private MockItemEntity item1; + private MockItemEntity item2; + private MockItemEntity item3; private DefaultFollowTheSunModel<MockContainerEntity, MockItemEntity> model; @BeforeMethod(alwaysRun=true) + @Override public void setUp() throws Exception { + super.setUp(); model = new DefaultFollowTheSunModel<MockContainerEntity, MockItemEntity>("myname"); + + loc1 = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class) + .configure("name","loc1")); + loc2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class) + .configure("name","loc2")); + container1 = app.addChild(EntitySpec.create(MockContainerEntity.class)); + container2 = app.addChild(EntitySpec.create(MockContainerEntity.class)); + item1 = app.addChild(EntitySpec.create(MockItemEntity.class)); + item2 = app.addChild(EntitySpec.create(MockItemEntity.class)); + item3 = app.addChild(EntitySpec.create(MockItemEntity.class)); } - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - // noting to tear down; no management context created - } - @Test public void testSimpleAddAndRemove() throws Exception { model.onContainerAdded(container1, loc1); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java ---------------------------------------------------------------------- diff --git a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java index 8b2c387..faf4fae 100644 --- a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java +++ b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/AbstractLoadBalancingPolicyTest.java @@ -32,9 +32,9 @@ import org.apache.brooklyn.api.entity.Group; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.config.BasicConfigKey; -import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.location.SimulatedLocation; import org.apache.brooklyn.core.sensor.Sensors; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.core.test.entity.TestApplication; import org.apache.brooklyn.entity.group.DynamicGroup; import org.apache.brooklyn.test.Asserts; @@ -53,7 +53,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -public class AbstractLoadBalancingPolicyTest { +public abstract class AbstractLoadBalancingPolicyTest extends BrooklynAppUnitTestSupport { private static final Logger LOG = LoggerFactory.getLogger(AbstractLoadBalancingPolicyTest.class); @@ -68,7 +68,6 @@ public class AbstractLoadBalancingPolicyTest { public static final ConfigKey<Double> LOW_THRESHOLD_CONFIG_KEY = new BasicConfigKey<Double>(Double.class, TEST_METRIC.getName()+".threshold.low", "desc", 0.0); public static final ConfigKey<Double> HIGH_THRESHOLD_CONFIG_KEY = new BasicConfigKey<Double>(Double.class, TEST_METRIC.getName()+".threshold.high", "desc", 0.0); - protected TestApplication app; protected SimulatedLocation loc; protected BalanceableWorkerPool pool; protected DefaultBalanceablePoolModel<Entity, Entity> model; @@ -78,7 +77,9 @@ public class AbstractLoadBalancingPolicyTest { protected Random random = new Random(); @BeforeMethod(alwaysRun=true) - public void before() { + @Override + public void setUp() throws Exception { + super.setUp(); LOG.debug("In AbstractLoadBalancingPolicyTest.before()"); MockItemEntityImpl.totalMoveCount.set(0); @@ -103,9 +104,13 @@ public class AbstractLoadBalancingPolicyTest { } @AfterMethod(alwaysRun=true) - public void after() { - if (policy != null) policy.destroy(); - if (app != null) Entities.destroyAll(app.getManagementContext()); + @Override + public void tearDown() throws Exception { + try { + if (policy != null) policy.destroy(); + } finally { + super.tearDown(); + } } // Using this utility, as it gives more info about the workrates of all containers rather than just the one that differs http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingModelTest.java ---------------------------------------------------------------------- diff --git a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingModelTest.java b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingModelTest.java index d96f509..35f6878 100644 --- a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingModelTest.java +++ b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingModelTest.java @@ -22,33 +22,37 @@ import static org.testng.Assert.assertEquals; import java.util.Collections; -import org.testng.annotations.AfterMethod; +import org.apache.brooklyn.api.entity.EntitySpec; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -public class LoadBalancingModelTest { +public class LoadBalancingModelTest extends BrooklynAppUnitTestSupport { private static final double PRECISION = 0.00001; - private MockContainerEntity container1 = new MockContainerEntityImpl(); - private MockContainerEntity container2 = new MockContainerEntityImpl(); - private MockItemEntity item1 = new MockItemEntityImpl(); - private MockItemEntity item2 = new MockItemEntityImpl(); - private MockItemEntity item3 = new MockItemEntityImpl(); + private MockContainerEntity container1; + private MockContainerEntity container2; + private MockItemEntity item1; + private MockItemEntity item2; + private MockItemEntity item3; private DefaultBalanceablePoolModel<MockContainerEntity, MockItemEntity> model; @BeforeMethod(alwaysRun=true) + @Override public void setUp() throws Exception { + super.setUp(); model = new DefaultBalanceablePoolModel<MockContainerEntity, MockItemEntity>("myname"); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - // nothing to tear down; no management context created + + container1 = app.addChild(EntitySpec.create(MockContainerEntity.class)); + container2 = app.addChild(EntitySpec.create(MockContainerEntity.class)); + item1 = app.addChild(EntitySpec.create(MockItemEntity.class)); + item2 = app.addChild(EntitySpec.create(MockItemEntity.class)); + item3 = app.addChild(EntitySpec.create(MockItemEntity.class)); } @Test http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingPolicyConcurrencyTest.java ---------------------------------------------------------------------- diff --git a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingPolicyConcurrencyTest.java b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingPolicyConcurrencyTest.java index 6c6f392..fd032ff 100644 --- a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingPolicyConcurrencyTest.java +++ b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/LoadBalancingPolicyConcurrencyTest.java @@ -51,16 +51,16 @@ public class LoadBalancingPolicyConcurrencyTest extends AbstractLoadBalancingPol @BeforeMethod(alwaysRun=true) @Override - public void before() { + public void setUp() throws Exception { scheduledExecutor = Executors.newScheduledThreadPool(10); - super.before(); + super.setUp(); } @AfterMethod(alwaysRun=true) @Override - public void after() { + public void tearDown() throws Exception { if (scheduledExecutor != null) scheduledExecutor.shutdownNow(); - super.after(); + super.tearDown(); } /** http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/MockItemEntityImpl.java ---------------------------------------------------------------------- diff --git a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/MockItemEntityImpl.java b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/MockItemEntityImpl.java index 699fe59..e0c960d 100644 --- a/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/MockItemEntityImpl.java +++ b/policy/src/test/java/org/apache/brooklyn/policy/loadbalancing/MockItemEntityImpl.java @@ -27,6 +27,7 @@ import java.util.concurrent.locks.ReentrantLock; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.core.entity.AbstractEntity; +import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.util.collections.MutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,7 +82,7 @@ public class MockItemEntityImpl extends AbstractEntity implements MockItemEntity _lock.lock(); try { if (stopped) throw new IllegalStateException("Item "+this+" is stopped; cannot move to "+destination); - if (currentContainer != null) currentContainer.removeItem(MockItemEntityImpl.this); + if (currentContainer != null && Entities.isManaged(currentContainer)) currentContainer.removeItem(MockItemEntityImpl.this); currentContainer = destination; destination.addItem(MockItemEntityImpl.this); sensors().set(CONTAINER, currentContainer); @@ -97,7 +98,7 @@ public class MockItemEntityImpl extends AbstractEntity implements MockItemEntity if (LOG.isDebugEnabled()) LOG.debug("Mocks: stopping item {} (was in container {})", this, currentContainer); _lock.lock(); try { - if (currentContainer != null) currentContainer.removeItem(this); + if (currentContainer != null && Entities.isManaged(currentContainer)) currentContainer.removeItem(this); currentContainer = null; stopped = true; } finally { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java ---------------------------------------------------------------------- diff --git a/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java b/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java index c85af6e..65b48eb 100644 --- a/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java +++ b/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java @@ -41,8 +41,10 @@ import java.util.regex.Pattern; import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; +import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.entity.ImplementedBy; import org.apache.brooklyn.api.location.Location; +import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.cli.AbstractMain.BrooklynCommand; import org.apache.brooklyn.cli.AbstractMain.BrooklynCommandCollectingArgs; @@ -219,19 +221,19 @@ public class CliTest { @Test public void testStopAllApplications() throws Exception { LaunchCommand launchCommand = new Main.LaunchCommand(); - ExampleApp app = new ExampleApp(); - ManagementContext mgmt = null; + ManagementContext mgmt = LocalManagementContextForTests.newInstance(); + try { - Entities.startManagement(app); - mgmt = app.getManagementContext(); - app.start(ImmutableList.of(new SimulatedLocation())); - assertTrue(app.running); + StartableApplication app = mgmt.getEntityManager().createEntity(EntitySpec.create(StartableApplication.class).impl(ExampleApp.class)); + ExampleApp appImpl = (ExampleApp) Entities.deproxy(app); + SimulatedLocation loc = mgmt.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); + app.start(ImmutableList.of(loc)); + assertTrue(appImpl.running); launchCommand.stopAllApps(ImmutableList.of(app)); - assertFalse(app.running); + assertFalse(appImpl.running); } finally { // Stopping the app will make app.getManagementContext return the "NonDeploymentManagementContext"; - // hence we've retrieved it before calling stopAllApps() if (mgmt != null) Entities.destroyAll(mgmt); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java index ae3943b..635f2fd 100644 --- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java +++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java @@ -92,7 +92,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.reflect.TypeToken; - public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport { // NB: These tests don't actually require ssh to localhost -- only that 'localhost' resolves. @@ -364,12 +363,12 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport { .configure(StopSoftwareParameters.STOP_MACHINE_MODE, stopMachineMode))); t1.asTask().get(10, TimeUnit.SECONDS); - if (MachineLifecycleEffectorTasksTest.canStop(stopProcessMode, isEntityStopped)) { + if (MachineLifecycleEffectorTasksTest.canStop(app, stopProcessMode, isEntityStopped)) { assertEquals(d.events, ImmutableList.of("stop")); } else { assertTrue(d.events.isEmpty()); } - if (MachineLifecycleEffectorTasksTest.canStop(stopMachineMode, machine == null)) { + if (MachineLifecycleEffectorTasksTest.canStop(app, stopMachineMode, machine == null)) { assertTrue(entity.getLocations().isEmpty()); assertTrue(l.getAvailable().contains(machine)); } else { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/9a83a598/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/MachineLifecycleEffectorTasksTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/MachineLifecycleEffectorTasksTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/MachineLifecycleEffectorTasksTest.java index 4d51db0..b7bba5c 100644 --- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/MachineLifecycleEffectorTasksTest.java +++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/MachineLifecycleEffectorTasksTest.java @@ -23,6 +23,7 @@ import static org.testng.Assert.assertTrue; import java.util.List; +import org.apache.brooklyn.api.entity.Application; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.mgmt.Task; @@ -34,12 +35,11 @@ import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; import org.apache.brooklyn.core.sensor.DependentConfiguration; import org.apache.brooklyn.core.sensor.Sensors; -import org.apache.brooklyn.core.test.entity.TestApplication; +import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.entity.software.base.EmptySoftwareProcess; import org.apache.brooklyn.entity.software.base.SoftwareProcess; import org.apache.brooklyn.entity.software.base.SoftwareProcess.StopSoftwareParameters.StopMode; import org.apache.brooklyn.entity.stock.BasicEntity; -import org.apache.brooklyn.entity.stock.BasicEntityImpl; import org.apache.brooklyn.location.jclouds.BailOutJcloudsLocation; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.core.task.TaskInternal; @@ -55,10 +55,11 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; -public class MachineLifecycleEffectorTasksTest { - public static boolean canStop(StopMode stopMode, boolean isEntityStopped) { - BasicEntityImpl entity = new BasicEntityImpl(); +public class MachineLifecycleEffectorTasksTest extends BrooklynAppUnitTestSupport { + + public static boolean canStop(Application parent, StopMode stopMode, boolean isEntityStopped) { Lifecycle state = isEntityStopped ? Lifecycle.STOPPED : Lifecycle.RUNNING; + BasicEntity entity = parent.addChild(EntitySpec.create(BasicEntity.class)); entity.sensors().set(SoftwareProcess.SERVICE_STATE_ACTUAL, state); return MachineLifecycleEffectorTasks.canStop(stopMode, entity); } @@ -77,7 +78,7 @@ public class MachineLifecycleEffectorTasksTest { @Test(dataProvider = "canStopStates") public void testBasicSonftwareProcessCanStop(StopMode mode, boolean isEntityStopped, boolean expected) { - boolean canStop = canStop(mode, isEntityStopped); + boolean canStop = canStop(app, mode, isEntityStopped); assertEquals(canStop, expected); } @@ -86,7 +87,6 @@ public class MachineLifecycleEffectorTasksTest { AttributeSensor<Boolean> ready = Sensors.newBooleanSensor("readiness"); - TestApplication app = TestApplication.Factory.newManagedInstanceForTests(); BasicEntity triggerEntity = app.createAndManageChild(EntitySpec.create(BasicEntity.class)); EmptySoftwareProcess entity = app.createAndManageChild(EntitySpec.create(EmptySoftwareProcess.class) @@ -115,8 +115,6 @@ public class MachineLifecycleEffectorTasksTest { } else { Exceptions.propagate(t); } - } finally { - Entities.destroyAll(app.getManagementContext()); } }
