You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/08/12 17:55:27 UTC

[09/35] incubator-brooklyn git commit: [BROOKLYN-162] package rename to org.apache.brooklyn: software/webapp

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.java b/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.java
deleted file mode 100644
index 3646155..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/proxy/nginx/NginxWebClusterEc2LiveTest.java
+++ /dev/null
@@ -1,115 +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.proxy.nginx;
-
-import static org.testng.Assert.assertNotNull;
-
-import java.net.URL;
-
-import org.apache.brooklyn.management.ManagementContext;
-import org.apache.brooklyn.test.HttpTestUtils;
-import org.apache.brooklyn.test.TestResourceUnavailableException;
-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.Entity;
-import brooklyn.entity.basic.ApplicationBuilder;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.group.DynamicCluster;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.webapp.JavaWebAppService;
-import brooklyn.entity.webapp.WebAppService;
-import brooklyn.entity.webapp.jboss.JBoss7Server;
-import brooklyn.location.Location;
-import brooklyn.location.MachineLocation;
-import brooklyn.location.basic.Machines;
-import brooklyn.test.Asserts;
-import brooklyn.test.entity.TestApplication;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Test Nginx proxying a cluster of JBoss7Server entities on AWS for ENGR-1689.
- *
- * This test is a proof-of-concept for the Brooklyn demo application, with each
- * service running on a separate Amazon EC2 instance.
- */
-public class NginxWebClusterEc2LiveTest {
-    private static final Logger LOG = LoggerFactory.getLogger(NginxWebClusterEc2LiveTest.class);
-    
-    private TestApplication app;
-    private NginxController nginx;
-    private DynamicCluster cluster;
-    private Location loc;
-
-    @BeforeMethod(alwaysRun = true)
-    public void setUp() {
-        ManagementContext managementContext = Entities.newManagementContext(
-                ImmutableMap.of("brooklyn.location.jclouds.aws-ec2.image-id", "us-east-1/ami-2342a94a"));
-        
-        loc = managementContext.getLocationRegistry().resolve("aws-ec2:us-east-1");
-        app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
-    }
-
-    @AfterMethod(alwaysRun = true)
-    public void shutdown() {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    @Test(groups = "Live")
-    public void testProvisionAwsCluster() {
-        String warName = "/hello-world.war";
-        TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), warName);
-        URL war = getClass().getResource(warName);
-        assertNotNull(war, "Unable to locate resource "+warName);
-        
-        cluster = app.createAndManageChild(EntitySpec.create(DynamicCluster.class)
-                .configure(DynamicCluster.MEMBER_SPEC, EntitySpec.create(JBoss7Server.class))
-                .configure("initialSize", 2)
-                .configure("httpPort", 8080)
-                .configure(JavaWebAppService.ROOT_WAR, war.getPath()));
-        
-        nginx = app.createAndManageChild(EntitySpec.create(NginxController.class)
-                .configure("cluster", cluster)
-                .configure("domain", "localhost")
-                .configure("port", 8000)
-                .configure("portNumberSensor", WebAppService.HTTP_PORT));
-
-        app.start(ImmutableList.of(loc));
-        
-        Asserts.succeedsEventually(new Runnable() {
-            public void run() {
-                // Nginx URL is available
-                MachineLocation machine = Machines.findUniqueMachineLocation(nginx.getLocations()).get();
-                String url = "http://" + machine.getAddress().getHostName() + ":" + nginx.getAttribute(NginxController.PROXY_HTTP_PORT) + "/swf-booking-mvc";
-                HttpTestUtils.assertHttpStatusCodeEquals(url, 200);
-    
-                // Web-app URL is available
-                for (Entity member : cluster.getMembers()) {
-                    HttpTestUtils.assertHttpStatusCodeEquals(member.getAttribute(JavaWebAppService.ROOT_URL) + "swf-booking-mvc", 200);
-                }
-            }});
-
-        nginx.stop();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
deleted file mode 100644
index 5ff4d0b..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/AbstractWebAppFixtureIntegrationTest.java
+++ /dev/null
@@ -1,502 +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.webapp;
-
-import static org.apache.brooklyn.test.HttpTestUtils.connectToUrl;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.security.KeyStore;
-import java.security.cert.Certificate;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import brooklyn.entity.basic.SoftwareProcessDriver;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import brooklyn.config.BrooklynProperties;
-import brooklyn.entity.Application;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.ApplicationBuilder;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityInternal;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.drivers.DriverDependentEntity;
-import brooklyn.entity.trait.Startable;
-import brooklyn.event.SensorEvent;
-import brooklyn.event.SensorEventListener;
-import brooklyn.location.LocationSpec;
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import brooklyn.test.Asserts;
-
-import org.apache.brooklyn.management.ManagementContext;
-import org.apache.brooklyn.management.SubscriptionContext;
-import org.apache.brooklyn.management.SubscriptionHandle;
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.test.HttpTestUtils;
-import org.apache.brooklyn.test.TestResourceUnavailableException;
-
-import brooklyn.test.entity.LocalManagementContextForTests;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.crypto.FluentKeySigner;
-import brooklyn.util.crypto.SecureKeys;
-import brooklyn.util.net.Urls;
-import brooklyn.util.stream.Streams;
-import brooklyn.util.time.Time;
-
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-
-/**
- * Test fixture for implementations of JavaWebApp, checking start up and shutdown, 
- * post request and error count metrics and deploy wars, etc.
- */
-public abstract class AbstractWebAppFixtureIntegrationTest {
-    
-    private static final Logger log = LoggerFactory.getLogger(AbstractWebAppFixtureIntegrationTest.class);
-    
-    // Don't use 8080 since that is commonly used by testing software
-    public static final String DEFAULT_HTTP_PORT = "7880+";
-    
-    // Port increment for JBoss 6.
-    public static final int PORT_INCREMENT = 400;
-
-    // The parent application entity for these tests
-    protected ManagementContext mgmt;
-    protected List<TestApplication> applications = Lists.newArrayList();
-    protected SoftwareProcess entity;
-    protected LocalhostMachineProvisioningLocation loc;
-
-    protected synchronized ManagementContext getMgmt() {
-        if (mgmt==null)
-            mgmt = new LocalManagementContextForTests(BrooklynProperties.Factory.newDefault());
-        return mgmt;
-    }
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        loc = getMgmt().getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class));
-    }
-    
-    /*
-     * Use of @DataProvider with test methods gives surprising behaviour with @AfterMethod.
-     * Unless careful, this causes problems when trying to ensure everything is shutdown cleanly.
-     *
-     * Empirically, the rules seem to be...
-     *  - @DataProvider method is called first; it creates a bunch of cases to run 
-     *    (all sharing the same instance of WebAppIntegrationTest).
-     *  - It runs the test method for the first time with the first @DataProvider value
-     *  - It runs @AfterMethod
-     *  - It runs the test method for the second @DataProvider value
-     *  - It runs @AfterMethod
-     *  - etc...
-     *
-     * Previously shutdownApp was calling stop on each app in applications, and clearing the applications set;
-     * but then the second invocation of the method was starting an entity that was never stopped. Until recently,
-     * every test method was also terminating the entity (belt-and-braces, but also brittle for if the method threw
-     * an exception earlier). When that "extra" termination was removed, it meant the second and subsequent 
-     * entities were never being stopped.
-     *
-     * Now we rely on having the test method set the entity field, so we can find out which application instance 
-     * it is and calling stop on just that app + entity.
-     */
-    @AfterMethod(alwaysRun=true)
-    public void shutdownApp() {
-        if (entity != null) {
-            Application app = entity.getApplication();
-            if (app != null) Entities.destroy(app);
-        }
-    }
-
-    @AfterClass(alwaysRun=true)
-    public synchronized void shutdownMgmt() {
-        try {
-            if (mgmt != null) Entities.destroyAll(mgmt);
-        } finally {
-            mgmt = null;
-        }
-    }
-
-    public static File createTemporaryKeyStore(String alias, String password) throws Exception {
-        FluentKeySigner signer = new FluentKeySigner("brooklyn-test").selfsign();
-
-        KeyStore ks = SecureKeys.newKeyStore();
-        ks.setKeyEntry(
-                alias,
-                signer.getKey().getPrivate(),
-                password.toCharArray(),
-                new Certificate[]{signer.getAuthorityCertificate()});
-
-        File file = File.createTempFile("test", "keystore");
-        FileOutputStream fos = new FileOutputStream(file);
-        try {
-            ks.store(fos, password.toCharArray());
-            return file;
-        } finally {
-            Streams.closeQuietly(fos);
-        }
-    }
-
-    /** 
-     * Create a new instance of TestApplication and append it to applications list
-     * so it can be terminated suitable after each test has run.
-     * @return
-     */
-    protected TestApplication newTestApplication() {
-        TestApplication ta = ApplicationBuilder.newManagedApp(TestApplication.class, getMgmt());
-        applications.add(ta);
-        return ta;
-    }
-
-    /**
-     * Provides instances of the WebAppServer to test
-     * (arrays of 1-element array arguments to some of the other methods) 
-     *
-     * NB annotation must be placed on concrete impl method
-     * 
-     * TODO combine the data provider here with live integration test
-     * @see WebAppLiveIntegrationTest#basicEntities()
-     */
-    @DataProvider(name = "basicEntities")
-    public abstract Object[][] basicEntities();
-
-    /**
-     * Checks an entity can start, set SERVICE_UP to true and shutdown again.
-     */
-    @Test(groups = "Integration", dataProvider = "basicEntities")
-    public void canStartAndStop(final SoftwareProcess entity) {
-        this.entity = entity;
-        log.info("test=canStartAndStop; entity="+entity+"; app="+entity.getApplication());
-        
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-        Asserts.succeedsEventually(MutableMap.of("timeout", 120*1000), new Runnable() {
-            public void run() {
-                assertTrue(entity.getAttribute(Startable.SERVICE_UP));
-            }});
-        
-        entity.stop();
-        assertFalse(entity.getAttribute(Startable.SERVICE_UP));
-    }
-    
-    /**
-     * Checks an entity can start, set SERVICE_UP to true and shutdown again.
-     */
-    @Test(groups = "Integration", dataProvider = "basicEntities")
-    public void testReportsServiceDownWhenKilled(final SoftwareProcess entity) throws Exception {
-        this.entity = entity;
-        log.info("test=testReportsServiceDownWithKilled; entity="+entity+"; app="+entity.getApplication());
-        
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", 120*1000), entity, Startable.SERVICE_UP, true);
-
-        // Stop the underlying entity, but without our entity instance being told!
-        killEntityBehindBack(entity);
-        log.info("Killed {} behind mgmt's back, waiting for service up false in mgmt context", entity);
-        
-        EntityTestUtils.assertAttributeEqualsEventually(entity, Startable.SERVICE_UP, false);
-        
-        log.info("success getting service up false in primary mgmt universe");
-    }
-    
-    /**
-     * Stop the given underlying entity, but without our entity instance being told!
-     */
-    protected void killEntityBehindBack(Entity tokill) throws Exception {
-        ((SoftwareProcessDriver)((DriverDependentEntity<?>) Entities.deproxy(entity)).getDriver()).stop();
-        // old method of doing this did some dodgy legacy rebind and failed due to too many dangling refs; above is better in any case
-        // but TODO we should have some rebind tests for these!
-    }
-    
-    /**
-     * Checks that an entity correctly sets request and error count metrics by
-     * connecting to a non-existent URL several times.
-     */
-    @Test(groups = "Integration", dataProvider = "basicEntities")
-    public void publishesRequestAndErrorCountMetrics(final SoftwareProcess entity) throws Exception {
-        this.entity = entity;
-        log.info("test=publishesRequestAndErrorCountMetrics; entity="+entity+"; app="+entity.getApplication());
-        
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-        
-        Asserts.succeedsEventually(MutableMap.of("timeout", 10*1000), new Runnable() {
-            public void run() {
-                assertTrue(entity.getAttribute(SoftwareProcess.SERVICE_UP));
-            }});
-        
-        String url = entity.getAttribute(WebAppService.ROOT_URL) + "does_not_exist";
-        
-        final int n = 10;
-        for (int i = 0; i < n; i++) {
-            URLConnection connection = HttpTestUtils.connectToUrl(url);
-            int status = ((HttpURLConnection) connection).getResponseCode();
-            log.info("connection to {} gives {}", url, status);
-        }
-        
-        Asserts.succeedsEventually(MutableMap.of("timeout", 20*1000), new Runnable() {
-            public void run() {
-                Integer requestCount = entity.getAttribute(WebAppService.REQUEST_COUNT);
-                Integer errorCount = entity.getAttribute(WebAppService.ERROR_COUNT);
-                log.info("req={}, err={}", requestCount, errorCount);
-                
-                assertNotNull(errorCount, "errorCount not set yet ("+errorCount+")");
-    
-                // AS 7 seems to take a very long time to report error counts,
-                // hence not using ==.  >= in case error pages include a favicon, etc.
-                assertEquals(errorCount, (Integer)n);
-                assertTrue(requestCount >= errorCount);
-            }});
-    }
-    
-    /**
-     * Checks an entity publishes correct requests/second figures and that these figures
-     * fall to zero after a period of no activity.
-     */
-    @Test(groups = "Integration", dataProvider = "basicEntities")
-    public void publishesRequestsPerSecondMetric(final SoftwareProcess entity) throws Exception {
-        this.entity = entity;
-        log.info("test=publishesRequestsPerSecondMetric; entity="+entity+"; app="+entity.getApplication());
-        
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-
-        log.info("Entity "+entity+" started");
-        
-        try {
-            // reqs/sec initially zero
-            log.info("Waiting for initial avg-requests to be zero...");
-            Asserts.succeedsEventually(MutableMap.of("timeout", 20*1000), new Runnable() {
-                public void run() {
-                    Double activityValue = entity.getAttribute(WebAppService.REQUESTS_PER_SECOND_IN_WINDOW);
-                    assertNotNull(activityValue, "activity not set yet "+activityValue+")");
-                    assertEquals(activityValue.doubleValue(), 0.0d, 0.000001d);
-                }});
-            
-            // apply workload on 1 per sec; reqs/sec should update
-            Asserts.succeedsEventually(MutableMap.of("timeout", 30*1000), new Callable<Void>() {
-                public Void call() throws Exception {
-                    String url = entity.getAttribute(WebAppService.ROOT_URL) + "does_not_exist";
-                    final int desiredMsgsPerSec = 10;
-                    
-                    Stopwatch stopwatch = Stopwatch.createStarted();
-                    final AtomicInteger reqsSent = new AtomicInteger();
-                    final Integer preRequestCount = entity.getAttribute(WebAppService.REQUEST_COUNT);
-                    
-                    // need to maintain n requests per second for the duration of the window size
-                    log.info("Applying load for "+WebAppServiceMethods.DEFAULT_WINDOW_DURATION);
-                    while (stopwatch.elapsed(TimeUnit.MILLISECONDS) < WebAppServiceMethods.DEFAULT_WINDOW_DURATION.toMilliseconds()) {
-                        long preReqsTime = stopwatch.elapsed(TimeUnit.MILLISECONDS);
-                        for (int i = 0; i < desiredMsgsPerSec; i++) { connectToUrl(url); }
-                        Time.sleep(1000 - (stopwatch.elapsed(TimeUnit.MILLISECONDS)-preReqsTime));
-                        reqsSent.addAndGet(desiredMsgsPerSec);
-                    }
-    
-                    Asserts.succeedsEventually(MutableMap.of("timeout", 4000), new Runnable() {
-                        public void run() {
-                            Double avgReqs = entity.getAttribute(WebAppService.REQUESTS_PER_SECOND_IN_WINDOW);
-                            Integer requestCount = entity.getAttribute(WebAppService.REQUEST_COUNT);
-                            
-                            log.info("avg-requests="+avgReqs+"; total-requests="+requestCount);
-                            assertEquals(avgReqs.doubleValue(), (double)desiredMsgsPerSec, 3.0d);
-                            assertEquals(requestCount.intValue(), preRequestCount+reqsSent.get());
-                        }});
-                    
-                    return null;
-                }});
-            
-            // After suitable delay, expect to again get zero msgs/sec
-            log.info("Waiting for avg-requests to drop to zero, for "+WebAppServiceMethods.DEFAULT_WINDOW_DURATION);
-            Thread.sleep(WebAppServiceMethods.DEFAULT_WINDOW_DURATION.toMilliseconds());
-            
-            Asserts.succeedsEventually(MutableMap.of("timeout", 10*1000), new Runnable() {
-                public void run() {
-                    Double avgReqs = entity.getAttribute(WebAppService.REQUESTS_PER_SECOND_IN_WINDOW);
-                    assertNotNull(avgReqs);
-                    assertEquals(avgReqs.doubleValue(), 0.0d, 0.00001d);
-                }});
-        } finally {
-            entity.stop();
-        }
-    }
-
-    /**
-     * Tests that we get consecutive events with zero workrate, and with suitably small timestamps between them.
-     */
-    @Test(groups = "Integration", dataProvider = "basicEntities")
-    @SuppressWarnings("rawtypes")
-    public void publishesZeroRequestsPerSecondMetricRepeatedly(final SoftwareProcess entity) {
-        this.entity = entity;
-        log.info("test=publishesZeroRequestsPerSecondMetricRepeatedly; entity="+entity+"; app="+entity.getApplication());
-        
-        final int MAX_INTERVAL_BETWEEN_EVENTS = 4000; // TomcatServerImpl publishes events every 3000ms so this should be enough overhead
-        final int NUM_CONSECUTIVE_EVENTS = 3;
-
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-        
-        SubscriptionHandle subscriptionHandle = null;
-        SubscriptionContext subContext = ((EntityInternal)entity).getSubscriptionContext();
-
-        try {
-            final List<SensorEvent> events = new CopyOnWriteArrayList<SensorEvent>();
-            subscriptionHandle = subContext.subscribe(entity, WebAppService.REQUESTS_PER_SECOND_IN_WINDOW, new SensorEventListener<Double>() {
-                public void onEvent(SensorEvent<Double> event) {
-                    log.info("publishesRequestsPerSecondMetricRepeatedly.onEvent: {}", event);
-                    events.add(event);
-                }});
-            
-            
-            Asserts.succeedsEventually(new Runnable() {
-                public void run() {
-                    assertTrue(events.size() > NUM_CONSECUTIVE_EVENTS, "events "+events.size()+" > "+NUM_CONSECUTIVE_EVENTS);
-                    long eventTime = 0;
-                    
-                    for (SensorEvent event : events.subList(events.size()-NUM_CONSECUTIVE_EVENTS, events.size())) {
-                        assertEquals(event.getSource(), entity);
-                        assertEquals(event.getSensor(), WebAppService.REQUESTS_PER_SECOND_IN_WINDOW);
-                        assertEquals(event.getValue(), 0.0d);
-                        if (eventTime > 0) assertTrue(event.getTimestamp()-eventTime < MAX_INTERVAL_BETWEEN_EVENTS,
-                            "events at "+eventTime+" and "+event.getTimestamp()+" exceeded maximum allowable interval "+MAX_INTERVAL_BETWEEN_EVENTS);
-                        eventTime = event.getTimestamp();
-                    }
-                }});
-        } finally {
-            if (subscriptionHandle != null) subContext.unsubscribe(subscriptionHandle);
-            entity.stop();
-        }
-    }
-
-    /**
-     * Twins the entities given by basicEntities() with links to WAR files
-     * they should be able to deploy.  Correct deployment can be checked by
-     * pinging the given URL.
-     *
-     * Everything can deploy hello world. Some subclasses deploy add'l apps.
-     * We're using the simplest hello-world (with no URL mapping) because JBoss 6 does not
-     * support URL mappings.
-     */
-    @DataProvider(name = "entitiesWithWarAndURL")
-    public Object[][] entitiesWithWar() {
-        TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world-no-mapping.war");
-        List<Object[]> result = Lists.newArrayList();
-        
-        for (Object[] entity : basicEntities()) {
-            result.add(new Object[] {
-                    entity[0],
-                    "hello-world-no-mapping.war",
-                    "hello-world-no-mapping/",
-                    "" // no sub-page path
-                    });
-        }
-        
-        return result.toArray(new Object[][] {});
-    }
-
-    /**
-     * Tests given entity can deploy the given war.  Checks given httpURL to confirm success.
-     */
-    @Test(groups = "Integration", dataProvider = "entitiesWithWarAndURL")
-    public void initialRootWarDeployments(final SoftwareProcess entity, final String war, 
-            final String urlSubPathToWebApp, final String urlSubPathToPageToQuery) {
-        this.entity = entity;
-        log.info("test=initialRootWarDeployments; entity="+entity+"; app="+entity.getApplication());
-        
-        URL resource = getClass().getClassLoader().getResource(war);
-        assertNotNull(resource);
-        
-        ((EntityLocal)entity).setConfig(JavaWebAppService.ROOT_WAR, resource.toString());
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-        
-        //tomcat may need a while to unpack everything
-        Asserts.succeedsEventually(MutableMap.of("timeout", 60*1000), new Runnable() {
-            public void run() {
-                // TODO get this URL from a WAR file entity
-                HttpTestUtils.assertHttpStatusCodeEquals(Urls.mergePaths(entity.getAttribute(WebAppService.ROOT_URL), urlSubPathToPageToQuery), 200);
-                
-                assertEquals(entity.getAttribute(JavaWebAppSoftwareProcess.DEPLOYED_WARS), ImmutableSet.of("/"));
-            }});
-    }
-    
-    @Test(groups = "Integration", dataProvider = "entitiesWithWarAndURL")
-    public void initialNamedWarDeployments(final SoftwareProcess entity, final String war, 
-            final String urlSubPathToWebApp, final String urlSubPathToPageToQuery) {
-        this.entity = entity;
-        log.info("test=initialNamedWarDeployments; entity="+entity+"; app="+entity.getApplication());
-        
-        URL resource = getClass().getClassLoader().getResource(war);
-        assertNotNull(resource);
-        
-        ((EntityLocal)entity).setConfig(JavaWebAppService.NAMED_WARS, ImmutableList.of(resource.toString()));
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-
-        Asserts.succeedsEventually(MutableMap.of("timeout", 60*1000), new Runnable() {
-            public void run() {
-                // TODO get this URL from a WAR file entity
-                HttpTestUtils.assertHttpStatusCodeEquals(Urls.mergePaths(entity.getAttribute(WebAppService.ROOT_URL), urlSubPathToWebApp, urlSubPathToPageToQuery), 200);
-            }});
-    }
-    
-    @Test(groups = "Integration", dataProvider = "entitiesWithWarAndURL")
-    public void testWarDeployAndUndeploy(final JavaWebAppSoftwareProcess entity, final String war, 
-            final String urlSubPathToWebApp, final String urlSubPathToPageToQuery) {
-        this.entity = entity;
-        log.info("test=testWarDeployAndUndeploy; entity="+entity+"; app="+entity.getApplication());
-        
-        URL resource = getClass().getClassLoader().getResource(war);;
-        assertNotNull(resource);
-        
-        Entities.start(entity.getApplication(), ImmutableList.of(loc));
-        
-        // Test deploying
-        entity.deploy(resource.toString(), "myartifactname.war");
-        Asserts.succeedsEventually(MutableMap.of("timeout", 60*1000), new Runnable() {
-            public void run() {
-                // TODO get this URL from a WAR file entity
-                HttpTestUtils.assertHttpStatusCodeEquals(Urls.mergePaths(entity.getAttribute(WebAppService.ROOT_URL), "myartifactname/", urlSubPathToPageToQuery), 200);
-                assertEquals(entity.getAttribute(JavaWebAppSoftwareProcess.DEPLOYED_WARS), ImmutableSet.of("/myartifactname"));
-            }});
-        
-        // And undeploying
-        entity.undeploy("/myartifactname");
-        Asserts.succeedsEventually(MutableMap.of("timeout", 60*1000), new Runnable() {
-            public void run() {
-                // TODO get this URL from a WAR file entity
-                HttpTestUtils.assertHttpStatusCodeEquals(Urls.mergePaths(entity.getAttribute(WebAppService.ROOT_URL), "myartifactname", urlSubPathToPageToQuery), 404);
-                assertEquals(entity.getAttribute(JavaWebAppSoftwareProcess.DEPLOYED_WARS), ImmutableSet.of());
-            }});
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterIntegrationTest.java
deleted file mode 100644
index 4d847fc..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterIntegrationTest.java
+++ /dev/null
@@ -1,182 +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.webapp;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-import java.util.List;
-import java.util.concurrent.Callable;
-
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.test.HttpTestUtils;
-import org.apache.brooklyn.test.TestResourceUnavailableException;
-import org.apache.brooklyn.entity.basic.RecordingSensorEventListener;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.BrooklynAppLiveTestSupport;
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.entity.proxy.AbstractController;
-import brooklyn.entity.proxy.LoadBalancer;
-import brooklyn.entity.proxy.nginx.NginxController;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.webapp.tomcat.TomcatServer;
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import brooklyn.test.Asserts;
-import brooklyn.test.entity.TestJavaWebAppEntity;
-import brooklyn.util.collections.CollectionFunctionals;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.base.Suppliers;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-public class ControlledDynamicWebAppClusterIntegrationTest extends BrooklynAppLiveTestSupport {
-    private static final Logger log = LoggerFactory.getLogger(ControlledDynamicWebAppClusterIntegrationTest.class);
-
-    private static final int TIMEOUT_MS = 10*1000;
-    
-    private LocalhostMachineProvisioningLocation loc;
-    private List<LocalhostMachineProvisioningLocation> locs;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        super.setUp();
-
-        loc = app.newLocalhostProvisioningLocation();
-        locs = ImmutableList.of(loc);
-    }
-
-    public String getTestWar() {
-        TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war");
-        return "classpath://hello-world.war";
-    }
-    
-    @Test(groups="Integration")
-    public void testPropogateHttpPorts() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1));
-        app.start(locs);
-
-        EntityTestUtils.assertAttributeEventuallyNonNull(cluster, LoadBalancer.PROXY_HTTP_PORT);
-        EntityTestUtils.assertAttributeEventuallyNonNull(cluster, LoadBalancer.PROXY_HTTPS_PORT);
-    }
-    
-    @Test(groups="Integration")
-    public void testConfiguresController() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure("memberSpec", EntitySpec.create(TomcatServer.class).configure("war", getTestWar())));
-        app.start(locs);
-
-        String url = cluster.getController().getAttribute(NginxController.ROOT_URL);
-        HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200);
-        HttpTestUtils.assertContentEventuallyContainsText(url, "Hello");
-    }
-    
-    @Test(groups="Integration")
-    public void testSetsToplevelHostnameFromController() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure("memberSpec", EntitySpec.create(TomcatServer.class).configure("war", getTestWar())));
-        app.start(locs);
-
-        String expectedHostname = cluster.getController().getAttribute(LoadBalancer.HOSTNAME);
-        String expectedRootUrl = cluster.getController().getAttribute(LoadBalancer.ROOT_URL);
-        boolean expectedServiceUp = true;
-        
-        assertNotNull(expectedHostname);
-        assertNotNull(expectedRootUrl);
-        
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), cluster, ControlledDynamicWebAppCluster.HOSTNAME, expectedHostname);
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), cluster, ControlledDynamicWebAppCluster.ROOT_URL, expectedRootUrl);
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), cluster, ControlledDynamicWebAppCluster.SERVICE_UP, expectedServiceUp);
-    }
-    
-    @Test(groups="Integration")
-    public void testCustomWebClusterSpecGetsMemberSpec() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TomcatServer.class)
-                        .configure(TomcatServer.ROOT_WAR, getTestWar()))
-                .configure(ControlledDynamicWebAppCluster.WEB_CLUSTER_SPEC, EntitySpec.create(DynamicWebAppCluster.class)
-                        .displayName("mydisplayname")));
-        app.start(locs);
-
-        String url = cluster.getController().getAttribute(NginxController.ROOT_URL);
-        HttpTestUtils.assertContentEventuallyContainsText(url, "Hello");
-
-        // and make sure it really was using our custom spec
-        assertEquals(cluster.getCluster().getDisplayName(), "mydisplayname");
-    }
-    
-    // Needs to be integration test because still using nginx controller; could pass in mock controller
-    @Test(groups="Integration")
-    public void testSetsServiceLifecycle() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild( EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-        
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED);
-        
-        RecordingSensorEventListener<Lifecycle> listener = new RecordingSensorEventListener<Lifecycle>(true);
-        app.subscribe(cluster, Attributes.SERVICE_STATE_ACTUAL, listener);
-        app.start(locs);
-        
-        Asserts.eventually(Suppliers.ofInstance(listener.getEventValues()), CollectionFunctionals.sizeEquals(2));
-        assertEquals(listener.getEventValues(), ImmutableList.of(Lifecycle.STARTING, Lifecycle.RUNNING), "vals="+listener.getEventValues());
-        listener.clearEvents();
-        
-        app.stop();
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED);
-        Asserts.eventually(Suppliers.ofInstance(listener), CollectionFunctionals.sizeEquals(2));
-        assertEquals(listener.getEventValues(), ImmutableList.of(Lifecycle.STOPPING, Lifecycle.STOPPED), "vals="+listener.getEventValues());
-    }
-    
-    @Test(groups="Integration")
-    public void testTomcatAbsoluteRedirect() {
-        final ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-            .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TomcatServer.class)
-            .configure(TomcatServer.ROOT_WAR, getTestWar()))
-            .configure("initialSize", 1)
-            .configure(AbstractController.SERVICE_UP_URL_PATH, "hello/redirectAbsolute")
-        );
-        app.start(locs);
-
-        final NginxController nginxController = (NginxController) cluster.getController();
-        Asserts.succeedsEventually(new Callable<Boolean>() {
-            @Override
-            public Boolean call() throws Exception {
-                return nginxController.getServerPoolAddresses().size() == 1;
-            }
-        });
-        
-        Entity tomcatServer = Iterables.getOnlyElement(cluster.getCluster().getMembers());
-        EntityTestUtils.assertAttributeEqualsEventually(tomcatServer, Attributes.SERVICE_UP, true);
-        
-        EntityTestUtils.assertAttributeEqualsContinually(nginxController, Attributes.SERVICE_UP, true);
-        
-        app.stop();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java
deleted file mode 100644
index d841f1b..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/ControlledDynamicWebAppClusterTest.java
+++ /dev/null
@@ -1,211 +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.webapp;
-
-import static org.testng.Assert.assertEquals;
-
-import java.util.List;
-
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.test.TestResourceUnavailableException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.BrooklynAppUnitTestSupport;
-import brooklyn.entity.Group;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.BasicGroup;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.Lifecycle;
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.proxy.AbstractController;
-import brooklyn.entity.proxy.LoadBalancer;
-import brooklyn.entity.proxy.TrackingAbstractController;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.webapp.jboss.JBoss7Server;
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import brooklyn.test.Asserts;
-import brooklyn.test.entity.TestJavaWebAppEntity;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
-public class ControlledDynamicWebAppClusterTest extends BrooklynAppUnitTestSupport {
-    private static final Logger log = LoggerFactory.getLogger(ControlledDynamicWebAppClusterTest.class);
-
-    private LocalhostMachineProvisioningLocation loc;
-    private List<LocalhostMachineProvisioningLocation> locs;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        super.setUp();
-
-        loc = app.newLocalhostProvisioningLocation();
-        locs = ImmutableList.of(loc);
-    }
-
-    public String getTestWar() {
-        TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war");
-        return "classpath://hello-world.war";
-    }
-
-    @Test
-    public void testUsesCustomController() {
-        AbstractController controller = app.createAndManageChild(EntitySpec.create(TrackingAbstractController.class).displayName("mycustom"));
-
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 0)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER, controller)
-                .configure("memberSpec", EntitySpec.create(JBoss7Server.class).configure("war", getTestWar())));
-        app.start(locs);
-
-        EntityTestUtils.assertAttributeEqualsEventually(controller, AbstractController.SERVICE_UP, true);
-        assertEquals(cluster.getController(), controller);
-
-        // Stopping cluster should not stop controller (because it didn't create it)
-        cluster.stop();
-        EntityTestUtils.assertAttributeEquals(controller, AbstractController.SERVICE_UP, true);
-    }
-    
-    @Test
-    public void testUsesCustomControlledGroup() {
-        TestJavaWebAppEntity webServer = app.createAndManageChild(EntitySpec.create(TestJavaWebAppEntity.class));
-        webServer.setAttribute(Attributes.SUBNET_HOSTNAME, "myhostname");
-        webServer.setAttribute(Attributes.HTTP_PORT, 1234);
-        
-        TrackingAbstractController controller = app.createAndManageChild(EntitySpec.create(TrackingAbstractController.class));
-        Group controlledGroup = app.createAndManageChild(EntitySpec.create(BasicGroup.class));
-        controlledGroup.addMember(webServer);
-        
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 0)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER, controller)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLED_GROUP, controlledGroup)
-                .configure("memberSpec", EntitySpec.create(JBoss7Server.class).configure("war", getTestWar())));
-        app.start(locs);
-
-        assertEquals(controller.getUpdates(), ImmutableList.of(ImmutableSet.of("myhostname:1234")));
-    }
-    
-    @Test
-    public void testUsesCustomControllerSpec() {
-        EntitySpec<TrackingAbstractController> controllerSpec = EntitySpec.create(TrackingAbstractController.class).displayName("mycustom");
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 0)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER_SPEC, controllerSpec)
-                .configure("memberSpec", EntitySpec.create(JBoss7Server.class).configure("war", getTestWar())));
-        app.start(locs);
-        LoadBalancer controller = cluster.getController();
-        
-        EntityTestUtils.assertAttributeEqualsEventually(controller, AbstractController.SERVICE_UP, true);
-        assertEquals(controller.getDisplayName(), "mycustom");
-
-        // Stopping cluster should stop the controller (because it created it)
-        cluster.stop();
-        EntityTestUtils.assertAttributeEquals(controller, AbstractController.SERVICE_UP, false);
-    }
-    
-    @Test
-    public void testTheTestJavaWebApp() {
-        SoftwareProcess n = app.createAndManageChild(EntitySpec.create(TestJavaWebAppEntity.class));
-        app.start(locs);
-
-        EntityTestUtils.assertAttributeEqualsEventually(n, AbstractController.SERVICE_UP, true);
-        
-        app.stop();
-        EntityTestUtils.assertAttributeEqualsEventually(n, AbstractController.SERVICE_UP, false);
-    }
-    
-    @Test
-    public void testSetsInitialSize() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 2)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER_SPEC, EntitySpec.create(TrackingAbstractController.class))
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-        app.start(locs);
-
-        Iterable<TestJavaWebAppEntity> webservers = Iterables.filter(cluster.getCluster().getMembers(), TestJavaWebAppEntity.class);
-        assertEquals(Iterables.size(webservers), 2, "webservers="+webservers);
-    }
-    
-    @Test
-    public void testUsesCustomWebClusterSpec() {
-        ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 0)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER_SPEC, EntitySpec.create(TrackingAbstractController.class))
-                .configure(ControlledDynamicWebAppCluster.WEB_CLUSTER_SPEC, EntitySpec.create(DynamicWebAppCluster.class)
-                        .displayName("mydisplayname")));
-        app.start(locs);
-
-        assertEquals(cluster.getCluster().getDisplayName(), "mydisplayname");
-    }
-
-    @Test
-    public void testMembersReflectChildClusterMembers() {
-        final ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER_SPEC, EntitySpec.create(TrackingAbstractController.class))
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-        app.start(locs);
-        final DynamicWebAppCluster childCluster = cluster.getCluster();
-        
-        // Expect initial member(s) to be the same
-        assertEquals(childCluster.getMembers().size(), 1);
-        Asserts.succeedsEventually(new Runnable() {
-            @Override public void run() {
-                Asserts.assertEqualsIgnoringOrder(childCluster.getMembers(), cluster.getMembers());
-            }});
-        
-        // After resize up, same members
-        cluster.resize(2);
-        assertEquals(childCluster.getMembers().size(), 2);
-        Asserts.succeedsEventually(new Runnable() {
-            @Override public void run() {
-                Asserts.assertEqualsIgnoringOrder(childCluster.getMembers(), cluster.getMembers());
-            }});
-        
-        // After resize down, same members
-        cluster.resize(1);
-        assertEquals(childCluster.getMembers().size(), 1);
-        Asserts.succeedsEventually(new Runnable() {
-            @Override public void run() {
-                Asserts.assertEqualsIgnoringOrder(childCluster.getMembers(), cluster.getMembers());
-            }});
-    }
-    
-    @Test
-    public void testStopOnChildUnmanaged() {
-        final ControlledDynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(ControlledDynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure(ControlledDynamicWebAppCluster.CONTROLLER_SPEC, EntitySpec.create(TrackingAbstractController.class))
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-        app.start(locs);
-        final DynamicWebAppCluster childCluster = cluster.getCluster();
-        LoadBalancer controller = cluster.getController();
-        
-        Entities.unmanage(childCluster);
-        Entities.unmanage(controller);
-        
-        cluster.stop();
-        EntityTestUtils.assertAttributeEquals(cluster, ControlledDynamicWebAppCluster.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.java
deleted file mode 100644
index df5a582..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppClusterTest.java
+++ /dev/null
@@ -1,131 +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.webapp;
-
-import static org.testng.Assert.assertEquals;
-
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.trait.Startable;
-import brooklyn.location.basic.SimulatedLocation;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.test.entity.TestJavaWebAppEntity;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-
-public class DynamicWebAppClusterTest {
-    
-    private static final int SHORT_WAIT_MS = 250;
-    
-    private TestApplication app;
-    private SimulatedLocation loc;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        loc = app.newSimulatedLocation();
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    @Test
-    public void testTestJavaWebAppEntityStarts() throws Exception {
-        Entity test = app.createAndManageChild(EntitySpec.create(TestJavaWebAppEntity.class));
-        test.invoke(Startable.START, ImmutableMap.of("locations", ImmutableList.of(loc))).get();
-        
-        EntityTestUtils.assertAttributeEqualsEventually(test, Attributes.SERVICE_UP, true);
-    }
-    
-    @Test
-    public void testRequestCountAggregation() throws Exception {
-        final DynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicWebAppCluster.class)
-                .configure("initialSize", 2)
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-        
-        app.start(ImmutableList.of(loc));
-        
-        for (Entity member : cluster.getMembers()) {
-            ((TestJavaWebAppEntity)member).spoofRequest();
-        }
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, DynamicWebAppCluster.REQUEST_COUNT, 2);
-        
-        for (Entity member : cluster.getMembers()) {
-            for (int i = 0; i < 2; i++) {
-                ((TestJavaWebAppEntity)member).spoofRequest();
-            }
-        }
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, DynamicWebAppCluster.REQUEST_COUNT_PER_NODE, 3d);
-    }
-    
-    @Test
-    public void testSetsServiceUpIfMemberIsUp() throws Exception {
-        DynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicWebAppCluster.class)
-                .configure("initialSize", 1)
-                .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-    
-        app.start(ImmutableList.of(loc));
-        
-        // Should initially be true (now that TestJavaWebAppEntity sets true) 
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, DynamicWebAppCluster.SERVICE_UP, true);
-        
-        // When child is !service_up, should report false
-        ((EntityLocal)Iterables.get(cluster.getMembers(), 0)).setAttribute(Startable.SERVICE_UP, false);
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, DynamicWebAppCluster.SERVICE_UP, false);
-        EntityTestUtils.assertAttributeEqualsContinually(MutableMap.of("timeout", SHORT_WAIT_MS), cluster, DynamicWebAppCluster.SERVICE_UP, false);
-        
-        cluster.resize(2);
-        
-        // When one of the two children is service_up, should report true
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, DynamicWebAppCluster.SERVICE_UP, true);
-
-        // And if that serviceUp child goes away, should again report false
-        Entities.unmanage(Iterables.get(cluster.getMembers(), 1));
-        ((EntityLocal)Iterables.get(cluster.getMembers(), 0)).setAttribute(Startable.SERVICE_UP, false);
-        
-        EntityTestUtils.assertAttributeEqualsEventually(cluster, DynamicWebAppCluster.SERVICE_UP, false);
-    }
-    
-    @Test
-    public void testPropertiesToChildren() throws Exception {
-        DynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicWebAppCluster.class)
-            .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)
-                .configure("a", 1))
-            .configure(DynamicWebAppCluster.CUSTOM_CHILD_FLAGS, ImmutableMap.of("b", 2)));
-
-        app.start(ImmutableList.of(loc));
-        
-        TestJavaWebAppEntity we = (TestJavaWebAppEntity) Iterables.getOnlyElement(cluster.getMembers());
-        assertEquals(we.getA(), 1);
-        assertEquals(we.getB(), 2);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
deleted file mode 100644
index b47bfdd..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/DynamicWebAppFabricTest.java
+++ /dev/null
@@ -1,124 +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.webapp;
-
-import java.util.List;
-
-import org.apache.brooklyn.test.EntityTestUtils;
-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.Entity;
-import brooklyn.entity.basic.DynamicGroup;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.basic.EntityInternal;
-import brooklyn.entity.basic.EntityLocal;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.trait.Changeable;
-import brooklyn.location.basic.SimulatedLocation;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.test.entity.TestJavaWebAppEntity;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * TODO clarify test purpose
- */
-public class DynamicWebAppFabricTest {
-    private static final Logger log = LoggerFactory.getLogger(DynamicWebAppFabricTest.class);
-
-    private static final long TIMEOUT_MS = 10*1000;
-    
-    private TestApplication app;
-    private SimulatedLocation loc1;
-    private SimulatedLocation loc2;
-    private List<SimulatedLocation> locs;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        loc1 = app.newSimulatedLocation();
-        loc2 = app.newSimulatedLocation();
-        locs = ImmutableList.of(loc1, loc2);
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    @Test
-    public void testRequestCountAggregation() {
-        DynamicWebAppFabric fabric = app.createAndManageChild(EntitySpec.create(DynamicWebAppFabric.class)
-                .configure(DynamicWebAppFabric.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) );
-        
-        app.start(locs);
-        for (Entity member : fabric.getChildren()) {
-            ((EntityLocal)member).setAttribute(Changeable.GROUP_SIZE, 1);
-        }
-        
-        for (Entity member : fabric.getChildren()) {
-            ((EntityInternal)member).setAttribute(DynamicGroup.GROUP_SIZE, 1);
-            ((TestJavaWebAppEntity)member).spoofRequest();
-        }
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), fabric, DynamicWebAppFabric.REQUEST_COUNT, 2);
-        
-        // Note this is time-sensitive: need to do the next two sends before the previous one has dropped out
-        // of the time-window.
-        for (Entity member : fabric.getChildren()) {
-            for (int i = 0; i < 2; i++) {
-                ((TestJavaWebAppEntity)member).spoofRequest();
-            }
-        }
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), fabric, DynamicWebAppFabric.REQUEST_COUNT_PER_NODE, 3d);
-    }
-    
-    @Test
-    public void testRequestCountAggregationOverClusters() {
-        DynamicWebAppFabric fabric = app.createAndManageChild(EntitySpec.create(DynamicWebAppFabric.class)
-                .configure(DynamicWebAppFabric.MEMBER_SPEC, 
-                    EntitySpec.create(DynamicWebAppCluster.class)
-                        .configure("initialSize", 2)
-                        .configure(ControlledDynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TestJavaWebAppEntity.class)) ));
-
-        app.start(locs);
-        
-        for (Entity cluster : fabric.getChildren()) {
-            for (Entity node : ((DynamicWebAppCluster)cluster).getMembers()) {
-                ((TestJavaWebAppEntity)node).spoofRequest();
-            }
-        }
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), fabric, DynamicWebAppFabric.REQUEST_COUNT, 4);
-        
-        // Note this is time-sensitive: need to do the next two sends before the previous one has dropped out
-        // of the time-window.
-        for (Entity cluster : fabric.getChildren()) {
-            for (Entity node : ((DynamicWebAppCluster)cluster).getMembers()) {
-                for (int i = 0; i < 2; i++) {
-                    ((TestJavaWebAppEntity)node).spoofRequest();
-                }
-            }
-        }
-        EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", TIMEOUT_MS), fabric, DynamicWebAppFabric.REQUEST_COUNT_PER_NODE, 3d);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticCustomLocationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticCustomLocationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticCustomLocationTest.java
deleted file mode 100644
index 5e24035..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticCustomLocationTest.java
+++ /dev/null
@@ -1,90 +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.webapp;
-
-import java.util.Map;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.Entity;
-import brooklyn.entity.basic.ApplicationBuilder;
-import brooklyn.entity.basic.BasicConfigurableEntityFactory;
-import brooklyn.entity.basic.ConfigurableEntityFactory;
-import brooklyn.entity.basic.Entities;
-import brooklyn.entity.webapp.ElasticJavaWebAppService.ElasticJavaWebAppServiceAwareLocation;
-import brooklyn.location.basic.SimulatedLocation;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.test.entity.TestEntityImpl;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.collect.ImmutableList;
-
-public class ElasticCustomLocationTest {
-
-    public static class MockWebServiceLocation extends SimulatedLocation implements ElasticJavaWebAppServiceAwareLocation {
-        public MockWebServiceLocation() {
-        }
-        
-        @Override
-        public ConfigurableEntityFactory<ElasticJavaWebAppService> newWebClusterFactory() {
-            return new BasicConfigurableEntityFactory(MockWebService.class);
-        }
-    }
-    
-    public static class MockWebService extends TestEntityImpl implements ElasticJavaWebAppService {
-        public MockWebService() {
-        } 
-        // TODO Used by asicConfigurableEntityFactory.newEntity2, via MockWebServiceLocation.newWebClusterFactory
-        public MockWebService(Map flags, Entity parent) {
-            super(flags, parent);
-        } 
-    }
-
-    private TestApplication app;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        app = ApplicationBuilder.newManagedApp(TestApplication.class);
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    @Test
-    public void testElasticClusterCreatesTestEntity() {
-        MockWebServiceLocation l = new MockWebServiceLocation();
-        app.setConfig(MockWebService.ROOT_WAR, "WAR0");
-        app.setConfig(MockWebService.NAMED_WARS, ImmutableList.of("ignore://WARn"));
-        
-        ElasticJavaWebAppService svc = 
-            new ElasticJavaWebAppService.Factory().newFactoryForLocation(l).newEntity(MutableMap.of("war", "WAR1"), app);
-        Entities.manage(svc);
-        
-        Assert.assertTrue(svc instanceof MockWebService, "expected MockWebService, got "+svc);
-        //check config has been set correctly, where overridden, and where inherited
-        Assert.assertEquals(svc.getConfig(MockWebService.ROOT_WAR), "WAR1");
-        Assert.assertEquals(svc.getConfig(MockWebService.NAMED_WARS), ImmutableList.of("ignore://WARn"));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticJavaWebAppServiceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticJavaWebAppServiceIntegrationTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticJavaWebAppServiceIntegrationTest.java
deleted file mode 100644
index 69711c5..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/ElasticJavaWebAppServiceIntegrationTest.java
+++ /dev/null
@@ -1,69 +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.webapp;
-
-import org.apache.brooklyn.test.HttpTestUtils;
-import org.apache.brooklyn.test.TestResourceUnavailableException;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.basic.Entities;
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.collect.ImmutableList;
-
-public class ElasticJavaWebAppServiceIntegrationTest {
-
-    private LocalhostMachineProvisioningLocation loc;
-    private TestApplication app;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        loc = app.newLocalhostProvisioningLocation();
-    }
-
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-
-    public String getTestWar() {
-        TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war");
-        return "classpath://hello-world.war";
-    }
-
-    @SuppressWarnings("deprecation")
-    @Test(groups = "Integration")
-    // TODO a new approach to what ElasticJavaWebAppService.Factory does, giving a different entity depending on location!
-    public void testLegacyFactory() {
-        ElasticJavaWebAppService svc =
-            new ElasticJavaWebAppService.Factory().newEntity(MutableMap.of("war", getTestWar()), app);
-        Entities.manage(svc);
-        app.start(ImmutableList.of(loc));
-        
-        String url = svc.getAttribute(ElasticJavaWebAppService.ROOT_URL);
-        Assert.assertNotNull(url);
-        HttpTestUtils.assertContentEventuallyContainsText(url, "Hello");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/FilenameToWebContextMapperTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/FilenameToWebContextMapperTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/FilenameToWebContextMapperTest.java
deleted file mode 100644
index 421bca0..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/FilenameToWebContextMapperTest.java
+++ /dev/null
@@ -1,85 +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.webapp;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-@Test
-public class FilenameToWebContextMapperTest {
-
-//    *   either ROOT.WAR or /       denotes root context
-//    * <p>
-//    *   anything of form  FOO.?AR  (ending .?AR) is copied with that name (unless copying not necessary)
-//    *                              and is expected to be served from /FOO
-//    * <p>
-//    *   anything of form  /FOO     (with leading slash) is expected to be served from /FOO
-//    *                              (and is copied as FOO.WAR)
-//    * <p>
-//    *   anything of form  FOO      (without a dot) is expected to be served from /FOO
-//    *                              (and is copied as FOO.WAR)
-//    * <p>                            
-//    *   otherwise <i>please note</i> behaviour may vary on different appservers;
-//    *   e.g. FOO.FOO would probably be ignored on appservers which expect a file copied across (usually),
-//    *   but served as /FOO.FOO on systems that take a deployment context.
-
-    FilenameToWebContextMapper m = new FilenameToWebContextMapper();
-    
-    private void assertMapping(String input, String context, String filename) {
-        Assert.assertEquals(m.convertDeploymentTargetNameToContext(input), context);
-        Assert.assertEquals(m.convertDeploymentTargetNameToFilename(input), filename);
-    }
-    
-    public void testRootNames() {
-        assertMapping("/", "/", "ROOT.war");
-        assertMapping("ROOT.war", "/", "ROOT.war");
-        
-        //bad ones -- some of these aren't invertible
-        assertMapping("/ROOT.war", "/ROOT.war", "ROOT.war.war");
-        assertMapping("/ROOT", "/ROOT", "ROOT.war");
-        
-        //and leave empty string alone (will cause subsequent error)
-        assertMapping("", "", "");
-    }
-
-    public void testOtherNames() {
-        assertMapping("/foo", "/foo", "foo.war");
-        assertMapping("/foo.foo", "/foo.foo", "foo.foo.war");
-        assertMapping("foo.war", "/foo", "foo.war");
-        assertMapping("foo.Ear", "/foo", "foo.Ear");
-        assertMapping("foo", "/foo", "foo.war");
-        
-        //bad ones -- some of these aren't invertible
-        assertMapping("foo.foo", "/foo.foo", "foo.foo");
-    }
-    
-    public void testInferFromUrl() {
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/simple.war", false), "simple.war");
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/simple.Ear?type=raw", false), "simple.Ear");
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/simple.war?type=raw*other=sample.war", false), "simple.war");
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/get?file=simple.war", false), "simple.war");
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/get?file=simple.war&other=ignore", false), "simple.war");
-        //takes the first (but logs warning in verbose mode)
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/get?file=simple.war&other=sample.war", false), "simple.war");
-        //allows hyphen
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/get?file=simple-simon.war&other=sample", false), "simple-simon.war");
-        Assert.assertEquals(m.findArchiveNameFromUrl("http//localhost/get?file=simple\\simon.war&other=sample", false), "simon.war");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/HttpsSslConfigTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/HttpsSslConfigTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/HttpsSslConfigTest.java
deleted file mode 100644
index da4b0ce..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/HttpsSslConfigTest.java
+++ /dev/null
@@ -1,38 +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.webapp;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.flags.TypeCoercions;
-
-public class HttpsSslConfigTest {
-
-    @Test
-    public void testCoerce() {
-        HttpsSslConfig config = TypeCoercions.coerce(MutableMap.of("keystoreUrl", "http://foo", "keystorePassword", "b4r", "keyAlias", "baz"), 
-            HttpsSslConfig.class);
-        Assert.assertEquals(config.getKeystoreUrl(), "http://foo");
-        Assert.assertEquals(config.getKeystorePassword(), "b4r");
-        Assert.assertEquals(config.getKeyAlias(), "baz");
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/TomcatAutoScalerPolicyTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/TomcatAutoScalerPolicyTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/TomcatAutoScalerPolicyTest.java
deleted file mode 100644
index cd38dfe..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/TomcatAutoScalerPolicyTest.java
+++ /dev/null
@@ -1,124 +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.webapp;
-
-import static org.apache.brooklyn.test.HttpTestUtils.connectToUrl;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-import org.apache.brooklyn.management.ManagementContext;
-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.basic.Entities;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.webapp.tomcat.TomcatServer;
-import brooklyn.entity.webapp.tomcat.TomcatServerImpl;
-import brooklyn.location.LocationSpec;
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import brooklyn.policy.autoscaling.AutoScalerPolicy;
-import brooklyn.test.Asserts;
-import brooklyn.test.entity.TestApplication;
-import brooklyn.util.collections.MutableMap;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-public class TomcatAutoScalerPolicyTest {
-
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(TomcatAutoScalerPolicyTest.class);
-
-    // TODO Test is time-sensitive: we send two web-requests in rapid succession, and expect the average workrate to
-    // be 2 msgs/sec; we then expect resizing to kick-in.
-    // P speculate that... if for some reason things are running slow (e.g. GC during that one second), then brooklyn 
-    // may not report the 2 msgs/sec.
-
-    private LocalhostMachineProvisioningLocation loc;
-    private TestApplication app;
-    private ManagementContext managementContext;
-    
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        app = TestApplication.Factory.newManagedInstanceForTests();
-        managementContext = app.getManagementContext();
-        loc = managementContext.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class)
-                .configure("name", "london"));
-    }
-    
-    @AfterMethod(alwaysRun=true)
-    public void tearDown() throws Exception {
-        if (app != null) Entities.destroyAll(app.getManagementContext());
-    }
-    
-    @Test(groups="Integration")
-    public void testWithTomcatServers() throws Exception {
-        /*
-         * One DynamicWebAppClster with auto-scaler policy
-         * AutoScaler listening to DynamicWebAppCluster.TOTAL_REQS
-         * AutoScaler minSize 1
-         * AutoScaler upper metric 1
-         * AutoScaler lower metric 0
-         * .. send one request
-         * wait til auto-scaling complete
-         * assert cluster size 2
-         */
-
-        final DynamicWebAppCluster cluster = app.createAndManageChild(EntitySpec.create(DynamicWebAppCluster.class)
-                .configure(DynamicWebAppCluster.INITIAL_SIZE, 1)
-                .configure(DynamicWebAppCluster.MEMBER_SPEC, EntitySpec.create(TomcatServer.class)));
-
-        final AutoScalerPolicy policy = AutoScalerPolicy.builder()
-                .metric(DynamicWebAppCluster.REQUEST_COUNT_PER_NODE)
-                .metricRange(0, 1)
-                .minPoolSize(1)
-                .build();
-        cluster.addPolicy(policy);
-        
-        app.start(ImmutableList.of(loc));
-        
-        assertEquals(cluster.getCurrentSize(), (Integer)1);
-        
-        // Scaling based on *total requests* processed, rather than the requests per second.
-        // So just hit it with 2 requests.
-        // Alternatively could hit each tomcat server's URL twice per second; but that's less deterministic.
-        TomcatServer tc = (TomcatServer) Iterables.getOnlyElement(cluster.getMembers());
-        for (int i = 0; i < 2; i++) {
-            connectToUrl(tc.getAttribute(TomcatServerImpl.ROOT_URL));
-        }
-        
-        // We'll scale to two members as soon as the policy detects it.
-        // But the second member won't count in the requests-per-node until it has started up.
-        // Expect to see (if we polled at convenient times):
-        //  - zero requests per node (because haven't yet retrieved over JMX the metric)
-        //  - two requests per node, with one member
-        //  - two requests per node, with two members (one of whom is still starting up, so doesn't count)
-        //  - one request per node (i.e. two divided across the two active members)
-        Asserts.succeedsEventually(MutableMap.of("timeout", 5*60*1000), new Runnable() {
-            @Override public void run() {
-                String err = "policy="+policy.isRunning()+"; size="+cluster.getCurrentSize()+"; reqCountPerNode="+cluster.getAttribute(DynamicWebAppCluster.REQUEST_COUNT_PER_NODE);
-                assertTrue(policy.isRunning(), "err="+err);
-                assertEquals(cluster.getCurrentSize(), (Integer)2, "err="+err);
-                assertEquals(cluster.getAttribute(DynamicWebAppCluster.REQUEST_COUNT_PER_NODE), 1.0d, "err="+err);
-            }});
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppConcurrentDeployTest.java
----------------------------------------------------------------------
diff --git a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppConcurrentDeployTest.java b/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppConcurrentDeployTest.java
deleted file mode 100644
index 328971c..0000000
--- a/software/webapp/src/test/java/brooklyn/entity/webapp/WebAppConcurrentDeployTest.java
+++ /dev/null
@@ -1,105 +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.webapp;
-
-import static org.testng.Assert.assertEquals;
-
-import java.net.URI;
-import java.util.Collection;
-
-import org.apache.http.client.HttpClient;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.BrooklynAppUnitTestSupport;
-import brooklyn.entity.basic.Attributes;
-import brooklyn.entity.basic.BrooklynConfigKeys;
-import brooklyn.entity.proxying.EntitySpec;
-import brooklyn.entity.webapp.jboss.JBoss7Server;
-import brooklyn.entity.webapp.tomcat.TomcatServer;
-import brooklyn.location.Location;
-import brooklyn.location.LocationSpec;
-import brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import brooklyn.test.Asserts;
-
-import org.apache.brooklyn.management.Task;
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.test.TestResourceUnavailableException;
-
-import brooklyn.util.collections.MutableList;
-import brooklyn.util.collections.MutableMap;
-import brooklyn.util.http.HttpTool;
-import brooklyn.util.http.HttpToolResponse;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-public class WebAppConcurrentDeployTest extends BrooklynAppUnitTestSupport {
-    private Location loc;
-    
-    @Override
-    @BeforeMethod(alwaysRun=true)
-    public void setUp() throws Exception {
-        super.setUp();
-        app.config().set(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, false);
-//      tested on  loc = mgmt.getLocationRegistry().resolve("byon:(hosts=\"hostname\")");
-        loc = mgmt.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class));
-    }
-    
-    @DataProvider(name = "basicEntities")
-    public Object[][] basicEntities() {
-        return new Object[][]{
-            {EntitySpec.create(TomcatServer.class)},
-            // Hot Deploy not enabled?
-            // {EntitySpec.create(JBoss6Server.class)},
-            {EntitySpec.create(JBoss7Server.class)},
-        };
-    }
-
-    @Test(groups = "Live", dataProvider="basicEntities")
-    public void testConcurrentDeploys(EntitySpec<? extends JavaWebAppSoftwareProcess> webServerSpec) throws Exception {
-        JavaWebAppSoftwareProcess server = app.createAndManageChild(webServerSpec);
-        app.start(ImmutableList.of(loc));
-        EntityTestUtils.assertAttributeEqualsEventually(server, Attributes.SERVICE_UP, Boolean.TRUE);
-        Collection<Task<Void>> deploys = MutableList.of();
-        for (int i = 0; i < 5; i++) {
-            deploys.add(server.invoke(TomcatServer.DEPLOY, MutableMap.of("url", getTestWar(), "targetName", "/")));
-        }
-        for(Task<Void> t : deploys) {
-            t.getUnchecked();
-        }
-
-        final HttpClient client = HttpTool.httpClientBuilder().build();
-        final URI warUrl = URI.create(server.getAttribute(JavaWebAppSoftwareProcess.ROOT_URL));
-        Asserts.succeedsEventually(new Runnable() {
-            @Override
-            public void run() {
-                HttpToolResponse resp = HttpTool.httpGet(client, warUrl, ImmutableMap.<String,String>of());
-                assertEquals(resp.getResponseCode(), 200);
-            }
-        });
-    }
-    
-    public String getTestWar() {
-        TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war");
-        return "classpath://hello-world.war";
-    }
-
-}