You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/08/19 13:09:31 UTC
[13/72] [abbrv] incubator-brooklyn git commit: BROOKLYN-162 - apply
org.apache package prefix to software-base, tidying package names,
and moving a few sensory things to core
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/MachineLifecycleEffectorTasksTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/MachineLifecycleEffectorTasksTest.java b/software/base/src/test/java/brooklyn/entity/software/MachineLifecycleEffectorTasksTest.java
deleted file mode 100644
index d746c60..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/MachineLifecycleEffectorTasksTest.java
+++ /dev/null
@@ -1,140 +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.software;
-
-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.mgmt.Task;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-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.lifecycle.Lifecycle;
-import org.apache.brooklyn.entity.stock.BasicEntity;
-import org.apache.brooklyn.entity.stock.BasicEntityImpl;
-import org.apache.brooklyn.entity.trait.Startable;
-import org.apache.brooklyn.sensor.core.DependentConfiguration;
-import org.apache.brooklyn.sensor.core.Sensors;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.core.task.TaskInternal;
-import org.apache.brooklyn.util.time.Duration;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import brooklyn.entity.basic.EmptySoftwareProcess;
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.basic.SoftwareProcess.StopSoftwareParameters.StopMode;
-
-import org.apache.brooklyn.location.jclouds.BailOutJcloudsLocation;
-
-public class MachineLifecycleEffectorTasksTest {
- public static boolean canStop(StopMode stopMode, boolean isEntityStopped) {
- BasicEntityImpl entity = new BasicEntityImpl();
- Lifecycle state = isEntityStopped ? Lifecycle.STOPPED : Lifecycle.RUNNING;
- entity.setAttribute(SoftwareProcess.SERVICE_STATE_ACTUAL, state);
- return MachineLifecycleEffectorTasks.canStop(stopMode, entity);
- }
-
- @DataProvider(name = "canStopStates")
- public Object[][] canStopStates() {
- return new Object[][] {
- { StopMode.ALWAYS, true, true },
- { StopMode.ALWAYS, false, true },
- { StopMode.IF_NOT_STOPPED, true, false },
- { StopMode.IF_NOT_STOPPED, false, true },
- { StopMode.NEVER, true, false },
- { StopMode.NEVER, false, false },
- };
- }
-
- @Test(dataProvider = "canStopStates")
- public void testBasicSonftwareProcessCanStop(StopMode mode, boolean isEntityStopped, boolean expected) {
- boolean canStop = canStop(mode, isEntityStopped);
- assertEquals(canStop, expected);
- }
-
- @Test
- public void testProvisionLatchObeyed() throws Exception {
-
- AttributeSensor<Boolean> ready = Sensors.newBooleanSensor("readiness");
-
- TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
- BasicEntity triggerEntity = app.createAndManageChild(EntitySpec.create(BasicEntity.class));
-
- EmptySoftwareProcess entity = app.createAndManageChild(EntitySpec.create(EmptySoftwareProcess.class)
- .configure(BrooklynConfigKeys.PROVISION_LATCH, DependentConfiguration.attributeWhenReady(triggerEntity, ready)));
-
- final Task<Void> task = Entities.invokeEffector(app, app, Startable.START, ImmutableMap.of(
- "locations", ImmutableList.of(BailOutJcloudsLocation.newBailOutJcloudsLocation(app.getManagementContext()))));
-
- assertEffectorBlockingDetailsEventually(entity, "Waiting for config " + BrooklynConfigKeys.PROVISION_LATCH.getName());
-
- Asserts.succeedsContinually(new Runnable() {
- @Override
- public void run() {
- assertFalse(task.isDone());
- }
- });
- try {
- ((EntityLocal) triggerEntity).setAttribute(ready, true);
- task.get(Duration.THIRTY_SECONDS);
- } catch (Throwable t) {
- // BailOut location throws but we don't care.
- } finally {
- Entities.destroyAll(app.getManagementContext());
- }
- }
-
- private void assertEffectorBlockingDetailsEventually(final Entity entity, final String blockingDetailsSnippet) {
- Asserts.succeedsEventually(new Runnable() {
- @Override public void run() {
- Task<?> entityTask = Iterables.getOnlyElement(entity.getApplication().getManagementContext().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/software/SoftwareEffectorTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/SoftwareEffectorTest.java b/software/base/src/test/java/brooklyn/entity/software/SoftwareEffectorTest.java
deleted file mode 100644
index 4c11b4d..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/SoftwareEffectorTest.java
+++ /dev/null
@@ -1,142 +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.software;
-
-import java.util.Arrays;
-
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.effector.core.Effectors;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-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.software.SshEffectorTasks.SshEffectorBody;
-
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.base.Throwables;
-
-public class SoftwareEffectorTest {
-
- private static final Logger log = LoggerFactory.getLogger(SoftwareEffectorTest.class);
-
- TestApplication app;
- ManagementContext mgmt;
-
- @BeforeMethod(alwaysRun=true)
- public void setup() throws Exception {
- app = TestApplication.Factory.newManagedInstanceForTests();
- mgmt = app.getManagementContext();
-
- LocalhostMachineProvisioningLocation lhc = mgmt.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class));
- SshMachineLocation lh = lhc.obtain();
- app.start(Arrays.asList(lh));
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (mgmt != null) Entities.destroyAll(mgmt);
- mgmt = null;
- }
-
- public static final Effector<String> GET_REMOTE_DATE_1 = Effectors.effector(String.class, "getRemoteDate")
- .description("retrieves the date from the remote machine")
- .impl(new SshEffectorBody<String>() {
- public String call(ConfigBag parameters) {
- queue( ssh("date").requiringZeroAndReturningStdout() );
- return last(String.class);
- }
- })
- .build();
-
- public static final Effector<String> GET_REMOTE_DATE_2 = Effectors.effector(GET_REMOTE_DATE_1)
- // Just get year to confirm implementation is different
- .description("retrieves the year from the remote machine")
- .impl(SshEffectorTasks.ssh("date +%Y").requiringZeroAndReturningStdout())
- .build();
-
- // TODO revisit next two tests before end 2019 ;)
-
- @Test(groups="Integration")
- public void testSshDateEffector1() {
- Task<String> call = Entities.invokeEffector(app, app, GET_REMOTE_DATE_1);
- log.info("ssh date 1 gives: "+call.getUnchecked());
- Assert.assertTrue(call.getUnchecked().indexOf("201") > 0);
- }
-
- @Test(groups="Integration")
- public void testSshDateEffector2() {
- Task<String> call = Entities.invokeEffector(app, app, GET_REMOTE_DATE_2);
- log.info("ssh date 2 gives: "+call.getUnchecked());
- Assert.assertTrue(call.getUnchecked().indexOf("201") == 0);
- }
-
- public static final String COMMAND_THAT_DOES_NOT_EXIST = "blah_blah_blah_command_DOES_NOT_EXIST";
-
- @Test(groups="Integration")
- public void testBadExitCodeCaught() {
- Task<Void> call = Entities.invokeEffector(app, app, Effectors.effector(Void.class, "badExitCode")
- .impl(new SshEffectorBody<Void>() {
- public Void call(ConfigBag parameters) {
- queue( ssh(COMMAND_THAT_DOES_NOT_EXIST).requiringZeroAndReturningStdout() );
- return null;
- }
- }).build() );
- try {
- Object result = call.getUnchecked();
- Assert.fail("ERROR: should have failed earlier in this test, instead got successful task result "+result+" from "+call);
- } catch (Exception e) {
- Throwable root = Throwables.getRootCause(e);
- if (!(root instanceof IllegalStateException)) Assert.fail("Should have failed with IAE, but got: "+root);
- if (root.getMessage()==null || root.getMessage().indexOf("exit code")<=0)
- Assert.fail("Should have failed with 'exit code' message, but got: "+root);
- // test passed
- return;
- }
- }
-
- @Test(groups="Integration")
- public void testBadExitCodeCaughtAndStdErrAvailable() {
- final ProcessTaskWrapper<?>[] sshTasks = new ProcessTaskWrapper[1];
-
- Task<Void> call = Entities.invokeEffector(app, app, Effectors.effector(Void.class, "badExitCode")
- .impl(new SshEffectorBody<Void>() {
- public Void call(ConfigBag parameters) {
- sshTasks[0] = queue( ssh(COMMAND_THAT_DOES_NOT_EXIST).requiringExitCodeZero() );
- return null;
- }
- }).build() );
- call.blockUntilEnded();
- Assert.assertTrue(call.isError());
- log.info("stderr gives: "+new String(sshTasks[0].getStderr()));
- Assert.assertTrue(new String(sshTasks[0].getStderr()).indexOf(COMMAND_THAT_DOES_NOT_EXIST) >= 0);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/SshEffectorTasksTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/SshEffectorTasksTest.java b/software/base/src/test/java/brooklyn/entity/software/SshEffectorTasksTest.java
deleted file mode 100644
index c076e56..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/SshEffectorTasksTest.java
+++ /dev/null
@@ -1,263 +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.software;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.mgmt.ManagementContext;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.util.core.task.ssh.SshFetchTaskWrapper;
-import org.apache.brooklyn.util.core.task.ssh.SshPutTaskWrapper;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.exceptions.PropagatedRuntimeException;
-import org.apache.brooklyn.util.net.Urls;
-import org.apache.commons.io.FileUtils;
-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 org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.io.Files;
-
-public class SshEffectorTasksTest {
-
- private static final Logger log = LoggerFactory.getLogger(SshEffectorTasksTest.class);
-
- TestApplication app;
- ManagementContext mgmt;
- SshMachineLocation host;
- File tempDir;
-
- boolean failureExpected;
-
- @BeforeMethod(alwaysRun=true)
- public void setup() throws Exception {
- app = TestApplication.Factory.newManagedInstanceForTests();
- mgmt = app.getManagementContext();
-
- LocalhostMachineProvisioningLocation lhc = mgmt.getLocationManager().createLocation(LocationSpec.create(LocalhostMachineProvisioningLocation.class));
- host = lhc.obtain();
- app.start(Arrays.asList(host));
- clearExpectedFailure();
- tempDir = Files.createTempDir();
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (mgmt != null) Entities.destroyAll(mgmt);
- mgmt = null;
- FileUtils.deleteDirectory(tempDir);
- checkExpectedFailure();
- }
-
- protected void checkExpectedFailure() {
- if (failureExpected) {
- clearExpectedFailure();
- Assert.fail("Test should have thrown an exception but it did not.");
- }
- }
-
- protected void clearExpectedFailure() {
- failureExpected = false;
- }
-
- protected void setExpectingFailure() {
- failureExpected = true;
- }
-
- public <T extends TaskAdaptable<?>> T submit(final TaskFactory<T> taskFactory) {
- return Entities.submit(app, taskFactory);
- }
-
- // ------------------- basic ssh
-
- @Test(groups="Integration")
- public void testSshEchoHello() {
- ProcessTaskWrapper<Integer> t = submit(SshEffectorTasks.ssh("sleep 1 ; echo hello world"));
- Assert.assertFalse(t.isDone());
- Assert.assertEquals(t.get(), (Integer)0);
- Assert.assertEquals(t.getTask().getUnchecked(), (Integer)0);
- Assert.assertEquals(t.getStdout().trim(), "hello world");
- }
-
- @Test(groups="Integration")
- public void testSshPut() throws IOException {
- String fn = Urls.mergePaths(tempDir.getPath(), "f1");
- SshPutTaskWrapper t = submit(SshEffectorTasks.put(fn).contents("hello world"));
- t.block();
- Assert.assertEquals(FileUtils.readFileToString(new File(fn)), "hello world");
- // and make sure this doesn't throw
- Assert.assertTrue(t.isDone());
- Assert.assertTrue(t.isSuccessful());
- Assert.assertEquals(t.get(), null);
- Assert.assertEquals(t.getExitCode(), (Integer)0);
- }
-
- @Test(groups="Integration")
- public void testSshFetch() throws IOException {
- String fn = Urls.mergePaths(tempDir.getPath(), "f2");
- FileUtils.write(new File(fn), "hello fetched world");
-
- SshFetchTaskWrapper t = submit(SshEffectorTasks.fetch(fn));
- t.block();
-
- Assert.assertTrue(t.isDone());
- Assert.assertEquals(t.get(), "hello fetched world");
- }
-
- // ----------------- pid stuff
-
- @Test(groups="Integration")
- public void testNonRunningPid() {
- ProcessTaskWrapper<Integer> t = submit(SshEffectorTasks.codePidRunning(99999));
- Assert.assertNotEquals(t.getTask().getUnchecked(), (Integer)0);
- Assert.assertNotEquals(t.getExitCode(), (Integer)0);
- ProcessTaskWrapper<Boolean> t2 = submit(SshEffectorTasks.isPidRunning(99999));
- Assert.assertFalse(t2.getTask().getUnchecked());
- }
-
- @Test(groups="Integration")
- public void testNonRunningPidRequired() {
- ProcessTaskWrapper<?> t = submit(SshEffectorTasks.requirePidRunning(99999));
- setExpectingFailure();
- try {
- t.getTask().getUnchecked();
- } catch (Exception e) {
- log.info("The error if required PID is not found is: "+e);
- clearExpectedFailure();
- Assert.assertTrue(e.toString().contains("Process with PID"), "Expected nice clue in error but got: "+e);
- }
- checkExpectedFailure();
- }
-
- public static Integer getMyPid() {
- try {
- java.lang.management.RuntimeMXBean runtime =
- java.lang.management.ManagementFactory.getRuntimeMXBean();
- java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
- jvm.setAccessible(true);
-// sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm.get(runtime);
- Object mgmt = jvm.get(runtime);
- java.lang.reflect.Method pid_method =
- mgmt.getClass().getDeclaredMethod("getProcessId");
- pid_method.setAccessible(true);
-
- return (Integer) pid_method.invoke(mgmt);
- } catch (Exception e) {
- throw new PropagatedRuntimeException("Test depends on (fragile) getMyPid method which does not work here", e);
- }
- }
-
- @Test(groups="Integration")
- public void testRunningPid() {
- ProcessTaskWrapper<Integer> t = submit(SshEffectorTasks.codePidRunning(getMyPid()));
- Assert.assertEquals(t.getTask().getUnchecked(), (Integer)0);
- ProcessTaskWrapper<Boolean> t2 = submit(SshEffectorTasks.isPidRunning(getMyPid()));
- Assert.assertTrue(t2.getTask().getUnchecked());
- }
-
- @Test(groups="Integration")
- public void testRunningPidFromFile() throws IOException {
- File f = File.createTempFile("testBrooklynPid", ".pid");
- Files.write( (""+getMyPid()).getBytes(), f );
- ProcessTaskWrapper<Integer> t = submit(SshEffectorTasks.codePidFromFileRunning(f.getPath()));
- Assert.assertEquals(t.getTask().getUnchecked(), (Integer)0);
- ProcessTaskWrapper<Boolean> t2 = submit(SshEffectorTasks.isPidFromFileRunning(f.getPath()));
- Assert.assertTrue(t2.getTask().getUnchecked());
- }
-
- @Test(groups="Integration")
- public void testRequirePidFromFileOnFailure() throws IOException {
- File f = File.createTempFile("testBrooklynPid", ".pid");
- Files.write( "99999".getBytes(), f );
- ProcessTaskWrapper<?> t = submit(SshEffectorTasks.requirePidFromFileRunning(f.getPath()));
-
- setExpectingFailure();
- try {
- t.getTask().getUnchecked();
- } catch (Exception e) {
- log.info("The error if required PID is not found is: "+e);
- clearExpectedFailure();
- Assert.assertTrue(e.toString().contains("Process with PID"), "Expected nice clue in error but got: "+e);
- Assert.assertEquals(t.getExitCode(), (Integer)1);
- }
- checkExpectedFailure();
- }
-
- @Test(groups="Integration")
- public void testRequirePidFromFileOnFailureNoSuchFile() throws IOException {
- ProcessTaskWrapper<?> t = submit(SshEffectorTasks.requirePidFromFileRunning("/path/does/not/exist/SADVQW"));
-
- setExpectingFailure();
- try {
- t.getTask().getUnchecked();
- } catch (Exception e) {
- log.info("The error if required PID is not found is: "+e);
- clearExpectedFailure();
- Assert.assertTrue(e.toString().contains("Process with PID"), "Expected nice clue in error but got: "+e);
- Assert.assertEquals(t.getExitCode(), (Integer)1);
- }
- checkExpectedFailure();
- }
-
- @Test(groups="Integration")
- public void testRequirePidFromFileOnFailureTooManyFiles() throws IOException {
- ProcessTaskWrapper<?> t = submit(SshEffectorTasks.requirePidFromFileRunning("/*"));
-
- setExpectingFailure();
- try {
- t.getTask().getUnchecked();
- } catch (Exception e) {
- log.info("The error if required PID is not found is: "+e);
- clearExpectedFailure();
- Assert.assertTrue(e.toString().contains("Process with PID"), "Expected nice clue in error but got: "+e);
- Assert.assertEquals(t.getExitCode(), (Integer)2);
- }
- checkExpectedFailure();
- }
-
- @Test(groups="Integration")
- public void testRequirePidFromFileOnSuccess() throws IOException {
- File f = File.createTempFile("testBrooklynPid", ".pid");
- Files.write( (""+getMyPid()).getBytes(), f );
- ProcessTaskWrapper<?> t = submit(SshEffectorTasks.requirePidFromFileRunning(f.getPath()));
-
- t.getTask().getUnchecked();
- }
-
- @Test(groups="Integration")
- public void testRequirePidFromFileOnSuccessAcceptsWildcards() throws IOException {
- File f = File.createTempFile("testBrooklynPid", ".pid");
- Files.write( (""+getMyPid()).getBytes(), f );
- ProcessTaskWrapper<?> t = submit(SshEffectorTasks.requirePidFromFileRunning(f.getPath()+"*"));
-
- t.getTask().getUnchecked();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/StaticSensorTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/StaticSensorTest.java b/software/base/src/test/java/brooklyn/entity/software/StaticSensorTest.java
deleted file mode 100644
index 33c4987..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/StaticSensorTest.java
+++ /dev/null
@@ -1,54 +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.software;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport;
-import org.apache.brooklyn.entity.stock.BasicEntity;
-import org.apache.brooklyn.sensor.core.Sensors;
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-public class StaticSensorTest extends BrooklynAppUnitTestSupport {
-
- @Test
- public void testAddsStaticSensorOfTypeString() {
- BasicEntity entity = app.createAndManageChild(EntitySpec.create(BasicEntity.class)
- .addInitializer(new StaticSensor<String>(ConfigBag.newInstance(ImmutableMap.of(
- StaticSensor.SENSOR_NAME, "myname",
- StaticSensor.SENSOR_TYPE, String.class.getName(),
- StaticSensor.STATIC_VALUE, "myval")))));
-
- EntityTestUtils.assertAttributeEquals(entity, Sensors.newSensor(String.class, "myname"), "myval");
- }
-
- @Test
- public void testAddsStaticSensorOfTypeInteger() {
- BasicEntity entity = app.createAndManageChild(EntitySpec.create(BasicEntity.class)
- .addInitializer(new StaticSensor<Integer>(ConfigBag.newInstance(ImmutableMap.of(
- StaticSensor.SENSOR_NAME, "myname",
- StaticSensor.SENSOR_TYPE, Integer.class.getName(),
- StaticSensor.STATIC_VALUE, "1")))));
-
- EntityTestUtils.assertAttributeEquals(entity, Sensors.newSensor(Integer.class, "myname"), 1);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java b/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
deleted file mode 100644
index d5367f2..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/http/HttpRequestSensorTest.java
+++ /dev/null
@@ -1,84 +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.software.http;
-
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.core.test.TestHttpRequestHandler;
-import org.apache.brooklyn.core.test.TestHttpServer;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.sensor.core.Sensors;
-import org.apache.brooklyn.test.EntityTestUtils;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.time.Duration;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import com.google.common.collect.ImmutableList;
-
-public class HttpRequestSensorTest {
- final static AttributeSensor<String> SENSOR_STRING = Sensors.newStringSensor("aString");
- final static String TARGET_TYPE = "java.lang.String";
-
- private TestApplication app;
- private EntityLocal entity;
-
- private TestHttpServer server;
- private String serverUrl;
-
- @BeforeClass(alwaysRun=true)
- public void setUp() throws Exception {
- server = new TestHttpServer()
- .handler("/myKey/myValue", new TestHttpRequestHandler().header("Content-Type", "application/json").response("{\"myKey\":\"myValue\"}"))
- .start();
- serverUrl = server.getUrl();
-
- app = TestApplication.Factory.newManagedInstanceForTests();
- entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)
- .location(app.newLocalhostProvisioningLocation().obtain()));
- app.start(ImmutableList.<Location>of());
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (app != null) Entities.destroyAll(app.getManagementContext());
- server.stop();
- }
-
- @Test
- public void testHttpSensor() throws Exception {
- HttpRequestSensor<Integer> sensor = new HttpRequestSensor<Integer>(ConfigBag.newInstance()
- .configure(HttpRequestSensor.SENSOR_PERIOD, Duration.millis(100))
- .configure(HttpRequestSensor.SENSOR_NAME, SENSOR_STRING.getName())
- .configure(HttpRequestSensor.SENSOR_TYPE, TARGET_TYPE)
- .configure(HttpRequestSensor.JSON_PATH, "$.myKey")
- .configure(HttpRequestSensor.SENSOR_URI, serverUrl + "/myKey/myValue"));
- sensor.apply(entity);
- entity.setAttribute(Attributes.SERVICE_UP, true);
-
- EntityTestUtils.assertAttributeEqualsEventually(entity, SENSOR_STRING, "myValue");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/mysql/AbstractToyMySqlEntityTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/mysql/AbstractToyMySqlEntityTest.java b/software/base/src/test/java/brooklyn/entity/software/mysql/AbstractToyMySqlEntityTest.java
deleted file mode 100644
index 7a465de..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/mysql/AbstractToyMySqlEntityTest.java
+++ /dev/null
@@ -1,109 +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.software.mysql;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.location.LocationSpec;
-import org.apache.brooklyn.api.location.MachineProvisioningLocation;
-import org.apache.brooklyn.core.test.BrooklynAppLiveTestSupport;
-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.test.EntityTestUtils;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-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.BeforeMethod;
-
-import brooklyn.entity.software.SshEffectorTasks;
-
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
-
-
-public abstract class AbstractToyMySqlEntityTest extends BrooklynAppLiveTestSupport {
-
- private static final Logger log = LoggerFactory.getLogger(AbstractToyMySqlEntityTest.class);
-
- protected MachineProvisioningLocation<? extends SshMachineLocation> targetLocation;
-
- @Override
- @BeforeMethod(alwaysRun=true)
- public void setUp() throws Exception {
- super.setUp();
-
- targetLocation = createLocation();
- }
-
- protected MachineProvisioningLocation<? extends SshMachineLocation> createLocation() {
- return mgmt.getLocationManager().createLocation(LocationSpec.create(
- LocalhostMachineProvisioningLocation.class));
- }
-
- protected abstract Entity createMysql();
-
- // deliberately not marked as a test here so that subclasses mark it correctly (Live v Integration)
- public void testMySqlOnProvisioningLocation() throws Exception {
- Entity mysql = createMysql();
- app.start(MutableList.of(targetLocation));
- checkStartsRunning(mysql);
- checkIsRunningAndStops(mysql, (SshMachineLocation) Iterables.getOnlyElement( mysql.getLocations() ));
- }
-
- protected Integer getPid(Entity mysql) {
- return mysql.getAttribute(Attributes.PID);
- }
-
- protected void checkStartsRunning(Entity mysql) {
- // should be starting within a few seconds (and almost certainly won't complete in that time)
- EntityTestUtils.assertAttributeEventually(
- mysql,
- Attributes.SERVICE_STATE_ACTUAL,
- Predicates.or(Predicates.equalTo(Lifecycle.STARTING), Predicates.equalTo(Lifecycle.RUNNING)));
- // should be up and running within 5m
- EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", Duration.FIVE_MINUTES),
- mysql, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);
- }
-
- protected void checkIsRunningAndStops(Entity mysql, SshMachineLocation lh) {
- Integer pid = getPid(mysql);
- Assert.assertNotNull(pid, "PID should be set as an attribute (or getPid() overridden to supply)");
- Entities.submit(app, SshEffectorTasks.requirePidRunning(pid).machine(lh).newTask() ).get();
-
- app.stop();
-
- // let the kill -1 take effect
- Time.sleep(Duration.ONE_SECOND);
-
- // and assert it has died
- log.info("mysql in pid "+pid+" should be dead now");
- // (app has stopped, so submit on mgmt context)
- ProcessTaskWrapper<Integer> t = SshEffectorTasks.codePidRunning(pid).machine(lh).newTask();
- mgmt.getExecutionManager().submit(t);
- Assert.assertNotEquals(t.block().getExitCode(), (Integer)0);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityBuilder.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityBuilder.java b/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityBuilder.java
deleted file mode 100644
index 91f402d..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityBuilder.java
+++ /dev/null
@@ -1,191 +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.software.mysql;
-
-import java.io.File;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntityInitializer;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.api.location.MachineLocation;
-import org.apache.brooklyn.api.location.OsDetails;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.stock.BasicStartable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.software.MachineLifecycleEffectorTasks;
-import brooklyn.entity.software.SshEffectorTasks;
-
-import org.apache.brooklyn.location.basic.BasicOsDetails.OsVersions;
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation.LocalhostMachine;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.core.task.ssh.SshTasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.ssh.BashCommands;
-import org.apache.brooklyn.util.text.ComparableVersion;
-import org.apache.brooklyn.util.time.Duration;
-import org.apache.brooklyn.util.time.Time;
-
-import com.google.common.base.Predicates;
-import com.google.common.base.Splitter;
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.collect.Iterables;
-
-public class DynamicToyMySqlEntityBuilder {
-
- private static final Logger log = LoggerFactory.getLogger(DynamicToyMySqlEntityBuilder.class);
-
- public static EntitySpec<? extends Entity> spec() {
- return EntitySpec.create(BasicStartable.class).addInitializer(MySqlEntityInitializer.class);
- }
-
- public static final String downloadUrl(Entity e, boolean isLocalhost) {
- if (isLocalhost) {
- for (int i=50; i>20; i--) {
- String f = System.getProperty("user.home")+"/.brooklyn/repository/MySqlNode/5.5."+i+"/mysql-5.5."+i+"-osx10.6-x86_64.tar.gz";
- if (new File(f).exists())
- return "file://"+f;
- }
- }
- // download
- String version = "5.5.37";
- String osTag = getOsTag(e);
- String mirrorUrl = "http://www.mirrorservice.org/sites/ftp.mysql.com/";
- return "http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-"+version+"-"+osTag+".tar.gz/from/"+mirrorUrl;
- }
-
- public static final String installDir(Entity e, boolean isLocalhost) {
- String url = downloadUrl(e, isLocalhost);
- String archive = Iterables.find(Splitter.on('/').omitEmptyStrings().split(url), Predicates.containsPattern(".tar.gz"));
- return archive.replace(".tar.gz", "");
- }
-
- public static final String dir(Entity e) {
- return "/tmp/brooklyn-mysql-"+e.getId();
- }
-
- // copied from MySqlSshDriver
- public static String getOsTag(Entity e) {
- // e.g. "osx10.6-x86_64"; see http://www.mysql.com/downloads/mysql/#downloads
- OsDetails os = ((SshMachineLocation)Iterables.getOnlyElement(e.getLocations())).getOsDetails();
- if (os == null) return "linux-glibc2.5-x86_64";
- if (os.isMac()) {
- String osp1 = os.getVersion()==null ? "osx10.8" //lowest common denominator
- : new ComparableVersion(os.getVersion()).isGreaterThanOrEqualTo(OsVersions.MAC_10_9) ? "osx10.9"
- : "osx10.8"; //lowest common denominator
- if (!os.is64bit()) {
- throw new IllegalStateException("Only 64 bit MySQL build is available for OS X");
- }
- return osp1+"-x86_64";
- }
- //assume generic linux
- String osp1 = "linux-glibc2.5";
- String osp2 = os.is64bit() ? "x86_64" : "i686";
- return osp1+"-"+osp2;
- }
-
- public static class MySqlEntityInitializer implements EntityInitializer {
- public void apply(final EntityLocal entity) {
- new MachineLifecycleEffectorTasks() {
- @Override
- protected String startProcessesAtMachine(Supplier<MachineLocation> machineS) {
- DynamicTasks.queue(
- SshEffectorTasks.ssh(
- "mkdir "+dir(entity),
- "cd "+dir(entity),
- BashCommands.downloadToStdout(downloadUrl(entity, isLocalhost(machineS)))+" | tar xvz"
- ).summary("download mysql").returning(SshTasks.returningStdoutLoggingInfo(log, true)));
- if (isLinux(machineS)) {
- DynamicTasks.queue(SshEffectorTasks.ssh(BashCommands.installPackage("libaio1")));
- }
- DynamicTasks.queue(
- SshEffectorTasks.put(".my.cnf")
- .contents(String.format("[mysqld]\nbasedir=%s/%s\n", dir(entity), installDir(entity, isLocalhost(machineS)))),
- SshEffectorTasks.ssh(
- "cd "+dir(entity)+"/*",
- "./scripts/mysql_install_db",
- "./support-files/mysql.server start > out.log 2> err.log < /dev/null"
- ).summary("setup and run mysql").returning(SshTasks.returningStdoutLoggingInfo(log, true)));
- return "submitted start";
- }
- protected void postStartCustom() {
- // if it's still up after 5s assume we are good
- Time.sleep(Duration.FIVE_SECONDS);
- if (!DynamicTasks.queue(SshEffectorTasks.isPidFromFileRunning(dir(entity)+"/*/data/*.pid")).get()) {
- // but if it's not up add a bunch of other info
- log.warn("MySQL did not start: "+dir(entity));
- ProcessTaskWrapper<Integer> info = DynamicTasks.queue(SshEffectorTasks.ssh(
- "cd "+dir(entity)+"/*",
- "cat out.log",
- "cat err.log > /dev/stderr")).block();
- log.info("STDOUT:\n"+info.getStdout());
- log.info("STDERR:\n"+info.getStderr());
- BrooklynTaskTags.addTagsDynamically(Tasks.current(),
- BrooklynTaskTags.tagForStream("console (nohup stdout)", Suppliers.ofInstance(info.getStdout()), null),
- BrooklynTaskTags.tagForStream("console (nohup stderr)", Suppliers.ofInstance(info.getStderr()), null));
- throw new IllegalStateException("MySQL appears not to be running");
- }
-
- // and set the PID
- entity().setAttribute(Attributes.PID,
- Integer.parseInt(DynamicTasks.queue(SshEffectorTasks.ssh("cat "+dir(entity)+"/*/data/*.pid")).block().getStdout().trim()));
-
- // TODO Without this, tests fail because nothing else sets serviceUp!
- // Really should set this with a Feed that checks pid periodically.
- // Should this instead be using SERVICE_NOT_UP_INDICATORS?
- entity().setAttribute(Attributes.SERVICE_UP, true);
- }
-
- @Override
- protected String stopProcessesAtMachine() {
- // TODO Where is best place to set?
- // Really should set this with a Feed that checks pid periodically.
- entity().setAttribute(Attributes.SERVICE_UP, false);
-
- Integer pid = entity().getAttribute(Attributes.PID);
- if (pid==null) {
- log.info("mysql not running");
- return "No pid -- is it running?";
- }
-
- DynamicTasks.queue(SshEffectorTasks.ssh(
- "cd "+dir(entity)+"/*",
- "./support-files/mysql.server stop"
- ).summary("stop mysql"));
- return "submitted stop";
- }
- }.attachLifecycleEffectors(entity);
- }
- }
-
- private static boolean isLocalhost(Supplier<MachineLocation> machineS) {
- return machineS.get() instanceof LocalhostMachine;
- }
-
- private static boolean isLinux(Supplier<MachineLocation> machineS) {
- return machineS.get().getMachineDetails().getOsDetails().isLinux();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityTest.java b/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityTest.java
deleted file mode 100644
index 75684f5..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/mysql/DynamicToyMySqlEntityTest.java
+++ /dev/null
@@ -1,58 +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.software.mysql;
-
-import java.util.Arrays;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.collections.MutableMap;
-
-
-public class DynamicToyMySqlEntityTest extends AbstractToyMySqlEntityTest {
-
- private static final Logger log = LoggerFactory.getLogger(DynamicToyMySqlEntityTest.class);
-
- protected Entity createMysql() {
- Entity mysql = app.createAndManageChild(DynamicToyMySqlEntityBuilder.spec());
- log.debug("created "+mysql);
- return mysql;
- }
-
- // put right group on test (also help Eclipse IDE pick it up)
- @Override
- @Test(groups = "Integration")
- public void testMySqlOnProvisioningLocation() throws Exception {
- super.testMySqlOnProvisioningLocation();
- }
-
- @Test(groups="Integration")
- public void testMySqlOnMachineLocation() throws Exception {
- Entity mysql = createMysql();
- SshMachineLocation lh = targetLocation.obtain(MutableMap.of());
-
- app.start(Arrays.asList(lh));
- checkStartsRunning(mysql);
- checkIsRunningAndStops(mysql, lh);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/entity/software/ssh/SshCommandIntegrationTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/entity/software/ssh/SshCommandIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/software/ssh/SshCommandIntegrationTest.java
deleted file mode 100644
index 085b737..0000000
--- a/software/base/src/test/java/brooklyn/entity/software/ssh/SshCommandIntegrationTest.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.software.ssh;
-
-import static org.testng.Assert.assertTrue;
-
-import java.io.File;
-
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.api.location.Location;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.effector.core.Effectors;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.sensor.core.Sensors;
-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.time.Duration;
-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.SshMachineLocation;
-
-import com.google.common.collect.ImmutableList;
-
-public class SshCommandIntegrationTest {
-
- final static AttributeSensor<String> SENSOR_STRING = Sensors.newStringSensor("aString", "");
- final static AttributeSensor<Integer> SENSOR_INT = Sensors.newIntegerSensor("aLong", "");
- final static Effector<String> EFFECTOR_SAY_HI = Effectors.effector(String.class, "sayHi").buildAbstract();
-
- private TestApplication app;
- private SshMachineLocation machine;
- private EntityLocal entity;
-
- @BeforeMethod(alwaysRun=true)
- public void setUp() throws Exception {
- app = TestApplication.Factory.newManagedInstanceForTests();
- machine = app.newLocalhostProvisioningLocation().obtain();
- entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).location(machine));
- app.start(ImmutableList.<Location>of());
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (app != null) Entities.destroyAll(app.getManagementContext());
- }
-
- @Test(groups="Integration")
- public void testSshSensor() throws Exception {
- File tempFile = File.createTempFile("testSshCommand", "txt");
- tempFile.deleteOnExit();
- new SshCommandSensor<String>(ConfigBag.newInstance()
- .configure(SshCommandSensor.SENSOR_PERIOD, Duration.millis(100))
- .configure(SshCommandSensor.SENSOR_NAME, SENSOR_STRING.getName())
- .configure(SshCommandSensor.SENSOR_COMMAND, "echo foo > "+tempFile.getAbsolutePath()+"\n"
- + "wc "+tempFile.getAbsolutePath()))
- .apply(entity);
- entity.setAttribute(Attributes.SERVICE_UP, true);
-
- String val = EntityTestUtils.assertAttributeEventuallyNonNull(entity, SENSOR_STRING);
- assertTrue(val.contains("1"), "val="+val);
- String[] counts = val.trim().split("\\s+");
- Assert.assertEquals(counts.length, 4, "val="+val);
- Assert.assertEquals(counts[0], "1", "val="+val);
- }
-
- @Test(groups="Integration")
- public void testSshEffector() throws Exception {
- File tempFile = File.createTempFile("testSshCommand", "txt");
- tempFile.deleteOnExit();
- new SshCommandEffector(ConfigBag.newInstance()
- .configure(SshCommandEffector.EFFECTOR_NAME, "sayHi")
- .configure(SshCommandEffector.EFFECTOR_COMMAND, "echo hi"))
- .apply(entity);
-
- String val = entity.invoke(EFFECTOR_SAY_HI, MutableMap.<String,String>of()).get();
- Assert.assertEquals(val.trim(), "hi", "val="+val);
- }
-
- @Test(groups="Integration")
- public void testSshEffectorWithParameters() throws Exception {
- File tempFile = File.createTempFile("testSshCommand", "txt");
- tempFile.deleteOnExit();
- new SshCommandEffector(ConfigBag.newInstance()
- .configure(SshCommandEffector.EFFECTOR_NAME, "sayHi")
- .configure(SshCommandEffector.EFFECTOR_COMMAND, "echo $foo")
- .configure(SshCommandEffector.EFFECTOR_PARAMETER_DEFS,
- MutableMap.<String,Object>of("foo", MutableMap.of("defaultValue", "hi"))))
- .apply(entity);
-
- String val;
- // explicit value
- val = entity.invoke(EFFECTOR_SAY_HI, MutableMap.<String,String>of("foo", "bar")).get();
- Assert.assertEquals(val.trim(), "bar", "val="+val);
-
- // default value
- val = entity.invoke(EFFECTOR_SAY_HI, MutableMap.<String,String>of()).get();
- Assert.assertEquals(val.trim(), "hi", "val="+val);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/event/basic/PortAttributeSensorAndConfigKeyTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/event/basic/PortAttributeSensorAndConfigKeyTest.java b/software/base/src/test/java/brooklyn/event/basic/PortAttributeSensorAndConfigKeyTest.java
deleted file mode 100644
index 8bcbb67..0000000
--- a/software/base/src/test/java/brooklyn/event/basic/PortAttributeSensorAndConfigKeyTest.java
+++ /dev/null
@@ -1,88 +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.event.basic;
-
-import static org.testng.Assert.assertEquals;
-
-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.entity.core.Entities;
-import org.testng.annotations.Test;
-
-import brooklyn.entity.basic.EmptySoftwareProcess;
-import brooklyn.entity.basic.EmptySoftwareProcessImpl;
-
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.sensor.core.PortAttributeSensorAndConfigKey;
-
-import com.google.common.collect.ImmutableList;
-
-public class PortAttributeSensorAndConfigKeyTest extends BrooklynAppUnitTestSupport {
-
- /*
- * FIXME Fails because port is never released. Nothing calls PortSupplier.releasePort(int).
- * The stacktrace below shows where it is obtained:
- *
- Daemon Thread [brooklyn-execmanager-XwLLLdS4-5] (Suspended (breakpoint at line 244 in LocalhostMachineProvisioningLocation$LocalhostMachine))
- LocalhostMachineProvisioningLocation$LocalhostMachine.obtainPort(PortRange) line: 244
- PortAttributeSensorAndConfigKey.convertConfigToSensor(PortRange, Entity) line: 78
- PortAttributeSensorAndConfigKey.convertConfigToSensor(Object, Entity) line: 1
- PortAttributeSensorAndConfigKey(AttributeSensorAndConfigKey<ConfigType,SensorType>).getAsSensorValue(Entity) line: 93
- ConfigToAttributes.apply(EntityLocal, AttributeSensorAndConfigKey<?,T>) line: 28
- ConfigToAttributes.apply(EntityLocal) line: 17
- SoftwareProcessDriverLifecycleEffectorTasks(MachineLifecycleEffectorTasks).preStartCustom(MachineLocation) line: 343
- SoftwareProcessDriverLifecycleEffectorTasks.preStartCustom(MachineLocation) line: 69
- MachineLifecycleEffectorTasks$6.run() line: 283
- */
- @Test(enabled=false, groups="Integration") // test is slow (for some reason - why?)
- public void testStoppingEntityReleasesPortFromMachineForReuse() throws Exception {
- LocalhostMachineProvisioningLocation loc = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost");
- SshMachineLocation machine = loc.obtain();
- runStoppingEntityReleasesPortFromLocalhostForReuse(machine);
- }
-
- @Test(groups="Integration") // test is slow (for some reason - why?)
- public void testStoppingEntityReleasesPortFromLocalhostProvisioningLocationForReuse() throws Exception {
- LocalhostMachineProvisioningLocation loc = (LocalhostMachineProvisioningLocation) mgmt.getLocationRegistry().resolve("localhost");
- runStoppingEntityReleasesPortFromLocalhostForReuse(loc);
- }
-
- protected void runStoppingEntityReleasesPortFromLocalhostForReuse(Location loc) throws Exception {
- MyEntity e1 = app.createAndManageChild(EntitySpec.create(MyEntity.class));
- e1.start(ImmutableList.of(loc));
- assertEquals(e1.getAttribute(MyEntity.MY_PORT), (Integer)47653);
-
- e1.stop();
- Entities.unmanage(e1);
- MyEntity e2 = app.createAndManageChild(EntitySpec.create(MyEntity.class));
- e2.start(ImmutableList.of(loc));
- assertEquals(e2.getAttribute(MyEntity.MY_PORT), (Integer)47653);
- }
-
- @ImplementedBy(MyEntityImpl.class)
- public interface MyEntity extends EmptySoftwareProcess {
- PortAttributeSensorAndConfigKey MY_PORT = new PortAttributeSensorAndConfigKey("myport", "", "47653");
- }
-
- public static class MyEntityImpl extends EmptySoftwareProcessImpl implements MyEntity {
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/test/java/brooklyn/event/feed/jmx/JmxFeedTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/brooklyn/event/feed/jmx/JmxFeedTest.java b/software/base/src/test/java/brooklyn/event/feed/jmx/JmxFeedTest.java
deleted file mode 100644
index f0c51a2..0000000
--- a/software/base/src/test/java/brooklyn/event/feed/jmx/JmxFeedTest.java
+++ /dev/null
@@ -1,418 +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.event.feed.jmx;
-
-import static org.apache.brooklyn.test.TestUtils.executeUntilSucceeds;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.management.MBeanOperationInfo;
-import javax.management.MBeanParameterInfo;
-import javax.management.Notification;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-import javax.management.StandardEmitterMBean;
-import javax.management.openmbean.CompositeDataSupport;
-import javax.management.openmbean.CompositeType;
-import javax.management.openmbean.OpenType;
-import javax.management.openmbean.SimpleType;
-import javax.management.openmbean.TabularDataSupport;
-import javax.management.openmbean.TabularType;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.entity.EntitySpec;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.api.sensor.SensorEvent;
-import org.apache.brooklyn.api.sensor.SensorEventListener;
-import org.apache.brooklyn.core.test.entity.TestApplication;
-import org.apache.brooklyn.core.test.entity.TestApplicationImpl;
-import org.apache.brooklyn.core.test.entity.TestEntity;
-import org.apache.brooklyn.core.test.entity.TestEntityImpl;
-import org.apache.brooklyn.entity.core.AbstractEntity;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.sensor.core.BasicAttributeSensor;
-import org.apache.brooklyn.sensor.core.BasicNotificationSensor;
-import org.apache.brooklyn.sensor.core.Sensors;
-import org.apache.brooklyn.sensor.feed.ConfigToAttributes;
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.test.TestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.testng.collections.Lists;
-
-import brooklyn.entity.java.JmxSupport;
-import brooklyn.entity.java.UsesJmx;
-import brooklyn.entity.java.UsesJmx.JmxAgentModes;
-
-import org.apache.brooklyn.location.basic.LocalhostMachineProvisioningLocation;
-import org.apache.brooklyn.location.basic.PortRanges;
-import org.apache.brooklyn.location.basic.SimulatedLocation;
-
-import brooklyn.test.GeneralisedDynamicMBean;
-import brooklyn.test.JmxService;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Test the operation of the {@link JmxFeed} class.
- * <p>
- * Also confirm some of the JMX setup done by {@link JmxSupport} and {@link JmxHelper},
- * based on ports in {@link UsesJmx}.
- * <p>
- * TODO tests of other JMX_AGENT_MODE are done in ActiveMqIntegrationTest;
- * would be nice to promote some to live here
- */
-public class JmxFeedTest {
-
- // FIXME Move out the JmxHelper tests into the JmxHelperTest class
-
- // FIXME Also test that setting poll period takes effect
-
- private static final Logger log = LoggerFactory.getLogger(JmxFeedTest.class);
-
- private static final int TIMEOUT_MS = 5000;
- private static final int SHORT_WAIT_MS = 250;
-
- private JmxService jmxService;
- private TestApplication app;
- private TestEntity entity;
- private JmxFeed feed;
- private JmxHelper jmxHelper;
-
- private AttributeSensor<Integer> intAttribute = Sensors.newIntegerSensor("brooklyn.test.intAttribute", "Brooklyn testing int attribute");
- private AttributeSensor<String> stringAttribute = Sensors.newStringSensor("brooklyn.test.stringAttribute", "Brooklyn testing string attribute");
- private BasicAttributeSensor<Map> mapAttribute = new BasicAttributeSensor<Map>(Map.class, "brooklyn.test.mapAttribute", "Brooklyn testing map attribute");
- private String objectName = "Brooklyn:type=MyTestMBean,name=myname";
- private ObjectName jmxObjectName;
- private String attributeName = "myattrib";
- private String opName = "myop";
-
- public static class TestEntityWithJmx extends TestEntityImpl {
- @Override public void init() {
- setAttribute(Attributes.HOSTNAME, "localhost");
- setAttribute(UsesJmx.JMX_PORT,
- LocalhostMachineProvisioningLocation.obtainPort(PortRanges.fromString("40123+")));
- // only supports no-agent, at the moment
- setConfig(UsesJmx.JMX_AGENT_MODE, JmxAgentModes.NONE);
- setAttribute(UsesJmx.RMI_REGISTRY_PORT, -1); // -1 means to use the JMX_PORT only
- ConfigToAttributes.apply(this, UsesJmx.JMX_CONTEXT);
- }
- }
-
- @BeforeMethod(alwaysRun=true)
- public void setUp() throws Exception {
- jmxObjectName = new ObjectName(objectName);
-
- // Create an entity and configure it with the above JMX service
- app = TestApplication.Factory.newManagedInstanceForTests();
- entity = app.createAndManageChild(EntitySpec.create(TestEntity.class).impl(TestEntityWithJmx.class));
- app.start(ImmutableList.of(new SimulatedLocation()));
-
- jmxHelper = new JmxHelper(entity);
-
- jmxService = new JmxService(entity);
- }
-
- @AfterMethod(alwaysRun=true)
- public void tearDown() throws Exception {
- if (feed != null) feed.stop();
- if (jmxHelper != null) jmxHelper.disconnect();
- if (jmxService != null) jmxService.shutdown();
- if (app != null) Entities.destroyAll(app.getManagementContext());
- feed = null;
- }
-
- @Test
- public void testJmxAttributePollerReturnsMBeanAttribute() throws Exception {
- GeneralisedDynamicMBean mbean = jmxService.registerMBean(ImmutableMap.of(attributeName, 42), objectName);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .pollAttribute(new JmxAttributePollConfig<Integer>(intAttribute)
- .objectName(objectName)
- .period(50)
- .attributeName(attributeName))
- .build();
-
- // Starts with value defined when registering...
- assertSensorEventually(intAttribute, 42, TIMEOUT_MS);
-
- // Change the value and check it updates
- mbean.updateAttributeValue(attributeName, 64);
- assertSensorEventually(intAttribute, 64, TIMEOUT_MS);
- }
-
- @Test
- public void testJmxAttributeOfTypeTabularDataProviderConvertedToMap() throws Exception {
- // Create the CompositeType and TabularData
- CompositeType compositeType = new CompositeType(
- "typeName",
- "description",
- new String[] {"myint", "mystring", "mybool"}, // item names
- new String[] {"myint", "mystring", "mybool"}, // item descriptions, can't be null or empty string
- new OpenType<?>[] {SimpleType.INTEGER, SimpleType.STRING, SimpleType.BOOLEAN}
- );
- TabularType tt = new TabularType(
- "typeName",
- "description",
- compositeType,
- new String[] {"myint"}
- );
- TabularDataSupport tds = new TabularDataSupport(tt);
- tds.put(new CompositeDataSupport(
- compositeType,
- new String[] {"mybool", "myint", "mystring"},
- new Object[] {true, 1234, "on"}
- ));
-
- // Create MBean
- GeneralisedDynamicMBean mbean = jmxService.registerMBean(ImmutableMap.of(attributeName, tds), objectName);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .pollAttribute(new JmxAttributePollConfig<Map>(mapAttribute)
- .objectName(objectName)
- .attributeName(attributeName)
- .onSuccess((Function)JmxValueFunctions.tabularDataToMap()))
- .build();
-
- // Starts with value defined when registering...
- assertSensorEventually(
- mapAttribute,
- ImmutableMap.of("myint", 1234, "mystring", "on", "mybool", Boolean.TRUE),
- TIMEOUT_MS);
- }
-
- @Test
- public void testJmxOperationPolledForSensor() throws Exception {
- // This is awful syntax...
- final int opReturnVal = 123;
- final AtomicInteger invocationCount = new AtomicInteger();
- MBeanOperationInfo opInfo = new MBeanOperationInfo(opName, "my descr", new MBeanParameterInfo[0], Integer.class.getName(), MBeanOperationInfo.ACTION);
- GeneralisedDynamicMBean mbean = jmxService.registerMBean(
- Collections.emptyMap(),
- ImmutableMap.of(opInfo, new Function<Object[], Integer>() {
- public Integer apply(Object[] args) {
- invocationCount.incrementAndGet(); return opReturnVal;
- }}),
- objectName);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .pollOperation(new JmxOperationPollConfig<Integer>(intAttribute)
- .objectName(objectName)
- .operationName(opName))
- .build();
-
- TestUtils.executeUntilSucceeds(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
- public void run() {
- assertTrue(invocationCount.get() > 0, "invocationCount="+invocationCount);
- assertEquals(entity.getAttribute(intAttribute), (Integer)opReturnVal);
- }});
- }
-
- @Test
- public void testJmxOperationWithArgPolledForSensor() throws Exception {
- // This is awful syntax...
- MBeanParameterInfo paramInfo = new MBeanParameterInfo("param1", String.class.getName(), "my param1");
- MBeanParameterInfo[] paramInfos = new MBeanParameterInfo[] {paramInfo};
- MBeanOperationInfo opInfo = new MBeanOperationInfo(opName, "my descr", paramInfos, String.class.getName(), MBeanOperationInfo.ACTION);
- GeneralisedDynamicMBean mbean = jmxService.registerMBean(
- Collections.emptyMap(),
- ImmutableMap.of(opInfo, new Function<Object[], String>() {
- public String apply(Object[] args) {
- return args[0]+"suffix";
- }}),
- objectName);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .pollOperation(new JmxOperationPollConfig<String>(stringAttribute)
- .objectName(objectName)
- .operationName(opName)
- .operationParams(ImmutableList.of("myprefix")))
- .build();
-
- assertSensorEventually(stringAttribute, "myprefix"+"suffix", TIMEOUT_MS);
- }
-
- @Test
- public void testJmxNotificationSubscriptionForSensor() throws Exception {
- final String one = "notification.one", two = "notification.two";
- final StandardEmitterMBean mbean = jmxService.registerMBean(ImmutableList.of(one, two), objectName);
- final AtomicInteger sequence = new AtomicInteger(0);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .subscribeToNotification(new JmxNotificationSubscriptionConfig<Integer>(intAttribute)
- .objectName(objectName)
- .notificationFilter(JmxNotificationFilters.matchesType(one)))
- .build();
-
- // Notification updates the sensor
- // Note that subscription is done async, so can't just send notification immediately during test.
- Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
- public void run() {
- sendNotification(mbean, one, sequence.getAndIncrement(), 123);
- assertEquals(entity.getAttribute(intAttribute), (Integer)123);
- }});
-
- // But other notification types are ignored
- sendNotification(mbean, two, sequence.getAndIncrement(), -1);
-
- Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
- public void run() {
- assertEquals(entity.getAttribute(intAttribute), (Integer)123);
- }});
- }
-
- @Test
- public void testJmxNotificationSubscriptionForSensorParsingNotification() throws Exception {
- final String one = "notification.one", two = "notification.two";
- final StandardEmitterMBean mbean = jmxService.registerMBean(ImmutableList.of(one, two), objectName);
- final AtomicInteger sequence = new AtomicInteger(0);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .subscribeToNotification(new JmxNotificationSubscriptionConfig<Integer>(intAttribute)
- .objectName(objectName)
- .notificationFilter(JmxNotificationFilters.matchesType(one))
- .onNotification(new Function<Notification, Integer>() {
- public Integer apply(Notification notif) {
- return (Integer) notif.getUserData();
- }
- }))
- .build();
-
-
- // Notification updates the sensor
- // Note that subscription is done async, so can't just send notification immediately during test.
- Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
- public void run() {
- sendNotification(mbean, one, sequence.getAndIncrement(), 123);
- assertEquals(entity.getAttribute(intAttribute), (Integer)123);
- }});
- }
-
- @Test
- public void testJmxNotificationMultipleSubscriptionUsingListener() throws Exception {
- final String one = "notification.one";
- final String two = "notification.two";
- final StandardEmitterMBean mbean = jmxService.registerMBean(ImmutableList.of(one, two), objectName);
- final AtomicInteger sequence = new AtomicInteger(0);
-
- feed = JmxFeed.builder()
- .entity(entity)
- .subscribeToNotification(new JmxNotificationSubscriptionConfig<Integer>(intAttribute)
- .objectName(objectName)
- .notificationFilter(JmxNotificationFilters.matchesTypes(one, two)))
- .build();
-
- // Notification updates the sensor
- // Note that subscription is done async, so can't just send notification immediately during test.
- Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
- public void run() {
- sendNotification(mbean, one, sequence.getAndIncrement(), 123);
- assertEquals(entity.getAttribute(intAttribute), (Integer)123);
- }});
-
- // And wildcard means other notifications also received
- sendNotification(mbean, two, sequence.getAndIncrement(), 456);
- assertSensorEventually(intAttribute, 456, TIMEOUT_MS);
- }
-
- // Test reproduces functionality used in Monterey, for Venue entity being told of requestActor
- @Test
- public void testSubscribeToJmxNotificationAndEmitCorrespondingNotificationSensor() throws Exception {
- TestApplication app2 = new TestApplicationImpl();
- final EntityWithEmitter entity = new EntityWithEmitter(app2);
- Entities.startManagement(app2);
- try {
- app2.start(ImmutableList.of(new SimulatedLocation()));
-
- final List<SensorEvent<String>> received = Lists.newArrayList();
- app2.subscribe(null, EntityWithEmitter.MY_NOTIF, new SensorEventListener<String>() {
- public void onEvent(SensorEvent<String> event) {
- received.add(event);
- }});
-
- final StandardEmitterMBean mbean = jmxService.registerMBean(ImmutableList.of("one"), objectName);
- final AtomicInteger sequence = new AtomicInteger(0);
-
- jmxHelper.connect(TIMEOUT_MS);
- jmxHelper.addNotificationListener(jmxObjectName, new NotificationListener() {
- public void handleNotification(Notification notif, Object callback) {
- if (notif.getType().equals("one")) {
- entity.emit(EntityWithEmitter.MY_NOTIF, (String) notif.getUserData());
- }
- }});
-
-
- Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() {
- public void run() {
- sendNotification(mbean, "one", sequence.getAndIncrement(), "abc");
- assertTrue(received.size() > 0, "received size should be bigger than 0");
- assertEquals(received.get(0).getValue(), "abc");
- }});
- } finally {
- Entities.destroyAll(app2.getManagementContext());
- }
- }
-
- public static class EntityWithEmitter extends AbstractEntity {
- public static final BasicNotificationSensor<String> MY_NOTIF = new BasicNotificationSensor<String>(String.class, "test.myNotif", "My notif");
-
- public EntityWithEmitter(Entity owner) {
- super(owner);
- }
- public EntityWithEmitter(Map flags) {
- super(flags);
- }
- public EntityWithEmitter(Map flags, Entity owner) {
- super(flags, owner);
- }
- }
-
- private Notification sendNotification(StandardEmitterMBean mbean, String type, long seq, Object userData) {
- Notification notif = new Notification(type, mbean, seq);
- notif.setUserData(userData);
- mbean.sendNotification(notif);
- return notif;
- }
-
- private <T> void assertSensorEventually(final AttributeSensor<T> sensor, final T expectedVal, long timeout) {
- executeUntilSucceeds(ImmutableMap.of("timeout", timeout), new Callable<Void>() {
- public Void call() {
- assertEquals(entity.getAttribute(sensor), expectedVal);
- return null;
- }});
- }
-}