http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java deleted file mode 100644 index 1421f45..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityLatchTest.java +++ /dev/null @@ -1,162 +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; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import java.util.List; - -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.api.location.LocationSpec; -import org.apache.brooklyn.api.mgmt.Task; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; -import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; -import org.apache.brooklyn.entity.core.Attributes; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.entity.stock.BasicEntity; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.basic.SoftwareProcessEntityTest.MyService; -import brooklyn.entity.basic.SoftwareProcessEntityTest.SimulatedDriver; - -import org.apache.brooklyn.location.basic.FixedListMachineProvisioningLocation; -import org.apache.brooklyn.location.basic.SshMachineLocation; -import org.apache.brooklyn.sensor.core.DependentConfiguration; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.util.core.task.TaskInternal; -import org.apache.brooklyn.util.time.Duration; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - - -public class SoftwareProcessEntityLatchTest extends BrooklynAppUnitTestSupport { - - // NB: These tests don't actually require ssh to localhost -- only that 'localhost' resolves. - - @SuppressWarnings("unused") - private static final Logger LOG = LoggerFactory.getLogger(SoftwareProcessEntityLatchTest.class); - - private SshMachineLocation machine; - private FixedListMachineProvisioningLocation<SshMachineLocation> loc; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - loc = getLocation(); - } - - @SuppressWarnings("unchecked") - private FixedListMachineProvisioningLocation<SshMachineLocation> getLocation() { - FixedListMachineProvisioningLocation<SshMachineLocation> loc = mgmt.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class)); - machine = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", "localhost")); - loc.addMachine(machine); - return loc; - } - - @Test - public void testStartLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.START_LATCH, ImmutableList.<String>of()); - } - - @Test - public void testSetupLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.SETUP_LATCH, ImmutableList.<String>of()); - } - - @Test - public void testIntallResourcesLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.INSTALL_RESOURCES_LATCH, ImmutableList.of("setup")); - } - - @Test - public void testInstallLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.INSTALL_LATCH, ImmutableList.of("setup", "copyInstallResources")); - } - - @Test - public void testCustomizeLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.CUSTOMIZE_LATCH, ImmutableList.of("setup", "copyInstallResources", "install")); - } - - @Test - public void testRuntimeResourcesLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.RUNTIME_RESOURCES_LATCH, ImmutableList.of("setup", "copyInstallResources", "install", "customize")); - } - - @Test - public void testLaunchLatchBlocks() throws Exception { - runTestLatchBlocks(SoftwareProcess.LAUNCH_LATCH, ImmutableList.of("setup", "copyInstallResources", "install", "customize", "copyRuntimeResources")); - } - - protected void runTestLatchBlocks(final ConfigKey<Boolean> latch, List<String> preLatchEvents) throws Exception { - final BasicEntity triggerEntity = app.createAndManageChild(EntitySpec.create(BasicEntity.class)); - final MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class) - .configure(latch, DependentConfiguration.attributeWhenReady(triggerEntity, Attributes.SERVICE_UP))); - - final Task<Void> task = Entities.invokeEffector(app, app, MyService.START, ImmutableMap.of("locations", ImmutableList.of(loc))); - - assertEffectorBlockingDetailsEventually(entity, "Waiting for config "+latch.getName()); - assertDriverEventsEquals(entity, preLatchEvents); - - assertFalse(task.isDone()); - ((EntityLocal)triggerEntity).setAttribute(Attributes.SERVICE_UP, true); - task.get(Duration.THIRTY_SECONDS); - assertDriverEventsEquals(entity, ImmutableList.of("setup", "copyInstallResources", "install", "customize", "copyRuntimeResources", "launch")); - } - - private void assertDriverEventsEquals(MyService entity, List<String> expectedEvents) { - List<String> events = ((SimulatedDriver)entity.getDriver()).events; - assertEquals(events, expectedEvents, "events="+events); - } - - private void assertEffectorBlockingDetailsEventually(final Entity entity, final String blockingDetailsSnippet) { - Asserts.succeedsEventually(new Runnable() { - @Override public void run() { - Task<?> entityTask = Iterables.getOnlyElement(mgmt.getExecutionManager().getTasksWithAllTags(ImmutableList.of(BrooklynTaskTags.EFFECTOR_TAG, BrooklynTaskTags.tagForContextEntity(entity)))); - String blockingDetails = getBlockingDetails(entityTask); - assertTrue(blockingDetails.contains(blockingDetailsSnippet)); - }}); - } - - private String getBlockingDetails(Task<?> task) { - List<TaskInternal<?>> taskChain = Lists.newArrayList(); - TaskInternal<?> taskI = (TaskInternal<?>) task; - while (taskI != null) { - taskChain.add(taskI); - if (taskI.getBlockingDetails() != null) { - return taskI.getBlockingDetails(); - } - taskI = (TaskInternal<?>) taskI.getBlockingTask(); - } - throw new IllegalStateException("No blocking details for "+task+" (walked task chain "+taskChain+")"); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityRebindTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityRebindTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityRebindTest.java deleted file mode 100644 index 5723507..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityRebindTest.java +++ /dev/null @@ -1,181 +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; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - -import java.io.File; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -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.api.location.MachineProvisioningLocation; -import org.apache.brooklyn.api.location.NoMachinesAvailableException; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils; -import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; -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.lifecycle.Lifecycle; -import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic; -import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic.ServiceProblemsLogic; -import org.apache.brooklyn.test.EntityTestUtils; -import org.apache.brooklyn.util.core.flags.SetFromFlag; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.basic.SoftwareProcessEntityTest.MyService; - -import org.apache.brooklyn.location.basic.AbstractLocation; -import org.apache.brooklyn.location.basic.SshMachineLocation; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.io.Files; - -public class SoftwareProcessEntityRebindTest extends BrooklynAppUnitTestSupport { - - private ClassLoader classLoader = getClass().getClassLoader(); - private TestApplication newApp; - private ManagementContext newManagementContext; - private MyService origE; - private File mementoDir; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - mementoDir = Files.createTempDir(); - mgmt = RebindTestUtils.newPersistingManagementContext(mementoDir, classLoader); - super.setUp(); - } - - @AfterMethod(alwaysRun=true) - @Override - public void tearDown() throws Exception { - super.tearDown(); - if (newApp != null) Entities.destroyAll(newApp.getManagementContext()); - if (newManagementContext != null) Entities.destroyAll(newManagementContext); - if (mementoDir != null) RebindTestUtils.deleteMementoDir(mementoDir); - } - - @Test - public void testReleasesLocationOnStopAfterRebinding() throws Exception { - origE = app.createAndManageChild(EntitySpec.create(MyService.class)); - - MyProvisioningLocation origLoc = mgmt.getLocationManager().createLocation(LocationSpec.create(MyProvisioningLocation.class) - .displayName("mylocname")); - app.start(ImmutableList.of(origLoc)); - assertEquals(origLoc.inUseCount.get(), 1); - - newApp = (TestApplication) rebind(); - MyProvisioningLocation newLoc = (MyProvisioningLocation) Iterables.getOnlyElement(newApp.getLocations()); - assertEquals(newLoc.inUseCount.get(), 1); - - newApp.stop(); - assertEquals(newLoc.inUseCount.get(), 0); - } - - @Test - public void testCreatesDriverAfterRebind() throws Exception { - origE = app.createAndManageChild(EntitySpec.create(MyService.class)); - //the entity skips enricher initialization, do it explicitly - origE.addEnricher(ServiceStateLogic.newEnricherForServiceStateFromProblemsAndUp()); - - MyProvisioningLocation origLoc = mgmt.getLocationManager().createLocation(LocationSpec.create(MyProvisioningLocation.class) - .displayName("mylocname")); - app.start(ImmutableList.of(origLoc)); - assertEquals(origE.getAttribute(Attributes.SERVICE_STATE_EXPECTED).getState(), Lifecycle.RUNNING); - EntityTestUtils.assertAttributeEqualsEventually(origE, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - - ServiceProblemsLogic.updateProblemsIndicator((EntityLocal)origE, "test", "fire"); - EntityTestUtils.assertAttributeEqualsEventually(origE, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE); - - newApp = (TestApplication) rebind(); - MyService newE = (MyService) Iterables.getOnlyElement(newApp.getChildren()); - assertTrue(newE.getDriver() != null, "driver should be initialized"); - } - - @Test - public void testDoesNotCreateDriverAfterRebind() throws Exception { - origE = app.createAndManageChild(EntitySpec.create(MyService.class)); - //the entity skips enricher initialization, do it explicitly - origE.addEnricher(ServiceStateLogic.newEnricherForServiceStateFromProblemsAndUp()); - - MyProvisioningLocation origLoc = mgmt.getLocationManager().createLocation(LocationSpec.create(MyProvisioningLocation.class) - .displayName("mylocname")); - app.start(ImmutableList.of(origLoc)); - assertEquals(origE.getAttribute(Attributes.SERVICE_STATE_EXPECTED).getState(), Lifecycle.RUNNING); - EntityTestUtils.assertAttributeEqualsEventually(origE, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - - ServiceStateLogic.setExpectedState(origE, Lifecycle.ON_FIRE); - EntityTestUtils.assertAttributeEqualsEventually(origE, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.ON_FIRE); - - newApp = (TestApplication) rebind(); - MyService newE = (MyService) Iterables.getOnlyElement(newApp.getChildren()); - assertNull(newE.getDriver(), "driver should not be initialized because entity is in a permanent failure"); - } - - private TestApplication rebind() throws Exception { - RebindTestUtils.waitForPersisted(app); - TestApplication result = (TestApplication) RebindTestUtils.rebind(mementoDir, getClass().getClassLoader()); - newManagementContext = result.getManagementContext(); - return result; - } - - public static class MyProvisioningLocation extends AbstractLocation implements MachineProvisioningLocation<SshMachineLocation> { - private static final long serialVersionUID = 1L; - - @SetFromFlag(defaultVal="0") - AtomicInteger inUseCount; - - public MyProvisioningLocation() { - } - - @Override - public MachineProvisioningLocation<SshMachineLocation> newSubLocation(Map<?, ?> newFlags) { - throw new UnsupportedOperationException(); - } - - @Override - public SshMachineLocation obtain(Map flags) throws NoMachinesAvailableException { - inUseCount.incrementAndGet(); - return getManagementContext().getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .parent(this) - .configure("address","localhost")); - } - - @Override - public void release(SshMachineLocation machine) { - inUseCount.decrementAndGet(); - } - - @Override - public Map getProvisioningFlags(Collection tags) { - return Collections.emptyMap(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java deleted file mode 100644 index ecd50e6..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessEntityTest.java +++ /dev/null @@ -1,793 +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; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.internal.EntityLocal; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.api.location.MachineLocation; -import org.apache.brooklyn.api.mgmt.EntityManager; -import org.apache.brooklyn.api.mgmt.Task; -import org.apache.brooklyn.api.mgmt.TaskAdaptable; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; -import org.apache.brooklyn.core.test.entity.TestApplication; -import org.apache.brooklyn.effector.core.Effectors; -import org.apache.brooklyn.entity.core.Attributes; -import org.apache.brooklyn.entity.core.BrooklynConfigKeys; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.entity.core.EntityInternal; -import org.apache.brooklyn.entity.drivers.BasicEntityDriverManager; -import org.apache.brooklyn.entity.drivers.ReflectiveEntityDriverFactory; -import org.apache.brooklyn.entity.lifecycle.Lifecycle; -import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic; -import org.apache.brooklyn.entity.trait.Startable; -import org.apache.brooklyn.sensor.core.PortAttributeSensorAndConfigKey; -import org.apache.brooklyn.test.Asserts; -import org.apache.brooklyn.test.EntityTestUtils; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.config.ConfigBag; -import org.apache.brooklyn.util.core.task.DynamicTasks; -import org.apache.brooklyn.util.core.task.Tasks; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.exceptions.PropagatedRuntimeException; -import org.apache.brooklyn.util.net.UserAndHostAndPort; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.text.Strings; -import org.apache.brooklyn.util.time.Duration; -import org.jclouds.util.Throwables2; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; - -import brooklyn.entity.basic.SoftwareProcess.RestartSoftwareParameters; -import brooklyn.entity.basic.SoftwareProcess.RestartSoftwareParameters.RestartMachineMode; -import brooklyn.entity.basic.SoftwareProcess.StopSoftwareParameters; -import brooklyn.entity.basic.SoftwareProcess.StopSoftwareParameters.StopMode; -import brooklyn.entity.software.MachineLifecycleEffectorTasksTest; - -import org.apache.brooklyn.location.basic.FixedListMachineProvisioningLocation; -import org.apache.brooklyn.location.basic.Locations; -import org.apache.brooklyn.location.basic.SimulatedLocation; -import org.apache.brooklyn.location.basic.SshMachineLocation; - - -public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport { - - // NB: These tests don't actually require ssh to localhost -- only that 'localhost' resolves. - - private static final Logger LOG = LoggerFactory.getLogger(SoftwareProcessEntityTest.class); - - private SshMachineLocation machine; - private FixedListMachineProvisioningLocation<SshMachineLocation> loc; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - loc = getLocation(); - } - - @SuppressWarnings("unchecked") - private FixedListMachineProvisioningLocation<SshMachineLocation> getLocation() { - FixedListMachineProvisioningLocation<SshMachineLocation> loc = mgmt.getLocationManager().createLocation(LocationSpec.create(FixedListMachineProvisioningLocation.class)); - machine = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", "localhost")); - loc.addMachine(machine); - return loc; - } - - @Test - public void testSetsMachineAttributes() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - - assertEquals(entity.getAttribute(SoftwareProcess.HOSTNAME), machine.getAddress().getHostName()); - assertEquals(entity.getAttribute(SoftwareProcess.ADDRESS), machine.getAddress().getHostAddress()); - assertEquals(entity.getAttribute(Attributes.SSH_ADDRESS), UserAndHostAndPort.fromParts(machine.getUser(), machine.getAddress().getHostName(), machine.getPort())); - assertEquals(entity.getAttribute(SoftwareProcess.PROVISIONING_LOCATION), loc); - } - - @Test - public void testProcessTemplateWithExtraSubstitutions() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - SimulatedDriver driver = (SimulatedDriver) entity.getDriver(); - Map<String,String> substitutions = MutableMap.of("myname","peter"); - String result = driver.processTemplate("/brooklyn/entity/basic/template_with_extra_substitutions.txt",substitutions); - Assert.assertTrue(result.contains("peter")); - } - - @Test - public void testInstallDirAndRunDir() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class) - .configure(BrooklynConfigKeys.ONBOX_BASE_DIR, "/tmp/brooklyn-foo")); - - entity.start(ImmutableList.of(loc)); - - Assert.assertEquals(entity.getAttribute(SoftwareProcess.INSTALL_DIR), "/tmp/brooklyn-foo/installs/MyService"); - Assert.assertEquals(entity.getAttribute(SoftwareProcess.RUN_DIR), "/tmp/brooklyn-foo/apps/"+entity.getApplicationId()+"/entities/MyService_"+entity.getId()); - } - - @Test - public void testInstallDirAndRunDirUsingTilde() throws Exception { - String dataDirName = ".brooklyn-foo"+Strings.makeRandomId(4); - String dataDir = "~/"+dataDirName; - String resolvedDataDir = Os.mergePaths(Os.home(), dataDirName); - - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class) - .configure(BrooklynConfigKeys.ONBOX_BASE_DIR, dataDir)); - - entity.start(ImmutableList.of(loc)); - - Assert.assertEquals(Os.nativePath(entity.getAttribute(SoftwareProcess.INSTALL_DIR)), - Os.nativePath(Os.mergePaths(resolvedDataDir, "installs/MyService"))); - Assert.assertEquals(Os.nativePath(entity.getAttribute(SoftwareProcess.RUN_DIR)), - Os.nativePath(Os.mergePaths(resolvedDataDir, "apps/"+entity.getApplicationId()+"/entities/MyService_"+entity.getId()))); - } - - protected <T extends MyService> void doStartAndCheckVersion(Class<T> type, String expectedLabel, ConfigBag config) { - MyService entity = app.createAndManageChild(EntitySpec.create(type) - .configure(BrooklynConfigKeys.ONBOX_BASE_DIR, "/tmp/brooklyn-foo") - .configure(config.getAllConfigAsConfigKeyMap())); - entity.start(ImmutableList.of(loc)); - Assert.assertEquals(entity.getAttribute(SoftwareProcess.INSTALL_DIR), "/tmp/brooklyn-foo/installs/" - + expectedLabel); - } - - @Test - public void testCustomInstallDir0() throws Exception { - doStartAndCheckVersion(MyService.class, "MyService", ConfigBag.newInstance()); - } - @Test - public void testCustomInstallDir1() throws Exception { - doStartAndCheckVersion(MyService.class, "MyService_9.9.8", ConfigBag.newInstance() - .configure(SoftwareProcess.SUGGESTED_VERSION, "9.9.8")); - } - @Test - public void testCustomInstallDir2() throws Exception { - doStartAndCheckVersion(MyService.class, "MySvc_998", ConfigBag.newInstance() - .configure(SoftwareProcess.INSTALL_UNIQUE_LABEL, "MySvc_998")); - } - @Test - public void testCustomInstallDir3() throws Exception { - doStartAndCheckVersion(MyServiceWithVersion.class, "MyServiceWithVersion_9.9.9", ConfigBag.newInstance()); - } - @Test - public void testCustomInstallDir4() throws Exception { - doStartAndCheckVersion(MyServiceWithVersion.class, "MyServiceWithVersion_9.9.7", ConfigBag.newInstance() - .configure(SoftwareProcess.SUGGESTED_VERSION, "9.9.7")); - } - @Test - public void testCustomInstallDir5() throws Exception { - doStartAndCheckVersion(MyServiceWithVersion.class, "MyServiceWithVersion_9.9.9_NaCl", ConfigBag.newInstance() - .configure(ConfigKeys.newStringConfigKey("salt"), "NaCl")); - } - - @Test - public void testBasicSoftwareProcessEntityLifecycle() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - SimulatedDriver d = (SimulatedDriver) entity.getDriver(); - Assert.assertTrue(d.isRunning()); - entity.stop(); - Assert.assertEquals(d.events, ImmutableList.of("setup", "copyInstallResources", "install", "customize", "copyRuntimeResources", "launch", "stop")); - assertFalse(d.isRunning()); - } - - @Test - public void testBasicSoftwareProcessRestarts() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - SimulatedDriver d = (SimulatedDriver) entity.getDriver(); - Assert.assertTrue(d.isRunning()); - - // this will cause restart to fail if it attempts to replace the machine - loc.removeMachine(Locations.findUniqueSshMachineLocation(entity.getLocations()).get()); - - // with defaults, it won't reboot machine - d.events.clear(); - entity.restart(); - assertEquals(d.events, ImmutableList.of("stop", "launch")); - - // but here, it will try to reboot, and fail because there is no machine available - TaskAdaptable<Void> t1 = Entities.submit(entity, Effectors.invocation(entity, Startable.RESTART, - ConfigBag.newInstance().configure(RestartSoftwareParameters.RESTART_MACHINE_TYPED, RestartMachineMode.TRUE))); - t1.asTask().blockUntilEnded(Duration.TEN_SECONDS); - if (!t1.asTask().isError()) { - Assert.fail("Should have thrown error during "+t1+" because no more machines available at "+loc); - } - - // now it has a machine, so reboot should succeed - SshMachineLocation machine2 = mgmt.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", "localhost")); - loc.addMachine(machine2); - TaskAdaptable<Void> t2 = Entities.submit(entity, Effectors.invocation(entity, Startable.RESTART, - ConfigBag.newInstance().configure(RestartSoftwareParameters.RESTART_MACHINE_TYPED, RestartMachineMode.TRUE))); - t2.asTask().get(); - - assertFalse(d.isRunning()); - } - - @Test - public void testBasicSoftwareProcessStopsEverything() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - SimulatedDriver d = (SimulatedDriver) entity.getDriver(); - Location machine = Iterables.getOnlyElement(entity.getLocations()); - - d.events.clear(); - entity.stop(); - assertEquals(d.events, ImmutableList.of("stop")); - assertEquals(entity.getLocations().size(), 0); - assertTrue(loc.getAvailable().contains(machine)); - } - - @Test - public void testBasicSoftwareProcessStopEverythingExplicitly() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - SimulatedDriver d = (SimulatedDriver) entity.getDriver(); - Location machine = Iterables.getOnlyElement(entity.getLocations()); - d.events.clear(); - - TaskAdaptable<Void> t1 = Entities.submit(entity, Effectors.invocation(entity, Startable.STOP, - ConfigBag.newInstance().configure(StopSoftwareParameters.STOP_MACHINE_MODE, StopSoftwareParameters.StopMode.IF_NOT_STOPPED))); - t1.asTask().get(); - - assertEquals(d.events, ImmutableList.of("stop")); - assertEquals(entity.getLocations().size(), 0); - assertTrue(loc.getAvailable().contains(machine)); - } - - @Test - public void testBasicSoftwareProcessStopsProcess() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - SimulatedDriver d = (SimulatedDriver) entity.getDriver(); - Location machine = Iterables.getOnlyElement(entity.getLocations()); - d.events.clear(); - - TaskAdaptable<Void> t1 = Entities.submit(entity, Effectors.invocation(entity, Startable.STOP, - ConfigBag.newInstance().configure(StopSoftwareParameters.STOP_MACHINE_MODE, StopSoftwareParameters.StopMode.NEVER))); - t1.asTask().get(10, TimeUnit.SECONDS); - - assertEquals(d.events, ImmutableList.of("stop")); - assertEquals(ImmutableList.copyOf(entity.getLocations()), ImmutableList.of(machine)); - assertFalse(loc.getAvailable().contains(machine)); - } - - @Test(groups = "Integration") - public void testBasicSoftwareProcessStopAllModes() throws Exception { - for (boolean isEntityStopped : new boolean[] {true, false}) { - for (StopMode stopProcessMode : StopMode.values()) { - for (StopMode stopMachineMode : StopMode.values()) { - try { - testBasicSoftwareProcessStopModes(stopProcessMode, stopMachineMode, isEntityStopped); - } catch (Exception e) { - String msg = "stopProcessMode: " + stopProcessMode + ", stopMachineMode: " + stopMachineMode + ", isEntityStopped: " + isEntityStopped; - throw new PropagatedRuntimeException(msg, e); - } - } - } - } - } - - @Test - public void testBasicSoftwareProcessStopSomeModes() throws Exception { - for (boolean isEntityStopped : new boolean[] {true, false}) { - StopMode stopProcessMode = StopMode.IF_NOT_STOPPED; - StopMode stopMachineMode = StopMode.IF_NOT_STOPPED; - try { - testBasicSoftwareProcessStopModes(stopProcessMode, stopMachineMode, isEntityStopped); - } catch (Exception e) { - String msg = "stopProcessMode: " + stopProcessMode + ", stopMachineMode: " + stopMachineMode + ", isEntityStopped: " + isEntityStopped; - throw new PropagatedRuntimeException(msg, e); - } - } - } - - private void testBasicSoftwareProcessStopModes(StopMode stopProcessMode, StopMode stopMachineMode, boolean isEntityStopped) throws Exception { - FixedListMachineProvisioningLocation<SshMachineLocation> l = getLocation(); - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(l)); - SimulatedDriver d = (SimulatedDriver) entity.getDriver(); - Location machine = Iterables.getOnlyElement(entity.getLocations()); - d.events.clear(); - - if (isEntityStopped) { - ((EntityInternal)entity).setAttribute(ServiceStateLogic.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED); - } - - TaskAdaptable<Void> t1 = Entities.submit(entity, Effectors.invocation(entity, Startable.STOP, - ConfigBag.newInstance() - .configure(StopSoftwareParameters.STOP_PROCESS_MODE, stopProcessMode) - .configure(StopSoftwareParameters.STOP_MACHINE_MODE, stopMachineMode))); - t1.asTask().get(10, TimeUnit.SECONDS); - - if (MachineLifecycleEffectorTasksTest.canStop(stopProcessMode, isEntityStopped)) { - assertEquals(d.events, ImmutableList.of("stop")); - } else { - assertTrue(d.events.isEmpty()); - } - if (MachineLifecycleEffectorTasksTest.canStop(stopMachineMode, machine == null)) { - assertTrue(entity.getLocations().isEmpty()); - assertTrue(l.getAvailable().contains(machine)); - } else { - assertEquals(ImmutableList.copyOf(entity.getLocations()), ImmutableList.of(machine)); - assertFalse(l.getAvailable().contains(machine)); - } - } - - @Test - public void testShutdownIsIdempotent() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - entity.start(ImmutableList.of(loc)); - entity.stop(); - - entity.stop(); - } - - @Test - public void testReleaseEvenIfErrorDuringStart() throws Exception { - MyServiceImpl entity = new MyServiceImpl(app) { - @Override public Class<?> getDriverInterface() { - return SimulatedFailOnStartDriver.class; - } - }; - Entities.manage(entity); - - try { - entity.start(ImmutableList.of(loc)); - Assert.fail(); - } catch (Exception e) { - IllegalStateException cause = Throwables2.getFirstThrowableOfType(e, IllegalStateException.class); - if (cause == null || !cause.toString().contains("Simulating start error")) throw e; - } - - try { - entity.stop(); - } catch (Exception e) { - // Keep going - LOG.info("Error during stop, after simulating error during start", e); - } - Assert.assertEquals(loc.getAvailable(), ImmutableSet.of(machine)); - Entities.unmanage(entity); - } - - @SuppressWarnings("rawtypes") - public void doTestReleaseEvenIfErrorDuringStop(final Class driver) throws Exception { - MyServiceImpl entity = new MyServiceImpl(app) { - @Override public Class<?> getDriverInterface() { - return driver; - } - }; - Entities.manage(entity); - - entity.start(ImmutableList.of(loc)); - Task<Void> t = entity.invoke(Startable.STOP); - t.blockUntilEnded(); - - assertFalse(t.isError(), "Expected parent to succeed, not fail with " + Tasks.getError(t)); - Iterator<Task<?>> failures; - failures = Tasks.failed(Tasks.descendants(t, true)).iterator(); - Assert.assertTrue(failures.hasNext(), "Expected error in descendants"); - failures = Tasks.failed(Tasks.children(t)).iterator(); - Assert.assertTrue(failures.hasNext(), "Expected error in child"); - Throwable e = Tasks.getError(failures.next()); - if (e == null || !e.toString().contains("Simulating stop error")) - Assert.fail("Wrong error", e); - - Assert.assertEquals(loc.getAvailable(), ImmutableSet.of(machine), "Expected location to be available again"); - - Entities.unmanage(entity); - } - - @Test - public void testReleaseEvenIfErrorDuringStop() throws Exception { - doTestReleaseEvenIfErrorDuringStop(SimulatedFailOnStopDriver.class); - } - - @Test - public void testReleaseEvenIfChildErrorDuringStop() throws Exception { - doTestReleaseEvenIfErrorDuringStop(SimulatedFailInChildOnStopDriver.class); - } - - @Test - public void testDoubleStopEntity() { - ReflectiveEntityDriverFactory f = ((BasicEntityDriverManager)mgmt.getEntityDriverManager()).getReflectiveDriverFactory(); - f.addClassFullNameMapping(EmptySoftwareProcessDriver.class.getName(), MinimalEmptySoftwareProcessTestDriver.class.getName()); - - // Second stop on SoftwareProcess will return early, while the first stop is still in progress - // This causes the app to shutdown prematurely, leaking machines. - EntityManager emgr = mgmt.getEntityManager(); - EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class); - TestApplication app = emgr.createEntity(appSpec); - emgr.manage(app); - EntitySpec<?> latchEntitySpec = EntitySpec.create(EmptySoftwareProcess.class); - Entity entity = app.createAndManageChild(latchEntitySpec); - - final ReleaseLatchLocation loc = mgmt.getLocationManager().createLocation(LocationSpec.create(ReleaseLatchLocation.class)); - try { - app.start(ImmutableSet.of(loc)); - EntityTestUtils.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - - final Task<Void> firstStop = entity.invoke(Startable.STOP, ImmutableMap.<String, Object>of()); - // Wait until first task tries to release the location, at this point the entity's reference - // to the location is already cleared. - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(loc.isBlocked()); - } - }); - - // Subsequent stops will end quickly - no location to release, - // while the first one is still releasing the machine. - final Task<Void> secondStop = entity.invoke(Startable.STOP, ImmutableMap.<String, Object>of());; - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(secondStop.isDone()); - } - }); - - // Entity state is STOPPED even though first location is still releasing - EntityTestUtils.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED); - Asserts.succeedsContinually(new Runnable() { - @Override - public void run() { - assertFalse(firstStop.isDone()); - } - }); - - loc.unblock(); - - // After the location is released, first task ends as well. - EntityTestUtils.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED); - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(firstStop.isDone()); - } - }); - - } finally { - loc.unblock(); - } - - } - - @Test - public void testDoubleStopApp() { - ReflectiveEntityDriverFactory f = ((BasicEntityDriverManager)mgmt.getEntityDriverManager()).getReflectiveDriverFactory(); - f.addClassFullNameMapping(EmptySoftwareProcessDriver.class.getName(), MinimalEmptySoftwareProcessTestDriver.class.getName()); - - // Second stop on SoftwareProcess will return early, while the first stop is still in progress - // This causes the app to shutdown prematurely, leaking machines. - EntityManager emgr = mgmt.getEntityManager(); - EntitySpec<TestApplication> appSpec = EntitySpec.create(TestApplication.class); - final TestApplication app = emgr.createEntity(appSpec); - emgr.manage(app); - EntitySpec<?> latchEntitySpec = EntitySpec.create(EmptySoftwareProcess.class); - final Entity entity = app.createAndManageChild(latchEntitySpec); - - final ReleaseLatchLocation loc = mgmt.getLocationManager().createLocation(LocationSpec.create(ReleaseLatchLocation.class)); - try { - app.start(ImmutableSet.of(loc)); - EntityTestUtils.assertAttributeEquals(entity, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - - final Task<Void> firstStop = app.invoke(Startable.STOP, ImmutableMap.<String, Object>of()); - // Wait until first task tries to release the location, at this point the entity's reference - // to the location is already cleared. - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(loc.isBlocked()); - } - }); - - // Subsequent stops will end quickly - no location to release, - // while the first one is still releasing the machine. - final Task<Void> secondStop = app.invoke(Startable.STOP, ImmutableMap.<String, Object>of());; - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(secondStop.isDone()); - } - }); - - // Since second stop succeeded the app will get unmanaged. - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(!Entities.isManaged(entity)); - assertTrue(!Entities.isManaged(app)); - } - }); - - // Unmanage will cancel the first task - Asserts.succeedsEventually(new Runnable() { - @Override - public void run() { - assertTrue(firstStop.isDone()); - } - }); - } finally { - // We still haven't unblocked the location release, but entity is already unmanaged. - // Double STOP on an application could leak locations!!! - loc.unblock(); - } - } - - @Test - public void testOpenPortsWithPortRangeConfig() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class) - .configure("http.port", "9999+")); - Assert.assertTrue(entity.getRequiredOpenPorts().contains(9999)); - } - - @ImplementedBy(MyServiceImpl.class) - public interface MyService extends SoftwareProcess { - PortAttributeSensorAndConfigKey HTTP_PORT = Attributes.HTTP_PORT; - public SoftwareProcessDriver getDriver(); - public Collection<Integer> getRequiredOpenPorts(); - } - - public static class MyServiceImpl extends SoftwareProcessImpl implements MyService { - public MyServiceImpl() {} - public MyServiceImpl(Entity parent) { super(parent); } - - @Override - protected void initEnrichers() { - // Don't add enrichers messing with the SERVICE_UP state - we are setting it manually - } - - @Override - public Class<?> getDriverInterface() { - return SimulatedDriver.class; - } - - @Override - public Collection<Integer> getRequiredOpenPorts() { - return super.getRequiredOpenPorts(); - } - } - - @ImplementedBy(MyServiceWithVersionImpl.class) - public interface MyServiceWithVersion extends MyService { - public static ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "9.9.9"); - } - - public static class MyServiceWithVersionImpl extends MyServiceImpl implements MyServiceWithVersion { - public MyServiceWithVersionImpl() {} - public MyServiceWithVersionImpl(Entity parent) { super(parent); } - } - - public static class SimulatedFailOnStartDriver extends SimulatedDriver { - public SimulatedFailOnStartDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void install() { - throw new IllegalStateException("Simulating start error"); - } - } - - public static class SimulatedFailOnStopDriver extends SimulatedDriver { - public SimulatedFailOnStopDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void stop() { - throw new IllegalStateException("Simulating stop error"); - } - } - - public static class SimulatedFailInChildOnStopDriver extends SimulatedDriver { - public SimulatedFailInChildOnStopDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void stop() { - DynamicTasks.queue(Tasks.fail("Simulating stop error in child", null)); - } - } - - public static class SimulatedDriver extends AbstractSoftwareProcessSshDriver { - public List<String> events = new ArrayList<String>(); - private volatile boolean launched = false; - - public SimulatedDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public boolean isRunning() { - return launched; - } - - @Override - public void stop() { - events.add("stop"); - launched = false; - entity.setAttribute(Startable.SERVICE_UP, false); - entity.setAttribute(SoftwareProcess.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED); - } - - @Override - public void kill() { - events.add("kill"); - launched = false; - entity.setAttribute(Startable.SERVICE_UP, false); - } - - @Override - public void install() { - events.add("install"); - entity.setAttribute(SoftwareProcess.SERVICE_STATE_ACTUAL, Lifecycle.STARTING); - } - - @Override - public void customize() { - events.add("customize"); - } - - @Override - public void launch() { - events.add("launch"); - launched = true; - entity.setAttribute(Startable.SERVICE_UP, true); - entity.setAttribute(SoftwareProcess.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING); - } - - @Override - public void setup() { - events.add("setup"); - } - - @Override - public void copyInstallResources() { - events.add("copyInstallResources"); - } - - @Override - public void copyRuntimeResources() { - events.add("copyRuntimeResources"); - } - - @Override - public void runPreInstallCommand(String command) { } - - @Override - public void runPostInstallCommand(String command) { } - - @Override - public void runPreLaunchCommand(String command) { } - - @Override - public void runPostLaunchCommand(String command) { } - - @Override - protected String getInstallLabelExtraSalt() { - return (String)getEntity().getConfigRaw(ConfigKeys.newStringConfigKey("salt"), true).or((String)null); - } - } - - public static class ReleaseLatchLocation extends SimulatedLocation { - private static final long serialVersionUID = 1L; - - private CountDownLatch lock = new CountDownLatch(1); - private volatile boolean isBlocked; - - public void unblock() { - lock.countDown(); - } - @Override - public void release(MachineLocation machine) { - super.release(machine); - try { - isBlocked = true; - lock.await(); - isBlocked = false; - } catch (InterruptedException e) { - throw Exceptions.propagate(e); - } - } - - public boolean isBlocked() { - return isBlocked; - } - - } - - public static class MinimalEmptySoftwareProcessTestDriver implements EmptySoftwareProcessDriver { - - private EmptySoftwareProcessImpl entity; - private Location location; - - public MinimalEmptySoftwareProcessTestDriver(EmptySoftwareProcessImpl entity, Location location) { - this.entity = entity; - this.location = location; - } - - @Override - public Location getLocation() { - return location; - } - - @Override - public EntityLocal getEntity() { - return entity; - } - - @Override - public boolean isRunning() { - return true; - } - - @Override - public void rebind() { - } - - @Override - public void start() { - } - - @Override - public void restart() { - } - - @Override - public void stop() { - } - - @Override - public void kill() { - } - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSshDriverIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSshDriverIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSshDriverIntegrationTest.java deleted file mode 100644 index c4ce2fe..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSshDriverIntegrationTest.java +++ /dev/null @@ -1,385 +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; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotEquals; -import static org.testng.Assert.assertTrue; - -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.internal.EntityLocal; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext; -import org.apache.brooklyn.core.test.entity.TestApplication; -import org.apache.brooklyn.entity.core.BrooklynConfigKeys; -import org.apache.brooklyn.entity.core.Entities; -import org.apache.brooklyn.entity.factory.ApplicationBuilder; -import org.apache.brooklyn.entity.trait.Startable; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.BrooklynNetworkUtils; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.stream.KnownSizeInputStream; -import org.apache.brooklyn.util.stream.Streams; -import org.apache.brooklyn.util.yaml.Yamls; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; -import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation; -import org.apache.brooklyn.location.basic.SshMachineLocation; - -import com.google.common.base.Charsets; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.io.ByteSource; -import com.google.common.io.Files; - - -public class SoftwareProcessSshDriverIntegrationTest { - - private LocalManagementContext managementContext; - private LocalhostMachineProvisioningLocation localhost; - private SshMachineLocation machine127; - private TestApplication app; - private File tempDataDir; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - tempDataDir = Files.createTempDir(); - managementContext = new LocalManagementContext(); - - localhost = managementContext.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class)); - machine127 = managementContext.getLocationManager().createLocation(LocationSpec.create(SshMachineLocation.class) - .configure("address", "localhost")); - app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (app != null) Entities.destroyAll(app.getManagementContext()); - if (tempDataDir != null) Os.deleteRecursively(tempDataDir); - } - - // Integration test because requires ssh'ing (and takes about 5 seconds) - // See also SoftwareProcessEntityTest.testCustomInstallDirX for a lot more mocked variants - @Test(groups="Integration") - public void testCanInstallMultipleVersionsOnSameMachine() throws Exception { - managementContext.getBrooklynProperties().put(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class) - .configure(SoftwareProcess.SUGGESTED_VERSION, "0.1.0")); - MyService entity2 = app.createAndManageChild(EntitySpec.create(MyService.class) - .configure(SoftwareProcess.SUGGESTED_VERSION, "0.2.0")); - app.start(ImmutableList.of(machine127)); - - String installDir1 = entity.getAttribute(SoftwareProcess.INSTALL_DIR); - String installDir2 = entity2.getAttribute(SoftwareProcess.INSTALL_DIR); - - assertNotEquals(installDir1, installDir2); - assertTrue(installDir1.contains("0.1.0"), "installDir1="+installDir1); - assertTrue(installDir2.contains("0.2.0"), "installDir2="+installDir2); - assertTrue(new File(new File(installDir1), "myfile").isFile()); - assertTrue(new File(new File(installDir2), "myfile").isFile()); - } - - @Test(groups="Integration") - public void testLocalhostInTmp() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - app.start(ImmutableList.of(localhost)); - - String installDir = entity.getAttribute(SoftwareProcess.INSTALL_DIR); - assertTrue(installDir.startsWith("/tmp/brooklyn-"+Os.user()+"/installs/"), "installed in "+installDir); - } - - @Test(groups="Integration") - public void testMachine127InHome() throws Exception { - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - app.start(ImmutableList.of(machine127)); - - String installDir = entity.getAttribute(SoftwareProcess.INSTALL_DIR); - assertTrue(installDir.startsWith(Os.home()+"/brooklyn-managed-processes/installs/"), "installed in "+installDir); - } - - @Test(groups="Integration") - public void testLocalhostInCustom() throws Exception { - localhost.setConfig(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - app.start(ImmutableList.of(localhost)); - - String installDir = entity.getAttribute(SoftwareProcess.INSTALL_DIR); - assertTrue(installDir.startsWith(tempDataDir.getAbsolutePath()+"/installs/"), "installed in "+installDir); - } - - @Test(groups="Integration") - @Deprecated - public void testMachineInCustomFromDataDir() throws Exception { - managementContext.getBrooklynProperties().put(BrooklynConfigKeys.BROOKLYN_DATA_DIR, tempDataDir.getAbsolutePath()); - - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - app.start(ImmutableList.of(machine127)); - - String installDir = entity.getAttribute(SoftwareProcess.INSTALL_DIR); - assertTrue(installDir.startsWith(tempDataDir.getAbsolutePath()+"/installs/"), "installed in "+installDir); - } - - @Test(groups="Integration") - public void testCopyResource() throws Exception { - File tempDest = new File(tempDataDir, "tempDest.txt"); - String tempLocalContent = "abc"; - File tempLocal = new File(tempDataDir, "tempLocal.txt"); - Files.write(tempLocalContent, tempLocal, Charsets.UTF_8); - - localhost.setConfig(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - app.start(ImmutableList.of(localhost)); - - // Copy local file - entity.getDriver().copyResource(tempLocal, tempDest.getAbsolutePath()); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - tempDest.delete(); - - // Copy local file using url - entity.getDriver().copyResource(tempLocal.toURI().toString(), tempDest.getAbsolutePath()); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - tempDest.delete(); - - // Copy reader - entity.getDriver().copyResource(new StringReader(tempLocalContent), tempDest.getAbsolutePath()); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - tempDest.delete(); - - // Copy stream - entity.getDriver().copyResource(ByteSource.wrap(tempLocalContent.getBytes()).openStream(), tempDest.getAbsolutePath()); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - tempDest.delete(); - - // Copy known-size stream - entity.getDriver().copyResource(new KnownSizeInputStream(Streams.newInputStreamWithContents(tempLocalContent), tempLocalContent.length()), tempDest.getAbsolutePath()); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - tempDest.delete(); - } - - @Test(groups="Integration") - public void testCopyResourceCreatingParentDir() throws Exception { - /* - * TODO copyResource will now always create the parent dir, irrespective of the createParentDir value! - * In SshMachineLocation on 2014-05-29, Alex added: mkdir -p `dirname '$DEST'` - * - * Changing this test to assert that parent dir always created; should we delete boolean createParentDir - * from the copyResource method? - * - * TODO Have also deleted test that if relative path is given it will write that relative to $RUN_DIR. - * That is not the case: it is relative to $HOME, which seems fine. For example, if copyResource - * is used during install phase then $RUN_DIR would be the wrong default. - * Is there any code that relies on this behaviour? - */ - File tempDataDirSub = new File(tempDataDir, "subdir"); - File tempDest = new File(tempDataDirSub, "tempDest.txt"); - String tempLocalContent = "abc"; - File tempLocal = new File(tempDataDir, "tempLocal.txt"); - Files.write(tempLocalContent, tempLocal, Charsets.UTF_8); - - localhost.setConfig(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - - MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); - app.start(ImmutableList.of(localhost)); - - // First confirm that even if createParentDir==false that it still gets created! - try { - entity.getDriver().copyResource(tempLocal.toURI().toString(), tempDest.getAbsolutePath(), false); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - } finally { - Os.deleteRecursively(tempDataDirSub); - } - - // Copy to absolute path - try { - entity.getDriver().copyResource(tempLocal.toURI().toString(), tempDest.getAbsolutePath(), true); - assertEquals(Files.readLines(tempDest, Charsets.UTF_8), ImmutableList.of(tempLocalContent)); - } finally { - Os.deleteRecursively(tempDataDirSub); - } - } - - @Test(groups="Integration") - public void testPreAndPostLaunchCommands() throws IOException { - File tempFile = new File(tempDataDir, "tempFile.txt"); - localhost.setConfig(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - app.createAndManageChild(EntitySpec.create(VanillaSoftwareProcess.class) - .configure(VanillaSoftwareProcess.CHECK_RUNNING_COMMAND, "") - .configure(SoftwareProcess.PRE_LAUNCH_COMMAND, String.format("echo inPreLaunch >> %s", tempFile.getAbsoluteFile())) - .configure(VanillaSoftwareProcess.LAUNCH_COMMAND, String.format("echo inLaunch >> %s", tempFile.getAbsoluteFile())) - .configure(SoftwareProcess.POST_LAUNCH_COMMAND, String.format("echo inPostLaunch >> %s", tempFile.getAbsoluteFile()))); - app.start(ImmutableList.of(localhost)); - - List<String> output = Files.readLines(tempFile, Charsets.UTF_8); - assertEquals(output.size(), 3); - assertEquals(output.get(0), "inPreLaunch"); - assertEquals(output.get(1), "inLaunch"); - assertEquals(output.get(2), "inPostLaunch"); - tempFile.delete(); - } - - @Test(groups="Integration") - public void testInstallResourcesCopy() throws IOException { - localhost.setConfig(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - File template = new File(Os.tmp(), "template.yaml"); - VanillaSoftwareProcess entity = app.createAndManageChild(EntitySpec.create(VanillaSoftwareProcess.class) - .configure(VanillaSoftwareProcess.CHECK_RUNNING_COMMAND, "") - .configure(SoftwareProcess.INSTALL_FILES, MutableMap.of("classpath://brooklyn/entity/basic/frogs.txt", "frogs.txt")) - .configure(SoftwareProcess.INSTALL_TEMPLATES, MutableMap.of("classpath://brooklyn/entity/basic/template.yaml", template.getAbsolutePath())) - .configure(VanillaSoftwareProcess.LAUNCH_COMMAND, "date")); - app.start(ImmutableList.of(localhost)); - - File frogs = new File(entity.getAttribute(SoftwareProcess.INSTALL_DIR), "frogs.txt"); - try { - Assert.assertTrue(frogs.canRead(), "File not readable: " + frogs); - String output = Files.toString(frogs, Charsets.UTF_8); - Assert.assertTrue(output.contains("Brekekekex"), "File content not found: " + output); - } finally { - frogs.delete(); - } - - try { - String expectedHostname = BrooklynNetworkUtils.getLocalhostInetAddress().getHostName(); - String expectedIp = BrooklynNetworkUtils.getLocalhostInetAddress().getHostAddress(); - - Map<?,?> data = (Map) Iterables.getOnlyElement(Yamls.parseAll(Files.toString(template, Charsets.UTF_8))); - Assert.assertEquals(data.size(), 3); - Assert.assertEquals(data.get("entity.hostname"), expectedHostname); - Assert.assertEquals(data.get("entity.address"), expectedIp); - Assert.assertEquals(data.get("frogs"), Integer.valueOf(12)); - } finally { - template.delete(); - } - } - - @Test(groups="Integration") - public void testRuntimeResourcesCopy() throws IOException { - localhost.setConfig(BrooklynConfigKeys.ONBOX_BASE_DIR, tempDataDir.getAbsolutePath()); - File template = new File(Os.tmp(), "template.yaml"); - VanillaSoftwareProcess entity = app.createAndManageChild(EntitySpec.create(VanillaSoftwareProcess.class) - .configure(VanillaSoftwareProcess.CHECK_RUNNING_COMMAND, "") - .configure(SoftwareProcess.RUNTIME_FILES, MutableMap.of("classpath://brooklyn/entity/basic/frogs.txt", "frogs.txt")) - .configure(SoftwareProcess.RUNTIME_TEMPLATES, MutableMap.of("classpath://brooklyn/entity/basic/template.yaml", template.getAbsolutePath())) - .configure(VanillaSoftwareProcess.LAUNCH_COMMAND, "date")); - app.start(ImmutableList.of(localhost)); - - File frogs = new File(entity.getAttribute(SoftwareProcess.RUN_DIR), "frogs.txt"); - try { - Assert.assertTrue(frogs.canRead(), "File not readable: " + frogs); - String output = Files.toString(frogs, Charsets.UTF_8); - Assert.assertTrue(output.contains("Brekekekex"), "File content not found: " + output); - } finally { - frogs.delete(); - } - - try { - String expectedHostname = BrooklynNetworkUtils.getLocalhostInetAddress().getHostName(); - String expectedIp = BrooklynNetworkUtils.getLocalhostInetAddress().getHostAddress(); - - Map<?,?> data = (Map) Iterables.getOnlyElement(Yamls.parseAll(Files.toString(template, Charsets.UTF_8))); - Assert.assertEquals(data.size(), 3); - Assert.assertEquals(data.get("entity.hostname"), expectedHostname); - Assert.assertEquals(data.get("entity.address"), expectedIp); - Assert.assertEquals(data.get("frogs"), Integer.valueOf(12)); - } finally { - template.delete(); - } - } - - @ImplementedBy(MyServiceImpl.class) - public interface MyService extends SoftwareProcess { - public SimulatedDriver getDriver(); - } - - public static class MyServiceImpl extends SoftwareProcessImpl implements MyService { - public MyServiceImpl() { - } - - @Override - public Class<?> getDriverInterface() { - return SimulatedDriver.class; - } - - @Override - public SimulatedDriver getDriver() { - return (SimulatedDriver) super.getDriver(); - } - } - - public static class SimulatedDriver extends AbstractSoftwareProcessSshDriver { - public List<String> events = new ArrayList<String>(); - private volatile boolean launched = false; - - public SimulatedDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void install() { - events.add("install"); - newScript(INSTALLING) - .failOnNonZeroResultCode() - .body.append("touch myfile") - .execute(); - } - - @Override - public void customize() { - events.add("customize"); - } - - @Override - public void launch() { - events.add("launch"); - launched = true; - entity.setAttribute(Startable.SERVICE_UP, true); - } - - @Override - public boolean isRunning() { - return launched; - } - - @Override - public void stop() { - events.add("stop"); - launched = false; - entity.setAttribute(Startable.SERVICE_UP, false); - } - - @Override - public void kill() { - events.add("kill"); - launched = false; - entity.setAttribute(Startable.SERVICE_UP, false); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSubclassTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSubclassTest.java b/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSubclassTest.java deleted file mode 100644 index fc006fe..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/SoftwareProcessSubclassTest.java +++ /dev/null @@ -1,166 +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; - -import static org.testng.Assert.assertEquals; - -import java.util.Collections; -import java.util.List; - -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; -import org.apache.brooklyn.effector.core.EffectorAndBody; -import org.apache.brooklyn.effector.core.MethodEffector; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; - - -public class SoftwareProcessSubclassTest extends BrooklynAppUnitTestSupport { - -// NB: These tests don't actually require ssh to localhost -- only that 'localhost' resolves. - - @SuppressWarnings("unused") - private static final Logger LOG = LoggerFactory.getLogger(SoftwareProcessSubclassTest.class); - - @ImplementedBy(SubSoftwareProcessImpl.class) - public static interface SubSoftwareProcess extends EmptySoftwareProcess { - public List<String> getCallHistory(); - public void triggerStopOutsideOfEffector(); - public void customRestart(); - } - - public static class SubSoftwareProcessImpl extends EmptySoftwareProcessImpl implements SubSoftwareProcess { - - protected List<String> callHistory = Collections.synchronizedList(Lists.<String>newArrayList()); - - @Override - public void init() { - super.init(); - getMutableEntityType().addEffector(new EffectorAndBody<Void>(SoftwareProcess.RESTART, new MethodEffector<Void>(SubSoftwareProcess.class, "customRestart").getBody())); - } - - @Override - public List<String> getCallHistory() { - return callHistory; - } - - @Override - public void preStart() { - callHistory.add("doStart"); - super.preStart(); - } - - @Override - public void preStop() { - callHistory.add("doStop"); - super.preStop(); - } - - @Override - public void customRestart() { - callHistory.add("doRestart"); - } - - @Override - public void triggerStopOutsideOfEffector() { - stop(); - } - - } - - private Location loc; - private List<Location> locs; - private SubSoftwareProcess entity; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - loc = mgmt.getLocationRegistry().resolve("localhost"); - locs = ImmutableList.of(loc); - entity = app.createAndManageChild(EntitySpec.create(SubSoftwareProcess.class)); - } - - @Test - public void testStartCalledViaMethod() throws Exception { - entity.start(locs); - - assertCallHistory(ImmutableList.of("doStart")); - } - - @Test - public void testStopCalledViaMethod() throws Exception { - app.start(locs); - entity.stop(); - - assertCallHistory(ImmutableList.of("doStart", "doStop")); - } - - @Test - public void testRestartCalledViaMethod() throws Exception { - app.start(locs); - entity.restart(); - - assertCallHistory(ImmutableList.of("doStart", "doRestart")); - } - - @Test - public void testStopCalledWithoutEffector() throws Exception { - app.start(locs); - entity.triggerStopOutsideOfEffector(); - - assertCallHistory(ImmutableList.of("doStart", "doStop")); - } - - @Test - public void testStartCalledViaInvokeEffector() throws Exception { - entity.invoke(SubSoftwareProcess.START, ImmutableMap.<String,Object>of("locations", locs)).get(); - - assertCallHistory(ImmutableList.of("doStart")); - } - - @Test - public void testStopCalledViaInvokeEffector() throws Exception { - app.start(locs); - entity.invoke(SubSoftwareProcess.STOP, ImmutableMap.<String,Object>of()).get(); - - assertCallHistory(ImmutableList.of("doStart", "doStop")); - } - - @Test - public void testRestartCalledViaInvokeEffector() throws Exception { - app.start(locs); - entity.invoke(SubSoftwareProcess.RESTART, ImmutableMap.<String,Object>of()).get(); - - assertCallHistory(ImmutableList.of("doStart", "doRestart")); - } - - private void assertCallHistory(Iterable<String> expected) { - List<String> actual = entity.getCallHistory(); - assertEquals(actual, ImmutableList.copyOf(expected), "actual="+actual); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/VanillaSoftwareProcessAndChildrenIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/VanillaSoftwareProcessAndChildrenIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/basic/VanillaSoftwareProcessAndChildrenIntegrationTest.java deleted file mode 100644 index 1179cfc..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/VanillaSoftwareProcessAndChildrenIntegrationTest.java +++ /dev/null @@ -1,196 +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; - -import java.util.Collections; -import java.util.concurrent.TimeUnit; - -import org.apache.brooklyn.api.entity.EntitySpec; -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.test.EntityTestUtils; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.javalang.JavaClassNames; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.text.Strings; -import org.apache.brooklyn.util.time.Duration; -import org.apache.brooklyn.util.time.Time; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.basic.SoftwareProcess.ChildStartableMode; - -import com.google.common.base.Stopwatch; - -public class VanillaSoftwareProcessAndChildrenIntegrationTest { - - // TODO Why are these tests so slow? Even when the sleep time was 3 seconds instead of 10, they would still take about 10 seconds. - - // Note that tests run by jenkins can be extremely time-sensitive. - // e.g. http://brooklyn.builds.cloudsoftcorp.com/job/Brooklyn-Master-Integration/io.brooklyn$brooklyn-software-base/217/testReport/junit/brooklyn.entity.basic/VanillaSoftwareProcessAndChildrenIntegrationTest/testModeBackground/ - // shows a 5 second difference when in background mode, whereas the test originally asserted a difference of <= 1. - // Therefore increasing time that tests will take, but decreasing the sensitivity so we don't get such false-negatives. - - private static final Logger log = LoggerFactory.getLogger(VanillaSoftwareProcessAndChildrenIntegrationTest.class); - - private static final int PARENT_TASK_SLEEP_LENGTH_SECS = 10; - private static final int CHILD_TASK_SLEEP_LENGTH_SECS = 10; - private static final int CONCURRENT_MAX_ACCEPTABLE_DIFF_SECS = PARENT_TASK_SLEEP_LENGTH_SECS - 1; - private static final int SEQUENTIAL_MIN_ACCEPTABLE_DIFF_SECS = PARENT_TASK_SLEEP_LENGTH_SECS - 1; - private static final int EARLY_RETURN_GRACE_MS = 20; - - private TestApplication app; - private Location localhost; - - private VanillaSoftwareProcess p1; - private VanillaSoftwareProcess p2; - - @BeforeMethod(alwaysRun=true) - public void setup() { - app = TestApplication.Factory.newManagedInstanceForTests(); - localhost = app.getManagementContext().getLocationRegistry().resolve("localhost"); - } - - @AfterMethod(alwaysRun=true) - public void shutdown() { - if (app != null) Entities.destroyAll(app.getManagementContext()); - } - - @Test(groups = "Integration") - public void testModeNone() { - prep(ChildStartableMode.NONE); - long startTime = startApp(); - - Assert.assertNotNull(p1.getAttribute(SoftwareProcess.RUN_DIR)); - Assert.assertNull(p2.getAttribute(SoftwareProcess.RUN_DIR)); - Assert.assertTrue(startTime >= PARENT_TASK_SLEEP_LENGTH_SECS*1000 - EARLY_RETURN_GRACE_MS, "startTime="+Time.makeTimeStringRounded(startTime)); - } - - @Test(groups = "Integration") - public void testModeForeground() { - prep(ChildStartableMode.FOREGROUND); - long startTime = startApp(); - - long timediff = timediff(); - Assert.assertTrue( Math.abs(timediff) <= CONCURRENT_MAX_ACCEPTABLE_DIFF_SECS, "should have started concurrently, not with time difference "+timediff+" ("+p1+", "+p2+")" ); - Assert.assertTrue(startTime >= PARENT_TASK_SLEEP_LENGTH_SECS*1000 - EARLY_RETURN_GRACE_MS, "startTime="+Time.makeTimeStringRounded(startTime)); - } - - @Test(groups = "Integration") - public void testModeForegroundLate() { - prep(ChildStartableMode.FOREGROUND_LATE); - long startTime = startApp(); - - long timediff = timediff(); - Assert.assertTrue( timediff >= SEQUENTIAL_MIN_ACCEPTABLE_DIFF_SECS, "should have started later, not with time difference "+timediff+" ("+p1+", "+p2+")" ); - Assert.assertTrue(startTime >= 2*PARENT_TASK_SLEEP_LENGTH_SECS*1000 - EARLY_RETURN_GRACE_MS, "startTime="+Time.makeTimeStringRounded(startTime)); - } - - @Test(groups = "Integration") - public void testModeBackground() { - prep(ChildStartableMode.BACKGROUND); - long startTime = startApp(); - - checkChildComesUpSoon(); - - long timediff = timediff(); - Assert.assertTrue( Math.abs(timediff) <= CONCURRENT_MAX_ACCEPTABLE_DIFF_SECS, "should have started concurrently, not with time difference "+timediff+" ("+p1+", "+p2+")" ); - Assert.assertTrue(startTime >= PARENT_TASK_SLEEP_LENGTH_SECS*1000 - EARLY_RETURN_GRACE_MS, "startTime="+Time.makeTimeStringRounded(startTime)); - } - - @Test(groups = "Integration") - public void testModeBackgroundLate() { - prep(ChildStartableMode.BACKGROUND_LATE); - long startTime = startApp(); - - checkChildNotUpYet(); - checkChildComesUpSoon(); - - long timediff = timediff(); - Assert.assertTrue( Math.abs(timediff) >= SEQUENTIAL_MIN_ACCEPTABLE_DIFF_SECS, "should have started later, not with time difference "+timediff+" ("+p1+", "+p2+")" ); - Assert.assertTrue(startTime >= PARENT_TASK_SLEEP_LENGTH_SECS*1000 - EARLY_RETURN_GRACE_MS, "startTime="+Time.makeTimeStringRounded(startTime)); - - // just to prevent warnings - waitForBackgroundedTasks(CHILD_TASK_SLEEP_LENGTH_SECS+1); - app.stop(); - app = null; - } - - private long startApp() { - Stopwatch stopwatch = Stopwatch.createStarted(); - app.start(Collections.singleton(localhost)); - long result = stopwatch.elapsed(TimeUnit.MILLISECONDS); - log.info("Took "+Time.makeTimeStringRounded(result)+" for app.start to complete"); - return result; - } - - private void waitForBackgroundedTasks(int secs) { - // child task is backgrounded; quick and dirty way to make sure it finishes (after setting service_up) - Time.sleep(Duration.seconds(secs)); - } - - private void checkChildNotUpYet() { - Assert.assertFalse(p2.getAttribute(SoftwareProcess.SERVICE_UP)); - } - - private void checkChildComesUpSoon() { - Stopwatch stopwatch = Stopwatch.createStarted(); - EntityTestUtils.assertAttributeEqualsEventually(p2, Attributes.SERVICE_UP, true); - log.info("Took "+Time.makeTimeStringRounded(stopwatch)+" for child-process to be service-up"); - } - - private long timediff() { - Long d1 = getRunTimeUtc(p1); - Long d2 = getRunTimeUtc(p2); - - log.info("timestamps for "+JavaClassNames.callerNiceClassAndMethod(1)+" have difference "+(d2-d1)); - - return d2 - d1; - } - - private Long getRunTimeUtc(VanillaSoftwareProcess p) { - Assert.assertNotNull(p.getAttribute(SoftwareProcess.RUN_DIR)); - return Long.parseLong( Strings.getFirstWordAfter(new ResourceUtils(this).getResourceAsString(Os.mergePaths(p.getAttribute(SoftwareProcess.RUN_DIR), "DATE")), "utc") ); - } - - private void prep(ChildStartableMode mode) { - String parentCmd = "echo utc `date +%s` > DATE ; echo human `date` >> DATE ; " - + "{ nohup sleep 60 & } ; echo $! > $PID_FILE ; sleep "+PARENT_TASK_SLEEP_LENGTH_SECS; - - String childCmd = "echo utc `date +%s` > DATE ; echo human `date` >> DATE ; " - + "{ nohup sleep 60 & } ; echo $! > $PID_FILE ; sleep "+CHILD_TASK_SLEEP_LENGTH_SECS; - - p1 = app.createAndManageChild(EntitySpec.create(VanillaSoftwareProcess.class) - .configure(VanillaSoftwareProcess.LAUNCH_COMMAND, parentCmd) - .configure(VanillaSoftwareProcess.CHILDREN_STARTABLE_MODE, mode) - ); - p2 = p1.addChild(EntitySpec.create(VanillaSoftwareProcess.class) - .configure(VanillaSoftwareProcess.LAUNCH_COMMAND, childCmd)); - Entities.manage(p2); - - log.info("testing "+JavaClassNames.callerNiceClassAndMethod(1)+", using "+p1+" and "+p2); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntity.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntity.java b/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntity.java deleted file mode 100644 index a582b15..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntity.java +++ /dev/null @@ -1,28 +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 org.apache.brooklyn.api.entity.ImplementedBy; - -import brooklyn.entity.basic.SoftwareProcess; - -@ImplementedBy(MyEntityImpl.class) -public interface MyEntity extends SoftwareProcess { - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityApp.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityApp.java b/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityApp.java deleted file mode 100644 index 632489f..0000000 --- a/software/base/src/test/java/brooklyn/entity/basic/lifecycle/MyEntityApp.java +++ /dev/null @@ -1,26 +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; - -public class MyEntityApp { - public static void main(String[] args) throws InterruptedException { - System.out.println("Properties: "+System.getProperties()); - Thread.sleep(60*60*1000); - } -}
