http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/ha/WarmStandbyTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/ha/WarmStandbyTest.java b/core/src/test/java/brooklyn/management/ha/WarmStandbyTest.java deleted file mode 100644 index 54f4b8b..0000000 --- a/core/src/test/java/brooklyn/management/ha/WarmStandbyTest.java +++ /dev/null @@ -1,153 +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.management.ha; - -import static org.testng.Assert.assertEquals; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.management.ha.HighAvailabilityMode; -import org.apache.brooklyn.api.management.ha.ManagementNodeState; -import org.apache.brooklyn.api.management.ha.ManagementPlaneSyncRecordPersister; -import org.apache.brooklyn.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.test.entity.TestApplication; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.basic.Entities; -import brooklyn.entity.rebind.PersistenceExceptionHandlerImpl; -import brooklyn.entity.rebind.persister.BrooklynMementoPersisterToObjectStore; -import brooklyn.entity.rebind.persister.InMemoryObjectStore; -import brooklyn.entity.rebind.persister.ListeningObjectStore; -import brooklyn.entity.rebind.persister.PersistMode; -import brooklyn.entity.rebind.persister.PersistenceObjectStore; -import brooklyn.management.internal.ManagementContextInternal; -import brooklyn.util.collections.MutableList; -import brooklyn.util.collections.MutableMap; -import brooklyn.util.time.Duration; - -@Test -public class WarmStandbyTest { - - private static final Logger log = LoggerFactory.getLogger(WarmStandbyTest.class); - - private List<HaMgmtNode> nodes = new MutableList<WarmStandbyTest.HaMgmtNode>(); - Map<String,String> sharedBackingStore = MutableMap.of(); - Map<String,Date> sharedBackingStoreDates = MutableMap.of(); - private ClassLoader classLoader = getClass().getClassLoader(); - - public class HaMgmtNode { - // TODO share with HotStandbyTest and SplitBrainTest and a few others (minor differences but worth it ultimately) - - private ManagementContextInternal mgmt; - private String ownNodeId; - private String nodeName; - private ListeningObjectStore objectStore; - private ManagementPlaneSyncRecordPersister persister; - private HighAvailabilityManagerImpl ha; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - nodeName = "node "+nodes.size(); - mgmt = newLocalManagementContext(); - ownNodeId = mgmt.getManagementNodeId(); - objectStore = new ListeningObjectStore(newPersistenceObjectStore()); - objectStore.injectManagementContext(mgmt); - objectStore.prepareForSharedUse(PersistMode.CLEAN, HighAvailabilityMode.DISABLED); - persister = new ManagementPlaneSyncRecordPersisterToObjectStore(mgmt, objectStore, classLoader); - ((ManagementPlaneSyncRecordPersisterToObjectStore)persister).preferRemoteTimestampInMemento(); - BrooklynMementoPersisterToObjectStore persisterObj = new BrooklynMementoPersisterToObjectStore(objectStore, mgmt.getBrooklynProperties(), classLoader); - mgmt.getRebindManager().setPersister(persisterObj, PersistenceExceptionHandlerImpl.builder().build()); - ha = ((HighAvailabilityManagerImpl)mgmt.getHighAvailabilityManager()) - .setPollPeriod(Duration.PRACTICALLY_FOREVER) - .setHeartbeatTimeout(Duration.THIRTY_SECONDS) - .setPersister(persister); - log.info("Created "+nodeName+" "+ownNodeId); - } - - public void tearDown() throws Exception { - if (ha != null) ha.stop(); - if (mgmt != null) Entities.destroyAll(mgmt); - if (objectStore != null) objectStore.deleteCompletely(); - } - - @Override - public String toString() { - return nodeName+" "+ownNodeId; - } - } - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - nodes.clear(); - sharedBackingStore.clear(); - } - - public HaMgmtNode newNode() throws Exception { - HaMgmtNode node = new HaMgmtNode(); - node.setUp(); - nodes.add(node); - return node; - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - for (HaMgmtNode n: nodes) - n.tearDown(); - } - - protected ManagementContextInternal newLocalManagementContext() { - return new LocalManagementContextForTests(); - } - - protected PersistenceObjectStore newPersistenceObjectStore() { - return new InMemoryObjectStore(sharedBackingStore, sharedBackingStoreDates); - } - - // TODO refactor above -- routines above this line are shared among HotStandbyTest and SplitBrainTest - - @Test - public void testWarmStandby() throws Exception { - HaMgmtNode n1 = newNode(); - n1.ha.start(HighAvailabilityMode.AUTO); - assertEquals(n1.ha.getNodeState(), ManagementNodeState.MASTER); - - TestApplication app = TestApplication.Factory.newManagedInstanceForTests(n1.mgmt); - app.start(MutableList.<Location>of()); - - n1.mgmt.getRebindManager().forcePersistNow(false, null); - - HaMgmtNode n2 = newNode(); - n2.ha.start(HighAvailabilityMode.STANDBY); - assertEquals(n2.ha.getNodeState(), ManagementNodeState.STANDBY); - - assertEquals(n2.mgmt.getApplications().size(), 0); - } - - // TODO support forcible demotion, and check that a master forcibly demoted - // to warm standby clears its apps, policies, and locations - - -}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/internal/AccessManagerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/internal/AccessManagerTest.java b/core/src/test/java/brooklyn/management/internal/AccessManagerTest.java deleted file mode 100644 index 34f733c..0000000 --- a/core/src/test/java/brooklyn/management/internal/AccessManagerTest.java +++ /dev/null @@ -1,145 +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.management.internal; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; - -import org.apache.brooklyn.api.entity.proxying.EntitySpec; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.test.entity.TestApplication; -import org.apache.brooklyn.test.entity.TestEntity; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.basic.ApplicationBuilder; -import brooklyn.entity.basic.Entities; - -import org.apache.brooklyn.location.basic.SimulatedLocation; - -import brooklyn.util.exceptions.Exceptions; - -import com.google.common.collect.ImmutableSet; - -public class AccessManagerTest { - - private LocalManagementContext managementContext; - private TestApplication app; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - managementContext = new LocalManagementContextForTests(); - app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (managementContext != null) Entities.destroyAll(managementContext); - app = null; - } - - @Test - public void testEntityManagementAllowed() throws Exception { - // default is allowed - TestEntity e1 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - // when forbidden, should give error trying to create+manage new entity - managementContext.getAccessManager().setEntityManagementAllowed(false); - try { - app.createAndManageChild(EntitySpec.create(TestEntity.class)); - fail(); - } catch (Exception e) { - // expect it to be forbidden - if (Exceptions.getFirstThrowableOfType(e, IllegalStateException.class) == null) { - throw e; - } - } - - // when forbidden, should refuse to create new app - try { - ApplicationBuilder.newManagedApp(TestApplication.class, managementContext); - fail(); - } catch (Exception e) { - // expect it to be forbidden - if (Exceptions.getFirstThrowableOfType(e, IllegalStateException.class) == null) { - throw e; - } - } - - // but when forbidden, still allowed to create locations - managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); - - // when re-enabled, can create entities again - managementContext.getAccessManager().setEntityManagementAllowed(true); - TestEntity e3 = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - assertEquals(ImmutableSet.copyOf(managementContext.getEntityManager().getEntities()), ImmutableSet.of(app, e1, e3)); - } - - @Test - public void testLocationManagementAllowed() throws Exception { - // default is allowed - Location loc1 = managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); - - // when forbidden, should give error - managementContext.getAccessManager().setLocationManagementAllowed(false); - try { - managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); - fail(); - } catch (Exception e) { - // expect it to be forbidden - if (Exceptions.getFirstThrowableOfType(e, IllegalStateException.class) == null) { - throw e; - } - } - - // but when forbidden, still allowed to create entity - ApplicationBuilder.newManagedApp(TestApplication.class, managementContext); - - // when re-enabled, can create entities again - managementContext.getAccessManager().setLocationManagementAllowed(true); - Location loc3 = managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); - - assertEquals(ImmutableSet.copyOf(managementContext.getLocationManager().getLocations()), ImmutableSet.of(loc1, loc3)); - } - - @Test - public void testLocationProvisioningAllowed() throws Exception { - SimulatedLocation loc = managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); - - // default is allowed - assertTrue(managementContext.getAccessController().canProvisionLocation(loc).isAllowed()); - - // when forbidden, should say so - managementContext.getAccessManager().setLocationProvisioningAllowed(false); - assertFalse(managementContext.getAccessController().canProvisionLocation(loc).isAllowed()); - - // but when forbidden, still allowed to create locations - managementContext.getLocationManager().createLocation(LocationSpec.create(SimulatedLocation.class)); - - // when re-enabled, can create entities again - managementContext.getAccessManager().setLocationProvisioningAllowed(true); - assertTrue(managementContext.getAccessController().canProvisionLocation(loc).isAllowed()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java b/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java deleted file mode 100644 index d8cb07a..0000000 --- a/core/src/test/java/brooklyn/management/internal/EntityExecutionManagerTest.java +++ /dev/null @@ -1,479 +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.management.internal; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; - -import java.io.Serializable; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.Semaphore; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.proxying.EntitySpec; -import org.apache.brooklyn.api.management.ExecutionManager; -import org.apache.brooklyn.api.management.Task; -import org.apache.brooklyn.test.entity.LocalManagementContextForTests; -import org.apache.brooklyn.test.entity.TestApplication; -import org.apache.brooklyn.test.entity.TestEntity; -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.config.BrooklynProperties; -import brooklyn.entity.basic.ApplicationBuilder; -import brooklyn.entity.basic.BrooklynTaskTags; -import brooklyn.entity.basic.BrooklynTaskTags.WrappedEntity; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityInternal; -import brooklyn.event.basic.BasicAttributeSensor; -import brooklyn.test.Asserts; -import brooklyn.util.collections.MutableMap; -import brooklyn.util.javalang.JavaClassNames; -import brooklyn.util.repeat.Repeater; -import brooklyn.util.task.BasicExecutionManager; -import brooklyn.util.task.ExecutionListener; -import brooklyn.util.task.TaskBuilder; -import brooklyn.util.task.Tasks; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -import com.google.common.base.Function; -import com.google.common.base.Objects; -import com.google.common.base.Stopwatch; -import com.google.common.collect.FluentIterable; -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 com.google.common.collect.Lists; -import com.google.common.util.concurrent.Callables; - -/** Includes many tests for {@link BrooklynGarbageCollector} */ -public class EntityExecutionManagerTest { - - private static final Logger LOG = LoggerFactory.getLogger(EntityExecutionManagerTest.class); - - private static final Duration TIMEOUT_MS = Duration.TEN_SECONDS; - - private ManagementContextInternal mgmt; - private TestApplication app; - private TestEntity e; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (app != null) Entities.destroyAll(app.getManagementContext()); - app = null; - if (mgmt != null) Entities.destroyAll(mgmt); - } - - @Test - public void testOnDoneCallback() throws InterruptedException { - mgmt = LocalManagementContextForTests.newInstance(); - ExecutionManager em = mgmt.getExecutionManager(); - BasicExecutionManager bem = (BasicExecutionManager)em; - final Map<Task<?>,Duration> completedTasks = MutableMap.of(); - final Semaphore sema4 = new Semaphore(-1); - bem.addListener(new ExecutionListener() { - @Override - public void onTaskDone(Task<?> task) { - Assert.assertTrue(task.isDone()); - Assert.assertEquals(task.getUnchecked(), "foo"); - completedTasks.put(task, Duration.sinceUtc(task.getEndTimeUtc())); - sema4.release(); - } - }); - Task<String> t1 = em.submit( Tasks.<String>builder().name("t1").dynamic(false).body(Callables.returning("foo")).build() ); - t1.getUnchecked(); - Task<String> t2 = em.submit( Tasks.<String>builder().name("t2").dynamic(false).body(Callables.returning("foo")).build() ); - sema4.acquire(); - Assert.assertEquals(completedTasks.size(), 2, "completed tasks are: "+completedTasks); - completedTasks.get(t1).isShorterThan(Duration.TEN_SECONDS); - completedTasks.get(t2).isShorterThan(Duration.TEN_SECONDS); - } - - protected void forceGc() { - ((LocalManagementContext)app.getManagementContext()).getGarbageCollector().gcIteration(); - } - - protected static Task<?> runEmptyTaskWithNameAndTags(Entity target, String name, Object ...tags) { - TaskBuilder<Object> tb = newEmptyTask(name); - for (Object tag: tags) tb.tag(tag); - Task<?> task = ((EntityInternal)target).getExecutionContext().submit(tb.build()); - task.getUnchecked(); - return task; - } - - protected static TaskBuilder<Object> newEmptyTask(String name) { - return Tasks.builder().name(name).dynamic(false).body(Callables.returning(null)); - } - - protected void assertTaskCountForEntitySoon(final Entity entity, final int expectedCount) { - // Dead task (and initialization task) should have been GC'd on completion. - // However, the GC'ing happens in a listener, executed in a different thread - the task.get() - // doesn't block for it. Therefore can't always guarantee it will be GC'ed by now. - Repeater.create().backoff(Duration.millis(10), 2, Duration.millis(500)).limitTimeTo(Duration.TEN_SECONDS).until(new Callable<Boolean>() { - @Override - public Boolean call() throws Exception { - forceGc(); - Collection<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(((EntityInternal)entity).getManagementContext().getExecutionManager(), entity); - Assert.assertEquals(tasks.size(), expectedCount, "Tasks were "+tasks); - return true; - } - }).runRequiringTrue(); - } - - @Test - public void testGetTasksAndGcBoringTags() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - e = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - final Task<?> task = runEmptyTaskWithNameAndTags(e, "should-be-kept", ManagementContextInternal.NON_TRANSIENT_TASK_TAG); - runEmptyTaskWithNameAndTags(e, "should-be-gcd", ManagementContextInternal.TRANSIENT_TASK_TAG); - - assertTaskCountForEntitySoon(e, 1); - Collection<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(app.getManagementContext().getExecutionManager(), e); - assertEquals(tasks, ImmutableList.of(task), "Mismatched tasks, got: "+tasks); - } - - @Test - public void testGcTaskAtNormalTagLimit() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - e = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - ((BrooklynProperties)app.getManagementContext().getConfig()).put( - BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2); - - for (int count=0; count<5; count++) - runEmptyTaskWithNameAndTags(e, "task"+count, ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - - assertTaskCountForEntitySoon(e, 2); - } - - @Test - public void testGcTaskAtEntityLimit() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - e = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - ((BrooklynProperties)app.getManagementContext().getConfig()).put( - BrooklynGarbageCollector.MAX_TASKS_PER_ENTITY, 2); - - for (int count=0; count<5; count++) - runEmptyTaskWithNameAndTags(e, "task-e-"+count, ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - for (int count=0; count<5; count++) - runEmptyTaskWithNameAndTags(app, "task-app-"+count, ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - - assertTaskCountForEntitySoon(app, 2); - assertTaskCountForEntitySoon(e, 2); - } - - @Test - public void testGcTaskWithTagAndEntityLimit() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - e = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - ((BrooklynProperties)app.getManagementContext().getConfig()).put( - BrooklynGarbageCollector.MAX_TASKS_PER_ENTITY, 6); - ((BrooklynProperties)app.getManagementContext().getConfig()).put( - BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2); - - int count=0; - - runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - Time.sleep(Duration.ONE_MILLISECOND); - // should keep the 2 below, because all the other borings get grace, but delete the ones above - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag"); - - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag", "another-tag-e"); - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "boring-tag", "another-tag-e"); - // should keep both the above - - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag"); - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag"); - Time.sleep(Duration.ONE_MILLISECOND); - runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag"); - // should keep the below since they have unique tags, but remove one of the e tasks above - runEmptyTaskWithNameAndTags(e, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag", "and-another-tag"); - runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag-app", "another-tag"); - runEmptyTaskWithNameAndTags(app, "task-"+(count++), ManagementContextInternal.NON_TRANSIENT_TASK_TAG, "another-tag-app", "another-tag"); - - assertTaskCountForEntitySoon(e, 6); - assertTaskCountForEntitySoon(app, 3); - - // now with a lowered limit, we should remove one more e - ((BrooklynProperties)app.getManagementContext().getConfig()).put( - BrooklynGarbageCollector.MAX_TASKS_PER_ENTITY, 5); - assertTaskCountForEntitySoon(e, 5); - } - - @Test - public void testGcDynamicTaskAtNormalTagLimit() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - e = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - ((BrooklynProperties)app.getManagementContext().getConfig()).put( - BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2); - - for (int count=0; count<5; count++) { - TaskBuilder<Object> tb = Tasks.builder().name("task-"+count).dynamic(true).body(new Runnable() { @Override public void run() {}}) - .tag(ManagementContextInternal.NON_TRANSIENT_TASK_TAG).tag("foo"); - ((EntityInternal)e).getExecutionContext().submit(tb.build()).getUnchecked(); - } - - // might need an eventually here, if the internal job completion and GC is done in the background - // (if there are no test failures for a few months, since Sept 2014, then we can remove this comment) - assertTaskCountForEntitySoon(e, 2); - } - - @Test - public void testUnmanagedEntityCanBeGcedEvenIfPreviouslyTagged() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - e = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - String eId = e.getId(); - - e.invoke(TestEntity.MY_EFFECTOR, ImmutableMap.<String,Object>of()).get(); - Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(app.getManagementContext().getExecutionManager(), e); - Task<?> task = Iterables.get(tasks, 0); - assertTrue(task.getTags().contains(BrooklynTaskTags.tagForContextEntity(e))); - - Set<Object> tags = app.getManagementContext().getExecutionManager().getTaskTags(); - assertTrue(tags.contains(BrooklynTaskTags.tagForContextEntity(e)), "tags="+tags); - - Entities.destroy(e); - forceGc(); - - Set<Object> tags2 = app.getManagementContext().getExecutionManager().getTaskTags(); - for (Object tag : tags2) { - if (tag instanceof Entity && ((Entity)tag).getId().equals(eId)) { - fail("tags contains unmanaged entity "+tag); - } - if ((tag instanceof WrappedEntity) && ((WrappedEntity)tag).entity.getId().equals(eId) - && ((WrappedEntity)tag).wrappingType.equals(BrooklynTaskTags.CONTEXT_ENTITY)) { - fail("tags contains unmanaged entity (wrapped) "+tag); - } - } - return; - } - - @Test(groups="Integration") - public void testSubscriptionAndEffectorTasksGced() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - BasicExecutionManager em = (BasicExecutionManager) app.getManagementContext().getExecutionManager(); - // allow background enrichers to complete - Time.sleep(Duration.ONE_SECOND); - forceGc(); - List<Task<?>> t1 = em.getAllTasks(); - - TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - entity.setAttribute(TestEntity.NAME, "bob"); - entity.invoke(TestEntity.MY_EFFECTOR, ImmutableMap.<String,Object>of()).get(); - Entities.destroy(entity); - Time.sleep(Duration.ONE_SECOND); - forceGc(); - List<Task<?>> t2 = em.getAllTasks(); - - Assert.assertEquals(t1.size(), t2.size(), "lists are different:\n"+t1+"\n"+t2+"\n"); - } - - /** - * Invoke effector many times, where each would claim 10MB because it stores the return value. - * If it didn't gc the tasks promptly, it would consume 10GB ram (so would OOME before that). - */ - @Test(groups="Integration") - public void testEffectorTasksGcedSoNoOome() throws Exception { - - BrooklynProperties brooklynProperties = BrooklynProperties.Factory.newEmpty(); - brooklynProperties.put(BrooklynGarbageCollector.GC_PERIOD, Duration.ONE_MILLISECOND); - brooklynProperties.put(BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2); - - app = ApplicationBuilder.newManagedApp(TestApplication.class, LocalManagementContextForTests.newInstance(brooklynProperties)); - TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - for (int i = 0; i < 1000; i++) { - if (i%100==0) LOG.info(JavaClassNames.niceClassAndMethod()+": iteration "+i); - try { - LOG.debug("testEffectorTasksGced: iteration="+i); - entity.invoke(TestEntity.IDENTITY_EFFECTOR, ImmutableMap.of("arg", new BigObject(10*1000*1000))).get(); - - Time.sleep(Duration.ONE_MILLISECOND); // Give GC thread a chance to run - forceGc(); - } catch (OutOfMemoryError e) { - LOG.warn(JavaClassNames.niceClassAndMethod()+": OOME at iteration="+i); - throw e; - } - } - } - - @Test(groups="Integration") - public void testUnmanagedEntityGcedOnUnmanageEvenIfEffectorInvoked() throws Exception { - app = TestApplication.Factory.newManagedInstanceForTests(); - - BasicAttributeSensor<Object> byteArrayAttrib = new BasicAttributeSensor<Object>(Object.class, "test.byteArray", ""); - - for (int i = 0; i < 1000; i++) { - if (i<100 && i%10==0 || i%100==0) LOG.info(JavaClassNames.niceClassAndMethod()+": iteration "+i); - try { - LOG.debug(JavaClassNames.niceClassAndMethod()+": iteration="+i); - TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - entity.setAttribute(byteArrayAttrib, new BigObject(10*1000*1000)); - entity.invoke(TestEntity.MY_EFFECTOR, ImmutableMap.<String,Object>of()).get(); - - // we get exceptions because tasks are still trying to publish after deployment; - // this should prevent them -// ((LocalEntityManager)app.getManagementContext().getEntityManager()).stopTasks(entity, Duration.ONE_SECOND); -// Entities.destroy(entity); - - // alternatively if we 'unmanage' instead of destroy, there are usually not errors - // (the errors come from the node transitioning to a 'stopping' state on destroy, - // and publishing lots of info then) - Entities.unmanage(entity); - - forceGc(); - // previously we did an extra GC but it was crazy slow, shouldn't be needed -// System.gc(); System.gc(); - } catch (OutOfMemoryError e) { - LOG.warn(JavaClassNames.niceClassAndMethod()+": OOME at iteration="+i); - ExecutionManager em = app.getManagementContext().getExecutionManager(); - Collection<Task<?>> tasks = ((BasicExecutionManager)em).getAllTasks(); - LOG.info("TASKS count "+tasks.size()+": "+tasks); - throw e; - } - } - } - - @Test(groups={"Integration"}) - public void testEffectorTasksGcedForMaxPerTag() throws Exception { - int maxNumTasks = 2; - BrooklynProperties brooklynProperties = BrooklynProperties.Factory.newEmpty(); - brooklynProperties.put(BrooklynGarbageCollector.GC_PERIOD, Duration.ONE_SECOND); - brooklynProperties.put(BrooklynGarbageCollector.MAX_TASKS_PER_TAG, 2); - - app = ApplicationBuilder.newManagedApp(TestApplication.class, LocalManagementContextForTests.newInstance(brooklynProperties)); - final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - List<Task<?>> tasks = Lists.newArrayList(); - - for (int i = 0; i < (maxNumTasks+1); i++) { - Task<?> task = entity.invoke(TestEntity.MY_EFFECTOR, ImmutableMap.<String,Object>of()); - task.get(); - tasks.add(task); - - // TASKS_OLDEST_FIRST_COMPARATOR is based on comparing EndTimeUtc; but two tasks executed in - // rapid succession could finish in same millisecond - // (especially when using System.currentTimeMillis, which can return the same time for several millisconds). - Thread.sleep(10); - } - - // Should initially have all tasks - Set<Task<?>> storedTasks = app.getManagementContext().getExecutionManager().getTasksWithAllTags( - ImmutableList.of(BrooklynTaskTags.tagForContextEntity(entity), ManagementContextInternal.EFFECTOR_TAG)); - assertEquals(storedTasks, ImmutableSet.copyOf(tasks), "storedTasks="+storedTasks+"; expected="+tasks); - - // Then oldest should be GC'ed to leave only maxNumTasks - final List<Task<?>> recentTasks = tasks.subList(tasks.size()-maxNumTasks, tasks.size()); - Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() { - @Override public void run() { - Set<Task<?>> storedTasks2 = app.getManagementContext().getExecutionManager().getTasksWithAllTags( - ImmutableList.of(BrooklynTaskTags.tagForContextEntity(entity), ManagementContextInternal.EFFECTOR_TAG)); - List<String> storedTasks2Str = FluentIterable - .from(storedTasks2) - .transform(new Function<Task<?>, String>() { - @Override public String apply(Task<?> input) { - return taskToVerboseString(input); - }}) - .toList(); - assertEquals(storedTasks2, ImmutableSet.copyOf(recentTasks), "storedTasks="+storedTasks2Str+"; expected="+recentTasks); - }}); - } - - private String taskToVerboseString(Task t) { - return Objects.toStringHelper(t) - .add("id", t.getId()) - .add("displayName", t.getDisplayName()) - .add("submitTime", t.getSubmitTimeUtc()) - .add("startTime", t.getStartTimeUtc()) - .add("endTime", t.getEndTimeUtc()) - .add("status", t.getStatusSummary()) - .add("tags", t.getTags()) - .toString(); - } - //2014-10-22 17:48:32,359 INFO TESTNG FAILED: "Surefire test" - brooklyn.management.internal.EntityExecutionManagerTest.testEffectorTasksGcedForMaxPerTag() finished in 10020 ms - //java.lang.AssertionError: storedTasks=[Task[myEffector:dmCJkiM9], Task[myEffector:R2hPTpNL]]; expected=[Task[myEffector:Z9wTQ8We], Task[myEffector:R2hPTpNL]] - // expected [[Task[myEffector:Z9wTQ8We], Task[myEffector:R2hPTpNL]]] - // but found [[Task[myEffector:dmCJkiM9], Task[myEffector:R2hPTpNL]]] - - @Test(groups="Integration") - public void testEffectorTasksGcedForAge() throws Exception { - Duration maxTaskAge = Duration.millis(100); - Duration maxOverhead = Duration.millis(250); - Duration earlyReturnGrace = Duration.millis(10); - BrooklynProperties brooklynProperties = BrooklynProperties.Factory.newEmpty(); - brooklynProperties.put(BrooklynGarbageCollector.GC_PERIOD, Duration.ONE_MILLISECOND); - brooklynProperties.put(BrooklynGarbageCollector.MAX_TASK_AGE, maxTaskAge); - - app = ApplicationBuilder.newManagedApp(TestApplication.class, LocalManagementContextForTests.newInstance(brooklynProperties)); - final TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - Stopwatch stopwatch = Stopwatch.createStarted(); - Task<?> oldTask = entity.invoke(TestEntity.MY_EFFECTOR, ImmutableMap.<String,Object>of()); - oldTask.get(); - - Asserts.succeedsEventually(ImmutableMap.of("timeout", TIMEOUT_MS), new Runnable() { - @Override public void run() { - Set<Task<?>> storedTasks = app.getManagementContext().getExecutionManager().getTasksWithAllTags(ImmutableList.of( - BrooklynTaskTags.tagForTargetEntity(entity), - ManagementContextInternal.EFFECTOR_TAG)); - assertEquals(storedTasks, ImmutableSet.of(), "storedTasks="+storedTasks); - }}); - - Duration timeToGc = Duration.of(stopwatch); - assertTrue(timeToGc.isLongerThan(maxTaskAge.subtract(earlyReturnGrace)), "timeToGc="+timeToGc+"; maxTaskAge="+maxTaskAge); - assertTrue(timeToGc.isShorterThan(maxTaskAge.add(maxOverhead)), "timeToGc="+timeToGc+"; maxTaskAge="+maxTaskAge); - } - - private static class BigObject implements Serializable { - private static final long serialVersionUID = -4021304829674972215L; - private final int sizeBytes; - private final byte[] data; - - BigObject(int sizeBytes) { - this.sizeBytes = sizeBytes; - this.data = new byte[sizeBytes]; - } - - @Override - public String toString() { - return "BigObject["+sizeBytes+"/"+data.length+"]"; - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/internal/LocalManagementContextInstancesTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/internal/LocalManagementContextInstancesTest.java b/core/src/test/java/brooklyn/management/internal/LocalManagementContextInstancesTest.java deleted file mode 100644 index 0e07b94..0000000 --- a/core/src/test/java/brooklyn/management/internal/LocalManagementContextInstancesTest.java +++ /dev/null @@ -1,86 +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.management.internal; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableSet; - -/** - * Tests the {@link LocalManagementContext#terminateAll()} and {@link LocalManagementContext#getInstances()} behaviour. - * Note this test must NEVER be run in parallel with other tests, as it will terminate the ManagementContext of those - * other tests. - * - * @author pveentjer - */ -public class LocalManagementContextInstancesTest { - - @AfterMethod(alwaysRun = true) - public void tearDown(){ - LocalManagementContext.terminateAll(); - } - - /** WIP group because other threads may be running in background, - * creating management contexts at the same time as us (slim chance, but observed once); - * they shouldn't be, but cleaning that up is another matter! */ - @Test(groups="WIP") - public void testGetInstances(){ - LocalManagementContext.terminateAll(); - LocalManagementContext context1 = new LocalManagementContext(); - LocalManagementContext context2 = new LocalManagementContext(); - LocalManagementContext context3 = new LocalManagementContext(); - - assertEquals(LocalManagementContext.getInstances(), ImmutableSet.of(context1, context2, context3)); - } - - /** WIP group because other threads may be running in background; - * they shouldn't be, but cleaning that up is another matter! */ - @Test - public void terminateAll(){ - LocalManagementContext.terminateAll(); - - LocalManagementContext context1 = new LocalManagementContext(); - LocalManagementContext context2 = new LocalManagementContext(); - - LocalManagementContext.terminateAll(); - - assertTrue(LocalManagementContext.getInstances().isEmpty()); - assertFalse(context1.isRunning()); - assertFalse(context2.isRunning()); - } - - @Test - public void terminateExplicitContext(){ - LocalManagementContext context1 = new LocalManagementContext(); - LocalManagementContext context2 = new LocalManagementContext(); - LocalManagementContext context3 = new LocalManagementContext(); - - context2.terminate(); - - Assert.assertFalse(LocalManagementContext.getInstances().contains(context2)); - Assert.assertTrue(LocalManagementContext.getInstances().contains(context1)); - Assert.assertTrue(LocalManagementContext.getInstances().contains(context3)); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java b/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java deleted file mode 100644 index d225cd7..0000000 --- a/core/src/test/java/brooklyn/management/internal/LocalManagementContextTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.management.internal; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotEquals; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.management.ManagementContext.PropertiesReloadListener; -import org.apache.brooklyn.test.entity.LocalManagementContextForTests; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.config.BrooklynProperties; -import brooklyn.config.BrooklynProperties.Factory.Builder; -import brooklyn.util.os.Os; - -import com.google.common.base.Charsets; -import com.google.common.io.Files; - -public class LocalManagementContextTest { - - private LocalManagementContext context; - private File globalPropertiesFile; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - context = null; - globalPropertiesFile = Os.newTempFile(getClass(), "global.properties"); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws Exception { - if (context!=null) context.terminate(); - if (globalPropertiesFile != null) globalPropertiesFile.delete(); - } - - @Test - public void testReloadPropertiesFromBuilder() throws IOException { - String globalPropertiesContents = "brooklyn.location.localhost.displayName=myname"; - Files.write(globalPropertiesContents, globalPropertiesFile, Charsets.UTF_8); - Builder propsBuilder = new BrooklynProperties.Factory.Builder() - .globalPropertiesFile(globalPropertiesFile.getAbsolutePath()); - // no builder support in LocalManagementContextForTests (we are testing that the builder's files are reloaded so we need it here) - context = new LocalManagementContext(propsBuilder); - Location location = context.getLocationRegistry().resolve("localhost"); - assertEquals(location.getDisplayName(), "myname"); - String newGlobalPropertiesContents = "brooklyn.location.localhost.displayName=myname2"; - Files.write(newGlobalPropertiesContents, globalPropertiesFile, Charsets.UTF_8); - context.reloadBrooklynProperties(); - Location location2 = context.getLocationRegistry().resolve("localhost"); - assertEquals(location.getDisplayName(), "myname"); - assertEquals(location2.getDisplayName(), "myname2"); - } - - @Test - public void testReloadPropertiesFromProperties() throws IOException { - String globalPropertiesContents = "brooklyn.location.localhost.displayName=myname"; - Files.write(globalPropertiesContents, globalPropertiesFile, Charsets.UTF_8); - BrooklynProperties brooklynProperties = new BrooklynProperties.Factory.Builder() - .globalPropertiesFile(globalPropertiesFile.getAbsolutePath()) - .build(); - context = LocalManagementContextForTests.builder(true).useProperties(brooklynProperties).build(); - Location location = context.getLocationRegistry().resolve("localhost"); - assertEquals(location.getDisplayName(), "myname"); - String newGlobalPropertiesContents = "brooklyn.location.localhost.displayName=myname2"; - Files.write(newGlobalPropertiesContents, globalPropertiesFile, Charsets.UTF_8); - context.reloadBrooklynProperties(); - Location location2 = context.getLocationRegistry().resolve("localhost"); - assertEquals(location.getDisplayName(), "myname"); - assertEquals(location2.getDisplayName(), "myname"); - } - - @Test - public void testPropertiesModified() throws IOException { - BrooklynProperties properties = BrooklynProperties.Factory.newEmpty(); - properties.put("myname", "myval"); - context = LocalManagementContextForTests.builder(true).useProperties(properties).build(); - assertEquals(context.getBrooklynProperties().get("myname"), "myval"); - properties.put("myname", "newval"); - assertEquals(properties.get("myname"), "newval"); - // TODO: Should changes in the 'properties' collection be reflected in context.getBrooklynProperties()? - assertNotEquals(context.getBrooklynProperties().get("myname"), "newval"); - } - - @Test - public void testAddAndRemoveReloadListener() { - final AtomicInteger reloadedCallbackCount = new AtomicInteger(0); - BrooklynProperties properties = BrooklynProperties.Factory.newEmpty(); - properties.put("myname", "myval"); - context = LocalManagementContextForTests.builder(true).useProperties(properties).build(); - PropertiesReloadListener listener = new PropertiesReloadListener() { - public void reloaded() { - reloadedCallbackCount.incrementAndGet(); - } - }; - assertEquals(reloadedCallbackCount.get(), 0); - context.addPropertiesReloadListener(listener); - context.reloadBrooklynProperties(); - assertEquals(reloadedCallbackCount.get(), 1); - context.removePropertiesReloadListener(listener); - context.reloadBrooklynProperties(); - assertEquals(reloadedCallbackCount.get(), 1); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/internal/LocalSubscriptionManagerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/internal/LocalSubscriptionManagerTest.java b/core/src/test/java/brooklyn/management/internal/LocalSubscriptionManagerTest.java deleted file mode 100644 index 7907d30..0000000 --- a/core/src/test/java/brooklyn/management/internal/LocalSubscriptionManagerTest.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.management.internal; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.proxying.EntitySpec; -import org.apache.brooklyn.api.event.SensorEvent; -import org.apache.brooklyn.api.event.SensorEventListener; -import org.apache.brooklyn.api.management.SubscriptionHandle; -import org.apache.brooklyn.api.management.SubscriptionManager; -import org.apache.brooklyn.test.entity.TestEntity; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import brooklyn.entity.BrooklynAppUnitTestSupport; -import brooklyn.entity.basic.BasicGroup; -import brooklyn.entity.basic.Entities; - -/** - * testing the {@link SubscriptionManager} and associated classes. - */ -public class LocalSubscriptionManagerTest extends BrooklynAppUnitTestSupport { - - private static final int TIMEOUT_MS = 5000; - - private TestEntity entity; - - @BeforeMethod(alwaysRun=true) - @Override - public void setUp() throws Exception { - super.setUp(); - entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - } - - private void manage(Entity ...entities) { - for (Entity e: entities) - Entities.manage(e); - } - - @Test - public void testSubscribeToEntityAttributeChange() throws Exception { - final CountDownLatch latch = new CountDownLatch(1); - app.subscribe(entity, TestEntity.SEQUENCE, new SensorEventListener<Object>() { - @Override public void onEvent(SensorEvent<Object> event) { - latch.countDown(); - }}); - entity.setSequenceValue(1234); - if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - fail("Timeout waiting for Event on TestEntity listener"); - } - } - - @Test - public void testSubscribeToEntityWithAttributeWildcard() throws Exception { - final CountDownLatch latch = new CountDownLatch(1); - app.subscribe(entity, null, new SensorEventListener<Object>() { - @Override public void onEvent(SensorEvent<Object> event) { - latch.countDown(); - }}); - entity.setSequenceValue(1234); - if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - fail("Timeout waiting for Event on TestEntity listener"); - } - } - - @Test - public void testSubscribeToAttributeChangeWithEntityWildcard() throws Exception { - final CountDownLatch latch = new CountDownLatch(1); - app.subscribe(null, TestEntity.SEQUENCE, new SensorEventListener<Object>() { - @Override public void onEvent(SensorEvent<Object> event) { - latch.countDown(); - }}); - entity.setSequenceValue(1234); - if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - fail("Timeout waiting for Event on TestEntity listener"); - } - } - - @Test - public void testSubscribeToChildAttributeChange() throws Exception { - final CountDownLatch latch = new CountDownLatch(1); - app.subscribeToChildren(app, TestEntity.SEQUENCE, new SensorEventListener<Object>() { - @Override public void onEvent(SensorEvent<Object> event) { - latch.countDown(); - }}); - entity.setSequenceValue(1234); - if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - fail("Timeout waiting for Event on child TestEntity listener"); - } - } - - @Test - public void testSubscribeToMemberAttributeChange() throws Exception { - BasicGroup group = app.createAndManageChild(EntitySpec.create(BasicGroup.class)); - TestEntity member = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - manage(group, member); - - group.addMember(member); - - final List<SensorEvent<Integer>> events = new CopyOnWriteArrayList<SensorEvent<Integer>>(); - final CountDownLatch latch = new CountDownLatch(1); - app.subscribeToMembers(group, TestEntity.SEQUENCE, new SensorEventListener<Integer>() { - @Override public void onEvent(SensorEvent<Integer> event) { - events.add(event); - latch.countDown(); - }}); - member.setAttribute(TestEntity.SEQUENCE, 123); - - if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - fail("Timeout waiting for Event on parent TestEntity listener"); - } - assertEquals(events.size(), 1); - assertEquals(events.get(0).getValue(), (Integer)123); - assertEquals(events.get(0).getSensor(), TestEntity.SEQUENCE); - assertEquals(events.get(0).getSource().getId(), member.getId()); - } - - // Regression test for ConcurrentModificationException in issue #327 - @Test(groups="Integration") - public void testConcurrentSubscribingAndPublishing() throws Exception { - final AtomicReference<Exception> threadException = new AtomicReference<Exception>(); - TestEntity entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); - - // Repeatedly subscribe and unsubscribe, so listener-set constantly changing while publishing to it. - // First create a stable listener so it is always the same listener-set object. - Thread thread = new Thread() { - public void run() { - try { - SensorEventListener<Object> noopListener = new SensorEventListener<Object>() { - @Override public void onEvent(SensorEvent<Object> event) { - } - }; - app.subscribe(null, TestEntity.SEQUENCE, noopListener); - while (!Thread.currentThread().isInterrupted()) { - SubscriptionHandle handle = app.subscribe(null, TestEntity.SEQUENCE, noopListener); - app.unsubscribe(null, handle); - } - } catch (Exception e) { - threadException.set(e); - } - } - }; - - try { - thread.start(); - for (int i = 0; i < 10000; i++) { - entity.setAttribute(TestEntity.SEQUENCE, i); - } - } finally { - thread.interrupt(); - } - - if (threadException.get() != null) throw threadException.get(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/osgi/OsgiPathTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/osgi/OsgiPathTest.java b/core/src/test/java/brooklyn/management/osgi/OsgiPathTest.java deleted file mode 100644 index 829b281..0000000 --- a/core/src/test/java/brooklyn/management/osgi/OsgiPathTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package brooklyn.management.osgi; - -import java.io.File; -import java.io.IOException; - -import org.apache.brooklyn.test.entity.LocalManagementContextForTests; -import org.osgi.framework.BundleException; -import org.testng.Assert; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.Test; - -import brooklyn.config.BrooklynProperties; -import brooklyn.config.BrooklynServerConfig; -import brooklyn.config.BrooklynServerPaths; -import brooklyn.entity.basic.Entities; -import brooklyn.management.internal.LocalManagementContext; -import brooklyn.util.os.Os; -import brooklyn.util.text.Identifiers; - - -/** - * Tests that OSGi entities load correctly and have the right catalog information set. - * Note further tests done elsewhere using CAMP YAML (referring to methods in this class). - */ -public class OsgiPathTest { - - protected LocalManagementContext mgmt = null; - - @AfterMethod(alwaysRun=true) - public void tearDown() throws BundleException, IOException, InterruptedException { - if (mgmt!=null) Entities.destroyAll(mgmt); - } - - @Test(groups="Integration") // integration only because OSGi takes ~200ms - public void testOsgiPathDefault() { - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).build(); - String path = BrooklynServerPaths.getOsgiCacheDir(mgmt).getAbsolutePath(); - Assert.assertTrue(path.startsWith(BrooklynServerPaths.getMgmtBaseDir(mgmt)), path); - Assert.assertTrue(path.contains(mgmt.getManagementNodeId()), path); - - assertExistsThenIsCleaned(path); - } - - @Test(groups="Integration") // integration only because OSGi takes ~200ms - public void testOsgiPathCustom() { - BrooklynProperties bp = BrooklynProperties.Factory.newEmpty(); - String randomSeg = "osgi-test-"+Identifiers.makeRandomId(4); - bp.put(BrooklynServerConfig.OSGI_CACHE_DIR, "${brooklyn.os.tmpdir}"+"/"+randomSeg+"/"+"${brooklyn.mgmt.node.id}"); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).useProperties(bp).build(); - String path = BrooklynServerPaths.getOsgiCacheDir(mgmt).getAbsolutePath(); - Os.deleteOnExitRecursivelyAndEmptyParentsUpTo(new File(path), new File(Os.tmp()+"/"+randomSeg)); - - Assert.assertTrue(path.startsWith(Os.tmp()), path); - Assert.assertTrue(path.contains(mgmt.getManagementNodeId()), path); - - assertExistsThenIsCleaned(path); - } - - @Test(groups="Integration") // integration only because OSGi takes ~200ms - public void testOsgiPathCustomWithoutNodeIdNotCleaned() { - BrooklynProperties bp = BrooklynProperties.Factory.newEmpty(); - String randomSeg = "osgi-test-"+Identifiers.makeRandomId(4); - bp.put(BrooklynServerConfig.OSGI_CACHE_DIR, "${brooklyn.os.tmpdir}"+"/"+randomSeg+"/"+"sample"); - mgmt = LocalManagementContextForTests.builder(true).disableOsgi(false).useProperties(bp).build(); - String path = BrooklynServerPaths.getOsgiCacheDir(mgmt).getAbsolutePath(); - Os.deleteOnExitRecursivelyAndEmptyParentsUpTo(new File(path), new File(Os.tmp()+"/"+randomSeg)); - - Assert.assertTrue(path.startsWith(Os.tmp()), path); - Assert.assertFalse(path.contains(mgmt.getManagementNodeId()), path); - - assertExistsThenCorrectCleanedBehaviour(path, false); - } - - private void assertExistsThenIsCleaned(String path) { - assertExistsThenCorrectCleanedBehaviour(path, true); - } - private void assertExistsThenCorrectCleanedBehaviour(String path, boolean shouldBeCleanAfterwards) { - Assert.assertTrue(new File(path).exists(), "OSGi cache "+path+" should exist when in use"); - Entities.destroyAll(mgmt); - mgmt = null; - if (shouldBeCleanAfterwards) - Assert.assertFalse(new File(path).exists(), "OSGi cache "+path+" should be cleaned after"); - else - Assert.assertTrue(new File(path).exists(), "OSGi cache "+path+" should NOT be cleaned after"); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java b/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java deleted file mode 100644 index 64306c6..0000000 --- a/core/src/test/java/brooklyn/management/osgi/OsgiStandaloneTest.java +++ /dev/null @@ -1,259 +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.management.osgi; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Enumeration; -import java.util.List; -import java.util.jar.JarInputStream; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.test.TestResourceUnavailableException; - -import brooklyn.util.exceptions.Exceptions; - -import org.apache.commons.io.FileUtils; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleException; -import org.osgi.framework.FrameworkEvent; -import org.osgi.framework.launch.Framework; -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.util.ResourceUtils; -import brooklyn.util.collections.MutableSet; -import brooklyn.util.maven.MavenArtifact; -import brooklyn.util.maven.MavenRetriever; -import brooklyn.util.net.Urls; -import brooklyn.util.os.Os; -import brooklyn.util.osgi.Osgis; -import brooklyn.util.osgi.Osgis.ManifestHelper; -import brooklyn.util.stream.Streams; - -/** - * Tests some assumptions about OSGi behaviour, in standalone mode (not part of brooklyn). - * See {@link OsgiTestResources} for description of test resources. - */ -public class OsgiStandaloneTest { - - private static final Logger log = LoggerFactory.getLogger(OsgiStandaloneTest.class); - - public static final String BROOKLYN_OSGI_TEST_A_0_1_0_PATH = OsgiTestResources.BROOKLYN_OSGI_TEST_A_0_1_0_PATH; - public static final String BROOKLYN_OSGI_TEST_A_0_1_0_URL = "classpath:"+BROOKLYN_OSGI_TEST_A_0_1_0_PATH; - - public static final String BROOKLYN_TEST_OSGI_ENTITIES_PATH = OsgiTestResources.BROOKLYN_TEST_OSGI_ENTITIES_PATH; - public static final String BROOKLYN_TEST_OSGI_ENTITIES_URL = "classpath:"+BROOKLYN_TEST_OSGI_ENTITIES_PATH; - public static final String BROOKLYN_TEST_OSGI_ENTITIES_NAME = "org.apache.brooklyn.test.resources.osgi.brooklyn-test-osgi-entities"; - public static final String BROOKLYN_TEST_OSGI_ENTITIES_VERSION = "0.1.0"; - - protected Framework framework = null; - private File storageTempDir; - - @BeforeMethod(alwaysRun=true) - public void setUp() throws Exception { - storageTempDir = Os.newTempDir("osgi-standalone"); - framework = Osgis.newFrameworkStarted(storageTempDir.getAbsolutePath(), true, null); - } - - @AfterMethod(alwaysRun=true) - public void tearDown() throws BundleException, IOException, InterruptedException { - tearDownOsgiFramework(framework, storageTempDir); - } - - public static void tearDownOsgiFramework(Framework framework, File storageTempDir) throws BundleException, InterruptedException, IOException { - if (framework!=null) { - framework.stop(); - Assert.assertEquals(framework.waitForStop(1000).getType(), FrameworkEvent.STOPPED); - framework = null; - } - if (storageTempDir!=null) { - FileUtils.deleteDirectory(storageTempDir); - storageTempDir = null; - } - } - - protected Bundle install(String url) throws BundleException { - try { - return Osgis.install(framework, url); - } catch (Exception e) { - throw new IllegalStateException("test resources not available; may be an IDE issue, so try a mvn rebuild of this project", e); - } - } - - protected Bundle installFromClasspath(String resourceName) throws BundleException { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), resourceName); - try { - return Osgis.install(framework, String.format("classpath:%s", resourceName)); - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - - @Test - public void testInstallBundle() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - checkMath(bundle, 3, 6); - } - - @Test - public void testBootBundle() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_TEST_OSGI_ENTITIES_PATH); - Class<?> bundleCls = bundle.loadClass("brooklyn.osgi.tests.SimpleEntity"); - Assert.assertEquals(Entity.class, bundle.loadClass(Entity.class.getName())); - Assert.assertEquals(Entity.class, bundleCls.getClassLoader().loadClass(Entity.class.getName())); - } - - @Test - public void testDuplicateBundle() throws Exception { - MavenArtifact artifact = new MavenArtifact("org.apache.brooklyn", "brooklyn-api", "jar", "0.8.0-SNAPSHOT"); // BROOKLYN_VERSION - String localUrl = MavenRetriever.localUrl(artifact); - if ("file".equals(Urls.getProtocol(localUrl))) { - helperDuplicateBundle(localUrl); - } else { - log.warn("Skipping test OsgiStandaloneTest.testDuplicateBundle due to " + artifact + " not available in local repo."); - } - } - - @Test(groups="Integration") - public void testRemoteDuplicateBundle() throws Exception { - helperDuplicateBundle(MavenRetriever.hostedUrl(new MavenArtifact("org.apache.brooklyn", "brooklyn-api", "jar", "0.8.0-SNAPSHOT"))); // BROOKLYN_VERSION - } - - public void helperDuplicateBundle(String url) throws Exception { - //The bundle is already installed from the boot path. - //Make sure that we still get the initially loaded - //bundle after trying to install the same version. - Bundle bundle = install(url); - Assert.assertTrue(Osgis.isExtensionBundle(bundle)); - } - - @Test - public void testAMultiplier() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - checkMath(bundle, 3, 6); - setAMultiplier(bundle, 5); - checkMath(bundle, 3, 15); - } - - /** run two multiplier tests to ensure that irrespective of order the tests run in, - * on a fresh install the multiplier is reset */ - @Test - public void testANOtherMultiple() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - checkMath(bundle, 3, 6); - setAMultiplier(bundle, 14); - checkMath(bundle, 3, 42); - } - - @Test - public void testGetBundle() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - setAMultiplier(bundle, 3); - - // can look it up based on the same location string (no other "location identifier" reference string seems to work here, however) - Bundle bundle2 = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - checkMath(bundle2, 3, 9); - } - - @Test - public void testUninstallAndReinstallBundle() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - checkMath(bundle, 3, 6); - setAMultiplier(bundle, 3); - checkMath(bundle, 3, 9); - bundle.uninstall(); - - Bundle bundle2 = installFromClasspath(BROOKLYN_OSGI_TEST_A_0_1_0_PATH); - checkMath(bundle2, 3, 6); - } - - protected void checkMath(Bundle bundle, int input, int output) throws Exception { - Assert.assertNotNull(bundle); - Class<?> aClass = bundle.loadClass("brooklyn.test.osgi.TestA"); - Object aInst = aClass.newInstance(); - Object result = aClass.getMethod("times", int.class).invoke(aInst, input); - Assert.assertEquals(result, output); - } - - protected void setAMultiplier(Bundle bundle, int newMultiplier) throws Exception { - Assert.assertNotNull(bundle); - Class<?> aClass = bundle.loadClass("brooklyn.test.osgi.TestA"); - aClass.getField("multiplier").set(null, newMultiplier); - } - - @Test - public void testReadAManifest() throws Exception { - Enumeration<URL> manifests = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF"); - log.info("Bundles and exported packages:"); - MutableSet<String> allPackages = MutableSet.of(); - while (manifests.hasMoreElements()) { - ManifestHelper mf = Osgis.ManifestHelper.forManifestContents(Streams.readFullyString( manifests.nextElement().openStream() )); - List<String> mfPackages = mf.getExportedPackages(); - log.info(" "+mf.getSymbolicNameVersion()+": "+mfPackages); - allPackages.addAll(mfPackages); - } - log.info("Total export package count: "+allPackages.size()); - Assert.assertTrue(allPackages.size()>20, "did not find enough packages"); // probably much larger - Assert.assertTrue(allPackages.contains(Osgis.class.getPackage().getName())); - } - - @Test - public void testReadKnownManifest() throws Exception { - TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), BROOKLYN_TEST_OSGI_ENTITIES_PATH); - InputStream in = this.getClass().getResourceAsStream(BROOKLYN_TEST_OSGI_ENTITIES_PATH); - JarInputStream jarIn = new JarInputStream(in); - ManifestHelper helper = Osgis.ManifestHelper.forManifest(jarIn.getManifest()); - jarIn.close(); - Assert.assertEquals(helper.getVersion().toString(), "0.1.0"); - Assert.assertTrue(helper.getExportedPackages().contains("brooklyn.osgi.tests")); - } - - @Test - public void testLoadOsgiBundleDependencies() throws Exception { - Bundle bundle = installFromClasspath(BROOKLYN_TEST_OSGI_ENTITIES_PATH); - Assert.assertNotNull(bundle); - Class<?> aClass = bundle.loadClass("brooklyn.osgi.tests.SimpleApplicationImpl"); - Object aInst = aClass.newInstance(); - Assert.assertNotNull(aInst); - } - - @Test - public void testLoadAbsoluteWindowsResourceWithInstalledOSGi() { - //Felix installs an additional URL to the system classloader - //which throws an IllegalArgumentException when passed a - //windows path. See ExtensionManager.java static initializer. - String context = "mycontext"; - String dummyPath = "C:\\dummypath"; - ResourceUtils utils = ResourceUtils.create(this, context); - try { - utils.getResourceFromUrl(dummyPath); - Assert.fail("Non-reachable, should throw an exception for non-existing resource."); - } catch (RuntimeException e) { - Assert.assertTrue(e.getMessage().startsWith("Error getting resource '"+dummyPath+"' for "+context)); - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6602f694/core/src/test/java/brooklyn/management/osgi/OsgiTestResources.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/management/osgi/OsgiTestResources.java b/core/src/test/java/brooklyn/management/osgi/OsgiTestResources.java deleted file mode 100644 index ef0321d..0000000 --- a/core/src/test/java/brooklyn/management/osgi/OsgiTestResources.java +++ /dev/null @@ -1,74 +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.management.osgi; - -/** - * Many OSGi tests require OSGi bundles (of course). Test bundles have been collected here - * for convenience and clarity. Available bundles (on the classpath, with source code - * either embedded or in /src/dependencies) are described by the constants in this class. - * <p> - * Some of these bundles are also used in REST API tests, as that stretches catalog further - * (using CAMP) and that is one area where OSGi is heavily used. - */ -public class OsgiTestResources { - - - /** - * brooklyn-osgi-test-a_0.1.0 - - * defines TestA which has a "times" method and a static multiplier field; - * we set the multiplier to determine when we are sharing versions and when not - */ - public static final String BROOKLYN_OSGI_TEST_A_0_1_0_PATH = "/brooklyn/osgi/brooklyn-osgi-test-a_0.1.0.jar"; - - /** - * brooklyn-test-osgi-entities (v 0.1.0) - - * defines an entity and an application, to confirm it can be read and used by brooklyn - */ - public static final String BROOKLYN_TEST_OSGI_ENTITIES_PATH = "/brooklyn/osgi/brooklyn-test-osgi-entities.jar"; - public static final String BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_APPLICATION = "brooklyn.osgi.tests.SimpleApplication"; - public static final String BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_ENTITY = "brooklyn.osgi.tests.SimpleEntity"; - public static final String BROOKLYN_TEST_OSGI_ENTITIES_SIMPLE_POLICY = "brooklyn.osgi.tests.SimplePolicy"; - - /** - * brooklyn-test-osgi-more-entities_0.1.0 - - * another bundle with a minimal sayHi effector, used to test versioning and dependencies - * (this one has no dependencies, but see also {@value #BROOKLYN_TEST_MORE_ENTITIES_V2_PATH}) - */ - public static final String BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FINAL_PART = "brooklyn-test-osgi-more-entities"; - public static final String BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FULL = - "org.apache.brooklyn.test.resources.osgi."+BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FINAL_PART; - public static final String BROOKLYN_TEST_MORE_ENTITIES_V1_PATH = "/brooklyn/osgi/" + BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FINAL_PART + "_0.1.0.jar"; - public static final String BROOKLYN_TEST_MORE_ENTITIES_MORE_ENTITY = "brooklyn.osgi.tests.more.MoreEntity"; - - /** - * brooklyn-test-osgi-more-entities_0.2.0 - - * similar to {@link #BROOKLYN_TEST_MORE_ENTITIES_V1_PATH} but saying "HI NAME" rather than "Hi NAME", - * and declaring an explicit dependency on SimplePolicy from {@link #BROOKLYN_TEST_OSGI_ENTITIES_PATH} - */ - public static final String BROOKLYN_TEST_MORE_ENTITIES_V2_PATH = "/brooklyn/osgi/" + BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FINAL_PART + "_0.2.0.jar"; - - /** - * bundle with identical metadata (same symbolic name and version -- hence being an evil twin) - * as {@link #BROOKLYN_TEST_MORE_ENTITIES_V2_PATH}, - * but slightly different behaviour -- saying "HO NAME" -- in order to make sure we can differentiate two two - * at runtime. - */ - public static final String BROOKLYN_TEST_MORE_ENTITIES_V2_EVIL_TWIN_PATH = "/brooklyn/osgi/" + BROOKLYN_TEST_MORE_ENTITIES_SYMBOLIC_NAME_FINAL_PART + "_evil-twin_0.2.0.jar"; - -}
