You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/08/25 08:37:48 UTC

[04/10] git commit: add builder for LocalManagementContextForTests and use in more places to speed things up, also adding conveniences for the BrooklynProperties.Factory.Builder

add builder for LocalManagementContextForTests and use in more places to speed things up, also adding conveniences for the BrooklynProperties.Factory.Builder


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

Branch: refs/heads/master
Commit: 9f439dd8677e32c8daa14f1968cc19a526aab1b5
Parents: 81f1788
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Aug 7 18:17:00 2014 -0400
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Mon Aug 25 07:23:51 2014 +0100

----------------------------------------------------------------------
 .../catalog/internal/CatalogLibrariesDo.java    |  26 +--
 .../brooklyn/config/BrooklynProperties.java     |  46 ++++-
 .../internal/LocalManagementContext.java        |   1 +
 .../brooklyn/camp/lite/CampYamlLiteTest.java    |   4 +-
 .../entity/basic/AbstractEntityLegacyTest.java  |   3 +-
 .../entity/basic/DynamicEntityTest.java         |   3 +-
 .../brooklyn/entity/basic/DynamicGroupTest.java |   4 +-
 .../persister/XmlMementoSerializerTest.java     |  11 +-
 .../basic/ByonLocationResolverTest.java         |   3 +-
 .../location/basic/MachineDetailsTest.java      |   5 +-
 .../SshMachineLocationIntegrationTest.java      |   3 +-
 .../location/cloud/CloudMachineNamerTest.java   |  13 +-
 .../location/cloud/CustomMachineNamerTest.java  |   3 +-
 .../internal/EntityExecutionManagerTest.java    |  15 +-
 .../internal/LocalManagementContextTest.java    |  15 +-
 .../entity/LocalManagementContextForTests.java  |  93 +++++++++-
 .../location/jclouds/JcloudsLocation.java       |   2 +-
 .../jclouds/AbstractJcloudsLiveTest.java        | 153 ++++++++++++++++
 .../location/jclouds/AbstractJcloudsTest.java   | 151 ----------------
 .../JcloudsByonLocationResolverLiveTest.java    | 175 +++++++++++++++++++
 .../JcloudsByonLocationResolverTest.java        | 166 ++----------------
 .../jclouds/JcloudsLocationMetadataTest.java    |   3 +-
 .../JcloudsLocationRebindMachineLiveTest.java   |   5 +-
 .../jclouds/JcloudsLocationResolverTest.java    |   3 +-
 .../location/jclouds/JcloudsLocationTest.java   |  14 +-
 .../location/jclouds/JcloudsLoginLiveTest.java  |   2 +-
 .../location/jclouds/JcloudsMinRamLiveTest.java |   2 +-
 .../location/jclouds/LiveTestEntity.java        |  15 +-
 .../jclouds/RebindJcloudsLocationLiveTest.java  |  36 ++--
 ...loudsLocationUserLoginAndConfigLiveTest.java |   3 +-
 ...hineProvisioningLocationJcloudsLiveTest.java |   2 +-
 .../jclouds/StandaloneJcloudsLiveTest.java      |   4 +-
 .../JcloudsPortForwardingLiveTest.java          |   4 +-
 .../pool/JcloudsMachinePoolLiveTest.java        |   4 +-
 .../zone/AwsAvailabilityZoneExtensionTest.java  |   8 +-
 .../entity/brooklyn/BrooklynMetricsTest.java    |   4 +-
 .../entity/basic/SameServerEntityTest.java      |   2 +-
 ...ftwareProcessAndChildrenIntegrationTest.java |   2 +-
 .../entity/software/SoftwareEffectorTest.java   |   3 +-
 .../entity/software/SshEffectorTasksTest.java   |   2 +-
 .../software/ssh/SshCommandIntegrationTest.java |   3 +-
 .../brooklyn/event/feed/jmx/JmxFeedTest.java    |   2 +-
 .../camp/brooklyn/AbstractYamlTest.java         |   8 +-
 43 files changed, 597 insertions(+), 429 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
index 84590f7..2a9fdbc 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogLibrariesDo.java
@@ -54,22 +54,22 @@ public class CatalogLibrariesDo implements CatalogItem.CatalogItemLibraries {
      */
     void load(ManagementContext managementContext) {
         ManagementContextInternal mgmt = (ManagementContextInternal) managementContext;
-        Maybe<OsgiManager> osgi = mgmt.getOsgiManager();
         List<String> bundles = getBundles();
-        if (osgi.isAbsent()) {
-            LOG.warn("{} not loading bundles in {} because osgi manager is unavailable. Bundles: {}",
+        if (!bundles.isEmpty()) {
+            Maybe<OsgiManager> osgi = mgmt.getOsgiManager();
+            if (osgi.isAbsent()) {
+                throw new IllegalStateException("Unable to load bundles "+bundles+" because OSGi is not running.");
+            } else if (LOG.isDebugEnabled()) {
+                LOG.debug("{} loading bundles in {}: {}",
                     new Object[]{this, managementContext, Joiner.on(", ").join(bundles)});
-            return;
-        } else if (LOG.isDebugEnabled()) {
-            LOG.debug("{} loading bundles in {}: {}",
-                    new Object[]{this, managementContext, Joiner.on(", ").join(bundles)});
-        }
-        Stopwatch timer = Stopwatch.createStarted();
-        for (String bundleUrl : bundles) {
-            osgi.get().registerBundle(bundleUrl);
-        }
-        LOG.debug("{} registered {} bundles in {}",
+            }
+            Stopwatch timer = Stopwatch.createStarted();
+            for (String bundleUrl : bundles) {
+                osgi.get().registerBundle(bundleUrl);
+            }
+            LOG.debug("{} registered {} bundles in {}",
                 new Object[]{this, bundles.size(), Time.makeTimeStringRounded(timer)});
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/main/java/brooklyn/config/BrooklynProperties.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/config/BrooklynProperties.java b/core/src/main/java/brooklyn/config/BrooklynProperties.java
index bd278e5..b5d63ba 100644
--- a/core/src/main/java/brooklyn/config/BrooklynProperties.java
+++ b/core/src/main/java/brooklyn/config/BrooklynProperties.java
@@ -72,17 +72,46 @@ public class BrooklynProperties extends LinkedHashMap implements StringConfigMap
         /** creates a new {@link BrooklynProperties} with contents loaded 
          * from the usual places, including *.properties files and environment variables */
         public static BrooklynProperties newDefault() {
-            return new Builder().build();
+            return new Builder(true).build();
+        }
+
+        public static Builder builderDefault() {
+            return new Builder(true);
+        }
+
+        public static Builder builderEmpty() {
+            return new Builder(true);
         }
 
         public static class Builder {
-            private String defaultLocationMetadataUrl = "classpath://brooklyn/location-metadata.properties";
-            private String globalLocationMetadataFile = Os.mergePaths(Os.home(), ".brooklyn", "location-metadata.properties");
-            private String globalPropertiesFile = Os.mergePaths(Os.home(), ".brooklyn", "brooklyn.properties");
+            private String defaultLocationMetadataUrl;
+            private String globalLocationMetadataFile = null;
+            private String globalPropertiesFile = null;
             private String localPropertiesFile = null;
             private BrooklynProperties originalProperties = null;
             
-            public Builder(){}
+            /** @deprecated since 0.7.0 use static methods in {@link Factory} to create */
+            public Builder() {
+                this(true);
+            }
+            
+            private Builder(boolean setGlobalFileDefaults) {
+                resetDefaultLocationMetadataUrl();
+                if (setGlobalFileDefaults) {
+                    resetGlobalFiles();
+                }
+            }
+            
+            public Builder resetDefaultLocationMetadataUrl() {
+                defaultLocationMetadataUrl = "classpath://brooklyn/location-metadata.properties";
+                return this;
+            }
+            public Builder resetGlobalFiles() {
+                defaultLocationMetadataUrl = "classpath://brooklyn/location-metadata.properties";
+                globalLocationMetadataFile = Os.mergePaths(Os.home(), ".brooklyn", "location-metadata.properties");
+                globalPropertiesFile = Os.mergePaths(Os.home(), ".brooklyn", "brooklyn.properties");
+                return this;
+            }
             
             /**
              * Creates a Builder that when built, will return the BrooklynProperties passed to this constructor
@@ -133,6 +162,7 @@ public class BrooklynProperties extends LinkedHashMap implements StringConfigMap
             public BrooklynProperties build() {
                 if (originalProperties != null) 
                     return new BrooklynProperties().addFromMap(originalProperties);
+                
                 BrooklynProperties properties = new BrooklynProperties();
 
                 // TODO Could also read from http://brooklyn.io, for up-to-date values?
@@ -141,7 +171,7 @@ public class BrooklynProperties extends LinkedHashMap implements StringConfigMap
                 
                 addPropertiesFromFile(properties, globalLocationMetadataFile);
                 addPropertiesFromFile(properties, globalPropertiesFile);
-                if (localPropertiesFile != null) addPropertiesFromFile(properties, localPropertiesFile);
+                addPropertiesFromFile(properties, localPropertiesFile);
                 
                 properties.addEnvironmentVars();
                 properties.addSystemProperties();
@@ -167,6 +197,8 @@ public class BrooklynProperties extends LinkedHashMap implements StringConfigMap
         }
         
         private static void addPropertiesFromUrl(BrooklynProperties p, String url, boolean warnIfNotFound) {
+            if (url==null) return;
+            
             try {
                 p.addFrom(ResourceUtils.create(BrooklynProperties.class).getResourceFromUrl(url));
             } catch (Exception e) {
@@ -177,6 +209,8 @@ public class BrooklynProperties extends LinkedHashMap implements StringConfigMap
         }
         
         private static void addPropertiesFromFile(BrooklynProperties p, String file) {
+            if (file==null) return;
+            
             String fileTidied = Os.tidyPath(file);
             File f = new File(fileTidied);
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
index 136dba1..2c3d43a 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalManagementContext.java
@@ -280,6 +280,7 @@ public class LocalManagementContext extends AbstractManagementContext {
     @Override
     public synchronized Maybe<OsgiManager> getOsgiManager() {
         if (!isRunning()) throw new IllegalStateException("Management context no longer running");
+        if (osgiManager==null) return Maybe.absent("OSGi not available in this instance"); 
         return Maybe.of(osgiManager);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/camp/lite/CampYamlLiteTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/camp/lite/CampYamlLiteTest.java b/core/src/test/java/brooklyn/camp/lite/CampYamlLiteTest.java
index 0e081cf..8eedabf 100644
--- a/core/src/test/java/brooklyn/camp/lite/CampYamlLiteTest.java
+++ b/core/src/test/java/brooklyn/camp/lite/CampYamlLiteTest.java
@@ -68,7 +68,7 @@ public class CampYamlLiteTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() {
-        mgmt = new LocalManagementContextForTests();
+        mgmt = LocalManagementContextForTests.newInstanceWithOsgi();
         platform = new CampPlatformWithJustBrooklynMgmt(mgmt);
     }
     
@@ -187,7 +187,7 @@ public class CampYamlLiteTest {
       String bundleUrl = OsgiStandaloneTest.BROOKLYN_TEST_OSGI_ENTITIES_URL;
       String yaml = getSampleMyCatalogAppYaml(registeredTypeName, bundleUrl);
 
-      LocalManagementContextForTests mgmt2 = new LocalManagementContextForTests();
+      LocalManagementContext mgmt2 = LocalManagementContextForTests.newInstanceWithOsgi();
       try {
           CampPlatformWithJustBrooklynMgmt platform2 = new CampPlatformWithJustBrooklynMgmt(mgmt2);
           MockWebPlatform.populate(platform2, TestAppAssemblyInstantiator.class);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/entity/basic/AbstractEntityLegacyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/AbstractEntityLegacyTest.java b/core/src/test/java/brooklyn/entity/basic/AbstractEntityLegacyTest.java
index 3c0bb1e..723420b 100644
--- a/core/src/test/java/brooklyn/entity/basic/AbstractEntityLegacyTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/AbstractEntityLegacyTest.java
@@ -32,6 +32,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.entity.proxying.ImplementedBy;
 import brooklyn.location.basic.SimulatedLocation;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.test.entity.TestApplicationImpl;
 import brooklyn.util.collections.MutableMap;
@@ -147,7 +148,7 @@ public class AbstractEntityLegacyTest {
     
     @Test
     public void testNewStyleUsesCustomDisplayName() throws Exception {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("appname"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("appname"), LocalManagementContextForTests.newInstance());
         MyEntity entity = app.addChild(EntitySpec.create(MyEntity.class).displayName("entityname"));
         
         assertEquals(app.getDisplayName(), "appname");

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/entity/basic/DynamicEntityTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/DynamicEntityTest.java b/core/src/test/java/brooklyn/entity/basic/DynamicEntityTest.java
index a9b2579..1b5928d 100644
--- a/core/src/test/java/brooklyn/entity/basic/DynamicEntityTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/DynamicEntityTest.java
@@ -27,6 +27,7 @@ import brooklyn.entity.Application;
 import brooklyn.entity.effector.EffectorTaskTest;
 import brooklyn.entity.proxying.EntityInitializer;
 import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.util.collections.MutableMap;
 
 public class DynamicEntityTest {
@@ -35,7 +36,7 @@ public class DynamicEntityTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setup() throws Exception {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(BasicApplication.class));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(BasicApplication.class), LocalManagementContextForTests.newInstance());
     }
     
     @AfterMethod(alwaysRun=true)

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java b/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
index 00ed47a..12c3b55 100644
--- a/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
+++ b/core/src/test/java/brooklyn/entity/basic/DynamicGroupTest.java
@@ -71,7 +71,7 @@ public class DynamicGroupTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        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));
@@ -101,7 +101,7 @@ public class DynamicGroupTest {
     
     @Test
     public void testCanUsePredicateAsFilter() throws Exception {
-        Predicate predicate = Predicates.equalTo(e1);
+        Predicate<Entity> predicate = Predicates.<Entity>equalTo(e1);
         group.setEntityFilter(predicate);
         assertEqualsIgnoringOrder(group.getMembers(), ImmutableSet.of(e1));
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
index 7776291..4eb08b9 100644
--- a/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
+++ b/core/src/test/java/brooklyn/entity/rebind/persister/XmlMementoSerializerTest.java
@@ -34,7 +34,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import brooklyn.entity.Entity;
-import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.location.Location;
@@ -126,7 +125,7 @@ public class XmlMementoSerializerTest {
 
     @Test
     public void testEntity() throws Exception {
-        final TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
         ManagementContext managementContext = app.getManagementContext();
         try {
             serializer.setLookupContext(new LookupContextImpl(managementContext, ImmutableList.of(app), ImmutableList.<Location>of(), ImmutableList.<Policy>of(), ImmutableList.<Enricher>of(), true));
@@ -138,7 +137,7 @@ public class XmlMementoSerializerTest {
 
     @Test
     public void testLocation() throws Exception {
-        TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
         ManagementContext managementContext = app.getManagementContext();
         try {
             @SuppressWarnings("deprecation")
@@ -155,7 +154,7 @@ public class XmlMementoSerializerTest {
         // If there's a dangling entity in an ImmutableList etc, then discard it entirely.
         // If we try to insert null then it fails, breaking the deserialization of that entire file.
         
-        final TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
         final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         ManagementContext managementContext = app.getManagementContext();
         try {
@@ -178,7 +177,7 @@ public class XmlMementoSerializerTest {
 
     @Test
     public void testFieldReffingEntity() throws Exception {
-        final TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
         ReffingEntity reffer = new ReffingEntity(app);
         ManagementContext managementContext = app.getManagementContext();
         try {
@@ -192,7 +191,7 @@ public class XmlMementoSerializerTest {
 
     @Test
     public void testUntypedFieldReffingEntity() throws Exception {
-        final TestApplication app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
         ReffingEntity reffer = new ReffingEntity((Object)app);
         ManagementContext managementContext = app.getManagementContext();
         try {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/location/basic/ByonLocationResolverTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/location/basic/ByonLocationResolverTest.java b/core/src/test/java/brooklyn/location/basic/ByonLocationResolverTest.java
index 4bef04d..08d8dca 100644
--- a/core/src/test/java/brooklyn/location/basic/ByonLocationResolverTest.java
+++ b/core/src/test/java/brooklyn/location/basic/ByonLocationResolverTest.java
@@ -43,6 +43,7 @@ import brooklyn.location.MachineLocation;
 import brooklyn.location.MachineProvisioningLocation;
 import brooklyn.management.internal.LocalManagementContext;
 import brooklyn.test.Asserts;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.util.collections.MutableMap;
 import brooklyn.util.os.Os;
 import brooklyn.util.text.StringPredicates;
@@ -67,7 +68,7 @@ public class ByonLocationResolverTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        managementContext = new LocalManagementContext(BrooklynProperties.Factory.newEmpty());
+        managementContext = LocalManagementContextForTests.newInstance();
         brooklynProperties = managementContext.getBrooklynProperties();
         defaultNamePredicate = StringPredicates.startsWith(FixedListMachineProvisioningLocation.class.getSimpleName());
     }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/location/basic/MachineDetailsTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/location/basic/MachineDetailsTest.java b/core/src/test/java/brooklyn/location/basic/MachineDetailsTest.java
index 53b708c..c6f3685 100644
--- a/core/src/test/java/brooklyn/location/basic/MachineDetailsTest.java
+++ b/core/src/test/java/brooklyn/location/basic/MachineDetailsTest.java
@@ -29,7 +29,6 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.location.LocationSpec;
 import brooklyn.location.MachineDetails;
@@ -37,8 +36,6 @@ import brooklyn.location.OsDetails;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.Task;
 import brooklyn.test.entity.TestApplication;
-import brooklyn.util.task.DynamicSequentialTask;
-import brooklyn.util.task.DynamicTasks;
 
 public class MachineDetailsTest {
 
@@ -50,7 +47,7 @@ public class MachineDetailsTest {
 
     @BeforeMethod(alwaysRun=true)
     public void setup() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        app = TestApplication.Factory.newManagedInstanceForTests();
         mgmt = app.getManagementContext();
 
         LocalhostMachineProvisioningLocation localhost = mgmt.getLocationManager().createLocation(

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java b/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java
index 30a6f32..9f743f5 100644
--- a/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java
+++ b/core/src/test/java/brooklyn/location/basic/SshMachineLocationIntegrationTest.java
@@ -27,7 +27,6 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.management.ManagementContext;
 import brooklyn.test.entity.TestApplication;
@@ -45,7 +44,7 @@ public class SshMachineLocationIntegrationTest {
 
     @BeforeMethod(alwaysRun=true)
     public void setup() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        app = TestApplication.Factory.newManagedInstanceForTests();
         mgmt = app.getManagementContext();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/location/cloud/CloudMachineNamerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/location/cloud/CloudMachineNamerTest.java b/core/src/test/java/brooklyn/location/cloud/CloudMachineNamerTest.java
index bb69508..4da08bc 100644
--- a/core/src/test/java/brooklyn/location/cloud/CloudMachineNamerTest.java
+++ b/core/src/test/java/brooklyn/location/cloud/CloudMachineNamerTest.java
@@ -30,6 +30,7 @@ import org.testng.annotations.Test;
 import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.test.entity.TestEntity;
 import brooklyn.util.config.ConfigBag;
@@ -47,7 +48,7 @@ public class CloudMachineNamerTest {
 
     @Test
     public void testGenerateGroupIdWithEntity() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
         TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
 
         ConfigBag cfg = new ConfigBag()
@@ -69,7 +70,7 @@ public class CloudMachineNamerTest {
     
     @Test
     public void testGenerateNewMachineName() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
         TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
 
         ConfigBag cfg = new ConfigBag()
@@ -88,7 +89,7 @@ public class CloudMachineNamerTest {
     
     @Test
     public void testGenerateNewMachineUniqueNameFromGroupId() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
         TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
 
         ConfigBag cfg = new ConfigBag()
@@ -103,7 +104,7 @@ public class CloudMachineNamerTest {
     
     @Test
     public void testLengthMaxPermittedForMachineName() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
         TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
         
         ConfigBag cfg = new ConfigBag()
@@ -116,7 +117,7 @@ public class CloudMachineNamerTest {
     
     @Test
     public void testLengthReserverdForNameInGroup() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TistApp"), LocalManagementContextForTests.newInstance());
         TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
         
         ConfigBag cfg = new ConfigBag()
@@ -130,7 +131,7 @@ public class CloudMachineNamerTest {
 
     @Test
     public void testSanitizesNewMachineName() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("T_%$()\r\n\t[]*.!App"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("T_%$()\r\n\t[]*.!App"), LocalManagementContextForTests.newInstance());
         TestEntity child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("ent"));
 
         ConfigBag cfg = new ConfigBag()

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/location/cloud/CustomMachineNamerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/location/cloud/CustomMachineNamerTest.java b/core/src/test/java/brooklyn/location/cloud/CustomMachineNamerTest.java
index 7d6c63f..829edb4 100644
--- a/core/src/test/java/brooklyn/location/cloud/CustomMachineNamerTest.java
+++ b/core/src/test/java/brooklyn/location/cloud/CustomMachineNamerTest.java
@@ -26,6 +26,7 @@ import org.testng.annotations.Test;
 import brooklyn.entity.basic.ApplicationBuilder;
 import brooklyn.entity.basic.Entities;
 import brooklyn.entity.proxying.EntitySpec;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.test.entity.TestEntity;
 import brooklyn.util.config.ConfigBag;
@@ -40,7 +41,7 @@ public class CustomMachineNamerTest {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() {
-        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TestApp"));
+        app = ApplicationBuilder.newManagedApp(EntitySpec.create(TestApplication.class).displayName("TestApp"), LocalManagementContextForTests.newInstance());
         child = app.createAndManageChild(EntitySpec.create(TestEntity.class).displayName("TestEnt"));
         config = new ConfigBag()
             .configure(CloudLocationConfig.CALLER_CONTEXT, child);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java b/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java
index cd58c82..e8d8986 100644
--- a/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java
+++ b/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java
@@ -45,6 +45,7 @@ import brooklyn.entity.proxying.EntitySpec;
 import brooklyn.event.basic.BasicAttributeSensor;
 import brooklyn.management.Task;
 import brooklyn.test.Asserts;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.test.entity.TestApplication;
 import brooklyn.test.entity.TestEntity;
 import brooklyn.util.collections.MutableMap;
@@ -77,7 +78,7 @@ public class EntityExecutionManagerTest {
 
     @Test
     public void testGetTasksOfEntity() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        app = TestApplication.Factory.newManagedInstanceForTests();
         e = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         
         final CountDownLatch latch = new CountDownLatch(1);
@@ -95,7 +96,7 @@ public class EntityExecutionManagerTest {
     
     @Test
     public void testUnmanagedEntityCanBeGcedEvenIfPreviouslyTagged() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        app = TestApplication.Factory.newManagedInstanceForTests();
         e = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         String eId = e.getId();
         
@@ -126,7 +127,7 @@ public class EntityExecutionManagerTest {
     
     @Test(groups="Integration")
     public void testUnmanagedEntityGcedOnUnmanageEvenIfEffectorInvoked() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
+        app = TestApplication.Factory.newManagedInstanceForTests();
         
         BasicAttributeSensor<Object> byteArrayAttrib = new BasicAttributeSensor<Object>(Object.class, "test.byteArray", "");
 
@@ -155,7 +156,7 @@ public class EntityExecutionManagerTest {
         brooklynProperties.put(BrooklynGarbageCollector.GC_PERIOD, 1);
         brooklynProperties.put(BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2);
         
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, new LocalManagementContext(brooklynProperties));
+        app = ApplicationBuilder.newManagedApp(TestApplication.class, LocalManagementContextForTests.newInstance(brooklynProperties));
         TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         
         for (int i = 0; i < 1000; i++) {
@@ -185,7 +186,7 @@ public class EntityExecutionManagerTest {
         brooklynProperties.put(BrooklynGarbageCollector.GC_PERIOD, 1000);
         brooklynProperties.put(BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2);
         
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, new LocalManagementContext(brooklynProperties));
+        app = ApplicationBuilder.newManagedApp(TestApplication.class, LocalManagementContextForTests.newInstance(brooklynProperties));
         final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         
         List<Task<?>> tasks = Lists.newArrayList();
@@ -220,7 +221,7 @@ public class EntityExecutionManagerTest {
         brooklynProperties.put(BrooklynGarbageCollector.GC_PERIOD, 1);
         brooklynProperties.put(BrooklynGarbageCollector.MAX_TASK_AGE, maxTaskAge);
         
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, new LocalManagementContext(brooklynProperties));
+        app = ApplicationBuilder.newManagedApp(TestApplication.class, LocalManagementContextForTests.newInstance(brooklynProperties));
         final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
         
         Stopwatch stopwatch = Stopwatch.createStarted();
@@ -253,7 +254,7 @@ public class EntityExecutionManagerTest {
         
         @Override
         public String toString() {
-            return "BigObject["+sizeBytes+"]";
+            return "BigObject["+sizeBytes+"/"+data.length+"]";
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java b/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java
index 68567bf..be29a73 100644
--- a/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java
+++ b/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java
@@ -33,6 +33,7 @@ import brooklyn.config.BrooklynProperties;
 import brooklyn.config.BrooklynProperties.Factory.Builder;
 import brooklyn.location.Location;
 import brooklyn.management.ManagementContext.PropertiesReloadListener;
+import brooklyn.test.entity.LocalManagementContextForTests;
 import brooklyn.util.os.Os;
 
 import com.google.common.base.Charsets;
@@ -40,15 +41,18 @@ import com.google.common.io.Files;
 
 public class LocalManagementContextTest {
     
+    private LocalManagementContext context; 
     private File globalPropertiesFile;
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
+        context = null;
         globalPropertiesFile = Os.newTempFile(getClass(), "global.properties");
     }
     
     @AfterMethod(alwaysRun=true)
     public void tearDown() throws Exception {
+        if (context!=null) context.terminate();
         if (globalPropertiesFile != null) globalPropertiesFile.delete();
     }
     
@@ -56,9 +60,10 @@ public class LocalManagementContextTest {
     public void testReloadPropertiesFromBuilder() throws IOException {
         String globalPropertiesContents = "brooklyn.location.localhost.displayName=myname";
         Files.write(globalPropertiesContents, globalPropertiesFile, Charsets.UTF_8);
-        Builder builder = new BrooklynProperties.Factory.Builder()
+        Builder propsBuilder = new BrooklynProperties.Factory.Builder()
             .globalPropertiesFile(globalPropertiesFile.getAbsolutePath());
-        LocalManagementContext context = new LocalManagementContext(builder);
+        // no builder support in LocalManagementContextForTests (we are testing that the builder's files are reloaded so we need it here)
+        context = new LocalManagementContext(propsBuilder);
         Location location = context.getLocationRegistry().resolve("localhost");
         assertEquals(location.getDisplayName(), "myname");
         String newGlobalPropertiesContents = "brooklyn.location.localhost.displayName=myname2";
@@ -76,7 +81,7 @@ public class LocalManagementContextTest {
         BrooklynProperties brooklynProperties = new BrooklynProperties.Factory.Builder()
             .globalPropertiesFile(globalPropertiesFile.getAbsolutePath())
             .build();
-        LocalManagementContext context = new LocalManagementContext(brooklynProperties);
+        context = LocalManagementContextForTests.builder(true).useProperties(brooklynProperties).build();
         Location location = context.getLocationRegistry().resolve("localhost");
         assertEquals(location.getDisplayName(), "myname");
         String newGlobalPropertiesContents = "brooklyn.location.localhost.displayName=myname2";
@@ -91,7 +96,7 @@ public class LocalManagementContextTest {
     public void testPropertiesModified() throws IOException {
         BrooklynProperties properties = BrooklynProperties.Factory.newEmpty();
         properties.put("myname", "myval");
-        LocalManagementContext context = new LocalManagementContext(properties);
+        context = LocalManagementContextForTests.builder(true).useProperties(properties).build();
         assertEquals(context.getBrooklynProperties().get("myname"), "myval");
         properties.put("myname", "newval");
         assertEquals(properties.get("myname"), "newval");
@@ -104,7 +109,7 @@ public class LocalManagementContextTest {
         final AtomicInteger reloadedCallbackCount = new AtomicInteger(0);
         BrooklynProperties properties = BrooklynProperties.Factory.newEmpty();
         properties.put("myname", "myval");
-        LocalManagementContext context = new LocalManagementContext(properties);
+        context = LocalManagementContextForTests.builder(true).useProperties(properties).build();
         PropertiesReloadListener listener = new PropertiesReloadListener() {
             public void reloaded() {
                 reloadedCallbackCount.incrementAndGet();

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/core/src/test/java/brooklyn/test/entity/LocalManagementContextForTests.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/brooklyn/test/entity/LocalManagementContextForTests.java b/core/src/test/java/brooklyn/test/entity/LocalManagementContextForTests.java
index c4d7cc8..5bc962b 100644
--- a/core/src/test/java/brooklyn/test/entity/LocalManagementContextForTests.java
+++ b/core/src/test/java/brooklyn/test/entity/LocalManagementContextForTests.java
@@ -22,13 +22,29 @@ import brooklyn.config.BrooklynProperties;
 import brooklyn.config.BrooklynServerConfig;
 import brooklyn.management.internal.LocalManagementContext;
 
-/** management context which forces an empty catalog to prevent scanning / interacting with local filesystem.
- * TODO this class could also force standard properties
- * TODO this should be more widely used in tests! */
+/** management context which allows disabling common time-consuming tasks.
+ * most instances have:
+ * <li> empty properties
+ * <li> no catalog
+ * <li> persistence off
+ * <li> osgi off
+ * <p>
+ * the constructor, {@link #newInstance()}, and {@link #builder(boolean)} (with true) return the above;
+ * the constructor and the builder allow custom properties to be set,
+ * and the builder allows individual items to be turned back on.
+ */
 public class LocalManagementContextForTests extends LocalManagementContext {
 
+    protected LocalManagementContextForTests(BrooklynProperties brooklynProperties, boolean minimal) {
+        super(builder(minimal).useProperties(brooklynProperties).buildProperties());
+    }
+    
+    public LocalManagementContextForTests() {
+        this(null);
+    }
+    
     public LocalManagementContextForTests(BrooklynProperties brooklynProperties) {
-        super(disablePersistentStoreBackup(emptyIfNull(setEmptyCatalogAsDefault(emptyIfNull(brooklynProperties)))));
+        this(brooklynProperties, true);
     }
     
     private static BrooklynProperties emptyIfNull(BrooklynProperties bp) {
@@ -54,8 +70,73 @@ public class LocalManagementContextForTests extends LocalManagementContext {
         return brooklynProperties;
     }
     
-    public LocalManagementContextForTests() {
-        this(null);
+    public static class Builder {
+        boolean disablePersistence = false;
+        boolean disableOsgi = false;
+        boolean emptyCatalog = false;
+        BrooklynProperties properties = null;
+        
+        public Builder disablePersistence() { return disablePersistence(true); }
+        public Builder disableOsgi() { return disableOsgi(true); }
+        public Builder emptyCatalog() { return emptyCatalog(true); }
+
+        public Builder disablePersistence(boolean disablePersistence) { this.disablePersistence = disablePersistence; return this; }
+        public Builder disableOsgi(boolean disableOsgi) { this.disableOsgi = disableOsgi; return this; }
+        public Builder emptyCatalog(boolean emptyCatalog) { this.emptyCatalog = emptyCatalog; return this; }
+
+        // for use in the outer class's constructor
+        private Builder minimal(boolean really) {
+            if (really) minimal();
+            return this;
+        }
+        
+        public Builder minimal() {
+            disablePersistence();
+            disableOsgi();
+            emptyCatalog();
+            properties = null;
+            return this;
+        }
+        
+        public Builder useProperties(BrooklynProperties properties) {
+            if (this.properties!=null && properties!=null)
+                throw new IllegalStateException("Cannot set multiple properties");
+            this.properties = properties; 
+            return this; 
+        }
+        
+        public BrooklynProperties buildProperties() {
+            BrooklynProperties result = emptyIfNull(properties);
+            if (disablePersistence) LocalManagementContextForTests.disablePersistentStoreBackup(result);
+            if (disableOsgi) LocalManagementContextForTests.disableOsgi(result);
+            if (emptyCatalog) LocalManagementContextForTests.setEmptyCatalogAsDefault(result);
+            return result;
+        }
+        
+        public LocalManagementContext build() {
+            return new LocalManagementContextForTests(buildProperties(), false);
+        }
+        public Builder useDefaultProperties() {
+            properties = BrooklynProperties.Factory.newDefault();
+            return this;
+        }
     }
     
+    /** create a new builder, defaulting to empty properties, and with the parameter determining whether 
+     * by default to disable common things disabled in tests (and the caller can re-enable selected ones individually)
+     * or (if false) leaving everything enabled (so the caller turns things off) */
+    public static Builder builder(boolean minimal) { return new Builder().minimal(minimal); }
+    
+    public static LocalManagementContext newInstance() {
+        return builder(true).build();
+    }
+
+    public static LocalManagementContext newInstance(BrooklynProperties properties) {
+        return builder(true).useProperties(properties).build();
+    }
+
+    public static LocalManagementContext newInstanceWithOsgi() {
+        return builder(true).disableOsgi(false).build();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index 380e351..bc2c457 100644
--- a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -93,7 +93,6 @@ import brooklyn.location.MachineManagementMixins.MachineMetadata;
 import brooklyn.location.MachineManagementMixins.RichMachineProvisioningLocation;
 import brooklyn.location.NoMachinesAvailableException;
 import brooklyn.location.access.PortForwardManager;
-import brooklyn.location.basic.AbstractLocation;
 import brooklyn.location.basic.BasicMachineMetadata;
 import brooklyn.location.basic.LocationConfigKeys;
 import brooklyn.location.basic.LocationConfigUtils;
@@ -165,6 +164,7 @@ import com.google.common.primitives.Ints;
  * For provisioning and managing VMs in a particular provider/region, using jclouds.
  * Configuration flags are defined in {@link JcloudsLocationConfig}.
  */
+@SuppressWarnings("serial")
 public class JcloudsLocation extends AbstractCloudMachineProvisioningLocation implements JcloudsLocationConfig, RichMachineProvisioningLocation<SshMachineLocation> {
 
     // TODO After converting from Groovy to Java, this is now very bad code! It relies entirely on putting 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLiveTest.java
new file mode 100644
index 0000000..0af5ad5
--- /dev/null
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsLiveTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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 brooklyn.location.jclouds;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+
+import brooklyn.config.BrooklynProperties;
+import brooklyn.entity.basic.Entities;
+import brooklyn.location.basic.SshMachineLocation;
+import brooklyn.management.internal.LocalManagementContext;
+import brooklyn.test.entity.LocalManagementContextForTests;
+import brooklyn.util.exceptions.CompoundRuntimeException;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+
+public class AbstractJcloudsLiveTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractJcloudsLiveTest.class);
+
+    public static final String BROOKLYN_PROPERTIES_PREFIX = "brooklyn.location.jclouds.";
+    public static final String BROOKLYN_PROPERTIES_LEGACY_PREFIX = "brooklyn.jclouds.";
+    
+    public static final String AWS_EC2_PROVIDER = "aws-ec2";
+    public static final String AWS_EC2_MICRO_HARDWARE_ID = "t1.micro";
+    public static final String AWS_EC2_SMALL_HARDWARE_ID = "m1.small";
+    public static final String AWS_EC2_EUWEST_REGION_NAME = "eu-west-1";
+    public static final String AWS_EC2_USEAST_REGION_NAME = "us-east-1";
+
+    public static final String RACKSPACE_PROVIDER = "rackspace-cloudservers-uk";
+    
+    protected BrooklynProperties brooklynProperties;
+    protected LocalManagementContext managementContext;
+    
+    protected List<JcloudsSshMachineLocation> machines;
+    protected JcloudsLocation jcloudsLocation;
+    
+    @BeforeMethod(alwaysRun=true)
+    public void setUp() throws Exception {
+        machines = Lists.newCopyOnWriteArrayList();
+        managementContext = newManagementContext();
+        
+        // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
+        brooklynProperties = managementContext.getBrooklynProperties();
+        stripBrooklynProperties(brooklynProperties);
+    }
+
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        List<Exception> exceptions = Lists.newArrayList();
+        try {
+            if (machines != null) {
+                for (JcloudsSshMachineLocation machine : machines) {
+                    try {
+                        releaseMachine(machine);
+                    } catch (Exception e) {
+                        LOG.warn("Error releasing machine "+machine+"; continuing...", e);
+                        exceptions.add(e);
+                    }
+                }
+                machines.clear();
+            }
+        } finally {
+            try {
+                if (managementContext != null) Entities.destroyAll(managementContext);
+            } catch (Exception e) {
+                LOG.warn("Error destroying management context", e);
+                exceptions.add(e);
+            }
+        }
+        
+        // TODO Debate about whether to:
+        //  - use destroyAllCatching (i.e. not propagating exception)
+        //    Benefit is that other tests in class will subsequently be run, rather than bailing out.
+        //  - propagate exceptions from tearDown
+        //    Benefit is that we don't hide errors; release(...) etc should not be throwing exceptions.
+        if (exceptions.size() > 0) {
+            throw new CompoundRuntimeException("Error in tearDown of "+getClass(), exceptions);
+        }
+    }
+
+    protected LocalManagementContext newManagementContext() {
+        // loads properties, by default, but not OSGi or anything else
+        return LocalManagementContextForTests.builder(true).useDefaultProperties().build();
+    }
+    
+    protected void stripBrooklynProperties(BrooklynProperties props) {
+        for (String key : ImmutableSet.copyOf(props.asMapWithStringKeys().keySet())) {
+            if (key.startsWith(BROOKLYN_PROPERTIES_PREFIX) && !(key.endsWith("identity") || key.endsWith("credential"))) {
+                props.remove(key);
+            }
+            if (key.startsWith(BROOKLYN_PROPERTIES_LEGACY_PREFIX) && !(key.endsWith("identity") || key.endsWith("credential"))) {
+                props.remove(key);
+            }
+            
+            // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty")
+            if (key.startsWith("brooklyn.ssh")) {
+                props.remove(key);
+            }
+        }
+    }
+    
+    protected void assertSshable(SshMachineLocation machine) {
+        int result = machine.execScript("simplecommand", ImmutableList.of("true"));
+        assertEquals(result, 0);
+    }
+
+    // Use this utility method to ensure machines are released on tearDown
+    protected JcloudsSshMachineLocation obtainMachine(Map<?, ?> conf) throws Exception {
+        assertNotNull(jcloudsLocation);
+        JcloudsSshMachineLocation result = jcloudsLocation.obtain(conf);
+        machines.add(checkNotNull(result, "result"));
+        return result;
+    }
+
+    protected JcloudsSshMachineLocation obtainMachine() throws Exception {
+        return obtainMachine(ImmutableMap.of());
+    }
+    
+    protected void releaseMachine(JcloudsSshMachineLocation machine) {
+        assertNotNull(jcloudsLocation);
+        machines.remove(machine);
+        jcloudsLocation.release(machine);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsTest.java
deleted file mode 100644
index 713229d..0000000
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/AbstractJcloudsTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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 brooklyn.location.jclouds;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-
-import brooklyn.config.BrooklynProperties;
-import brooklyn.entity.basic.Entities;
-import brooklyn.location.basic.SshMachineLocation;
-import brooklyn.management.internal.LocalManagementContext;
-import brooklyn.util.exceptions.CompoundRuntimeException;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-
-public class AbstractJcloudsTest {
-
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractJcloudsTest.class);
-
-    public static final String BROOKLYN_PROPERTIES_PREFIX = "brooklyn.location.jclouds.";
-    public static final String BROOKLYN_PROPERTIES_LEGACY_PREFIX = "brooklyn.jclouds.";
-    
-    public static final String AWS_EC2_PROVIDER = "aws-ec2";
-    public static final String AWS_EC2_MICRO_HARDWARE_ID = "t1.micro";
-    public static final String AWS_EC2_SMALL_HARDWARE_ID = "m1.small";
-    public static final String AWS_EC2_EUWEST_REGION_NAME = "eu-west-1";
-    public static final String AWS_EC2_USEAST_REGION_NAME = "us-east-1";
-
-    public static final String RACKSPACE_PROVIDER = "rackspace-cloudservers-uk";
-    
-    protected BrooklynProperties brooklynProperties;
-    protected LocalManagementContext managementContext;
-    
-    protected List<JcloudsSshMachineLocation> machines;
-    protected JcloudsLocation jcloudsLocation;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        machines = Lists.newCopyOnWriteArrayList();
-        managementContext = newManagementContext();
-        
-        // Don't let any defaults from brooklyn.properties (except credentials) interfere with test
-        brooklynProperties = managementContext.getBrooklynProperties();
-        stripBrooklynProperties(brooklynProperties);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        List<Exception> exceptions = Lists.newArrayList();
-        try {
-            if (machines != null) {
-                for (JcloudsSshMachineLocation machine : machines) {
-                    try {
-                        releaseMachine(machine);
-                    } catch (Exception e) {
-                        LOG.warn("Error releasing machine "+machine+"; continuing...", e);
-                        exceptions.add(e);
-                    }
-                }
-                machines.clear();
-            }
-        } finally {
-            try {
-                if (managementContext != null) Entities.destroyAll(managementContext);
-            } catch (Exception e) {
-                LOG.warn("Error destroying management context", e);
-                exceptions.add(e);
-            }
-        }
-        
-        // TODO Debate about whether to:
-        //  - use destroyAllCatching (i.e. not propagating exception)
-        //    Benefit is that other tests in class will subsequently be run, rather than bailing out.
-        //  - propagate exceptions from tearDown
-        //    Benefit is that we don't hide errors; release(...) etc should not be throwing exceptions.
-        if (exceptions.size() > 0) {
-            throw new CompoundRuntimeException("Error in tearDown of "+getClass(), exceptions);
-        }
-    }
-
-    protected LocalManagementContext newManagementContext() {
-        return new LocalManagementContext();
-    }
-    
-    protected void stripBrooklynProperties(BrooklynProperties props) {
-        for (String key : ImmutableSet.copyOf(props.asMapWithStringKeys().keySet())) {
-            if (key.startsWith(BROOKLYN_PROPERTIES_PREFIX) && !(key.endsWith("identity") || key.endsWith("credential"))) {
-                props.remove(key);
-            }
-            if (key.startsWith(BROOKLYN_PROPERTIES_LEGACY_PREFIX) && !(key.endsWith("identity") || key.endsWith("credential"))) {
-                props.remove(key);
-            }
-            
-            // Also removes scriptHeader (e.g. if doing `. ~/.bashrc` and `. ~/.profile`, then that can cause "stdin: is not a tty")
-            if (key.startsWith("brooklyn.ssh")) {
-                props.remove(key);
-            }
-        }
-    }
-    
-    protected void assertSshable(SshMachineLocation machine) {
-        int result = machine.execScript("simplecommand", ImmutableList.of("true"));
-        assertEquals(result, 0);
-    }
-
-    // Use this utility method to ensure machines are released on tearDown
-    protected JcloudsSshMachineLocation obtainMachine(Map<?, ?> conf) throws Exception {
-        assertNotNull(jcloudsLocation);
-        JcloudsSshMachineLocation result = jcloudsLocation.obtain(conf);
-        machines.add(checkNotNull(result, "result"));
-        return result;
-    }
-
-    protected JcloudsSshMachineLocation obtainMachine() throws Exception {
-        return obtainMachine(ImmutableMap.of());
-    }
-    
-    protected void releaseMachine(JcloudsSshMachineLocation machine) {
-        assertNotNull(jcloudsLocation);
-        machines.remove(machine);
-        jcloudsLocation.release(machine);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverLiveTest.java
new file mode 100644
index 0000000..49e1faa
--- /dev/null
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverLiveTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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 brooklyn.location.jclouds;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.net.InetAddress;
+import java.util.Map;
+import java.util.Set;
+
+import org.testng.annotations.Test;
+
+import brooklyn.location.basic.FixedListMachineProvisioningLocation;
+
+import com.google.common.collect.Iterables;
+
+public class JcloudsByonLocationResolverLiveTest extends AbstractJcloudsLiveTest {
+
+    // FIXME Expects this VM to exist; how to write this better? 
+    // We should create a VM in @BeforeClass - slower but automated and will work for everyone
+    private final String awsVm1User = "aled";
+    private final String awsVm1InstanceId = "i-72b1b132";
+    private final String awsVmIp = "54.195.164.70";
+    private final String awsVmHostname = "ec2-54-195-164-70.eu-west-1.compute.amazonaws.com";
+
+    private final String slVmInstanceId = "4107756";
+    private final String slVmIp = "81.95.147.234";
+    private final String slVmHostname = "amp";
+
+    // TODO Requires that a VM already exists; could create that VM first to make test more robust
+    @Test(groups={"Live","WIP"})
+    public void testResolvesJcloudsByonAws() throws Exception {
+        String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\"eu-west-1\",user=\""+awsVm1User+"\",hosts=\""+awsVm1InstanceId+"\")";
+        
+        FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve(spec);
+        
+        Set<JcloudsSshMachineLocation> machines = loc.getAllMachines();
+        JcloudsSshMachineLocation machine = Iterables.getOnlyElement(machines);
+        assertEquals(machine.getParent().getProvider(), "aws-ec2");
+        assertEquals(machine.getAddress().getHostAddress(), awsVmIp);
+        assertEquals(machine.getAddress().getHostName(), awsVmHostname);
+        assertEquals(machine.getUser(), awsVm1User);
+        
+        assertTrue(machine.isSshable());
+    }
+
+    // TODO Requires that a VM already exists; could create that VM first to make test more robust
+    @Test(groups={"Live","WIP"})
+    public void testResolvesNamedJcloudsByon() throws Exception {
+        String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\"eu-west-1\",user=\""+awsVm1User+"\",hosts=\""+awsVm1InstanceId+"\")";
+        brooklynProperties.put("brooklyn.location.named.mynamed", spec);
+        
+        FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve("named:mynamed");
+        assertEquals(loc.obtain().getAddress(), InetAddress.getByName(awsVmHostname));
+    }
+
+    // TODO Requires that a VM already exists; could create that VM first to make test more robust
+    @Test(groups={"Live","WIP"})
+    public void testJcloudsPropertiesPrecedence() throws Exception {
+        String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\"eu-west-1\",user=\""+awsVm1User+"\",hosts=\""+awsVm1InstanceId+"\")";
+        brooklynProperties.put("brooklyn.location.named.mynamed", spec);
+        
+        // prefer those in spec string over everything else
+        brooklynProperties.put("brooklyn.location.named.mynamed.user", "user-inNamed");
+        brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.user", "user-inProviderSpecific");
+        brooklynProperties.put("brooklyn.jclouds.aws-ec2.user", "user-inProviderSpecificDeprecated");
+        brooklynProperties.put("brooklyn.location.jclouds.user", "user-inJcloudsGeneric");
+        brooklynProperties.put("brooklyn.jclouds.user", "user-inJcloudsGenericDeprecated");
+        brooklynProperties.put("brooklyn.location.user", "user-inLocationGeneric");
+
+        // prefer those in "named" over everything else (except spec string itself)
+        brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyFile", "privateKeyFile-inNamed");
+        brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.privateKeyFile", "privateKeyFile-inProviderSpecific");
+        brooklynProperties.put("brooklyn.jclouds.aws-ec2.privateKeyFile", "privateKeyFile-inProviderSpecificDeprecated");
+        brooklynProperties.put("brooklyn.location.jclouds.privateKeyFile", "privateKeyFile-inJcloudsGeneric");
+        brooklynProperties.put("brooklyn.jclouds.privateKeyFile", "privateKeyFile-inJcloudsGenericDeprecated");
+        brooklynProperties.put("brooklyn.location.privateKeyFile", "privateKeyFile-inLocationGeneric");
+
+        // prefer those in provider-specific over generic
+        brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.publicKeyFile", "publicKeyFile-inProviderSpecific");
+        brooklynProperties.put("brooklyn.jclouds.aws-ec2.publicKeyFile", "publicKeyFile-inProviderSpecificDeprecated");
+        brooklynProperties.put("brooklyn.location.jclouds.publicKeyFile", "publicKeyFile-inJcloudsGeneric");
+        brooklynProperties.put("brooklyn.jclouds.publicKeyFile", "publicKeyFile-inJcloudsGenericDeprecated");
+        brooklynProperties.put("brooklyn.location.publicKeyFile", "publicKeyFile-inLocationGeneric");
+        
+        // prefer those in provider-specific (deprecated scope) over generic
+        brooklynProperties.put("brooklyn.jclouds.aws-ec2.securityGroups", "securityGroups-inProviderSpecificDeprecated");
+        brooklynProperties.put("brooklyn.location.jclouds.securityGroups", "securityGroups-inJcloudsGeneric");
+        brooklynProperties.put("brooklyn.jclouds.securityGroups", "securityGroups-inJcloudsGenericDeprecated");
+        brooklynProperties.put("brooklyn.location.securityGroups", "securityGroups-inLocationGeneric");
+
+        // prefer those in jclouds-generic over location-generic
+        brooklynProperties.put("brooklyn.location.jclouds.loginUser", "loginUser-inJcloudsGeneric");
+        brooklynProperties.put("brooklyn.jclouds.loginUser", "loginUser-inJcloudsGenericDeprecated");
+        brooklynProperties.put("brooklyn.location.loginUser", "loginUser-inLocationGeneric");
+
+        // prefer those in jclouds-generic (deprecated) over location-generic
+        brooklynProperties.put("brooklyn.jclouds.imageId", "imageId-inJcloudsGenericDeprecated");
+        brooklynProperties.put("brooklyn.location.imageId", "imageId-inLocationGeneric");
+
+        // prefer location-generic if nothing else
+        brooklynProperties.put("brooklyn.location.keyPair", "keyPair-inLocationGeneric");
+
+        // prefer deprecated properties in "named" over those less specific
+        brooklynProperties.put("brooklyn.location.named.mynamed.private-key-data", "privateKeyData-inNamed");
+        brooklynProperties.put("brooklyn.jclouds.aws-ec2.privateKeyData", "privateKeyData-inProviderSpecific");
+        brooklynProperties.put("brooklyn.jclouds.privateKeyData", "privateKeyData-inJcloudsGeneric");
+
+        // prefer "named" over everything else: confirm deprecated don't get transformed to overwrite it accidentally
+        brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyPassphrase", "privateKeyPassphrase-inNamed");
+        brooklynProperties.put("brooklyn.jclouds.aws-ec2.private-key-passphrase", "privateKeyPassphrase-inProviderSpecific");
+        brooklynProperties.put("brooklyn.jclouds.private-key-passphrase", "privateKeyPassphrase-inJcloudsGeneric");
+
+        Map<String, Object> conf = resolve("named:mynamed").obtain().getAllConfig(true);
+        
+        assertEquals(conf.get("user"), awsVm1User);
+        assertEquals(conf.get("privateKeyFile"), "privateKeyFile-inNamed");
+        assertEquals(conf.get("publicKeyFile"), "publicKeyFile-inProviderSpecific");
+        assertEquals(conf.get("securityGroups"), "securityGroups-inProviderSpecificDeprecated");
+        assertEquals(conf.get("loginUser"), "loginUser-inJcloudsGeneric");
+        assertEquals(conf.get("imageId"), "imageId-inJcloudsGenericDeprecated");
+        assertEquals(conf.get("keyPair"), "keyPair-inLocationGeneric");
+        assertEquals(conf.get("privateKeyData"), "privateKeyData-inNamed");
+        assertEquals(conf.get("privateKeyPassphrase"), "privateKeyPassphrase-inNamed");
+    }
+
+    // TODO Requires that a VM already exists; could create that VM first to make test more robust
+    @Test(groups={"Live","WIP"})
+    public void testResolvesJcloudsByonSoftlayer() throws Exception {
+        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",region=\"dal05\",hosts=\""+slVmInstanceId+"\")");
+        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",region=\"dal05\",hosts=\""+slVmHostname+"\")");
+        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",region=\"dal05\",hosts=\""+slVmIp+"\")");
+        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",hosts=\""+slVmIp+"\")");
+    }
+    
+    private void checkSoftlayer(String spec) {
+        FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve(spec);
+        
+        Set<JcloudsSshMachineLocation> machines = loc.getAllMachines();
+        JcloudsSshMachineLocation machine = Iterables.getOnlyElement(machines);
+        assertEquals(machine.getParent().getProvider(), "softlayer");
+        assertEquals(machine.getNode().getId(), slVmInstanceId);
+        assertEquals(machine.getAddress().getHostAddress(), slVmIp);
+        assertTrue(slVmHostname.equals(machine.getAddress().getHostName()) || slVmIp.equals(machine.getAddress().getHostName()), 
+            "address hostname is: "+machine.getAddress().getHostName());
+        assertTrue(slVmHostname.equals(machine.getNode().getHostname()) || slVmIp.equals(machine.getNode().getHostname()), 
+            "node hostname is: "+machine.getNode().getHostname());
+        
+        // could also assert this, given a user credential, but not currently set up
+//        assertTrue(machine.isSshable());
+    }
+
+    @SuppressWarnings("unchecked")
+    private FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> resolve(String spec) {
+        return (FixedListMachineProvisioningLocation<JcloudsSshMachineLocation>) managementContext.getLocationRegistry().resolve(spec);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverTest.java
index f01f365..86e790f 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsByonLocationResolverTest.java
@@ -18,46 +18,33 @@
  */
 package brooklyn.location.jclouds;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.net.InetAddress;
-import java.util.Map;
 import java.util.NoSuchElementException;
-import java.util.Set;
 
+import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import brooklyn.location.LocationRegistry;
-import brooklyn.location.basic.BasicLocationRegistry;
+import brooklyn.entity.basic.Entities;
 import brooklyn.location.basic.FixedListMachineProvisioningLocation;
+import brooklyn.management.internal.LocalManagementContext;
+import brooklyn.test.entity.LocalManagementContextForTests;
 
-import com.google.common.collect.Iterables;
+public class JcloudsByonLocationResolverTest {
 
-public class JcloudsByonLocationResolverTest extends AbstractJcloudsTest {
-
-    private LocationRegistry registry;
-
-    // FIXME Expects this VM to exist; how to write this better? 
-    // We should create a VM in @BeforeClass - slower but automated and will work for everyone
-    private final String awsVm1User = "aled";
-    private final String awsVm1InstanceId = "i-72b1b132";
-    private final String awsVmIp = "54.195.164.70";
-    private final String awsVmHostname = "ec2-54-195-164-70.eu-west-1.compute.amazonaws.com";
-
-    private final String slVmInstanceId = "4107756";
-    private final String slVmIp = "81.95.147.234";
-    private final String slVmHostname = "amp";
+    private LocalManagementContext managementContext;
     
     @BeforeMethod(alwaysRun=true)
-    @Override
     public void setUp() throws Exception {
-        super.setUp();
-        registry = new BasicLocationRegistry(managementContext);
+        managementContext = LocalManagementContextForTests.newInstance();
     }
-    
+
+    @AfterMethod(alwaysRun=true)
+    public void tearDown() throws Exception {
+        if (managementContext != null) Entities.destroyAll(managementContext);
+    }
+
     @Test
     public void testThrowsOnInvalid() throws Exception {
         assertThrowsNoSuchElement("wrongprefix:(hosts=\"1.1.1.1\")");
@@ -68,135 +55,10 @@ public class JcloudsByonLocationResolverTest extends AbstractJcloudsTest {
         assertThrowsIllegalArgument("jcloudsByon:(hosts=\"1.1.1.1\", name)"); // no value for name
         assertThrowsIllegalArgument("jcloudsByon:(hosts=\"1.1.1.1\", name=)"); // no value for name
     }
-    
-    // TODO Requires that a VM already exists; could create that VM first to make test more robust
-    @Test(groups={"Live","WIP"})
-    public void testResolvesJcloudsByonAws() throws Exception {
-        String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\"eu-west-1\",user=\""+awsVm1User+"\",hosts=\""+awsVm1InstanceId+"\")";
-        
-        FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve(spec);
-        
-        Set<JcloudsSshMachineLocation> machines = loc.getAllMachines();
-        JcloudsSshMachineLocation machine = Iterables.getOnlyElement(machines);
-        assertEquals(machine.getParent().getProvider(), "aws-ec2");
-        assertEquals(machine.getAddress().getHostAddress(), awsVmIp);
-        assertEquals(machine.getAddress().getHostName(), awsVmHostname);
-        assertEquals(machine.getUser(), awsVm1User);
-        
-        assertTrue(machine.isSshable());
-    }
-
-    // TODO Requires that a VM already exists; could create that VM first to make test more robust
-    @Test(groups={"Live","WIP"})
-    public void testResolvesNamedJcloudsByon() throws Exception {
-        String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\"eu-west-1\",user=\""+awsVm1User+"\",hosts=\""+awsVm1InstanceId+"\")";
-        brooklynProperties.put("brooklyn.location.named.mynamed", spec);
-        registry = new BasicLocationRegistry(managementContext);
-        
-        FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve("named:mynamed");
-        assertEquals(loc.obtain().getAddress(), InetAddress.getByName(awsVmHostname));
-    }
-
-    // TODO Requires that a VM already exists; could create that VM first to make test more robust
-    @Test(groups={"Live","WIP"})
-    public void testJcloudsPropertiesPrecedence() throws Exception {
-        String spec = "jcloudsByon:(provider=\"aws-ec2\",region=\"eu-west-1\",user=\""+awsVm1User+"\",hosts=\""+awsVm1InstanceId+"\")";
-        brooklynProperties.put("brooklyn.location.named.mynamed", spec);
-        
-        // prefer those in spec string over everything else
-        brooklynProperties.put("brooklyn.location.named.mynamed.user", "user-inNamed");
-        brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.user", "user-inProviderSpecific");
-        brooklynProperties.put("brooklyn.jclouds.aws-ec2.user", "user-inProviderSpecificDeprecated");
-        brooklynProperties.put("brooklyn.location.jclouds.user", "user-inJcloudsGeneric");
-        brooklynProperties.put("brooklyn.jclouds.user", "user-inJcloudsGenericDeprecated");
-        brooklynProperties.put("brooklyn.location.user", "user-inLocationGeneric");
-
-        // prefer those in "named" over everything else (except spec string itself)
-        brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyFile", "privateKeyFile-inNamed");
-        brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.privateKeyFile", "privateKeyFile-inProviderSpecific");
-        brooklynProperties.put("brooklyn.jclouds.aws-ec2.privateKeyFile", "privateKeyFile-inProviderSpecificDeprecated");
-        brooklynProperties.put("brooklyn.location.jclouds.privateKeyFile", "privateKeyFile-inJcloudsGeneric");
-        brooklynProperties.put("brooklyn.jclouds.privateKeyFile", "privateKeyFile-inJcloudsGenericDeprecated");
-        brooklynProperties.put("brooklyn.location.privateKeyFile", "privateKeyFile-inLocationGeneric");
-
-        // prefer those in provider-specific over generic
-        brooklynProperties.put("brooklyn.location.jclouds.aws-ec2.publicKeyFile", "publicKeyFile-inProviderSpecific");
-        brooklynProperties.put("brooklyn.jclouds.aws-ec2.publicKeyFile", "publicKeyFile-inProviderSpecificDeprecated");
-        brooklynProperties.put("brooklyn.location.jclouds.publicKeyFile", "publicKeyFile-inJcloudsGeneric");
-        brooklynProperties.put("brooklyn.jclouds.publicKeyFile", "publicKeyFile-inJcloudsGenericDeprecated");
-        brooklynProperties.put("brooklyn.location.publicKeyFile", "publicKeyFile-inLocationGeneric");
-        
-        // prefer those in provider-specific (deprecated scope) over generic
-        brooklynProperties.put("brooklyn.jclouds.aws-ec2.securityGroups", "securityGroups-inProviderSpecificDeprecated");
-        brooklynProperties.put("brooklyn.location.jclouds.securityGroups", "securityGroups-inJcloudsGeneric");
-        brooklynProperties.put("brooklyn.jclouds.securityGroups", "securityGroups-inJcloudsGenericDeprecated");
-        brooklynProperties.put("brooklyn.location.securityGroups", "securityGroups-inLocationGeneric");
-
-        // prefer those in jclouds-generic over location-generic
-        brooklynProperties.put("brooklyn.location.jclouds.loginUser", "loginUser-inJcloudsGeneric");
-        brooklynProperties.put("brooklyn.jclouds.loginUser", "loginUser-inJcloudsGenericDeprecated");
-        brooklynProperties.put("brooklyn.location.loginUser", "loginUser-inLocationGeneric");
-
-        // prefer those in jclouds-generic (deprecated) over location-generic
-        brooklynProperties.put("brooklyn.jclouds.imageId", "imageId-inJcloudsGenericDeprecated");
-        brooklynProperties.put("brooklyn.location.imageId", "imageId-inLocationGeneric");
-
-        // prefer location-generic if nothing else
-        brooklynProperties.put("brooklyn.location.keyPair", "keyPair-inLocationGeneric");
-
-        // prefer deprecated properties in "named" over those less specific
-        brooklynProperties.put("brooklyn.location.named.mynamed.private-key-data", "privateKeyData-inNamed");
-        brooklynProperties.put("brooklyn.jclouds.aws-ec2.privateKeyData", "privateKeyData-inProviderSpecific");
-        brooklynProperties.put("brooklyn.jclouds.privateKeyData", "privateKeyData-inJcloudsGeneric");
-
-        // prefer "named" over everything else: confirm deprecated don't get transformed to overwrite it accidentally
-        brooklynProperties.put("brooklyn.location.named.mynamed.privateKeyPassphrase", "privateKeyPassphrase-inNamed");
-        brooklynProperties.put("brooklyn.jclouds.aws-ec2.private-key-passphrase", "privateKeyPassphrase-inProviderSpecific");
-        brooklynProperties.put("brooklyn.jclouds.private-key-passphrase", "privateKeyPassphrase-inJcloudsGeneric");
-
-        registry = new BasicLocationRegistry(managementContext);
-        Map<String, Object> conf = resolve("named:mynamed").obtain().getAllConfig(true);
-        
-        assertEquals(conf.get("user"), awsVm1User);
-        assertEquals(conf.get("privateKeyFile"), "privateKeyFile-inNamed");
-        assertEquals(conf.get("publicKeyFile"), "publicKeyFile-inProviderSpecific");
-        assertEquals(conf.get("securityGroups"), "securityGroups-inProviderSpecificDeprecated");
-        assertEquals(conf.get("loginUser"), "loginUser-inJcloudsGeneric");
-        assertEquals(conf.get("imageId"), "imageId-inJcloudsGenericDeprecated");
-        assertEquals(conf.get("keyPair"), "keyPair-inLocationGeneric");
-        assertEquals(conf.get("privateKeyData"), "privateKeyData-inNamed");
-        assertEquals(conf.get("privateKeyPassphrase"), "privateKeyPassphrase-inNamed");
-    }
-
-    // TODO Requires that a VM already exists; could create that VM first to make test more robust
-    @Test(groups={"Live","WIP"})
-    public void testResolvesJcloudsByonSoftlayer() throws Exception {
-        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",region=\"dal05\",hosts=\""+slVmInstanceId+"\")");
-        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",region=\"dal05\",hosts=\""+slVmHostname+"\")");
-        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",region=\"dal05\",hosts=\""+slVmIp+"\")");
-        checkSoftlayer("jcloudsByon:(provider=\"softlayer\",hosts=\""+slVmIp+"\")");
-    }
-    
-    private void checkSoftlayer(String spec) {
-        FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> loc = resolve(spec);
-        
-        Set<JcloudsSshMachineLocation> machines = loc.getAllMachines();
-        JcloudsSshMachineLocation machine = Iterables.getOnlyElement(machines);
-        assertEquals(machine.getParent().getProvider(), "softlayer");
-        assertEquals(machine.getNode().getId(), slVmInstanceId);
-        assertEquals(machine.getAddress().getHostAddress(), slVmIp);
-        assertTrue(slVmHostname.equals(machine.getAddress().getHostName()) || slVmIp.equals(machine.getAddress().getHostName()), 
-            "address hostname is: "+machine.getAddress().getHostName());
-        assertTrue(slVmHostname.equals(machine.getNode().getHostname()) || slVmIp.equals(machine.getNode().getHostname()), 
-            "node hostname is: "+machine.getNode().getHostname());
-        
-        // could also assert this, given a user credential, but not currently set up
-//        assertTrue(machine.isSshable());
-    }
 
     @SuppressWarnings("unchecked")
     private FixedListMachineProvisioningLocation<JcloudsSshMachineLocation> resolve(String spec) {
-        return (FixedListMachineProvisioningLocation<JcloudsSshMachineLocation>) registry.resolve(spec);
+        return (FixedListMachineProvisioningLocation<JcloudsSshMachineLocation>) managementContext.getLocationRegistry().resolve(spec);
     }
     
     private void assertThrowsNoSuchElement(String val) {

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationMetadataTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationMetadataTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationMetadataTest.java
index 56e4d1c..e5ebfab 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationMetadataTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationMetadataTest.java
@@ -29,6 +29,7 @@ import brooklyn.entity.basic.Entities;
 import brooklyn.location.Location;
 import brooklyn.location.basic.LocationConfigKeys;
 import brooklyn.management.internal.LocalManagementContext;
+import brooklyn.test.entity.LocalManagementContextForTests;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -42,7 +43,7 @@ public class JcloudsLocationMetadataTest implements JcloudsLocationConfig {
     
     @BeforeMethod(alwaysRun=true)
     public void setUp() throws Exception {
-        managementContext = new LocalManagementContext();
+        managementContext = LocalManagementContextForTests.newInstance(BrooklynProperties.Factory.builderEmpty().build());
         brooklynProperties = managementContext.getBrooklynProperties();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f439dd8/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindMachineLiveTest.java
----------------------------------------------------------------------
diff --git a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindMachineLiveTest.java b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindMachineLiveTest.java
index a0a4989..7ec58cf 100644
--- a/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindMachineLiveTest.java
+++ b/locations/jclouds/src/test/java/brooklyn/location/jclouds/JcloudsLocationRebindMachineLiveTest.java
@@ -36,7 +36,7 @@ import brooklyn.location.basic.SshMachineLocation;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
-public class JcloudsLocationRebindMachineLiveTest extends AbstractJcloudsTest {
+public class JcloudsLocationRebindMachineLiveTest extends AbstractJcloudsLiveTest {
     
     private static final Logger LOG = LoggerFactory.getLogger(JcloudsLocationRebindMachineLiveTest.class);
     
@@ -71,6 +71,7 @@ public class JcloudsLocationRebindMachineLiveTest extends AbstractJcloudsTest {
         // Create a VM through jclouds
         JcloudsSshMachineLocation machine = obtainMachine(ImmutableMap.of("imageId", EUWEST_IMAGE_ID, "imageOwner", IMAGE_OWNER));
         assertTrue(machine.isSshable());
+        LOG.info("obtained "+machine);
 
         String id = checkNotNull(machine.getJcloudsId(), "id");
         InetAddress address = checkNotNull(machine.getAddress(), "address");
@@ -81,6 +82,8 @@ public class JcloudsLocationRebindMachineLiveTest extends AbstractJcloudsTest {
         JcloudsLocation loc2 = (JcloudsLocation) managementContext.getLocationRegistry().resolve(AWS_EC2_PROVIDER+":"+AWS_EC2_EUWEST_REGION_NAME);
         SshMachineLocation machine2 = loc2.rebindMachine(ImmutableMap.of("id", id, "hostname", hostname, "user", user));
         
+        LOG.info("rebinded to "+machine2);
+        
         // Confirm the re-bound machine is wired up
         assertTrue(machine2.isSshable());
         assertEquals(ImmutableSet.copyOf(loc2.getChildren()), ImmutableSet.of(machine2));