@Test public void testSubscribeToChildAttributeChange() throws Exception { final CountDownLatch latch = new CountDownLatch(1); app.subscriptions().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"); } }
.configure(BUCKET_FUNCTION, bucketFromAttribute(SENSOR)) ); app.subscriptions().subscribeToChildren(group, SENSOR, new SensorEventListener<String>() { @Override public void onEvent(SensorEvent<String> event) { dmg.rescanEntities(); }
@Test public void testSubscribeToChildrenReceivesEvents() { entity.subscriptions().subscribeToChildren(observedEntity, TestEntity.SEQUENCE, listener); observedChildEntity.sensors().set(TestEntity.SEQUENCE, 123); observedEntity.sensors().set(TestEntity.SEQUENCE, 456); Asserts.succeedsEventually(new Runnable() { @Override public void run() { assertEquals(listener.getEvents(), ImmutableList.of( new BasicSensorEvent<Integer>(TestEntity.SEQUENCE, observedChildEntity, 123))); }}); }
@Test public void testBucketDistributionFromSubscription() { Group group = app.createAndManageChild(EntitySpec.create(BasicGroup.class)); final DynamicMultiGroup dmg = app.createAndManageChild( EntitySpec.create(DynamicMultiGroup.class) .configure(ENTITY_FILTER, instanceOf(TestEntity.class)) .configure(BUCKET_FUNCTION, bucketFromAttribute(SENSOR)) ); app.subscriptions().subscribeToChildren(group, SENSOR, new SensorEventListener<String>() { @Override public void onEvent(SensorEvent<String> event) { dmg.rescanEntities(); } }); EntitySpec<TestEntity> childSpec = EntitySpec.create(TestEntity.class); TestEntity child1 = group.addChild(EntitySpec.create(childSpec).displayName("child1")); TestEntity child2 = group.addChild(EntitySpec.create(childSpec).displayName("child2")); checkDistribution(group, dmg, childSpec, child1, child2); }
@Test public void testContextEntityOnSubscriptionCallbackTask() { observedEntity.sensors().set(TestEntity.NAME, "myval"); entity.subscriptions().subscribe(ImmutableMap.of("notifyOfInitialValue", true), observedEntity, TestEntity.NAME, listener); // notify-of-initial-value should give us our entity assertListenerCalledOnceWithContextEntityEventually(listener, entity); listener.clearEvents(); // as should subsequent events observedEntity.sensors().set(TestEntity.NAME, "myval2"); assertListenerCalledOnceWithContextEntityEventually(listener, entity); listener.clearEvents(); // same for subscribing to children: context should be the subscriber entity.subscriptions().subscribeToChildren(observedEntity, TestEntity.SEQUENCE, listener); observedChildEntity.sensors().set(TestEntity.SEQUENCE, 123); assertListenerCalledOnceWithContextEntityEventually(listener, entity); }
@Test public void testSubscribeToChildrenReceivesEventsForDynamicallyAddedChildren() { entity.subscriptions().subscribeToChildren(observedEntity, TestEntity.SEQUENCE, listener); final TestEntity observedChildEntity2 = observedEntity.createAndManageChild(EntitySpec.create(TestEntity.class)); observedChildEntity2.sensors().set(TestEntity.SEQUENCE, 123); Asserts.succeedsEventually(new Runnable() { @Override public void run() { assertEquals(listener.getEvents(), ImmutableList.of( new BasicSensorEvent<Integer>(TestEntity.SEQUENCE, observedChildEntity2, 123))); }}); }