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 2015/08/19 13:09:34 UTC

[16/72] [abbrv] incubator-brooklyn git commit: BROOKLYN-162 - apply org.apache package prefix to software-base, tidying package names, and moving a few sensory things to core

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityImpl.java b/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityImpl.java
deleted file mode 100644
index 2f0e336..0000000
--- a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityImpl.java
+++ /dev/null
@@ -1,126 +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.entity.basic.lifecycle;
-
-import java.util.List;
-
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.basic.SoftwareProcessDriver;
-import brooklyn.entity.basic.SoftwareProcessImpl;
-import brooklyn.entity.java.JavaSoftwareProcessSshDriver;
-
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.ResourceUtils;
-import org.apache.brooklyn.util.core.flags.SetFromFlag;
-import org.apache.brooklyn.util.text.Identifiers;
-
-public class MyEntityImpl extends SoftwareProcessImpl implements MyEntity {
-    @Override
-    public Class<?> getDriverInterface() {
-        return MyEntityDriver.class;
-    }
-
-    @Override
-    protected void connectSensors() {
-        super.connectSensors();
-        connectServiceUpIsRunning();
-    }
-    
-    @Override
-    protected void disconnectSensors() {
-        super.disconnectSensors();
-        disconnectServiceUpIsRunning();
-    }
-    
-    public interface MyEntityDriver extends SoftwareProcessDriver {}
-
-    public static class MyEntitySshDriver extends JavaSoftwareProcessSshDriver implements MyEntityDriver {
-
-        @SetFromFlag("version")
-        public static final ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "0.1");
-
-        public MyEntitySshDriver(MyEntityImpl entity, SshMachineLocation machine) {
-            super(entity, machine);
-        }
-
-        @Override
-        protected String getLogFileLocation() {
-            return getRunDir()+"/nohup.out";
-        }
-        
-        @Override
-        public void install() {
-            String resourceName = "/"+MyEntityApp.class.getName().replace(".", "/")+".class";
-            ResourceUtils r = ResourceUtils.create(this);
-            if (r.getResourceFromUrl(resourceName) == null) 
-                throw new IllegalStateException("Cannot find resource "+resourceName);
-            String tmpFile = "/tmp/brooklyn-test-MyEntityApp-"+Identifiers.makeRandomId(6)+".class";
-            int result = getMachine().installTo(resourceName, tmpFile);
-            if (result!=0) throw new IllegalStateException("Cannot install "+resourceName+" to "+tmpFile);
-            String saveAs = "classes/"+MyEntityApp.class.getPackage().getName().replace(".", "/")+"/"+MyEntityApp.class.getSimpleName()+".class";
-            newScript(INSTALLING).
-                failOnNonZeroResultCode().
-                body.append(
-                    "curl -L \"file://"+tmpFile+"\" --create-dirs -o "+saveAs+" || exit 9"
-                ).execute();
-        }
-
-        @Override
-        public void customize() {
-            newScript(CUSTOMIZING)
-                .execute();
-        }
-        
-        @Override
-        public void launch() {
-            newScript(MutableMap.of("usePidFile", true), LAUNCHING)
-                .body.append(
-                    String.format("nohup java -classpath %s/classes $JAVA_OPTS %s &", getInstallDir(), MyEntityApp.class.getName())
-                ).execute();
-        }
-        
-        @Override
-        public boolean isRunning() {
-            //TODO use PID instead
-            return newScript(MutableMap.of("usePidFile", true), CHECK_RUNNING)
-                .execute() == 0;
-        }
-        
-        @Override
-        public void stop() {
-            newScript(MutableMap.of("usePidFile", true), STOPPING)
-                .execute();
-        }
-
-        @Override
-        public void kill() {
-            newScript(MutableMap.of("usePidFile", true), KILLING)
-                .execute();
-        }
-
-        @Override
-        protected List<String> getCustomJavaConfigOptions() {
-            return MutableList.<String>builder().addAll(super.getCustomJavaConfigOptions()).add("-Dabc=def").build();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/lifecycle/NaiveScriptRunnerTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/NaiveScriptRunnerTest.java b/software/base/src/test/java/brooklyn/entity/basic/lifecycle/NaiveScriptRunnerTest.java
deleted file mode 100644
index 4ef2bde..0000000
--- a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/NaiveScriptRunnerTest.java
+++ /dev/null
@@ -1,252 +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.entity.basic.lifecycle;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import org.apache.brooklyn.api.location.NoMachinesAvailableException;
-import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags.WrappedStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.task.BasicExecutionContext;
-import org.apache.brooklyn.util.core.task.BasicExecutionManager;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.repeat.Repeater;
-import org.apache.brooklyn.util.time.Duration;
-
-import com.google.common.base.Throwables;
-
-@Test
-public class NaiveScriptRunnerTest {
-    
-    private static final Logger log = LoggerFactory.getLogger(NaiveScriptRunnerTest.class);
-    
-    List<String> commands = new ArrayList<String>();
-    
-    @BeforeMethod
-    private void setup() { commands.clear(); }
-    
-    @SuppressWarnings("rawtypes")
-    private NaiveScriptRunner newMockRunner(final int result) {
-        return new NaiveScriptRunner() {
-            @Override
-            public int execute(List<String> script, String summaryForLogging) {
-                return execute(new MutableMap(), script, summaryForLogging);
-            }
-            @Override
-            public int execute(Map flags, List<String> script, String summaryForLogging) {
-                commands.addAll(script);
-                return result;                
-            }
-        };
-    }
-
-    @SuppressWarnings("rawtypes")
-    public static NaiveScriptRunner newLocalhostRunner() {
-        return new NaiveScriptRunner() {
-            LocalhostMachineProvisioningLocation location = new LocalhostMachineProvisioningLocation();
-            @Override
-            public int execute(List<String> script, String summaryForLogging) {
-                return execute(new MutableMap(), script, summaryForLogging);
-            }
-            @SuppressWarnings("unchecked")
-            @Override
-            public int execute(Map flags, List<String> script, String summaryForLogging) {
-                try {
-                    Map flags2 = MutableMap.of("logPrefix", "test");
-                    flags2.putAll(flags);
-                    return location.obtain().execScript(flags2, summaryForLogging, script);
-                } catch (NoMachinesAvailableException e) {
-                    throw Throwables.propagate(e);
-                }
-            }
-        };
-    };
-
-    public void testHeadBodyFootAndResult() {
-        ScriptHelper h = new ScriptHelper(newMockRunner(101), "mock");
-        int result = h.header.
-                append("h1", "h2").body.append("b1", "b2").footer.append("f1", "f2").
-                execute();
-        Assert.assertEquals(result, 101);
-        Assert.assertEquals(commands, Arrays.asList("h1", "h2", "b1", "b2", "f1", "f2"), "List wrong: "+commands);
-    }
-
-    public void testFailOnNonZero() {
-        ScriptHelper h = new ScriptHelper(newMockRunner(106), "mock");
-        boolean succeededWhenShouldntHave = false;
-        try {
-            h.body.append("ignored").
-                failOnNonZeroResultCode().   // will happen
-                execute();            
-            succeededWhenShouldntHave = true;
-        } catch (Exception e) {
-            log.info("ScriptHelper non-zero causes return code: "+e);
-        }
-        if (succeededWhenShouldntHave) Assert.fail("succeeded when shouldn't have");
-    }
-
-    public void testFailOnNonZeroDontFailIfZero() {
-        int result = new ScriptHelper(newMockRunner(0), "mock").body.append("ignored").
-                failOnNonZeroResultCode().   // will happen
-                execute();
-        Assert.assertEquals(result, 0);
-    }
-
-
-    @Test(groups = "Integration")
-    public void testFailingCommandFailsEarly() {
-        ScriptHelper script = new ScriptHelper(newLocalhostRunner(), "mock").
-                body.append("curl road://to/nowhere", "exit 11").
-                gatherOutput();
-        int result = script.execute();
-        // should get _1_ from curl failing, not 11 from us
-        // TODO not sure why though!
-        Assert.assertEquals(1, result);
-    }
-
-    // TODO a good way to indicate when downloads fail, as that is quite a common case
-    // but i think we need quite a bit of scaffolding to detect that problem (without inspecting logs) ...
-
-    @Test(groups = "Integration")
-    public void testGatherOutputStdout() {
-        ScriptHelper script = new ScriptHelper(newLocalhostRunner(), "mock").
-                body.append("echo `echo foo``echo bar`", "exit 8").
-                gatherOutput();
-        int result = script.execute();
-        Assert.assertEquals(8, result);
-        if (!script.getResultStdout().contains("foobar"))
-            Assert.fail("STDOUT does not contain expected text 'foobar'.\n"+script.getResultStdout()+
-                    "\nSTDERR:\n"+script.getResultStderr());
-    }
-
-    @Test(groups = "Integration")
-    public void testGatherOutputStderr() {
-        ScriptHelper script = new ScriptHelper(newLocalhostRunner(), "mock").
-                body.append("set -x", "curl road://to/nowhere || exit 11").
-                gatherOutput();
-        int result = script.execute();
-        Assert.assertEquals(11, result);
-        if (!script.getResultStderr().contains("road"))
-            Assert.fail("STDERR does not contain expected text 'road'.\n"+script.getResultStderr()+
-                    "\nSTDOUT:\n"+script.getResultStdout());
-    }
-
-    @Test(groups = "Integration")
-    public void testGatherOutuputNotEnabled() {
-        ScriptHelper script = new ScriptHelper(newLocalhostRunner(), "mock").
-                body.append("echo foo", "exit 11");
-        int result = script.execute();
-        Assert.assertEquals(11, result);
-        boolean succeededWhenShouldNotHave = false;
-        try {
-            script.getResultStdout();
-            succeededWhenShouldNotHave = true;
-        } catch (Exception e) { /* expected */ }
-        if (succeededWhenShouldNotHave) Assert.fail("Should have failed");
-    }
-
-    @Test(groups = "Integration")
-    public void testStreamsInTask() {
-        final ScriptHelper script = new ScriptHelper(newLocalhostRunner(), "mock").
-                body.append("echo `echo foo``echo bar`", "grep absent-text badfile_which_does_not_exist_blaahblahasdewq").
-                gatherOutput();
-        Assert.assertNull(script.peekTask());
-        Task<Integer> task = script.newTask();
-        Assert.assertTrue(BrooklynTaskTags.streams(task).size() >= 3, "Expected at least 3 streams: "+BrooklynTaskTags.streams(task));
-        Assert.assertFalse(Tasks.isQueuedOrSubmitted(task));
-        WrappedStream in = BrooklynTaskTags.stream(task, BrooklynTaskTags.STREAM_STDIN);
-        Assert.assertNotNull(in);
-        Assert.assertTrue(in.streamContents.get().contains("echo foo"), "Expected 'echo foo' but had: "+in.streamContents.get());
-        Assert.assertTrue(in.streamSize.get() > 0);
-        Assert.assertNotNull(script.peekTask());
-    }
-
-    @Test(groups = "Integration")
-    public void testAutoQueueAndRuntimeStreamsInTask() {
-        final ScriptHelper script = new ScriptHelper(newLocalhostRunner(), "mock").
-                body.append("echo `echo foo``echo bar`", "grep absent-text badfile_which_does_not_exist_blaahblahasdewq").
-                gatherOutput();
-        Task<Integer> submitter = Tasks.<Integer>builder().body(new Callable<Integer>() {
-            public Integer call() {
-                int result = script.execute();
-                return result;
-            } 
-        }).build();
-        BasicExecutionManager em = new BasicExecutionManager("tests");
-        BasicExecutionContext ec = new BasicExecutionContext(em);
-        try {
-            Assert.assertNull(script.peekTask());
-            ec.submit(submitter);
-            // soon there should be a task which is submitted
-            Assert.assertTrue(Repeater.create("get script").every(Duration.millis(10)).limitTimeTo(Duration.FIVE_SECONDS).until(new Callable<Boolean>() {
-                public Boolean call() { 
-                    return (script.peekTask() != null) && Tasks.isQueuedOrSubmitted(script.peekTask());
-                }
-            }).run());
-            Task<Integer> task = script.peekTask();
-            Assert.assertTrue(BrooklynTaskTags.streams(task).size() >= 3, "Expected at least 3 streams: "+BrooklynTaskTags.streams(task));
-            // stdin should be populated
-            WrappedStream in = BrooklynTaskTags.stream(task, BrooklynTaskTags.STREAM_STDIN);
-            Assert.assertNotNull(in);
-            Assert.assertTrue(in.streamContents.get().contains("echo foo"), "Expected 'echo foo' but had: "+in.streamContents.get());
-            Assert.assertTrue(in.streamSize.get() > 0);
-            
-            // out and err should exist
-            WrappedStream out = BrooklynTaskTags.stream(task, BrooklynTaskTags.STREAM_STDOUT);
-            WrappedStream err = BrooklynTaskTags.stream(task, BrooklynTaskTags.STREAM_STDERR);
-            Assert.assertNotNull(out);
-            Assert.assertNotNull(err);
-            
-            // it should soon finish, with exit code
-            Integer result = task.getUnchecked(Duration.TEN_SECONDS);
-            Assert.assertNotNull(result);
-            Assert.assertTrue(result > 0, "Expected non-zero exit code: "+result);
-            // and should contain foobar in stdout
-            if (!script.getResultStdout().contains("foobar"))
-                Assert.fail("Script STDOUT does not contain expected text 'foobar'.\n"+script.getResultStdout()+
-                        "\nSTDERR:\n"+script.getResultStderr());
-            if (!out.streamContents.get().contains("foobar"))
-                Assert.fail("Task STDOUT does not contain expected text 'foobar'.\n"+out.streamContents.get()+
-                        "\nSTDERR:\n"+script.getResultStderr());
-            // and "No such file or directory" in stderr
-            if (!script.getResultStderr().contains("No such file or directory"))
-                Assert.fail("Script STDERR does not contain expected text 'No such ...'.\n"+script.getResultStdout()+
-                        "\nSTDERR:\n"+script.getResultStderr());
-            if (!err.streamContents.get().contains("No such file or directory"))
-                Assert.fail("Task STDERR does not contain expected text 'No such...'.\n"+out.streamContents.get()+
-                        "\nSTDERR:\n"+script.getResultStderr());
-        } finally {
-            em.shutdownNow();
-        }
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/lifecycle/ScriptHelperTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/ScriptHelperTest.java b/software/base/src/test/java/brooklyn/entity/basic/lifecycle/ScriptHelperTest.java
deleted file mode 100644
index f0288f3..0000000
--- a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/ScriptHelperTest.java
+++ /dev/null
@@ -1,159 +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.entity.basic.lifecycle;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
-import org.apache.brooklyn.entity.trait.Startable;
-import org.apache.brooklyn.sensor.feed.function.FunctionFeed;
-import org.apache.brooklyn.sensor.feed.function.FunctionPollConfig;
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.TestException;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.basic.SoftwareProcessEntityTest;
-import brooklyn.entity.basic.SoftwareProcessEntityTest.MyService;
-import brooklyn.entity.basic.SoftwareProcessEntityTest.MyServiceImpl;
-
-import org.apache.brooklyn.location.basic.FixedListMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.base.Functions;
-import com.google.common.collect.ImmutableList;
-
-public class ScriptHelperTest extends BrooklynAppUnitTestSupport {
-    
-    private static final Logger log = LoggerFactory.getLogger(ScriptHelperTest.class);
-    
-    private SshMachineLocation machine;
-    private FixedListMachineProvisioningLocation<SshMachineLocation> loc;
-    boolean shouldFail = false;
-    int failCount = 0;
-    
-    @BeforeMethod(alwaysRun=true)
-    @SuppressWarnings("unchecked")
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        loc = mgmt.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class));
-        machine = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class)
-                .configure("address", "localhost"));
-        loc.addMachine(machine);
-    }
-
-    @Test
-    public void testCheckRunningForcesInessential() {
-        MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class, MyServiceInessentialDriverImpl.class));
-        
-        entity.start(ImmutableList.of(loc));
-        SimulatedInessentialIsRunningDriver driver = (SimulatedInessentialIsRunningDriver) entity.getDriver();
-        Assert.assertTrue(driver.isRunning());
-        
-        EntityTestUtils.assertAttributeEqualsEventually(entity, SoftwareProcess.SERVICE_PROCESS_IS_RUNNING, true);
-        EntityTestUtils.assertAttributeEqualsEventually(entity, Startable.SERVICE_UP, true);
-        
-        log.debug("up, now cause failure");
-        
-        driver.setFailExecution(true);
-        EntityTestUtils.assertAttributeEqualsEventually(entity, SoftwareProcess.SERVICE_PROCESS_IS_RUNNING, false);
-        
-        log.debug("caught failure, now clear");
-        driver.setFailExecution(false);
-        EntityTestUtils.assertAttributeEqualsEventually(entity, SoftwareProcess.SERVICE_PROCESS_IS_RUNNING, true);
-    }
-    
-    public static class MyServiceInessentialDriverImpl extends MyServiceImpl {
-
-        @Override public Class<?> getDriverInterface() {
-            return SimulatedInessentialIsRunningDriver.class;
-        }
-
-        @Override
-        protected void connectSensors() {
-            super.connectSensors();
-            connectServiceUpIsRunning();
-        }
-        
-        @Override
-        public void connectServiceUpIsRunning() {
-//            super.connectServiceUpIsRunning();
-            // run more often
-            FunctionFeed.builder()
-                .entity(this)
-                .period(Duration.millis(10))
-                .poll(new FunctionPollConfig<Boolean, Boolean>(SERVICE_PROCESS_IS_RUNNING)
-                    .onException(Functions.constant(Boolean.FALSE))
-                    .callable(new Callable<Boolean>() {
-                        public Boolean call() {
-                            return getDriver().isRunning();
-                        }
-                    }))
-                .build();
-        }
-    }
-    
-    public static class SimulatedInessentialIsRunningDriver extends SoftwareProcessEntityTest.SimulatedDriver {
-        private boolean failExecution = false;
-
-        public SimulatedInessentialIsRunningDriver(EntityLocal entity, SshMachineLocation machine) {
-            super(entity, machine);
-        }
-        
-        @Override
-        public boolean isRunning() {
-            return newScript(CHECK_RUNNING)
-                .execute() == 0;
-        }
-        
-        @Override
-        public int execute(List<String> script, String summaryForLogging) {
-            if (failExecution) {
-                throw new TestException("Simulated driver exception");
-            }
-            return 0;
-        }
-        
-        @SuppressWarnings("rawtypes")
-        @Override
-        public int execute(Map flags2, List<String> script, String summaryForLogging) {
-            if (failExecution) {
-                throw new TestException("Simulated driver exception");
-            }
-            return 0;
-        }
-        
-        public void setFailExecution(boolean failExecution) {
-            this.failExecution = failExecution;
-        }
-        
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/lifecycle/StartStopSshDriverTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/StartStopSshDriverTest.java b/software/base/src/test/java/brooklyn/entity/basic/lifecycle/StartStopSshDriverTest.java
deleted file mode 100644
index 48bc72c..0000000
--- a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/StartStopSshDriverTest.java
+++ /dev/null
@@ -1,170 +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.entity.basic.lifecycle;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-import java.io.ByteArrayOutputStream;
-import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.internal.EntityLocal;
-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.core.BrooklynConfigKeys;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.internal.ssh.SshTool;
-import org.apache.brooklyn.util.core.internal.ssh.cli.SshCliTool;
-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 brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
-
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.base.Function;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
-public class StartStopSshDriverTest {
-
-    public class BasicStartStopSshDriver extends AbstractSoftwareProcessSshDriver {
-        public BasicStartStopSshDriver(EntityLocal entity, SshMachineLocation machine) {
-            super(entity, machine);
-        }
-        public boolean isRunning() { return true; }
-        public void stop() {}
-        public void kill() {}
-        public void install() {}
-        public void customize() {}
-        public void launch() {}
-    }
-
-    private static class ThreadIdTransformer implements Function<ThreadInfo, Long> {
-        @Override
-        public Long apply(ThreadInfo t) {
-            return t.getThreadId();
-        }
-    }
-
-    private TestApplication app;
-    private TestEntity entity;
-    private SshMachineLocationWithSshTool sshMachineLocation;
-    private AbstractSoftwareProcessSshDriver driver;
-
-    @SuppressWarnings("rawtypes")
-    protected static class SshMachineLocationWithSshTool extends SshMachineLocation {
-        private static final long serialVersionUID = 1L;
-
-        SshTool lastTool;
-        public SshMachineLocationWithSshTool(Map flags) { super(flags); }
-        public SshTool connectSsh(Map args) {
-            SshTool result = super.connectSsh(args);
-            lastTool = result;
-            return result;
-        }
-    }
-    
-    @BeforeMethod(alwaysRun = true)
-    public void setUp() {
-        app = new TestApplicationImpl();
-        entity = new TestEntityImpl(app);
-        Entities.startManagement(app);
-        sshMachineLocation = new SshMachineLocationWithSshTool(ImmutableMap.of("address", "localhost"));
-        driver = new BasicStartStopSshDriver(entity, sshMachineLocation);
-    }
-    
-    @Test(groups="Integration")
-    public void testExecuteDoesNotLeaveRunningStreamGobblerThread() {
-        List<ThreadInfo> existingThreads = getThreadsCalling(StreamGobbler.class);
-        final List<Long> existingThreadIds = getThreadId(existingThreads);
-        
-        List<String> script = Arrays.asList("echo hello");
-        driver.execute(script, "mytest");
-        
-        Asserts.succeedsEventually(ImmutableMap.of("timeout", 10*1000), new Runnable() {
-            @Override
-            public void run() {
-              List<ThreadInfo> currentThreads = getThreadsCalling(StreamGobbler.class);
-              Set<Long> currentThreadIds = MutableSet.copyOf(getThreadId(currentThreads));
-
-              currentThreadIds.removeAll(existingThreadIds);
-              assertEquals(currentThreadIds, ImmutableSet.<Long>of());
-            }
-        });
-    }
-
-    @Test(groups="Integration")
-    public void testSshScriptHeaderUsedWhenSpecified() {
-        entity.setConfig(BrooklynConfigKeys.SSH_CONFIG_SCRIPT_HEADER, "#!/bin/bash -e\necho hello world");
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        driver.execute(ImmutableMap.of("out", out), Arrays.asList("echo goodbye"), "test");
-        String s = out.toString();
-        assertTrue(s.contains("goodbye"), "should have said goodbye: "+s);
-        assertTrue(s.contains("hello world"), "should have said hello: "+s);
-        assertTrue(sshMachineLocation.lastTool instanceof SshjTool, "expect sshj tool, got "+
-            (sshMachineLocation.lastTool!=null ? ""+sshMachineLocation.lastTool.getClass()+":" : "") + sshMachineLocation.lastTool);
-    }
-
-    @Test(groups="Integration")
-    public void testSshCliPickedUpWhenSpecified() {
-        entity.setConfig(BrooklynConfigKeys.SSH_TOOL_CLASS, SshCliTool.class.getName());
-        driver.execute(Arrays.asList("echo hi"), "test");
-        assertTrue(sshMachineLocation.lastTool instanceof SshCliTool, "expect CLI tool, got "+
-                        (sshMachineLocation.lastTool!=null ? ""+sshMachineLocation.lastTool.getClass()+":" : "") + sshMachineLocation.lastTool);
-    }
-    
-    private List<ThreadInfo> getThreadsCalling(Class<?> clazz) {
-        String clazzName = clazz.getCanonicalName();
-        List<ThreadInfo> result = MutableList.of();
-        ThreadMXBean threadMxbean = ManagementFactory.getThreadMXBean();
-        ThreadInfo[] threads = threadMxbean.dumpAllThreads(false, false);
-        
-        for (ThreadInfo thread : threads) {
-            StackTraceElement[] stackTrace = thread.getStackTrace();
-            for (StackTraceElement stackTraceElement : stackTrace) {
-                if (clazzName == stackTraceElement.getClassName()) {
-                    result.add(thread);
-                    break;
-                }
-            }
-        }
-        return result;
-    }
-
-    private ImmutableList<Long> getThreadId(List<ThreadInfo> existingThreads) {
-        return FluentIterable.from(existingThreads).transform(new ThreadIdTransformer()).toList();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynClusterIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynClusterIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynClusterIntegrationTest.java
deleted file mode 100644
index e69abc2..0000000
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynClusterIntegrationTest.java
+++ /dev/null
@@ -1,97 +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.entity.brooklynnode;
-
-import java.io.File;
-import java.util.List;
-
-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.test.EntityTestUtils;
-import org.apache.brooklyn.util.javalang.JavaClassNames;
-import org.apache.brooklyn.util.net.Networking;
-import org.apache.brooklyn.util.os.Os;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.brooklynnode.BrooklynNode.ExistingFileBehaviour;
-
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-public class BrooklynClusterIntegrationTest extends BrooklynAppUnitTestSupport {
-
-    private static final Logger LOG = LoggerFactory.getLogger(BrooklynNodeIntegrationTest.class);
-
-    private File pseudoBrooklynPropertiesFile;
-    private File pseudoBrooklynCatalogFile;
-    private File persistenceDir;
-    private LocalhostMachineProvisioningLocation loc;
-    private List<LocalhostMachineProvisioningLocation> locs;
-
-    @BeforeMethod(alwaysRun=true)
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        pseudoBrooklynPropertiesFile = Os.newTempFile("brooklynnode-test", ".properties");
-        pseudoBrooklynPropertiesFile.delete();
-
-        pseudoBrooklynCatalogFile = Os.newTempFile("brooklynnode-test", ".catalog");
-        pseudoBrooklynCatalogFile.delete();
-
-        loc = app.newLocalhostProvisioningLocation();
-        locs = ImmutableList.of(loc);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    @Override
-    public void tearDown() throws Exception {
-        try {
-            super.tearDown();
-        } finally {
-            if (pseudoBrooklynPropertiesFile != null) pseudoBrooklynPropertiesFile.delete();
-            if (pseudoBrooklynCatalogFile != null) pseudoBrooklynCatalogFile.delete();
-            if (persistenceDir != null) Os.deleteRecursively(persistenceDir);
-        }
-    }
-
-    @Test(groups="Integration")
-    public void testCanStartAndStop() throws Exception {
-        BrooklynCluster cluster = app.createAndManageChild(EntitySpec.create(BrooklynCluster.class)
-                .configure(BrooklynCluster.INITIAL_SIZE, 1)
-                .configure(BrooklynNode.WEB_CONSOLE_BIND_ADDRESS, Networking.ANY_NIC)
-                .configure(BrooklynNode.ON_EXISTING_PROPERTIES_FILE, ExistingFileBehaviour.DO_NOT_USE));
-        app.start(locs);
-        Entity brooklynNode = Iterables.find(cluster.getMembers(), Predicates.instanceOf(BrooklynNode.class));
-        LOG.info("started "+app+" containing "+cluster+" for "+JavaClassNames.niceClassAndMethod());
-
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, BrooklynNode.SERVICE_UP, true);
-        EntityTestUtils.assertAttributeEqualsEventually(brooklynNode, BrooklynNode.SERVICE_UP, true);
-
-        cluster.stop();
-        EntityTestUtils.assertAttributeEquals(cluster, BrooklynNode.SERVICE_UP, false);
-    }    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
deleted file mode 100644
index fb4a99f..0000000
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeIntegrationTest.java
+++ /dev/null
@@ -1,630 +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.entity.brooklynnode;
-
-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 java.io.File;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.net.URI;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.core.internal.BrooklynProperties;
-import org.apache.brooklyn.core.objs.proxy.EntityProxyImpl;
-import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.entity.lifecycle.Lifecycle;
-import org.apache.brooklyn.entity.stock.BasicApplication;
-import org.apache.brooklyn.entity.stock.BasicApplicationImpl;
-import org.apache.brooklyn.sensor.feed.http.JsonFunctions;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.test.HttpTestUtils;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.http.HttpTool;
-import org.apache.brooklyn.util.core.http.HttpToolResponse;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.guava.Functionals;
-import org.apache.brooklyn.util.javalang.JavaClassNames;
-import org.apache.brooklyn.util.net.Networking;
-import org.apache.brooklyn.util.net.Urls;
-import org.apache.brooklyn.util.os.Os;
-import org.apache.brooklyn.util.text.Strings;
-import org.apache.brooklyn.util.time.Duration;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.HttpClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.basic.SoftwareProcess.StopSoftwareParameters.StopMode;
-import brooklyn.entity.brooklynnode.BrooklynNode.DeployBlueprintEffector;
-import brooklyn.entity.brooklynnode.BrooklynNode.ExistingFileBehaviour;
-import brooklyn.entity.brooklynnode.BrooklynNode.StopNodeAndKillAppsEffector;
-
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.Locations;
-import org.apache.brooklyn.location.basic.PortRanges;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.base.Charsets;
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.io.Files;
-
-/**
- * This test needs to able to access the binary artifact in order to run.
- * The default behaviour is to take this from maven, which works pretty well if you're downloading from hosted maven.
- * <p>
- * This class has been updated so that it does not effect or depend on the contents of ~/.brooklyn/brooklyn.properties .
- * <p>
- * If you wish to supply your own version (useful if testing changes locally!), you'll need to force download of this file.
- * The simplest way is to install:
- * <ul>
- * <li>file://$HOME/.brooklyn/repository/BrooklynNode/${VERSION}/BrooklynNode-${VERSION}.tar.gz - for snapshot versions (filename is default format due to lack of filename in sonatype inferencing; 
- *     note on case-sensitive systems it might have to be all in lower case!)
- * <li>file://$HOME/.brooklyn/repository/BrooklynNode/${VERSION}/brooklyn-${VERSION}-dist.tar.gz - for release versions, filename should match that in maven central
- * </ul>
- * In both cases, remember that you may also need to wipe the local apps cache ($BROOKLYN_DATA_DIR/installs/BrooklynNode).
- * The following commands may be useful:
- * <p>
- * <code>
- * cp ~/.m2/repository/org/apache/brooklyn/brooklyn-dist/0.7.0-SNAPSHOT/brooklyn-dist-0.7.0-SNAPSHOT-dist.tar.gz ~/.brooklyn/repository/BrooklynNode/0.7.0-SNAPSHOT/BrooklynNode-0.7.0-SNAPSHOT.tar.gz
- * rm -rf /tmp/brooklyn-`whoami`/installs/BrooklynNode*
- * </code>
- */
-public class BrooklynNodeIntegrationTest extends BrooklynAppUnitTestSupport {
-
-    private static final Logger log = LoggerFactory.getLogger(BrooklynNodeIntegrationTest.class);
-    
-    private File pseudoBrooklynPropertiesFile;
-    private File pseudoBrooklynCatalogFile;
-    private File persistenceDir;
-    private LocalhostMachineProvisioningLocation loc;
-    private List<LocalhostMachineProvisioningLocation> locs;
-
-    @BeforeMethod(alwaysRun=true)
-    @Override
-    public void setUp() throws Exception {
-        super.setUp();
-        pseudoBrooklynPropertiesFile = Os.newTempFile("brooklynnode-test", ".properties");
-        pseudoBrooklynPropertiesFile.delete();
-
-        pseudoBrooklynCatalogFile = Os.newTempFile("brooklynnode-test", ".catalog");
-        pseudoBrooklynCatalogFile.delete();
-
-        loc = app.newLocalhostProvisioningLocation();
-        locs = ImmutableList.of(loc);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    @Override
-    public void tearDown() throws Exception {
-        try {
-            super.tearDown();
-        } finally {
-            if (pseudoBrooklynPropertiesFile != null) pseudoBrooklynPropertiesFile.delete();
-            if (pseudoBrooklynCatalogFile != null) pseudoBrooklynCatalogFile.delete();
-            if (persistenceDir != null) Os.deleteRecursively(persistenceDir);
-        }
-    }
-
-    protected EntitySpec<BrooklynNode> newBrooklynNodeSpecForTest() {
-        // poor man's way to output which test is running
-        log.info("Creating entity spec for "+JavaClassNames.callerNiceClassAndMethod(1));
-        
-        return EntitySpec.create(BrooklynNode.class)
-                .configure(BrooklynNode.WEB_CONSOLE_BIND_ADDRESS, Networking.ANY_NIC)
-                .configure(BrooklynNode.ON_EXISTING_PROPERTIES_FILE, ExistingFileBehaviour.DO_NOT_USE);
-        
-        /* yaml equivalent, for testing:
-
-location: localhost
-services:
-- type: brooklyn.entity.brooklynnode.BrooklynNode
-  bindAddress: 127.0.0.1
-  onExistingProperties: do_not_use
-
-# some other options
-  enabledHttpProtocols: [ https ]
-  managementPassword: s3cr3t
-  brooklynLocalPropertiesContents: |
-    brooklyn.webconsole.security.https.required=true
-    brooklyn.webconsole.security.users=admin
-    brooklyn.webconsole.security.user.admin.password=s3cr3t
-    brooklyn.location.localhost.enabled=false
-
-         */
-    }
-
-    @Test(groups="Integration")
-    public void testCanStartAndStop() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest());
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        EntityTestUtils.assertAttributeEqualsEventually(brooklynNode, BrooklynNode.SERVICE_UP, true);
-
-        brooklynNode.stop();
-        EntityTestUtils.assertAttributeEquals(brooklynNode, BrooklynNode.SERVICE_UP, false);
-    }
-
-    @Test(groups="Integration")
-    public void testSetsGlobalBrooklynPropertiesFromContents() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_REMOTE_PATH, pseudoBrooklynPropertiesFile.getAbsolutePath())
-                .configure(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_CONTENTS, "abc=def"));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        assertEquals(Files.readLines(pseudoBrooklynPropertiesFile, Charsets.UTF_8), ImmutableList.of("abc=def"));
-    }
-
-    @Test(groups="Integration")
-    public void testSetsLocalBrooklynPropertiesFromContents() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_REMOTE_PATH, pseudoBrooklynPropertiesFile.getAbsolutePath())
-                .configure(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_CONTENTS, "abc=def"));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        assertEquals(Files.readLines(pseudoBrooklynPropertiesFile, Charsets.UTF_8), ImmutableList.of("abc=def"));
-    }
-
-    @Test(groups="Integration")
-    public void testSetsBrooklynPropertiesFromUri() throws Exception {
-        File brooklynPropertiesSourceFile = File.createTempFile("brooklynnode-test", ".properties");
-        Files.write("abc=def", brooklynPropertiesSourceFile, Charsets.UTF_8);
-
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_REMOTE_PATH, pseudoBrooklynPropertiesFile.getAbsolutePath())
-                .configure(BrooklynNode.BROOKLYN_GLOBAL_PROPERTIES_URI, brooklynPropertiesSourceFile.toURI().toString()));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        assertEquals(Files.readLines(pseudoBrooklynPropertiesFile, Charsets.UTF_8), ImmutableList.of("abc=def"));
-    }
-
-    @Test(groups="Integration")
-    public void testSetsBrooklynCatalogFromContents() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.BROOKLYN_CATALOG_REMOTE_PATH, pseudoBrooklynCatalogFile.getAbsolutePath())
-                .configure(BrooklynNode.BROOKLYN_CATALOG_CONTENTS, "<catalog/>"));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        assertEquals(Files.readLines(pseudoBrooklynCatalogFile, Charsets.UTF_8), ImmutableList.of("<catalog/>"));
-    }
-
-    @Test(groups="Integration")
-    public void testSetsBrooklynCatalogFromUri() throws Exception {
-        File brooklynCatalogSourceFile = File.createTempFile("brooklynnode-test", ".catalog");
-        Files.write("abc=def", brooklynCatalogSourceFile, Charsets.UTF_8);
-
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.BROOKLYN_CATALOG_REMOTE_PATH, pseudoBrooklynCatalogFile.getAbsolutePath())
-                .configure(BrooklynNode.BROOKLYN_CATALOG_URI, brooklynCatalogSourceFile.toURI().toString()));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        assertEquals(Files.readLines(pseudoBrooklynCatalogFile, Charsets.UTF_8), ImmutableList.of("abc=def"));
-    }
-
-    @Test(groups="Integration")
-    public void testCopiesResources() throws Exception {
-        File sourceFile = File.createTempFile("brooklynnode-test", ".properties");
-        Files.write("abc=def", sourceFile, Charsets.UTF_8);
-        File tempDir = Files.createTempDir();
-        File expectedFile = new File(tempDir, "myfile.txt");
-
-        try {
-            BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                    .configure(BrooklynNode.RUN_DIR, tempDir.getAbsolutePath())
-                    .configure(BrooklynNode.COPY_TO_RUNDIR, ImmutableMap.of(sourceFile.getAbsolutePath(), "${RUN}/myfile.txt")));
-            app.start(locs);
-            log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-            assertEquals(Files.readLines(expectedFile, Charsets.UTF_8), ImmutableList.of("abc=def"));
-        } finally {
-            expectedFile.delete();
-            tempDir.delete();
-            sourceFile.delete();
-        }
-    }
-
-    @Test(groups="Integration")
-    public void testCopiesClasspathEntriesInConfigKey() throws Exception {
-        String content = "abc=def";
-        File classpathEntry1 = File.createTempFile("first", ".properties");
-        File classpathEntry2 = File.createTempFile("second", ".properties");
-        Files.write(content, classpathEntry1, Charsets.UTF_8);
-        Files.write(content, classpathEntry2, Charsets.UTF_8);
-        File tempDir = Files.createTempDir();
-        File expectedFile1 = new File(new File(tempDir, "lib"), classpathEntry1.getName());
-        File expectedFile2 = new File(new File(tempDir, "lib"), classpathEntry2.getName());
-
-        try {
-            BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                    .configure(BrooklynNode.RUN_DIR, tempDir.getAbsolutePath())
-                    .configure(BrooklynNode.CLASSPATH, ImmutableList.of(classpathEntry1.getAbsolutePath(), classpathEntry2.getAbsolutePath()))
-                    );
-            app.start(locs);
-            log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-            assertEquals(Files.readLines(expectedFile1, Charsets.UTF_8), ImmutableList.of(content));
-            assertEquals(Files.readLines(expectedFile2, Charsets.UTF_8), ImmutableList.of(content));
-        } finally {
-            expectedFile1.delete();
-            expectedFile2.delete();
-            tempDir.delete();
-            classpathEntry1.delete();
-            classpathEntry2.delete();
-        }
-    }
-
-    @Test(groups="Integration")
-    public void testCopiesClasspathEntriesInBrooklynProperties() throws Exception {
-        String content = "abc=def";
-        File classpathEntry1 = File.createTempFile("first", ".properties");
-        File classpathEntry2 = File.createTempFile("second", ".properties");
-        Files.write(content, classpathEntry1, Charsets.UTF_8);
-        Files.write(content, classpathEntry2, Charsets.UTF_8);
-        File tempDir = Files.createTempDir();
-        File expectedFile1 = new File(new File(tempDir, "lib"), classpathEntry1.getName());
-        File expectedFile2 = new File(new File(tempDir, "lib"), classpathEntry2.getName());
-
-        try {
-            String propName = BrooklynNode.CLASSPATH.getName();
-            String propValue = classpathEntry1.toURI().toString() + "," + classpathEntry2.toURI().toString();
-            ((BrooklynProperties)app.getManagementContext().getConfig()).put(propName, propValue);
-    
-            BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                    .configure(BrooklynNode.RUN_DIR, tempDir.getAbsolutePath())
-                    );
-            app.start(locs);
-            log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-            assertEquals(Files.readLines(expectedFile1, Charsets.UTF_8), ImmutableList.of(content));
-            assertEquals(Files.readLines(expectedFile2, Charsets.UTF_8), ImmutableList.of(content));
-        } finally {
-            expectedFile1.delete();
-            expectedFile2.delete();
-            tempDir.delete();
-            classpathEntry1.delete();
-            classpathEntry2.delete();
-        }
-    }
-    
-    // TODO test that the classpath set above is actually used
-
-    @Test(groups="Integration")
-    public void testSetsBrooklynWebConsolePort() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.HTTP_PORT, PortRanges.fromString("45000+")));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        Integer httpPort = brooklynNode.getAttribute(BrooklynNode.HTTP_PORT);
-        URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI);
-        assertTrue(httpPort >= 45000 && httpPort < 54100, "httpPort="+httpPort);
-        assertEquals((Integer)webConsoleUri.getPort(), httpPort);
-        HttpTestUtils.assertHttpStatusCodeEquals(webConsoleUri.toString(), 200, 401);
-    }
-
-    @Test(groups="Integration")
-    public void testStartsAppOnStartup() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.APP, BasicApplicationImpl.class.getName()));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI);
-        waitForApps(webConsoleUri, 1);
-        String apps = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
-        List<String> appType = parseJsonList(apps, ImmutableList.of("spec", "type"), String.class);
-        assertEquals(appType, ImmutableList.of(BasicApplication.class.getName()));
-    }
-
-    protected static void waitForApps(String webConsoleUri) {
-        HttpTestUtils.assertHttpStatusCodeEquals(webConsoleUri+"/v1/applications", 200, 403);
-        HttpTestUtils.assertHttpStatusCodeEventuallyEquals(webConsoleUri+"/v1/applications", 200);
-    }
-
-    // TODO Should introduce startup stages and let the client select which stage it expects to be complete
-    protected void waitForApps(final URI webConsoleUri, final int num) {
-        waitForApps(webConsoleUri.toString());
-        
-        // e.g. [{"id":"UnBqPcqg","spec":{"name":"Application (UnBqPcqg)","type":"brooklyn.entity.basic.BasicApplication","locations":["pOL4NtiW"]},"status":"RUNNING","links":{"self":"/v1/applications/UnBqPcqg","entities":"/v1/applications/UnBqPcqg/entities"}}]
-        Asserts.succeedsEventually(new Runnable() {
-            @Override
-            public void run() {
-                //Wait all apps to become managed
-                String appsContent = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
-                List<String> appIds = parseJsonList(appsContent, ImmutableList.of("id"), String.class);
-                assertEquals(appIds.size(), num);
-                
-                // and then to start
-                List<String> statuses = parseJsonList(appsContent, ImmutableList.of("status"), String.class);
-                for (String status : statuses) {
-                    assertEquals(status, Lifecycle.RUNNING.toString().toUpperCase());
-                }
-            }});
-    }
-
-    @Test(groups="Integration")
-    public void testStartsAppViaEffector() throws Exception {
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest());
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-        
-        // note there is also a test for this in DeployApplication
-        final URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI);
-        waitForApps(webConsoleUri.toString());
-
-        final String id = brooklynNode.invoke(BrooklynNode.DEPLOY_BLUEPRINT, ConfigBag.newInstance()
-            .configure(DeployBlueprintEffector.BLUEPRINT_TYPE, BasicApplication.class.getName())
-            .getAllConfig()).get();
-        
-        String apps = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
-        List<String> appType = parseJsonList(apps, ImmutableList.of("spec", "type"), String.class);
-        assertEquals(appType, ImmutableList.of(BasicApplication.class.getName()));
-        
-        HttpTestUtils.assertContentEventuallyMatches(
-            webConsoleUri.toString()+"/v1/applications/"+id+"/entities/"+id+"/sensors/service.state",
-            "\"?(running|RUNNING)\"?");
-    }
-    
-    @Test(groups="Integration")
-    public void testUsesLocation() throws Exception {
-        String brooklynPropertiesContents = 
-            "brooklyn.location.named.mynamedloc=localhost:(name=myname)\n"+
-                //force lat+long so test will work when offline
-                "brooklyn.location.named.mynamedloc.latitude=123\n"+ 
-                "brooklyn.location.named.mynamedloc.longitude=45.6\n";
-
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-            .configure(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_CONTENTS, brooklynPropertiesContents)
-            .configure(BrooklynNode.APP, BasicApplicationImpl.class.getName())
-            .configure(BrooklynNode.LOCATIONS, "named:mynamedloc"));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI);
-        waitForApps(webConsoleUri, 1);
-
-        // Check that "mynamedloc" has been picked up from the brooklyn.properties
-        String locsContent = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/locations");
-        List<String> locNames = parseJsonList(locsContent, ImmutableList.of("name"), String.class);
-        assertTrue(locNames.contains("mynamedloc"), "locNames="+locNames);
-
-        // Find the id of the concrete location instance of the app
-        String appsContent = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
-        List<String[]> appLocationIds = parseJsonList(appsContent, ImmutableList.of("spec", "locations"), String[].class);
-        String appLocationId = Iterables.getOnlyElement(appLocationIds)[0];  // app.getManagementContext().getLocationRegistry()
-
-        // Check that the concrete location is of the required type
-        String locatedLocationsContent = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/locations/usage/LocatedLocations");
-        assertEquals(parseJson(locatedLocationsContent, ImmutableList.of(appLocationId, "name"), String.class), "myname");
-        assertEquals(parseJson(locatedLocationsContent, ImmutableList.of(appLocationId, "longitude"), Double.class), 45.6, 0.00001);
-    }
-
-    @Test(groups="Integration")
-    public void testAuthenticationAndHttps() throws Exception {
-        String adminPassword = "p4ssw0rd";
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-            .configure(BrooklynNode.ENABLED_HTTP_PROTOCOLS, ImmutableList.of("https"))
-            .configure(BrooklynNode.MANAGEMENT_PASSWORD, adminPassword)
-            .configure(BrooklynNode.BROOKLYN_LOCAL_PROPERTIES_CONTENTS,
-                Strings.lines(
-                    "brooklyn.webconsole.security.https.required=true",
-                    "brooklyn.webconsole.security.users=admin",
-                    "brooklyn.webconsole.security.user.admin.password="+adminPassword,
-                    "brooklyn.location.localhost.enabled=false") )
-            );
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI);
-        Assert.assertTrue(webConsoleUri.toString().startsWith("https://"), "web console not https: "+webConsoleUri);
-        Integer httpsPort = brooklynNode.getAttribute(BrooklynNode.HTTPS_PORT);
-        Assert.assertTrue(httpsPort!=null && httpsPort >= 8443 && httpsPort <= 8500);
-        Assert.assertTrue(webConsoleUri.toString().contains(""+httpsPort), "web console not using right https port ("+httpsPort+"): "+webConsoleUri);
-        HttpTestUtils.assertHttpStatusCodeEquals(webConsoleUri.toString(), 401);
-
-        HttpClient http = HttpTool.httpClientBuilder()
-            .trustAll()
-            .uri(webConsoleUri)
-            .laxRedirect(true)
-            .credentials(new UsernamePasswordCredentials("admin", adminPassword))
-            .build();
-        HttpToolResponse response = HttpTool.httpGet(http, webConsoleUri, MutableMap.<String,String>of());
-        Assert.assertEquals(response.getResponseCode(), 200);
-    }
-
-    @Test(groups="Integration")
-    public void testStopPlainThrowsException() throws Exception {
-        BrooklynNode brooklynNode = setUpBrooklynNodeWithApp();
-
-        // Not using annotation with `expectedExceptions = PropagatedRuntimeException.class` because want to 
-        // ensure exception comes from stop. On jenkins, was seeing setUpBrooklynNodeWithApp fail in 
-        // testStopAndKillAppsEffector; so can't tell if this method was really passing!
-        try {
-            brooklynNode.stop();
-            fail("Expected "+brooklynNode+" stop to fail, because has app");
-        } catch (Exception e) {
-            IllegalStateException ise = Exceptions.getFirstThrowableOfType(e, IllegalStateException.class);
-            if (ise != null && ise.toString().contains("Can't stop instance with running applications")) {
-                // success
-            } else {
-                throw e;
-            }
-        } finally {
-            try {
-                brooklynNode.invoke(BrooklynNode.STOP_NODE_AND_KILL_APPS, ImmutableMap.of(StopNodeAndKillAppsEffector.TIMEOUT.getName(), Duration.THIRTY_SECONDS)).getUnchecked();
-            } catch (Exception e) {
-                log.warn("Error in stopNodeAndKillApps for "+brooklynNode+" (continuing)", e);
-            }
-        }
-    }
-
-    @Test(groups="Integration")
-    public void testStopAndKillAppsEffector() throws Exception {
-        createNodeAndExecStopEffector(BrooklynNode.STOP_NODE_AND_KILL_APPS);
-    }
-
-    @Test(groups="Integration")
-    public void testStopButLeaveAppsEffector() throws Exception {
-        createNodeAndExecStopEffector(BrooklynNode.STOP_NODE_BUT_LEAVE_APPS);
-    }
-    
-    @Test(groups="Integration")
-    public void testStopAndRestartProcess() throws Exception {
-        persistenceDir = Files.createTempDir();
-        BrooklynNode brooklynNode = app.createAndManageChild(newBrooklynNodeSpecForTest()
-                .configure(BrooklynNode.EXTRA_LAUNCH_PARAMETERS, "--persist auto --persistenceDir "+persistenceDir.getAbsolutePath())
-                .configure(BrooklynNode.APP, BasicApplicationImpl.class.getName()));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-        File pidFile = new File(getDriver(brooklynNode).getPidFile());
-        URI webConsoleUri = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI);
-
-        waitForApps(webConsoleUri, 1);
-
-        // Stop just the process; will not have unmanaged entity unless machine was being terminated 
-        brooklynNode.invoke(BrooklynNode.STOP, ImmutableMap.<String, Object>of(
-                BrooklynNode.StopSoftwareParameters.STOP_MACHINE_MODE.getName(), StopMode.NEVER,
-                BrooklynNode.StopSoftwareParameters.STOP_PROCESS_MODE.getName(), StopMode.ALWAYS)).getUnchecked();
-
-        assertTrue(Entities.isManaged(brooklynNode));
-        assertFalse(isPidRunning(pidFile), "pid in "+pidFile+" still running");
-        
-        // Clear the startup app so it's not started second time, in addition to the rebind state
-        // TODO remove this once the startup app is created only if no previous persistence state
-        brooklynNode.config().set(BrooklynNode.APP, (String)null);
-        ((EntityLocal)brooklynNode).setAttribute(BrooklynNode.APP, null);
-        
-        // Restart the process; expect persisted state to have been restored, so apps still known about
-        brooklynNode.invoke(BrooklynNode.RESTART, ImmutableMap.<String, Object>of(
-                BrooklynNode.RestartSoftwareParameters.RESTART_MACHINE.getName(), "false")).getUnchecked();
-
-        waitForApps(webConsoleUri.toString());
-        String apps = HttpTestUtils.getContent(webConsoleUri.toString()+"/v1/applications");
-        List<String> appType = parseJsonList(apps, ImmutableList.of("spec", "type"), String.class);
-        assertEquals(appType, ImmutableList.of(BasicApplication.class.getName()));
-    }
-
-    private void createNodeAndExecStopEffector(Effector<?> eff) throws Exception {
-        BrooklynNode brooklynNode = setUpBrooklynNodeWithApp();
-        File pidFile = new File(getDriver(brooklynNode).getPidFile());
-        assertTrue(isPidRunning(pidFile));
-        
-        brooklynNode.invoke(eff, Collections.<String, Object>emptyMap()).getUnchecked();
-
-        // Note can't use driver.isRunning to check shutdown; can't invoke scripts on an unmanaged entity
-        EntityTestUtils.assertAttributeEquals(brooklynNode, BrooklynNode.SERVICE_UP, false);
-        
-        // unmanaged if the machine is destroyed - ie false on localhost (this test by default), but true in the cloud 
-//        assertFalse(Entities.isManaged(brooklynNode));
-        
-        assertFalse(isPidRunning(pidFile), "pid in "+pidFile+" still running");
-    }
-
-    private boolean isPidRunning(File pidFile) throws Exception {
-        SshMachineLocation machine = loc.obtain();
-        try {
-            int result = machine.execScript("check-pid", ImmutableList.of(
-                    "test -f "+pidFile+" || exit 1",
-                    "ps -p `cat "+pidFile+"`"));
-            return result == 0;
-        } finally {
-            loc.release(machine);
-            Locations.unmanage(machine);
-        }
-    }
-    
-    private BrooklynNodeSshDriver getDriver(BrooklynNode brooklynNode) {
-        try {
-            EntityProxyImpl entityProxy = (EntityProxyImpl)Proxy.getInvocationHandler(brooklynNode);
-            Method getDriver = BrooklynNodeImpl.class.getMethod("getDriver");
-            return (BrooklynNodeSshDriver)entityProxy.invoke(brooklynNode, getDriver, new Object[]{});
-        } catch (Throwable e) {
-            throw Exceptions.propagate(e);
-        }
-    }
-
-    private BrooklynNode setUpBrooklynNodeWithApp() throws InterruptedException,
-            ExecutionException {
-        BrooklynNode brooklynNode = app.createAndManageChild(EntitySpec.create(BrooklynNode.class)
-                .configure(BrooklynNode.NO_WEB_CONSOLE_AUTHENTICATION, Boolean.TRUE));
-        app.start(locs);
-        log.info("started "+app+" containing "+brooklynNode+" for "+JavaClassNames.niceClassAndMethod());
-
-        EntityTestUtils.assertAttributeEqualsEventually(brooklynNode, BrooklynNode.SERVICE_UP, true);
-
-        String baseUrl = brooklynNode.getAttribute(BrooklynNode.WEB_CONSOLE_URI).toString();
-        waitForApps(baseUrl);
-        
-        final String id = brooklynNode.invoke(BrooklynNode.DEPLOY_BLUEPRINT, ConfigBag.newInstance()
-                .configure(DeployBlueprintEffector.BLUEPRINT_TYPE, BasicApplication.class.getName())
-                .getAllConfig()).get();
-
-        String entityUrl = Urls.mergePaths(baseUrl, "v1/applications/", id, "entities", id);
-        
-        Entity mirror = brooklynNode.addChild(EntitySpec.create(BrooklynEntityMirror.class)
-                .configure(BrooklynEntityMirror.MIRRORED_ENTITY_URL, entityUrl)
-                .configure(BrooklynEntityMirror.MIRRORED_ENTITY_ID, id));
-        Entities.manage(mirror);
-
-        assertEquals(brooklynNode.getChildren().size(), 1);
-        return brooklynNode;
-    }
-
-    private <T> T parseJson(String json, List<String> elements, Class<T> clazz) {
-        Function<String, T> func = Functionals.chain(
-                JsonFunctions.asJson(),
-                JsonFunctions.walk(elements),
-                JsonFunctions.cast(clazz));
-        return func.apply(json);
-    }
-
-    private <T> List<T> parseJsonList(String json, List<String> elements, Class<T> clazz) {
-        Function<String, List<T>> func = Functionals.chain(
-                JsonFunctions.asJson(),
-                JsonFunctions.forEach(Functionals.chain(
-                        JsonFunctions.walk(elements),
-                        JsonFunctions.cast(clazz))));
-        return func.apply(json);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeTest.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeTest.java
deleted file mode 100644
index 1745c38..0000000
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/BrooklynNodeTest.java
+++ /dev/null
@@ -1,138 +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.entity.brooklynnode;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-import java.util.List;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolver;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.entity.trait.Startable;
-import org.apache.brooklyn.sensor.feed.ConfigToAttributes;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.time.Duration;
-import org.apache.brooklyn.util.time.Time;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-public class BrooklynNodeTest {
-
-    // TODO Need test for copying/setting classpath
-    
-    private TestApplication app;
-    private SshMachineLocation loc;
-    
-    public static class SlowStopBrooklynNode extends BrooklynNodeImpl {
-        public SlowStopBrooklynNode() {}
-        
-        @Override
-        protected void postStop() {
-            super.postStop();
-            
-            //Make sure UnmanageTask will wait for the STOP effector to complete.
-            Time.sleep(Duration.FIVE_SECONDS);
-        }
-        
-    }
-
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        loc = new SshMachineLocation(MutableMap.of("address", "localhost"));
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-    
-    @Test
-    public void testGeneratesCorrectSnapshotDownload() throws Exception {
-        String version = "0.0.1-SNAPSHOT";
-        String expectedUrl = "https://repository.apache.org/service/local/artifact/maven/redirect?r=snapshots&g=org.apache.brooklyn&v="+version+"&a=brooklyn-dist&c=dist&e=tar.gz";
-        runTestGeneratesCorrectDownloadUrl(version, expectedUrl);
-    }
-    
-    @Test
-    public void testGeneratesCorrectReleaseDownload() throws Exception {
-        String version = "0.0.1";
-        String expectedUrl = "http://search.maven.org/remotecontent?filepath=org/apache/brooklyn/brooklyn-dist/"+version+"/brooklyn-dist-"+version+"-dist.tar.gz";
-        runTestGeneratesCorrectDownloadUrl(version, expectedUrl);
-    }
-    
-    private void runTestGeneratesCorrectDownloadUrl(String version, String expectedUrl) throws Exception {
-        // TODO Using BrooklynNodeImpl directly, because want to instantiate a BroolynNodeSshDriver.
-        //      Really want to make that easier to test, without going through "wrong" code path for creating entity.
-        BrooklynNodeImpl entity = new BrooklynNodeImpl();
-        entity.setConfig(BrooklynNode.SUGGESTED_VERSION, version);
-        entity.setParent(app);
-        Entities.manage(entity);
-        ConfigToAttributes.apply(entity);
-        BrooklynNodeSshDriver driver = new BrooklynNodeSshDriver(entity, loc);
-        
-        DownloadResolver resolver = Entities.newDownloader(driver);
-        List<String> urls = resolver.getTargets();
-        
-        System.out.println("urls="+urls);
-        assertTrue(urls.contains(expectedUrl), "urls="+urls);
-    }
-    
-    @Test(groups = "Integration")
-    public void testUnmanageOnStop() throws Exception {
-        final BrooklynNode node = app.addChild(EntitySpec.create(BrooklynNode.class).impl(SlowStopBrooklynNode.class));
-        Entities.manage(node);
-        assertTrue(Entities.isManaged(node), "Entity " + node + " must be managed.");
-        node.invoke(Startable.STOP, ImmutableMap.<String,Object>of()).asTask().getUnchecked();
-        //The UnmanageTask will unblock after the STOP effector completes, so we are competing with it here.
-        Asserts.succeedsEventually(new Runnable() {
-            @Override
-            public void run() {
-                assertFalse(Entities.isManaged(node));
-            }
-        });
-    }
-    
-
-    @Test
-    public void testCanStartSameNode() throws Exception {
-        // not very interesting as do not have REST when run in this project
-        // but test BrooklynNodeRestTest in downstream project does
-        BrooklynNode bn = app.createAndManageChild(EntitySpec.create(BrooklynNode.class, SameBrooklynNodeImpl.class));
-        bn.start(MutableSet.<Location>of());
-        
-        Assert.assertEquals(bn.getAttribute(Attributes.SERVICE_UP), (Boolean)true);
-        // no URI
-        Assert.assertNull(bn.getAttribute(BrooklynNode.WEB_CONSOLE_URI));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/brooklynnode/CallbackEntityHttpClient.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/CallbackEntityHttpClient.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/CallbackEntityHttpClient.java
deleted file mode 100644
index 53712ab..0000000
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/CallbackEntityHttpClient.java
+++ /dev/null
@@ -1,101 +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.entity.brooklynnode;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.util.core.http.HttpToolResponse;
-import org.apache.brooklyn.util.core.http.HttpTool.HttpClientBuilder;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-
-import brooklyn.entity.brooklynnode.EntityHttpClient;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-
-public class CallbackEntityHttpClient implements EntityHttpClient {
-    public static class Request {
-        private Entity entity;
-        private String method;
-        private String path;
-        private Map<String, String> params;
-        public Request(Entity entity, String method, String path, Map<String, String> params) {
-            this.entity = entity;
-            this.method = method;
-            this.path = path;
-            this.params = params;
-        }
-        public Entity getEntity() {
-            return entity;
-        }
-        public String getMethod() {
-            return method;
-        }
-        public String getPath() {
-            return path;
-        }
-        public Map<String, String> getParams() {
-            return params;
-        }
-    }
-    private Function<Request, String> callback;
-    private Entity entity;
-
-    public CallbackEntityHttpClient(Entity entity, Function<Request, String> callback) {
-        this.entity = entity;
-        this.callback = callback;
-    }
-
-    @Override
-    public HttpClientBuilder getHttpClientForBrooklynNode() {
-        throw new IllegalStateException("Method call not expected");
-    }
-
-    @Override
-    public HttpToolResponse get(String path) {
-        String result = callback.apply(new Request(entity, HttpGet.METHOD_NAME, path, Collections.<String, String>emptyMap()));
-        return new HttpToolResponse(HttpStatus.SC_OK, null, result.getBytes(), 0, 0, 0);
-    }
-
-    @Override
-    public HttpToolResponse post(String path, Map<String, String> headers, byte[] body) {
-        throw new IllegalStateException("Method call not expected");
-    }
-
-    @Override
-    public HttpToolResponse post(String path, Map<String, String> headers, Map<String, String> formParams) {
-        String result = callback.apply(new Request(entity, HttpPost.METHOD_NAME, path, formParams));
-        return new HttpToolResponse(HttpStatus.SC_OK, Collections.<String, List<String>>emptyMap(), result.getBytes(), 0, 0, 0);
-    }
-    
-    @Override
-    public HttpToolResponse delete(String path, Map<String, String> headers) {
-        throw new IllegalStateException("Method call not expected");
-    }
-
-    @Override
-    public EntityHttpClient responseSuccess(Predicate<Integer> successPredicate) {
-        throw new IllegalStateException("Method call not expected");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/brooklynnode/MockBrooklynNode.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/MockBrooklynNode.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/MockBrooklynNode.java
deleted file mode 100644
index 4a8cbb0..0000000
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/MockBrooklynNode.java
+++ /dev/null
@@ -1,71 +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.entity.brooklynnode;
-
-import java.util.Collection;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.entity.core.AbstractEntity;
-import org.apache.brooklyn.sensor.core.BasicAttributeSensor;
-
-import brooklyn.entity.brooklynnode.CallbackEntityHttpClient.Request;
-import brooklyn.entity.brooklynnode.effector.SetHighAvailabilityModeEffectorBody;
-import brooklyn.entity.brooklynnode.effector.SetHighAvailabilityPriorityEffectorBody;
-
-import com.google.common.base.Function;
-import com.google.common.reflect.TypeToken;
-
-public class MockBrooklynNode extends AbstractEntity implements BrooklynNode {
-    @SuppressWarnings("serial")
-    public static final ConfigKey<Function<Request, String>> HTTP_CLIENT_CALLBACK = ConfigKeys.newConfigKey(new TypeToken<Function<Request, String>>(){}, "httpClientCallback");
-    public static final AttributeSensor<Integer> HA_PRIORITY = new BasicAttributeSensor<Integer>(Integer.class, "priority");
-    
-    @Override
-    public void init() {
-        super.init();
-        getMutableEntityType().addEffector(SetHighAvailabilityPriorityEffectorBody.SET_HIGH_AVAILABILITY_PRIORITY);
-        getMutableEntityType().addEffector(SetHighAvailabilityModeEffectorBody.SET_HIGH_AVAILABILITY_MODE);
-        setAttribute(HA_PRIORITY, 0);
-    }
-
-    @Override
-    public EntityHttpClient http() {
-        return new CallbackEntityHttpClient(this, getConfig(HTTP_CLIENT_CALLBACK));
-    }
-
-    @Override
-    public void start(Collection<? extends Location> locations) {
-    }
-
-    @Override
-    public void stop() {
-    }
-
-    @Override
-    public void restart() {
-    }
-
-    @Override
-    public void populateServiceNotUpDiagnostics() {
-        // no-op
-    }    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/brooklynnode/SameBrooklynNodeImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/brooklynnode/SameBrooklynNodeImpl.java b/software/base/src/test/java/brooklyn/entity/brooklynnode/SameBrooklynNodeImpl.java
deleted file mode 100644
index dc35de0..0000000
--- a/software/base/src/test/java/brooklyn/entity/brooklynnode/SameBrooklynNodeImpl.java
+++ /dev/null
@@ -1,96 +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.entity.brooklynnode;
-
-import java.net.URI;
-import java.util.Collection;
-
-import brooklyn.entity.brooklynnode.BrooklynNodeImpl.DeployBlueprintEffectorBody;
-
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.entity.core.AbstractEntity;
-import org.apache.brooklyn.sensor.feed.http.HttpFeed;
-import org.apache.brooklyn.sensor.feed.http.HttpPollConfig;
-import org.apache.brooklyn.sensor.feed.http.HttpValueFunctions;
-
-/** Implementation of BrooklynNode which just presents the node where this is running, for convenience;
- * 
- *  start/stop/restart have no effect; 
- *  sensors are connected;
- *  deploy blueprint assumes that a REST endpoint is available */
-public class SameBrooklynNodeImpl extends AbstractEntity implements BrooklynNode {
-    
-    private HttpFeed httpFeed;
-
-    @Override
-    public void start(Collection<? extends Location> locations) {
-        connectSensors();
-    }
-
-    @Override
-    public void stop() {
-        disconnectSensors();
-    }
-
-    @Override
-    public void restart() {
-        return;
-    }
-
-    
-    @Override
-    public void init() {
-        super.init();
-        getMutableEntityType().addEffector(DeployBlueprintEffectorBody.DEPLOY_BLUEPRINT);
-    }
-    
-    protected void connectSensors() {
-        URI webConsoleUri = getManagementContext().getManagementNodeUri().orNull();
-        setAttribute(WEB_CONSOLE_URI, webConsoleUri);
-
-        if (webConsoleUri != null) {
-            httpFeed = HttpFeed.builder()
-                    .entity(this)
-                    .period(200)
-                    .baseUri(webConsoleUri)
-                    .credentialsIfNotNull(getConfig(MANAGEMENT_USER), getConfig(MANAGEMENT_PASSWORD))
-                    .poll(new HttpPollConfig<Boolean>(SERVICE_UP)
-                            .onSuccess(HttpValueFunctions.responseCodeEquals(200))
-                            .setOnFailureOrException(false))
-                    .build();
-
-        } else {
-            setAttribute(SERVICE_UP, true);
-        }
-    }
-    
-    protected void disconnectSensors() {
-        if (httpFeed != null) httpFeed.stop();
-    }
-
-    @Override
-    public EntityHttpClient http() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void populateServiceNotUpDiagnostics() {
-        // no-op
-    }    
-}