You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/05/17 13:43:26 UTC

[1/5] [brooklyn-server] Git Push Summary

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 774d75e78 -> 8c38f3b29

[5/5] brooklyn-server git commit: This closes #679

Posted by dr...@apache.org.
This closes #679


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

Branch: refs/heads/master
Commit: 8c38f3b29ff4f90387ef451cf0f1dad71dff4db2
Parents: 774d75e c1c7178
Author: Duncan Godwin <dr...@googlemail.com>
Authored: Wed May 17 14:43:13 2017 +0100
Committer: Duncan Godwin <dr...@googlemail.com>
Committed: Wed May 17 14:43:13 2017 +0100

----------------------------------------------------------------------
 .../entity/group/AbstractGroupImpl.java         |   9 -
 .../brooklyn/entity/group/DynamicGroupImpl.java |   8 -
 .../core/effector/EffectorConcatenateTest.java  | 106 ++++---
 .../brooklyn/core/entity/AttributeTest.java     |  31 +-
 .../core/entity/EntitySetFromFlagTest.java      |  81 +++---
 .../brooklyn/core/entity/EntitySpecTest.java    |   2 +-
 .../brooklyn/core/entity/EntityTypeTest.java    |  46 ++-
 .../entity/OwnedChildrenDeprecatedTest.java     | 215 ++++++++++++++
 .../brooklyn/core/entity/OwnedChildrenTest.java | 160 +++--------
 .../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 +-
 .../core/mgmt/rebind/RebindCatalogItemTest.java |   3 +
 .../brooklyn/core/test/entity/TestEntity.java   |   4 +
 .../core/test/entity/TestEntityImpl.java        |  17 +-
 .../YamlRollingTimeWindowMeanEnricherTest.java  |  23 +-
 .../brooklyn/entity/group/DynamicGroupTest.java | 285 +++++++++++--------
 .../autoscaling/AutoScalerPolicyTest.java       |  41 +--
 .../autoscaling/LocallyResizableEntity.java     |  49 +---
 .../autoscaling/LocallyResizableEntityImpl.java |  76 +++++
 .../policy/enricher/DeltaEnrichersTests.java    |  59 ++--
 .../enricher/RollingMeanEnricherTest.java       |  29 +-
 .../RollingTimeWindowMeanEnricherTest.java      |  30 +-
 .../AbstractFollowTheSunPolicyTest.java         |  42 ++-
 .../followthesun/FollowTheSunModelTest.java     |  43 +--
 .../AbstractLoadBalancingPolicyTest.java        |  19 +-
 .../loadbalancing/LoadBalancingModelTest.java   |  28 +-
 .../LoadBalancingPolicyConcurrencyTest.java     |   8 +-
 .../loadbalancing/MockItemEntityImpl.java       |   5 +-
 .../testing/mocks/RestMockSimpleEntity.java     |  19 --
 .../java/org/apache/brooklyn/cli/CliTest.java   |  18 +-
 .../entity/brooklynnode/BrooklynNodeImpl.java   |   8 -
 .../entity/java/VanillaJavaAppImpl.java         |  14 +-
 .../software/base/SoftwareProcessImpl.java      |  13 -
 .../base/SoftwareProcessEntityTest.java         |  47 +--
 .../MachineLifecycleEffectorTasksTest.java      |  16 +-
 .../base/lifecycle/StartStopSshDriverTest.java  |  26 +-
 .../apache/brooklyn/feed/jmx/JmxFeedTest.java   |  47 ++-
 42 files changed, 1020 insertions(+), 831 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/8c38f3b2/server-cli/src/test/java/org/apache/brooklyn/cli/CliTest.java
----------------------------------------------------------------------


[3/5] brooklyn-server git commit: Rewrite tests: don’t rely on entity constructors

Posted by dr...@apache.org.
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 <al...@gmail.com>
Authored: Mon May 15 08:07:14 2017 +0100
Committer: Aled Sage <al...@gmail.com>
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());
         }
     }
 


[4/5] brooklyn-server git commit: Fix RebindCatalogItemTest

Posted by dr...@apache.org.
Fix RebindCatalogItemTest

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

Branch: refs/heads/master
Commit: c1c71780de62015318ce69169409c1adb2d595bc
Parents: 9a83a59
Author: Aled Sage <al...@gmail.com>
Authored: Mon May 15 20:10:54 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon May 15 20:10:54 2017 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java   | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c1c71780/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
index 292d0f4..2418a33 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindCatalogItemTest.java
@@ -298,6 +298,7 @@ public class RebindCatalogItemTest extends RebindTestFixtureWithApp {
         final String tag = "tag1";
         origItem.tags().addTag(tag);
         assertTrue(origItem.tags().containsTag(tag));
+        origManagementContext.getCatalog().persist(origItem);
 
         rebindAndAssertCatalogsAreEqual();
 
@@ -352,7 +353,9 @@ public class RebindCatalogItemTest extends RebindTestFixtureWithApp {
         
         item.setDeprecated(true);
         catalog.persist(item);
+        
         rebindAndAssertCatalogsAreEqual();
+        
         RegisteredType catalogItemAfterRebind = newManagementContext.getTypeRegistry().get("rebind-yaml-catalog-item-test", TEST_VERSION);
         assertTrue(catalogItemAfterRebind.isDeprecated(), "Expected item to be deprecated");
     }


[2/5] brooklyn-server git commit: Delete entity constructors

Posted by dr...@apache.org.
Delete 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/2a394007
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/2a394007
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/2a394007

Branch: refs/heads/master
Commit: 2a39400761afe1654201cb1e039cb3145e2df20e
Parents: 15447e1
Author: Aled Sage <al...@gmail.com>
Authored: Wed May 10 14:43:07 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Fri May 12 13:27:37 2017 +0100

----------------------------------------------------------------------
 .../entity/group/AbstractGroupImpl.java         |   9 -
 .../brooklyn/entity/group/DynamicGroupImpl.java |   8 -
 .../core/effector/EffectorConcatenateTest.java  | 106 +++++----
 .../core/entity/EntitySetFromFlagTest.java      |  81 +++----
 .../brooklyn/core/entity/EntityTypeTest.java    |  46 ++--
 .../entity/OwnedChildrenDeprecatedTest.java     | 215 +++++++++++++++++++
 .../brooklyn/core/entity/OwnedChildrenTest.java | 160 ++++----------
 .../core/test/entity/TestEntityImpl.java        |   3 -
 .../autoscaling/AutoScalerPolicyTest.java       |  41 ++--
 .../autoscaling/LocallyResizableEntity.java     |  49 +----
 .../autoscaling/LocallyResizableEntityImpl.java |  76 +++++++
 .../policy/enricher/DeltaEnrichersTests.java    |  59 +++--
 .../enricher/RollingMeanEnricherTest.java       |  29 +--
 .../RollingTimeWindowMeanEnricherTest.java      |  30 +--
 .../testing/mocks/RestMockSimpleEntity.java     |  19 --
 .../entity/brooklynnode/BrooklynNodeImpl.java   |   8 -
 .../entity/java/VanillaJavaAppImpl.java         |  14 +-
 .../software/base/SoftwareProcessImpl.java      |  13 --
 .../base/SoftwareProcessEntityTest.java         |  42 ++--
 .../base/lifecycle/StartStopSshDriverTest.java  |  26 ++-
 .../apache/brooklyn/feed/jmx/JmxFeedTest.java   |  47 ++--
 21 files changed, 598 insertions(+), 483 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/main/java/org/apache/brooklyn/entity/group/AbstractGroupImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/AbstractGroupImpl.java b/core/src/main/java/org/apache/brooklyn/entity/group/AbstractGroupImpl.java
index a4bbf62..f1c1a6f 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/group/AbstractGroupImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/group/AbstractGroupImpl.java
@@ -21,7 +21,6 @@ package org.apache.brooklyn.entity.group;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.brooklyn.api.entity.Entity;
@@ -63,14 +62,6 @@ public abstract class AbstractGroupImpl extends AbstractEntity implements Abstra
 
     private Set<Entity> members = Sets.newLinkedHashSet();
 
-    public AbstractGroupImpl() {
-    }
-
-    @Deprecated
-    public AbstractGroupImpl(@SuppressWarnings("rawtypes") Map flags, Entity parent) {
-        super(flags, parent);
-    }
-
     @Override
     public void setManagementContext(ManagementContextInternal managementContext) {
         super.setManagementContext(managementContext);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java
index 7572430..0815d93 100644
--- a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java
+++ b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java
@@ -19,7 +19,6 @@
 package org.apache.brooklyn.entity.group;
 
 import java.util.Collection;
-import java.util.Map;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.Task;
@@ -53,13 +52,6 @@ public class DynamicGroupImpl extends AbstractGroupImpl implements DynamicGroup
 
     private volatile MyEntitySetChangeListener setChangeListener = null;
 
-    public DynamicGroupImpl() { }
-
-    @Deprecated
-    public DynamicGroupImpl(@SuppressWarnings("rawtypes") Map flags, Entity parent) {
-        super(flags, parent);
-    }
-
     @Override
     public void init() {
         super.init();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/test/java/org/apache/brooklyn/core/effector/EffectorConcatenateTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/effector/EffectorConcatenateTest.java b/core/src/test/java/org/apache/brooklyn/core/effector/EffectorConcatenateTest.java
index 93692c6..a80839f 100644
--- a/core/src/test/java/org/apache/brooklyn/core/effector/EffectorConcatenateTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/effector/EffectorConcatenateTest.java
@@ -28,22 +28,21 @@ import java.util.concurrent.TimeUnit;
 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.mgmt.ExecutionManager;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.annotation.Effector;
 import org.apache.brooklyn.core.annotation.EffectorParam;
-import org.apache.brooklyn.core.effector.MethodEffector;
 import org.apache.brooklyn.core.entity.AbstractEntity;
-import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestApplicationImpl;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.task.BasicExecutionContext;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
@@ -51,25 +50,37 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
-public class EffectorConcatenateTest {
-
+public class EffectorConcatenateTest extends BrooklynAppUnitTestSupport {
     
     private static final Logger log = LoggerFactory.getLogger(EffectorConcatenateTest.class);
     private static final long TIMEOUT = 10*1000;
-    
-    public static class MyEntityImpl extends AbstractEntity {
 
+    @ImplementedBy(MyEntityImpl.class)
+    public static interface MyEntity extends Entity, EntityInternal {
         public static MethodEffector<String> CONCATENATE = new MethodEffector<String>(MyEntityImpl.class, "concatenate");
         public static MethodEffector<Void> WAIT_A_BIT = new MethodEffector<Void>(MyEntityImpl.class, "waitabit");
         public static MethodEffector<Void> SPAWN_CHILD = new MethodEffector<Void>(MyEntityImpl.class, "spawnchild");
-
-        public MyEntityImpl() {
-            super();
-        }
-        public MyEntityImpl(Entity parent) {
-            super(parent);
-        }
-
+        
+        @Effector(description="sample effector concatenating strings")
+        String concatenate(@EffectorParam(name="first", description="first argument") String first,
+                @EffectorParam(name="second", description="2nd arg") String second) throws Exception;
+        
+        @Effector(description="sample effector doing some waiting")
+        void waitabit() throws Exception;
+        
+        @Effector(description="sample effector that spawns a child task that waits a bit")
+        void spawnchild() throws Exception;
+        
+        AtomicReference<Task<?>> getWaitingTask();
+        
+        /** latch is .countDown'ed by the effector at the beginning of the "waiting" point */
+        CountDownLatch getNowWaitingLatch();
+        
+        /** latch is await'ed on by the effector when it is in the "waiting" point */
+        CountDownLatch getContinueFromWaitingLatch();
+    }
+    
+    public static class MyEntityImpl extends AbstractEntity implements MyEntity {
         /** The "current task" representing the effector currently executing */
         AtomicReference<Task<?>> waitingTask = new AtomicReference<Task<?>>();
         
@@ -78,14 +89,28 @@ public class EffectorConcatenateTest {
         
         /** latch is await'ed on by the effector when it is in the "waiting" point */
         CountDownLatch continueFromWaitingLatch = new CountDownLatch(1);
+
+        @Override
+        public AtomicReference<Task<?>> getWaitingTask() {
+            return waitingTask;
+        }
+
+        @Override
+        public CountDownLatch getNowWaitingLatch() {
+            return nowWaitingLatch;
+        }
         
-        @Effector(description="sample effector concatenating strings")
-        public String concatenate(@EffectorParam(name="first", description="first argument") String first,
-                @EffectorParam(name="second", description="2nd arg") String second) throws Exception {
+        @Override
+        public CountDownLatch getContinueFromWaitingLatch() {
+            return continueFromWaitingLatch;
+        }
+        
+        @Override
+        public String concatenate(String first, String second) throws Exception {
             return first+second;
         }
         
-        @Effector(description="sample effector doing some waiting")
+        @Override
         public void waitabit() throws Exception {
             waitingTask.set(Tasks.current());
             
@@ -102,7 +127,7 @@ public class EffectorConcatenateTest {
                     }});
         }
         
-        @Effector(description="sample effector that spawns a child task that waits a bit")
+        @Override
         public void spawnchild() throws Exception {
             // spawn a child, then wait
             BasicExecutionContext.getCurrentExecutionContext().submit(
@@ -121,29 +146,22 @@ public class EffectorConcatenateTest {
         }
     }
             
-    private TestApplication app;
-    private MyEntityImpl e;
+    private MyEntity entity;
     
     @BeforeMethod(alwaysRun=true)
-    public void setUp() {
-        app = new TestApplicationImpl();
-        e = new MyEntityImpl(app);
-        Entities.startManagement(app);
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
+    public void setUp() throws Exception {
+        super.setUp();
+        entity = app.addChild(EntitySpec.create(MyEntity.class));
     }
     
     @Test
     public void testCanInvokeEffector() throws Exception {
         // invocation map syntax
-        Task<String> task = e.invoke(MyEntityImpl.CONCATENATE, ImmutableMap.of("first", "a", "second", "b"));
+        Task<String> task = entity.invoke(MyEntity.CONCATENATE, ImmutableMap.of("first", "a", "second", "b"));
         assertEquals(task.get(TIMEOUT, TimeUnit.MILLISECONDS), "ab");
 
         // method syntax
-        assertEquals("xy", e.concatenate("x", "y"));
+        assertEquals("xy", entity.concatenate("x", "y"));
     }
     
     @Test
@@ -155,14 +173,14 @@ public class EffectorConcatenateTest {
             public void run() {
                 try {
                     // Expect "wait a bit" to tell us it's blocking 
-                    if (!e.nowWaitingLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
+                    if (!entity.getNowWaitingLatch().await(TIMEOUT, TimeUnit.MILLISECONDS)) {
                         result.set("took too long for waitabit to be waiting");
                         return;
                     }
 
                     // Expect "wait a bit" to have retrieved and set its task
                     try {
-                        Task<?> t = e.waitingTask.get();
+                        Task<?> t = entity.getWaitingTask().get();
                         String status = t.getStatusDetail(true);
                         log.info("waitabit task says:\n"+status);
                         if (!status.contains("waitabit extra status details")) {
@@ -174,7 +192,7 @@ public class EffectorConcatenateTest {
                             return;
                         }
                     } finally {
-                        e.continueFromWaitingLatch.countDown();
+                        entity.getContinueFromWaitingLatch().countDown();
                     }
                 } catch (Throwable t) {
                     log.warn("Failure: "+t, t);
@@ -183,7 +201,7 @@ public class EffectorConcatenateTest {
             }});
         bg.start();
     
-        e.invoke(MyEntityImpl.WAIT_A_BIT, ImmutableMap.<String,Object>of())
+        entity.invoke(MyEntity.WAIT_A_BIT, ImmutableMap.<String,Object>of())
                 .get(TIMEOUT, TimeUnit.MILLISECONDS);
         
         bg.join(TIMEOUT*2);
@@ -202,14 +220,14 @@ public class EffectorConcatenateTest {
             public void run() {
                 try {
                     // Expect "spawned child" to tell us it's blocking 
-                    if (!e.nowWaitingLatch.await(TIMEOUT, TimeUnit.MILLISECONDS)) {
+                    if (!entity.getNowWaitingLatch().await(TIMEOUT, TimeUnit.MILLISECONDS)) {
                         result.set("took too long for spawnchild's sub-task to be waiting");
                         return;
                     }
 
                     // Expect spawned task to be have been tagged with entity
-                    ExecutionManager em = e.getManagementContext().getExecutionManager();
-                    Task<?> subtask = Iterables.find(BrooklynTaskTags.getTasksInEntityContext(em, e), new Predicate<Task<?>>() {
+                    ExecutionManager em = entity.getManagementContext().getExecutionManager();
+                    Task<?> subtask = Iterables.find(BrooklynTaskTags.getTasksInEntityContext(em, entity), new Predicate<Task<?>>() {
                         @Override
                         public boolean apply(Task<?> input) {
                             return "SpawnedChildName".equals(input.getDisplayName());
@@ -225,7 +243,7 @@ public class EffectorConcatenateTest {
                             return;
                         }
                     } finally {
-                        e.continueFromWaitingLatch.countDown();
+                        entity.getContinueFromWaitingLatch().countDown();
                     }
                 } catch (Throwable t) {
                     log.warn("Failure: "+t, t);
@@ -234,7 +252,7 @@ public class EffectorConcatenateTest {
             }});
         bg.start();
     
-        e.invoke(MyEntityImpl.SPAWN_CHILD, ImmutableMap.<String,Object>of())
+        entity.invoke(MyEntity.SPAWN_CHILD, ImmutableMap.<String,Object>of())
                 .get(TIMEOUT, TimeUnit.MILLISECONDS);
         
         bg.join(TIMEOUT*2);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/test/java/org/apache/brooklyn/core/entity/EntitySetFromFlagTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySetFromFlagTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySetFromFlagTest.java
index c909893..7f5e8fd 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntitySetFromFlagTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntitySetFromFlagTest.java
@@ -23,54 +23,59 @@ import static org.testng.Assert.assertEquals;
 import java.util.Map;
 
 import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.location.PortRange;
-import org.apache.brooklyn.core.entity.AbstractEntity;
 import org.apache.brooklyn.core.location.PortRanges;
-import org.testng.annotations.Test;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
 
-public class EntitySetFromFlagTest {
+public class EntitySetFromFlagTest extends BrooklynAppUnitTestSupport {
 
     @Test
     public void testSetFromFlagUsingFieldName() {
-        MyEntity entity = new MyEntity(MutableMap.of("str1", "myval"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("str1", "myval"));
         assertEquals(entity.str1, "myval");
     }
     
     @Test
     public void testSetFromFlagUsingOverridenName() {
-        MyEntity entity = new MyEntity(MutableMap.of("altStr2", "myval"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("altStr2", "myval"));
         assertEquals(entity.str2, "myval");
     }
     
     @Test
     public void testSetFromFlagWhenNoDefaultIsNull() {
-        MyEntity entity = new MyEntity();
+        MyEntity entity = newDeproxiedEntity();
         assertEquals(entity.str1, null);
     }
     
     @Test
     public void testSetFromFlagUsesDefault() {
-        MyEntity entity = new MyEntity();
+        MyEntity entity = newDeproxiedEntity();
         assertEquals(entity.str3, "default str3");
     }
     
     @Test
     public void testSetFromFlagOverridingDefault() {
-        MyEntity entity = new MyEntity(MutableMap.of("str3", "overridden str3"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("str3", "overridden str3"));
         assertEquals(entity.str3, "overridden str3");
     }
 
     @Test
     public void testSetFromFlagCastsPrimitives() {
-        MyEntity entity = new MyEntity(MutableMap.of("double1", 1f));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("double1", 1f));
         assertEquals(entity.double1, 1d);
     }
 
     @Test
     public void testSetFromFlagCastsDefault() {
-        MyEntity entity = new MyEntity();
+        MyEntity entity = newDeproxiedEntity();
         assertEquals(entity.byte1, (byte)1);
         assertEquals(entity.short1, (short)2);
         assertEquals(entity.int1, 3);
@@ -92,44 +97,60 @@ public class EntitySetFromFlagTest {
     
     @Test
     public void testSetFromFlagCoercesDefaultToPortRange() {
-        MyEntity entity = new MyEntity();
+        MyEntity entity = newDeproxiedEntity();
         assertEquals(entity.portRange1, PortRanges.fromInteger(1234));
     }
     
     @Test
     public void testSetFromFlagCoercesStringValueToPortRange() {
-        MyEntity entity = new MyEntity(MutableMap.of("portRange1", "1-3"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("portRange1", "1-3"));
         assertEquals(entity.portRange1, new PortRanges.LinearPortRange(1, 3));
     }
     
     @Test
     public void testSetFromFlagCoercesStringValueToInt() {
-        MyEntity entity = new MyEntity(MutableMap.of("int1", "123"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("int1", "123"));
         assertEquals(entity.int1, 123);
     }
 
     @Test
     public void testSetIconUrl() {
-        MyEntity entity = new MyEntity(MutableMap.of("iconUrl", "/img/myicon.gif"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("iconUrl", "/img/myicon.gif"));
         assertEquals(entity.getIconUrl(), "/img/myicon.gif");
     }
 
-    @Test(expectedExceptions=IllegalArgumentException.class)
-    public void testFailsFastOnInvalidCoercion() {;
-        new MyEntity(MutableMap.of("int1", "thisisnotanint"));
+    @Test
+    public void testFailsFastOnInvalidCoercion() {
+        try {
+            newDeproxiedEntity(MutableMap.of("int1", "thisisnotanint"));
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception e) {
+            if (Exceptions.getFirstThrowableOfType(e, IllegalArgumentException.class) == null) {
+                throw e;
+            }
+        }
     }
     
-    // Fails because configure being called from inside constructor; so field is set after configure called
-    @Test(enabled=false) 
+    @Test
     public void testSetFromFlagWithFieldThatIsExplicitySet() {
-        MyEntity entity = new MyEntity(MutableMap.of("str4", "myval"));
+        MyEntity entity = newDeproxiedEntity(MutableMap.of("str4", "myval"));
         assertEquals(entity.str4, "myval");
         
-        MyEntity entity2 = new MyEntity();
+        MyEntity entity2 = newDeproxiedEntity();
         assertEquals(entity2.str4, "explicit str4");
     }
     
-    private static class MyEntity extends AbstractEntity {
+    private MyEntity newDeproxiedEntity() {
+        return newDeproxiedEntity(ImmutableMap.of());
+    }
+    
+    private MyEntity newDeproxiedEntity(Map<?, ?> config) {
+        Entity result = app.addChild(EntitySpec.create(Entity.class).impl(MyEntity.class)
+                .configure(config));
+        return (MyEntity) Entities.deproxy(result);
+    }
+    
+    public static class MyEntity extends AbstractEntity {
 
         @SetFromFlag(defaultVal="1234")
         PortRange portRange1;
@@ -193,21 +214,5 @@ public class EntitySetFromFlagTest {
 
         @SetFromFlag(defaultVal="true")
         Boolean bool2;
-
-        MyEntity() {
-            super(MutableMap.of(), null);
-        }
-        
-        MyEntity(Map flags) {
-            super(flags, null);
-        }
-        
-        MyEntity(Entity parent) {
-            super(MutableMap.of(), parent);
-        }
-        
-        MyEntity(Map flags, Entity parent) {
-            super(flags, parent);
-        }
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/test/java/org/apache/brooklyn/core/entity/EntityTypeTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntityTypeTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntityTypeTest.java
index aac3cca..e7cf727 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/EntityTypeTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntityTypeTest.java
@@ -47,14 +47,6 @@ import java.util.Set;
 
 import javax.annotation.Nullable;
 
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
@@ -69,6 +61,13 @@ import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.core.test.entity.TestEntityImpl;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableSet;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 
 public class EntityTypeTest extends BrooklynAppUnitTestSupport {
     private static final AttributeSensor<String> TEST_SENSOR = Sensors.newStringSensor("test.sensor");
@@ -152,30 +151,25 @@ public class EntityTypeTest extends BrooklynAppUnitTestSupport {
 
     @Test
     public void testCustomSimpleName() throws Exception {
-        class CustomTypeNamedEntity extends AbstractEntity {
-            private final String typeName;
-            @SuppressWarnings("deprecation")
-            CustomTypeNamedEntity(Entity parent, String typeName) {
-                super(parent);
-                this.typeName = typeName;
-            }
-            @Override protected String getEntityTypeName() {
-                return typeName;
-            }
-        }
-        
-        CustomTypeNamedEntity entity2 = new CustomTypeNamedEntity(app, "a.b.with space");
-        Entities.manage(entity2);
+        CustomTypeNamedEntity.typeName = "a.b.with space";
+        Entity entity2 = app.addChild(EntitySpec.create(Entity.class).impl(CustomTypeNamedEntity.class));
         assertEquals(entity2.getEntityType().getSimpleName(), "with_space");
         
-        CustomTypeNamedEntity entity3 = new CustomTypeNamedEntity(app, "a.b.with$dollar");
-        Entities.manage(entity3);
+        CustomTypeNamedEntity.typeName = "a.b.with$dollar";
+        Entity entity3 = app.addChild(EntitySpec.create(Entity.class).impl(CustomTypeNamedEntity.class));
         assertEquals(entity3.getEntityType().getSimpleName(), "with_dollar");
         
-        CustomTypeNamedEntity entity4 = new CustomTypeNamedEntity(app, "a.nothingafterdot.");
-        Entities.manage(entity4);
+        CustomTypeNamedEntity.typeName = "a.nothingafterdot.";
+        Entity entity4 = app.addChild(EntitySpec.create(Entity.class).impl(CustomTypeNamedEntity.class));
         assertEquals(entity4.getEntityType().getSimpleName(), "a.nothingafterdot.");
     }
+    public static class CustomTypeNamedEntity extends AbstractEntity {
+        static volatile String typeName;
+        
+        @Override protected String getEntityTypeName() {
+            return typeName;
+        }
+    }
     
     @Test
     public void testGetSensors() throws Exception{

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenDeprecatedTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenDeprecatedTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenDeprecatedTest.java
new file mode 100644
index 0000000..a134b6c
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenDeprecatedTest.java
@@ -0,0 +1,215 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.core.entity;
+
+import static org.apache.brooklyn.test.Asserts.assertEqualsIgnoringOrder;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+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;
+import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class OwnedChildrenDeprecatedTest extends BrooklynAppUnitTestSupport {
+
+    // Tests that the deprecated "owner" still works
+    @Test
+    public void testSetOwnerInConstructorMap() {
+        Entity e = new AbstractEntity(MutableMap.of("owner", app)) {};
+        
+        assertEquals(e.getParent(), app);
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
+        assertEquals(e.getApplication(), app);
+    }
+    
+    // Tests that the deprecated constructor still works
+    @Test
+    public void testSetParentInConstructorArgument() {
+        Entity e = new AbstractEntity(app) {};
+        
+        assertEquals(e.getParent(), app);
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
+        assertEquals(e.getApplication(), app);
+    }
+    
+    // Tests with deprecated constructor usage
+    @Test
+    public void testSetParentWhenMatchesParentSetInConstructor() {
+        Entity e = new AbstractEntity(app) {};
+        e.setParent(app);
+        
+        assertEquals(e.getParent(), app);
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
+    }
+    
+    // Tests with deprecated constructor usage
+    @Test
+    public void testSetParentWhenDiffersFromParentSetInConstructor() {
+        Entity e = new AbstractEntity(app) {};
+        Entity e2 = new AbstractEntity() {};
+        try {
+            e.setParent(e2);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception ex) {
+            Exception uoe = Exceptions.getFirstThrowableOfType(ex, UnsupportedOperationException.class);
+            if (uoe == null || !uoe.toString().contains("Cannot change parent")) {
+                throw ex;
+            }
+        }
+    }
+    
+    // Tests deprecated setParent still works - should be set through EntitySpec or addChild
+    @Test
+    public void testSetParentInSetterMethod() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
+        e.setParent(app);
+        
+        assertEquals(e.getParent(), app);
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
+        assertEquals(e.getApplication(), app);
+    }
+
+    // Tests with deprecated setParent(Entity)
+    @Test
+    public void testSetParentWhenMatchesParentSetInSpec() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class).parent(app));
+        e.setParent(app);
+        
+        assertEquals(e.getParent(), app);
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
+    }
+    
+    // Tests with deprecated setParent(Entity)
+    @Test
+    public void testSetParentWhenDiffersFromParentSetInSpec() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class).parent(app));
+        Entity e2 = mgmt.getEntityManager().createEntity(EntitySpec.create(TestApplication.class));
+        try {
+            e.setParent(e2);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception ex) {
+            Exception uoe = Exceptions.getFirstThrowableOfType(ex, UnsupportedOperationException.class);
+            if (uoe == null || !uoe.toString().contains("Cannot change parent")) {
+                throw ex;
+            }
+        }
+    }
+    
+    // Tests deprecated addChild still works - users should instead set it through EntitySpec (or {@code addChild(EntitySpec)})
+    @Test
+    public void testAddChild() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
+        app.addChild(e);
+        
+        assertEquals(e.getParent(), app);
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
+        assertEquals(e.getApplication(), app);
+    }
+    
+
+    
+    @Test(enabled = false) // FIXME fails currently
+    public void testRemoveChild() {
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        app.removeChild(e);
+        
+        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of());
+        assertEquals(e.getParent(), null);
+    }
+    
+    @Test
+    public void testParentalLoopForbiddenViaAddChild() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
+        Entity e2 = e.addChild(EntitySpec.create(TestEntity.class));
+        try {
+            e2.addChild(e);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception ex) {
+            Exception cause = Exceptions.getFirstThrowableOfType(ex, IllegalStateException.class);
+            if (cause == null || !cause.toString().contains("loop detected trying to add child")) {
+                throw ex;
+            }
+        }
+        assertEqualsIgnoringOrder(e.getChildren(), ImmutableList.of(e2));
+        assertEqualsIgnoringOrder(e2.getChildren(), ImmutableList.of());
+        assertEquals(e.getParent(), null);
+        assertEquals(e2.getParent(), e);
+    }
+    
+    @Test
+    public void testParentalLoopForbiddenViaSetParent() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
+        Entity e2 = e.addChild(EntitySpec.create(TestEntity.class));
+        try {
+            e.setParent(e2);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception ex) {
+            Exception cause = Exceptions.getFirstThrowableOfType(ex, IllegalStateException.class);
+            if (cause == null || !cause.toString().contains("loop detected trying to set parent")) {
+                throw ex;
+            }
+        }
+        assertEqualsIgnoringOrder(e.getChildren(), ImmutableList.of(e2));
+        assertEqualsIgnoringOrder(e2.getChildren(), ImmutableList.of());
+        assertEquals(e.getParent(), null);
+        assertEquals(e2.getParent(), e);
+    }
+    
+    @Test
+    public void testChildingOneselfForbidden() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
+        try {
+            e.addChild(e);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception ex) {
+            Exception cause = Exceptions.getFirstThrowableOfType(ex, IllegalStateException.class);
+            if (cause == null || !cause.toString().contains("cannot own itself")) {
+                throw ex;
+            }
+        }
+        
+        assertNull(e.getParent());
+        assertEquals(e.getChildren(), ImmutableList.of());
+    }
+    
+    @Test
+    public void testParentingOneselfForbidden() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class));
+        try {
+            e.setParent(e);
+            Asserts.shouldHaveFailedPreviously();
+        } catch (Exception ex) {
+            Exception cause = Exceptions.getFirstThrowableOfType(ex, IllegalStateException.class);
+            if (cause == null || !cause.toString().contains("cannot own itself")) {
+                throw ex;
+            }
+        }
+        
+        assertNull(e.getParent());
+        assertEquals(e.getChildren(), ImmutableList.of());
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenTest.java
index dede9aa..f750f6d 100644
--- a/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/entity/OwnedChildrenTest.java
@@ -22,102 +22,62 @@ import static org.apache.brooklyn.test.Asserts.assertEqualsIgnoringOrder;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
 
-import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.core.entity.AbstractApplication;
-import org.apache.brooklyn.core.entity.AbstractEntity;
-import org.apache.brooklyn.core.entity.Entities;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
+import org.apache.brooklyn.api.entity.EntitySpec;
+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;
+import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
 
-public class OwnedChildrenTest {
+public class OwnedChildrenTest extends BrooklynAppUnitTestSupport {
 
-    private Application app;
-
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() {
-        app = new AbstractApplication() {};
-    }
-
-    @AfterMethod(alwaysRun = true)
-    public void tearDown(){
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    // Tests that the deprecated "owner" still works
     @Test
-    public void testSetOwnerInConstructorMap() {
-        Entity e = new AbstractEntity(app) {};
+    public void testAddChildUsingSpec() {
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
         
         assertEquals(e.getParent(), app);
-        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
-        assertEquals(e.getApplication(), app);
+        assertEquals(app.getChildren(), ImmutableList.of(e));
     }
     
     @Test
-    public void testSetParentInConstructorMap() {
-        Entity e = new AbstractEntity(app) {};
+    public void testSpecDeclaresParent() {
+        Entity e = mgmt.getEntityManager().createEntity(EntitySpec.create(TestEntity.class).parent(app));
         
         assertEquals(e.getParent(), app);
         assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
-        assertEquals(e.getApplication(), app);
     }
     
     @Test
-    public void testSetParentInConstructorArgument() {
-        Entity e = new AbstractEntity(app) {};
+    public void testAddChildWhenMatchesParentSetInSpec() {
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class).parent(app));
         
         assertEquals(e.getParent(), app);
         assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
-        assertEquals(e.getApplication(), app);
     }
     
     @Test
-    public void testSetParentInSetterMethod() {
-        Entity e = new AbstractEntity() {};
-        e.setParent(app);
-        
-        assertEquals(e.getParent(), app);
-        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
-        assertEquals(e.getApplication(), app);
-    }
-
-    @Test
-    public void testAddChild() {
-        Entity e = new AbstractEntity() {};
-        app.addChild(e);
-        
-        assertEquals(e.getParent(), app);
-        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
-        assertEquals(e.getApplication(), app);
-    }
-    
-    @Test
-    public void testSetParentWhenMatchesParentSetInConstructor() {
-        Entity e = new AbstractEntity(app) {};
-        e.setParent(app);
-        
-        assertEquals(e.getParent(), app);
-        assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of(e));
-    }
-    
-    @Test(expectedExceptions = UnsupportedOperationException.class)
-    public void testSetParentWhenDiffersFromParentSetInConstructor() {
-        Entity e = new AbstractEntity(app) {};
-        Entity e2 = new AbstractEntity() {};
-        e.setParent(e2);
-        fail();
+    public void testAddChildWhenDifferentParentSetInSpec() {
+        TestApplication app2 = mgmt.getEntityManager().createEntity(EntitySpec.create(TestApplication.class));
+        try {
+            Entity e = app.addChild(EntitySpec.create(TestEntity.class).parent(app2));
+            Asserts.shouldHaveFailedPreviously("entity="+e);
+        } catch (Exception ex) {
+            Exception cause = Exceptions.getFirstThrowableOfType(ex, IllegalArgumentException.class);
+            if (cause == null || !cause.toString().contains("failed because spec has different parent")) {
+                throw ex;
+            }
+        }
     }
     
     @Test
     public void testParentCanHaveMultipleChildren() {
-        Entity e = new AbstractEntity(app) {};
-        Entity e2 = new AbstractEntity(app) {};
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        Entity e2 = app.addChild(EntitySpec.create(TestEntity.class));
         
         assertEquals(e.getParent(), app);
         assertEquals(e2.getParent(), app);
@@ -126,9 +86,9 @@ public class OwnedChildrenTest {
     
     @Test
     public void testHierarchyOfOwners() {
-        Entity e = new AbstractEntity(app) {};
-        Entity e2 = new AbstractEntity(e) {};
-        Entity e3 = new AbstractEntity(e2) {};
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        Entity e2 = e.addChild(EntitySpec.create(TestEntity.class));
+        Entity e3 = e2.addChild(EntitySpec.create(TestEntity.class));
         
         assertEquals(app.getParent(), null);
         assertEquals(e.getParent(), app);
@@ -141,73 +101,43 @@ public class OwnedChildrenTest {
         assertEqualsIgnoringOrder(e3.getChildren(), ImmutableList.of());
     }
     
-    @Test(enabled = false) // FIXME fails currently
-    public void testRemoveChild() {
-        Entity e = new AbstractEntity(app) {};
-        app.removeChild(e);
+    @Test
+    public void testUnmanageEntityRemovedAsChild() {
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        Entities.unmanage(e);
         
         assertEqualsIgnoringOrder(app.getChildren(), ImmutableList.of());
         assertEquals(e.getParent(), null);
     }
     
     @Test
-    public void testParentalLoopForbiddenViaAddChild() {
-        Entity e = new AbstractEntity() {};
-        Entity e2 = new AbstractEntity(e) {};
-        try {
-            e2.addChild(e);
-            fail();
-        } catch (IllegalStateException ex) {
-            // success
-        }
+    public void testUnmanageParentRemovesChild() {
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        Entities.unmanage(app);
         
-        assertEqualsIgnoringOrder(e.getChildren(), ImmutableList.of(e2));
-        assertEqualsIgnoringOrder(e2.getChildren(), ImmutableList.of());
-        assertEquals(e.getParent(), null);
-        assertEquals(e2.getParent(), e);
-    }
-    
-    @Test
-    public void testParentalLoopForbiddenViaSetParent() {
-        Entity e = new AbstractEntity() {};
-        Entity e2 = new AbstractEntity(e) {};
-        try {
-            e.setParent(e2);
-            fail();
-        } catch (IllegalStateException ex) {
-			ex.printStackTrace();
-            // success
-        }
-        assertEqualsIgnoringOrder(e.getChildren(), ImmutableList.of(e2));
-        assertEqualsIgnoringOrder(e2.getChildren(), ImmutableList.of());
-        assertEquals(e.getParent(), null);
-        assertEquals(e2.getParent(), e);
-    }
-    
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void testParentingOneselfForbidden() {
-        AbstractEntity e = new AbstractEntity() {};
-        e.addChild(e);
-        fail();
+        assertFalse(Entities.isManaged(app));
+        assertFalse(Entities.isManaged(e));
     }
     
     @Test
     public void testIsAncestor() {
-        AbstractEntity e = new AbstractEntity(app) {};
-        AbstractEntity e2 = new AbstractEntity(e) {};
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        Entity e2 = e.addChild(EntitySpec.create(TestEntity.class));
         
 		assertTrue(Entities.isAncestor(e2, app));
 		assertTrue(Entities.isAncestor(e2, e));
 		assertFalse(Entities.isAncestor(e2, e2));
+        assertFalse(Entities.isAncestor(e, e2));
     }
     
     @Test
     public void testIsDescendant() {
-        AbstractEntity e = new AbstractEntity(app) {};
-        AbstractEntity e2 = new AbstractEntity(e) {};
+        Entity e = app.addChild(EntitySpec.create(TestEntity.class));
+        Entity e2 = e.addChild(EntitySpec.create(TestEntity.class));
 
 		assertTrue(Entities.isDescendant(app, e));
 		assertTrue(Entities.isDescendant(app, e2));
 		assertFalse(Entities.isDescendant(e2, e));
+        assertFalse(Entities.isDescendant(e2, e2));
     }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/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 b31caf2..2331b48 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
@@ -63,9 +63,6 @@ public class TestEntityImpl extends AbstractEntity implements TestEntity {
     public TestEntityImpl() {
         super();
     }
-    public TestEntityImpl(Map properties) {
-        this(properties, null);
-    }
     public TestEntityImpl(Entity parent) {
         this(MutableMap.of(), parent);
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/AutoScalerPolicyTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/AutoScalerPolicyTest.java b/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/AutoScalerPolicyTest.java
index bdeaf17..3342959 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/AutoScalerPolicyTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/AutoScalerPolicyTest.java
@@ -38,6 +38,7 @@ import org.apache.brooklyn.api.policy.PolicySpec;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.trait.Resizable;
 import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
 import org.apache.brooklyn.core.test.entity.TestApplication;
 import org.apache.brooklyn.core.test.entity.TestCluster;
 import org.apache.brooklyn.test.Asserts;
@@ -55,7 +56,7 @@ import com.google.common.base.Stopwatch;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class AutoScalerPolicyTest {
+public class AutoScalerPolicyTest extends BrooklynAppUnitTestSupport {
 
     private static final Logger log = LoggerFactory.getLogger(AutoScalerPolicyTest.class);
     
@@ -69,16 +70,15 @@ public class AutoScalerPolicyTest {
     AutoScalerPolicy policy;
     TestCluster cluster;
     LocallyResizableEntity resizable;
-    TestApplication app;
     List<Integer> policyResizes = MutableList.of();
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
+        super.setUp();
         log.info("resetting "+getClass().getSimpleName());
-        app = TestApplication.Factory.newManagedInstanceForTests();
         cluster = app.createAndManageChild(EntitySpec.create(TestCluster.class).configure(TestCluster.INITIAL_SIZE, 1));
-        resizable = new LocallyResizableEntity(cluster, cluster);
-        Entities.manage(resizable);
+        resizable = cluster.addChild(EntitySpec.create(LocallyResizableEntity.class)
+                .configure(LocallyResizableEntity.TEST_CLUSTER, cluster));
         PolicySpec<AutoScalerPolicy> policySpec = PolicySpec.create(AutoScalerPolicy.class).configure(AutoScalerPolicy.RESIZE_OPERATOR, new ResizeOperator() {
             @Override
             public Integer resize(Entity entity, Integer desiredSize) {
@@ -93,11 +93,14 @@ public class AutoScalerPolicyTest {
 
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        if (policy != null) policy.destroy();
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-        cluster = null;
-        resizable = null;
-        policy = null;
+        try {
+            if (policy != null) policy.destroy();
+        } finally {
+            super.tearDown();
+            cluster = null;
+            resizable = null;
+            policy = null;
+        }
     }
 
     public void assertSizeEventually(Integer targetSize) {
@@ -236,7 +239,7 @@ public class AutoScalerPolicyTest {
     
     @Test
     public void testNeverShrinkHotPool() throws Exception {
-        resizable.resizeSleepTime = 0;
+        resizable.setResizeSleepTime(0);
         resizable.resize(2);
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_HOT_SENSOR, message(2, 0L, 2*10L, 2*20L));
         
@@ -247,7 +250,7 @@ public class AutoScalerPolicyTest {
     
     @Test(groups="Integration")
     public void testConcurrentShrinkShrink() throws Exception {
-        resizable.resizeSleepTime = 250;
+        resizable.setResizeSleepTime(250);
         resizable.resize(4);
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_COLD_SENSOR, message(4, 30L, 4*10L, 4*20L));
         // would cause pool to shrink to 3
@@ -260,7 +263,7 @@ public class AutoScalerPolicyTest {
     
     @Test(groups="Integration")
     public void testConcurrentGrowGrow() throws Exception {
-        resizable.resizeSleepTime = 250;
+        resizable.setResizeSleepTime(250);
         resizable.resize(2);
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_HOT_SENSOR, message(2, 41L, 2*10L, 2*20L));
         // would cause pool to grow to 3
@@ -273,7 +276,7 @@ public class AutoScalerPolicyTest {
     
     @Test(groups="Integration")
     public void testConcurrentGrowShrink() throws Exception {
-        resizable.resizeSleepTime = 250;
+        resizable.setResizeSleepTime(250);
         resizable.resize(2);
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_HOT_SENSOR, message(2, 81L, 2*10L, 2*20L));
         // would cause pool to grow to 5
@@ -286,7 +289,7 @@ public class AutoScalerPolicyTest {
     
     @Test(groups="Integration")
     public void testConcurrentShrinkGrow() throws Exception {
-        resizable.resizeSleepTime = 250;
+        resizable.setResizeSleepTime(250);
         resizable.resize(4);
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_COLD_SENSOR, message(4, 1L, 4*10L, 4*20L));
         // would cause pool to shrink to 1
@@ -302,14 +305,14 @@ public class AutoScalerPolicyTest {
     @Test(groups="WIP")
     public void testRepeatedQueuedResizeTakesLatestValueRatherThanIntermediateValues() throws Exception {
         // TODO is this too time sensitive? the resize takes only 250ms so if it finishes before the next emit we'd also see size=2
-        resizable.resizeSleepTime = 500;
+        resizable.setResizeSleepTime(250);
         resizable.resize(4);
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_COLD_SENSOR, message(4, 30L, 4*10L, 4*20L)); // shrink to 3
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_COLD_SENSOR, message(4, 20L, 4*10L, 4*20L)); // shrink to 2
         resizable.sensors().emit(AutoScalerPolicy.DEFAULT_POOL_COLD_SENSOR, message(4, 10L, 4*10L, 4*20L)); // shrink to 1
         
         Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), currentSizeAsserter(resizable, 1));
-        assertEquals(resizable.sizes, ImmutableList.of(4, 3, 1));
+        assertEquals(resizable.getSizes(), ImmutableList.of(4, 3, 1));
     }
     
 
@@ -381,7 +384,7 @@ public class AutoScalerPolicyTest {
         assertEquals(resizable.getCurrentSize(), (Integer)1);
         Asserts.succeedsContinually(MutableMap.of("duration", 2000L), new Runnable() {
                 @Override public void run() {
-                    assertEquals(resizable.sizes, ImmutableList.of(1));
+                    assertEquals(resizable.getSizes(), ImmutableList.of(1));
                 }});
     }
 
@@ -510,7 +513,7 @@ public class AutoScalerPolicyTest {
         Asserts.succeedsContinually(MutableMap.of("duration", 2000L), new Runnable() {
                 @Override
                 public void run() {
-                    assertEquals(resizable.sizes, ImmutableList.of(2));
+                    assertEquals(resizable.getSizes(), ImmutableList.of(2));
                 }});
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntity.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntity.java b/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntity.java
index 5550899..14698b4 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntity.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntity.java
@@ -21,52 +21,23 @@ package org.apache.brooklyn.policy.autoscaling;
 import java.util.List;
 
 import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.core.entity.AbstractEntity;
+import org.apache.brooklyn.api.entity.ImplementedBy;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.entity.trait.Resizable;
-import org.apache.brooklyn.core.entity.trait.Startable;
 import org.apache.brooklyn.core.test.entity.TestCluster;
 
-import com.google.common.base.Throwables;
-import com.google.common.collect.Lists;
-
 /**
  * Test class for providing a Resizable LocallyManagedEntity for policy testing
  * It is hooked up to a TestCluster that can be used to make assertions against
  */
-public class LocallyResizableEntity extends AbstractEntity implements Resizable {
-    List<Integer> sizes = Lists.newArrayList();
-    TestCluster cluster;
-    long resizeSleepTime = 0;
-    
-    public LocallyResizableEntity (TestCluster tc) {
-        this(null, tc);
-    }
-    @SuppressWarnings("deprecation")
-    public LocallyResizableEntity (Entity parent, TestCluster tc) {
-        super(parent);
-        this.cluster = tc;
-        sensors().set(Startable.SERVICE_UP, true);
-    }
-    
-    @Override
-    public Integer resize(Integer newSize) {
-        try {
-            Thread.sleep(resizeSleepTime);
-            sizes.add(newSize); 
-            return cluster.resize(newSize);
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw Throwables.propagate(e);
-        }
-    }
+@ImplementedBy(LocallyResizableEntityImpl.class)
+public interface LocallyResizableEntity extends Entity, Resizable {
+    ConfigKey<TestCluster> TEST_CLUSTER = ConfigKeys.newConfigKey(
+            TestCluster.class,
+            "testCluster");
     
-    @Override
-    public Integer getCurrentSize() {
-        return cluster.getCurrentSize();
-    }
+    void setResizeSleepTime(long val);
     
-    @Override
-    public String toString() {
-        return getDisplayName();
-    }
+    List<Integer> getSizes();
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntityImpl.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntityImpl.java b/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntityImpl.java
new file mode 100644
index 0000000..59144c4
--- /dev/null
+++ b/policy/src/test/java/org/apache/brooklyn/policy/autoscaling/LocallyResizableEntityImpl.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.policy.autoscaling;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.List;
+
+import org.apache.brooklyn.core.entity.AbstractEntity;
+import org.apache.brooklyn.core.entity.trait.Startable;
+import org.apache.brooklyn.core.test.entity.TestCluster;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+public class LocallyResizableEntityImpl extends AbstractEntity implements LocallyResizableEntity {
+    List<Integer> sizes = Lists.newArrayList();
+    TestCluster cluster;
+    long resizeSleepTime = 0;
+
+    @Override
+    public void init() {
+        super.init();
+        this.cluster = checkNotNull(config().get(TEST_CLUSTER), "testCluster");
+        sensors().set(Startable.SERVICE_UP, true);
+    }
+    
+    @Override
+    public void setResizeSleepTime(long val) {
+        resizeSleepTime = val;
+    }
+    
+    @Override
+    public List<Integer> getSizes() {
+        return ImmutableList.copyOf(sizes);
+    }
+    
+    @Override
+    public Integer resize(Integer newSize) {
+        try {
+            Thread.sleep(resizeSleepTime);
+            sizes.add(newSize); 
+            return cluster.resize(newSize);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw Throwables.propagate(e);
+        }
+    }
+    
+    @Override
+    public Integer getCurrentSize() {
+        return cluster.getCurrentSize();
+    }
+    
+    @Override
+    public String toString() {
+        return getDisplayName();
+    }
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
index 3722bcd..62cdef8 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/DeltaEnrichersTests.java
@@ -20,45 +20,35 @@ package org.apache.brooklyn.policy.enricher;
 
 import static org.testng.Assert.assertEquals;
 
-import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.Entity;
+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.Sensor;
-import org.apache.brooklyn.core.entity.AbstractApplication;
-import org.apache.brooklyn.core.entity.AbstractEntity;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
-import org.testng.annotations.AfterMethod;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
 
-public class DeltaEnrichersTests {
+public class DeltaEnrichersTests extends BrooklynAppUnitTestSupport {
     
-    AbstractApplication app;
-    
-    EntityLocal producer;
+    Entity producer;
 
     Sensor<Integer> intSensor;
     Sensor<Double> avgSensor;
     SubscriptionContext subscription;
     
-    @BeforeMethod
-    public void before() {
-        app = new AbstractApplication() {};
-        producer = new AbstractEntity(app) {};
-        producer.setParent(app);
-        Entities.startManagement(app);
-
+    @BeforeMethod(alwaysRun=true)
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        producer = app.addChild(EntitySpec.create(TestEntity.class));
         intSensor = new BasicAttributeSensor<Integer>(Integer.class, "int sensor");
     }
 
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
     @Test
     public void testDeltaEnricher() {
         AttributeSensor<Integer> deltaSensor = new BasicAttributeSensor<Integer>(Integer.class, "delta sensor");
@@ -83,15 +73,16 @@ public class DeltaEnrichersTests {
             TimeWeightedDeltaEnricher.<Integer>getPerSecondDeltaEnricher(producer, intSensor, deltaSensor);
         producer.enrichers().add(delta);
         
-        delta.onEvent(intSensor.newEvent(producer, 0), 0);
-        assertEquals(producer.getAttribute(deltaSensor), null);
+        // Don't start with timestamp=0: that may be treated special 
         delta.onEvent(intSensor.newEvent(producer, 0), 1000);
+        assertEquals(producer.getAttribute(deltaSensor), null);
+        delta.onEvent(intSensor.newEvent(producer, 0), 2000);
         assertEquals(producer.getAttribute(deltaSensor), 0d);
-        delta.onEvent(intSensor.newEvent(producer, 1), 2000);
+        delta.onEvent(intSensor.newEvent(producer, 1), 3000);
         assertEquals(producer.getAttribute(deltaSensor), 1d);
-        delta.onEvent(intSensor.newEvent(producer, 3), 3000);
+        delta.onEvent(intSensor.newEvent(producer, 3), 4000);
         assertEquals(producer.getAttribute(deltaSensor), 2d);
-        delta.onEvent(intSensor.newEvent(producer, 8), 4000);
+        delta.onEvent(intSensor.newEvent(producer, 8), 5000);
         assertEquals(producer.getAttribute(deltaSensor), 5d);
     }
     
@@ -102,16 +93,16 @@ public class DeltaEnrichersTests {
             TimeWeightedDeltaEnricher.<Integer>getPerSecondDeltaEnricher(producer, intSensor, deltaSensor);
         producer.enrichers().add(delta);
         
-        delta.onEvent(intSensor.newEvent(producer, 0), 0);
-        delta.onEvent(intSensor.newEvent(producer, 0), 2000);
+        delta.onEvent(intSensor.newEvent(producer, 0), 1000);
+        delta.onEvent(intSensor.newEvent(producer, 0), 3000);
         assertEquals(producer.getAttribute(deltaSensor), 0d);
-        delta.onEvent(intSensor.newEvent(producer, 3), 5000);
+        delta.onEvent(intSensor.newEvent(producer, 3), 6000);
         assertEquals(producer.getAttribute(deltaSensor), 1d);
-        delta.onEvent(intSensor.newEvent(producer, 7), 7000);
+        delta.onEvent(intSensor.newEvent(producer, 7), 8000);
         assertEquals(producer.getAttribute(deltaSensor), 2d);
-        delta.onEvent(intSensor.newEvent(producer, 12), 7500);
+        delta.onEvent(intSensor.newEvent(producer, 12), 8500);
         assertEquals(producer.getAttribute(deltaSensor), 10d);
-        delta.onEvent(intSensor.newEvent(producer, 15), 9500);
+        delta.onEvent(intSensor.newEvent(producer, 15), 10500);
         assertEquals(producer.getAttribute(deltaSensor), 1.5d);
     }
 
@@ -121,10 +112,10 @@ public class DeltaEnrichersTests {
         TimeWeightedDeltaEnricher<Integer> delta = new TimeWeightedDeltaEnricher<Integer>(producer, intSensor, deltaSensor, 1000, new AddConstant(123d));
         producer.enrichers().add(delta);
         
-        delta.onEvent(intSensor.newEvent(producer, 0), 0);
         delta.onEvent(intSensor.newEvent(producer, 0), 1000);
+        delta.onEvent(intSensor.newEvent(producer, 0), 2000);
         assertEquals(producer.getAttribute(deltaSensor), 123+0d);
-        delta.onEvent(intSensor.newEvent(producer, 1), 2000);
+        delta.onEvent(intSensor.newEvent(producer, 1), 3000);
         assertEquals(producer.getAttribute(deltaSensor), 123+1d);
     }
 

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
index b8b6f15..4db1a6f 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingMeanEnricherTest.java
@@ -20,22 +20,19 @@ package org.apache.brooklyn.policy.enricher;
 
 import static org.testng.Assert.assertEquals;
 
-import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.core.entity.AbstractApplication;
-import org.apache.brooklyn.core.entity.AbstractEntity;
-import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
-import org.testng.annotations.AfterMethod;
+import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
+import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-public class RollingMeanEnricherTest {
+public class RollingMeanEnricherTest extends BrooklynAppUnitTestSupport {
     
-    AbstractApplication app;
-    
-    EntityLocal producer;
+    Entity producer;
 
     Sensor<Integer> intSensor;
     AttributeSensor<Integer> deltaSensor;
@@ -43,11 +40,10 @@ public class RollingMeanEnricherTest {
     RollingMeanEnricher<Integer> averager;
 
     @BeforeMethod(alwaysRun=true)
-    public void before() {
-        app = new AbstractApplication() {};
-        producer = new AbstractEntity(app) {};
-        producer.setParent(app);
-        Entities.startManagement(app);
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        producer = app.addChild(EntitySpec.create(TestEntity.class));
 
         intSensor = new BasicAttributeSensor<Integer>(Integer.class, "int sensor");
         deltaSensor = new BasicAttributeSensor<Integer>(Integer.class, "delta sensor");
@@ -58,11 +54,6 @@ public class RollingMeanEnricherTest {
         producer.enrichers().add(averager);
     }
 
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
     @Test
     public void testDefaultAverage() {
         assertEquals(averager.getAverage(), null);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
----------------------------------------------------------------------
diff --git a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
index 162833d..90854e7 100644
--- a/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
+++ b/policy/src/test/java/org/apache/brooklyn/policy/enricher/RollingTimeWindowMeanEnricherTest.java
@@ -20,24 +20,21 @@ package org.apache.brooklyn.policy.enricher;
 
 import static org.testng.Assert.assertEquals;
 
-import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.api.sensor.Sensor;
-import org.apache.brooklyn.core.entity.AbstractApplication;
-import org.apache.brooklyn.core.entity.AbstractEntity;
-import org.apache.brooklyn.core.entity.Entities;
 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.policy.enricher.RollingTimeWindowMeanEnricher.ConfidenceQualifiedNumber;
-import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 @SuppressWarnings("deprecation")
-public class RollingTimeWindowMeanEnricherTest {
+public class RollingTimeWindowMeanEnricherTest extends BrooklynAppUnitTestSupport {
     
-    AbstractApplication app;
-    
-    EntityLocal producer;
+    Entity producer;
 
     Sensor<Integer> intSensor;
     AttributeSensor<Integer> deltaSensor;
@@ -48,11 +45,11 @@ public class RollingTimeWindowMeanEnricherTest {
 
     private final long timePeriod = 1000;
     
-    @BeforeMethod
-    public void before() {
-        app = new AbstractApplication() {};
-        producer = new AbstractEntity(app) {};
-        Entities.startManagement(app);
+    @BeforeMethod(alwaysRun=true)
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        producer = app.addChild(EntitySpec.create(TestEntity.class));
 
         intSensor = new BasicAttributeSensor<Integer>(Integer.class, "int sensor");
         deltaSensor = new BasicAttributeSensor<Integer>(Integer.class, "delta sensor");
@@ -63,11 +60,6 @@ public class RollingTimeWindowMeanEnricherTest {
         producer.enrichers().add(averager);
     }
 
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
     @Test
     public void testDefaultAverageWhenEmpty() {
         average = averager.getAverage(0);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockSimpleEntity.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockSimpleEntity.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockSimpleEntity.java
index 36d3bf6..f1977a9 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockSimpleEntity.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/mocks/RestMockSimpleEntity.java
@@ -18,9 +18,6 @@
  */
 package org.apache.brooklyn.rest.testing.mocks;
 
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.annotation.Effector;
@@ -39,22 +36,6 @@ public class RestMockSimpleEntity extends SoftwareProcessImpl {
 
     private static final Logger log = LoggerFactory.getLogger(RestMockSimpleEntity.class);
     
-    public RestMockSimpleEntity() {
-        super();
-    }
-
-    public RestMockSimpleEntity(Entity parent) {
-        super(parent);
-    }
-
-    public RestMockSimpleEntity(@SuppressWarnings("rawtypes") Map flags, Entity parent) {
-        super(flags, parent);
-    }
-
-    public RestMockSimpleEntity(@SuppressWarnings("rawtypes") Map flags) {
-        super(flags);
-    }
-    
     @Override
     protected void connectSensors() {
         super.connectSensors();

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
index 128f909..54c81d1 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeImpl.java
@@ -119,14 +119,6 @@ public class BrooklynNodeImpl extends SoftwareProcessImpl implements BrooklynNod
 
     private HttpFeed httpFeed;
     
-    public BrooklynNodeImpl() {
-        super();
-    }
-
-    public BrooklynNodeImpl(Entity parent) {
-        super(parent);
-    }
-    
     @Override
     public Class<?> getDriverInterface() {
         return BrooklynNodeDriver.class;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/software/base/src/main/java/org/apache/brooklyn/entity/java/VanillaJavaAppImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/java/VanillaJavaAppImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/java/VanillaJavaAppImpl.java
index 6f73a4c..3609e73 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/java/VanillaJavaAppImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/java/VanillaJavaAppImpl.java
@@ -23,35 +23,25 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.entity.software.base.SoftwareProcessImpl;
 import org.apache.brooklyn.feed.jmx.JmxFeed;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
-
 public class VanillaJavaAppImpl extends SoftwareProcessImpl implements VanillaJavaApp {
 
+    private static final Logger log = LoggerFactory.getLogger(VanillaJavaApp.class);
+    
     static {
         JavaAppUtils.init();
     }
 
-    private static final Logger log = LoggerFactory.getLogger(VanillaJavaApp.class);
-
     @SetFromFlag
     protected long jmxPollPeriod;
 
     protected JmxFeed jmxFeed;
 
-    public VanillaJavaAppImpl() {}
-
-    @VisibleForTesting
-    public VanillaJavaAppImpl(Map<?,?> properties, Entity parent) {
-        super(properties, parent);
-    }
-
     @Override
     public String getMainClass() { return getConfig(MAIN_CLASS); }
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
index 68b7955..89e49dd 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java
@@ -89,19 +89,6 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft
 
     protected boolean connectedSensors = false;
 
-    public SoftwareProcessImpl() {
-        super(MutableMap.of(), null);
-    }
-    public SoftwareProcessImpl(Entity parent) {
-        this(MutableMap.of(), parent);
-    }
-    public SoftwareProcessImpl(Map properties) {
-        this(properties, null);
-    }
-    public SoftwareProcessImpl(Map properties, Entity parent) {
-        super(properties, parent);
-    }
-
     protected void setProvisioningLocation(MachineProvisioningLocation val) {
         if (getAttribute(PROVISIONING_LOCATION) != null) throw new IllegalStateException("Cannot change provisioning location: existing="+getAttribute(PROVISIONING_LOCATION)+"; new="+val);
         sensors().set(PROVISIONING_LOCATION, val);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/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 3fa464c..ae3943b 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
@@ -90,6 +90,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.reflect.TypeToken;
 
 
 public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
@@ -388,12 +389,8 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
     
     @Test
     public void testReleaseEvenIfErrorDuringStart() throws Exception {
-        MyServiceImpl entity = new MyServiceImpl(app) {
-            @Override public Class<?> getDriverInterface() {
-                return SimulatedFailOnStartDriver.class;
-            }
-        };
-        Entities.manage(entity);
+        MyService entity = app.addChild(EntitySpec.create(MyServiceWithCustomDriver.class)
+                .configure(MyServiceWithCustomDriver.DRIVER_CLASS, SimulatedFailOnStartDriver.class));
         
         try {
             entity.start(ImmutableList.of(loc));
@@ -413,17 +410,12 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
         Entities.unmanage(entity);
     }
 
-    @SuppressWarnings("rawtypes")
-    public void doTestReleaseEvenIfErrorDuringStop(final Class driver) throws Exception {
-        MyServiceImpl entity = new MyServiceImpl(app) {
-            @Override public Class<?> getDriverInterface() {
-                return driver;
-            }
-        };
-        Entities.manage(entity);
+    public void doTestReleaseEvenIfErrorDuringStop(final Class<? extends SimulatedDriver> driver) throws Exception {
+        MyService entity = app.addChild(EntitySpec.create(MyServiceWithCustomDriver.class)
+                .configure(MyServiceWithCustomDriver.DRIVER_CLASS, driver));
         
         entity.start(ImmutableList.of(loc));
-        Task<Void> t = entity.invoke(Startable.STOP);
+        Task<Void> t = entity.invoke(Startable.STOP, ImmutableMap.<String, Object>of());
         t.blockUntilEnded();
         
         assertFalse(t.isError(), "Expected parent to succeed, not fail with " + Tasks.getError(t));
@@ -634,9 +626,6 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
     }
 
     public static class MyServiceImpl extends SoftwareProcessImpl implements MyService {
-        public MyServiceImpl() {}
-        public MyServiceImpl(Entity parent) { super(parent); }
-
         @Override
         protected void initEnrichers() {
             // Don't add enrichers messing with the SERVICE_UP state - we are setting it manually
@@ -659,8 +648,21 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport {
     }
 
     public static class MyServiceWithVersionImpl extends MyServiceImpl implements MyServiceWithVersion {
-        public MyServiceWithVersionImpl() {}
-        public MyServiceWithVersionImpl(Entity parent) { super(parent); }
+    }
+
+    @ImplementedBy(MyServiceWithCustomDriverImpl.class)
+    public interface MyServiceWithCustomDriver extends MyService {
+        @SuppressWarnings("serial")
+        ConfigKey<Class<? extends SimulatedDriver>> DRIVER_CLASS = ConfigKeys.newConfigKey(
+                new TypeToken<Class<? extends SimulatedDriver>>() {},
+                "driverClass");
+    }
+
+    public static class MyServiceWithCustomDriverImpl extends MyServiceImpl implements MyServiceWithCustomDriver {
+        @Override
+        public Class<?> getDriverInterface() {
+            return config().get(DRIVER_CLASS);
+        }
     }
 
     public static class SimulatedFailOnStartDriver extends SimulatedDriver {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/StartStopSshDriverTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/StartStopSshDriverTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/StartStopSshDriverTest.java
index f18ccd6..a74bf04 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/StartStopSshDriverTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/lifecycle/StartStopSshDriverTest.java
@@ -31,13 +31,13 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.brooklyn.api.entity.EntityLocal;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.core.entity.BrooklynConfigKeys;
-import org.apache.brooklyn.core.entity.Entities;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestApplicationImpl;
+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.apache.brooklyn.entity.software.base.AbstractSoftwareProcessSshDriver;
+import org.apache.brooklyn.location.ssh.SshMachineLocation;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableSet;
@@ -47,7 +47,6 @@ import org.apache.brooklyn.util.core.internal.ssh.sshj.SshjTool;
 import org.apache.brooklyn.util.stream.StreamGobbler;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
-import org.apache.brooklyn.location.ssh.SshMachineLocation;
 
 import com.google.common.base.Function;
 import com.google.common.collect.FluentIterable;
@@ -55,7 +54,7 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
-public class StartStopSshDriverTest {
+public class StartStopSshDriverTest extends BrooklynAppUnitTestSupport {
 
     public class BasicStartStopSshDriver extends AbstractSoftwareProcessSshDriver {
         public BasicStartStopSshDriver(EntityLocal entity, SshMachineLocation machine) {
@@ -82,15 +81,13 @@ public class StartStopSshDriverTest {
         }
     }
 
-    private TestApplication app;
     private TestEntity entity;
     private SshMachineLocationWithSshTool sshMachineLocation;
     private AbstractSoftwareProcessSshDriver driver;
 
     @SuppressWarnings("rawtypes")
-    protected static class SshMachineLocationWithSshTool extends SshMachineLocation {
+    public static class SshMachineLocationWithSshTool extends SshMachineLocation {
         SshTool lastTool;
-        public SshMachineLocationWithSshTool(Map flags) { super(flags); }
 
         @Override
         public SshTool connectSsh(Map args) {
@@ -101,11 +98,12 @@ public class StartStopSshDriverTest {
     }
     
     @BeforeMethod(alwaysRun = true)
-    public void setUp() {
-        app = new TestApplicationImpl();
-        entity = new TestEntityImpl(app);
-        Entities.startManagement(app);
-        sshMachineLocation = new SshMachineLocationWithSshTool(ImmutableMap.of("address", "localhost"));
+    public void setUp() throws Exception {
+        super.setUp();
+        entity = app.addChild(EntitySpec.create(TestEntity.class));
+        
+        sshMachineLocation = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocationWithSshTool.class)
+                .configure("address", "localhost"));
         driver = new BasicStartStopSshDriver(entity, sshMachineLocation);
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/2a394007/software/base/src/test/java/org/apache/brooklyn/feed/jmx/JmxFeedTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/feed/jmx/JmxFeedTest.java b/software/base/src/test/java/org/apache/brooklyn/feed/jmx/JmxFeedTest.java
index dc63361..6966a73 100644
--- a/software/base/src/test/java/org/apache/brooklyn/feed/jmx/JmxFeedTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/feed/jmx/JmxFeedTest.java
@@ -42,6 +42,7 @@ import javax.management.openmbean.TabularType;
 
 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.SensorEvent;
 import org.apache.brooklyn.api.sensor.SensorEventListener;
@@ -55,8 +56,8 @@ import org.apache.brooklyn.core.location.SimulatedLocation;
 import org.apache.brooklyn.core.sensor.BasicAttributeSensor;
 import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
 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.TestApplicationImpl;
 import org.apache.brooklyn.core.test.entity.TestEntity;
 import org.apache.brooklyn.core.test.entity.TestEntityImpl;
 import org.apache.brooklyn.entity.java.JmxAttributeSensor;
@@ -89,7 +90,7 @@ import com.google.common.collect.Lists;
  * TODO tests of other JMX_AGENT_MODE are done in ActiveMqIntegrationTest; 
  * would be nice to promote some to live here
  */
-public class JmxFeedTest {
+public class JmxFeedTest extends BrooklynAppUnitTestSupport {
     
     // FIXME Move out the JmxHelper tests into the JmxHelperTest class
     
@@ -101,7 +102,6 @@ public class JmxFeedTest {
     private static final int SHORT_WAIT_MS = 250;
     
     private JmxService jmxService;
-    private TestApplication app;
     private TestEntity entity;
     private JmxFeed feed;
     private JmxHelper jmxHelper;
@@ -133,11 +133,13 @@ public class JmxFeedTest {
     }
     
     @BeforeMethod(alwaysRun=true)
+    @Override
     public void setUp() throws Exception {
+        super.setUp();
+        
         jmxObjectName = new ObjectName(objectName);
         
         // Create an entity and configure it with the above JMX service
-        app = TestApplication.Factory.newManagedInstanceForTests();
         entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).impl(TestEntityWithJmx.class).additionalInterfaces(UsesJmx.class));
         app.start(ImmutableList.of(new SimulatedLocation()));
 
@@ -148,11 +150,14 @@ public class JmxFeedTest {
     
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
-        if (feed != null) feed.stop();
-        if (jmxHelper != null) jmxHelper.disconnect();
-        if (jmxService != null) jmxService.shutdown();
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-        feed = null;
+        try {
+            if (feed != null) feed.stop();
+            if (jmxHelper != null) jmxHelper.disconnect();
+            if (jmxService != null) jmxService.shutdown();
+            feed = null;
+        } finally {
+            super.tearDown();
+        }
     }
 
     @Test
@@ -391,9 +396,9 @@ public class JmxFeedTest {
     // Test reproduces functionality used in Monterey, for Venue entity being told of requestActor
     @Test
     public void testSubscribeToJmxNotificationAndEmitCorrespondingNotificationSensor() throws Exception {
-        TestApplication app2 = new TestApplicationImpl();
-        final EntityWithEmitter entity = new EntityWithEmitter(app2);
-        Entities.startManagement(app2);
+        final TestApplication app2 = mgmt.getEntityManager().createEntity(EntitySpec.create(TestApplication.class));
+        final EntityWithEmitter entity = app2.addChild(EntitySpec.create(EntityWithEmitter.class));
+        
         try {
             app2.start(ImmutableList.of(new SimulatedLocation()));
             
@@ -428,19 +433,13 @@ public class JmxFeedTest {
             Entities.destroyAll(app2.getManagementContext());
         }
     }
-    
-    public static class EntityWithEmitter extends AbstractEntity {
+
+    @ImplementedBy(EntityWithEmitterImpl.class)
+    public static interface EntityWithEmitter extends Entity {
         public static final BasicNotificationSensor<String> MY_NOTIF = new BasicNotificationSensor<String>(String.class, "test.myNotif", "My notif");
-        
-        public EntityWithEmitter(Entity owner) {
-            super(owner);
-        }
-        public EntityWithEmitter(Map flags) {
-            super(flags);
-        }
-        public EntityWithEmitter(Map flags, Entity owner) {
-            super(flags, owner);
-        }
+    }
+    
+    public static class EntityWithEmitterImpl extends AbstractEntity implements EntityWithEmitter {
     }
     
     private Notification sendNotification(StandardEmitterMBean mbean, String type, long seq, Object userData) {