use of com.arm.mbed.cloud.sdk.subscribe.NotificationCallback in project mbed-cloud-sdk-java by ARMmbed.
the class TestNotificationHandling method testDeviceState.
/**
* Tests subscriptions to device state changes
*/
@Test
public void testDeviceState() {
Future<?> handle = null;
ScheduledExecutorService executor = null;
try {
List<DeviceStateNotification> receivedNotifications = new LinkedList<>();
executor = Executors.newScheduledThreadPool(1);
NotificationHandlersStore store = new NotificationHandlersStore(null, null, executor, null);
DeviceStateObserver obs1 = store.getSubscriptionManager().deviceState(new DeviceStateFilterOptions().likeDevice("016%33e").equalDeviceState(DeviceState.REGISTRATION_UPDATE), BackpressureStrategy.BUFFER);
// Generating notifications
@SuppressWarnings("boxing") List<NotificationMessage> notifications = Stream.iterate(0, n -> n + 1).limit(32).map(i -> {
NotificationMessage message = new NotificationMessage();
EndpointData data = new EndpointData();
if (i % 5 == 0) {
data.setEp("0161661e9ce10000000000010010033e");
} else {
data.setEp("0161661edbab000000000001001002b7");
}
data.setEpt("random");
data.setQ(false);
data.setResources(Stream.iterate(0, n -> n + 1).limit(50).map(v -> {
final ResourcesData resource = new ResourcesData();
resource.setPath("/" + v);
resource.setObs(true);
return resource;
}).collect(Collectors.toList()));
if (i % 2 == 0) {
message.addRegUpdatesItem(data);
} else {
message.addRegistrationsItem(data);
}
return message;
}).collect(Collectors.toList());
obs1.addCallback(new NotificationCallback<>(new Callback<DeviceStateNotification>() {
@Override
public void execute(DeviceStateNotification arg) {
receivedNotifications.add(arg);
}
}, null));
int Interval = 300;
handle = executor.scheduleWithFixedDelay(new Runnable() {
private int i = 0;
@Override
public void run() {
if (i < notifications.size()) {
store.notify(notifications.get(i));
i++;
}
}
}, 0, Interval, TimeUnit.MILLISECONDS);
// Waiting for all notifications to be emitted
Thread.sleep((notifications.size() + 1) * Interval);
assertFalse(receivedNotifications.isEmpty());
// Only multiples of 10 between 0 and 32
assertEquals(4, receivedNotifications.size());
// Observer only cares about changes related to devices like 016%33e and REGISTRATION_UPDATE state
receivedNotifications.forEach(n -> {
assertEquals("0161661e9ce10000000000010010033e", n.getDeviceId());
assertEquals(DeviceState.REGISTRATION_UPDATE, n.getState());
});
if (handle != null) {
handle.cancel(true);
}
executor.shutdownNow();
} catch (Exception e) {
if (handle != null) {
handle.cancel(true);
}
if (executor != null) {
executor.shutdownNow();
}
e.printStackTrace();
fail(e.getMessage());
}
}
use of com.arm.mbed.cloud.sdk.subscribe.NotificationCallback in project mbed-cloud-sdk-java by ARMmbed.
the class TestSubscriptionObserversStore method testDeviceState.
/**
* Tests subscriptions to device state changes
*/
@Test
public void testDeviceState() {
Future<?> handle = null;
ScheduledExecutorService executor = null;
try {
List<DeviceStateNotification> receivedNotifications = new LinkedList<>();
SubscriptionObserversStore store = new SubscriptionObserversStore(Schedulers.computation());
DeviceStateObserver obs1 = store.deviceState(new DeviceStateFilterOptions().likeDevice("016%33e").equalDeviceState(DeviceState.REGISTRATION_UPDATE), BackpressureStrategy.BUFFER);
// We are only interested in one value of obs1
Future<DeviceStateNotification> future = obs1.futureOne();
DeviceStateObserver obs2 = store.deviceState(DeviceStateFilterOptions.newFilter().likeDevice("016%2b7").equalDeviceState(DeviceState.REGISTRATION_UPDATE), BackpressureStrategy.BUFFER);
assertTrue(store.hasObservers());
assertTrue(store.hasObservers(SubscriptionType.DEVICE_STATE_CHANGE));
assertFalse(store.hasObservers(SubscriptionType.NOTIFICATION));
assertEquals(2, store.listAll().size());
assertEquals(2, store.listAll(SubscriptionType.DEVICE_STATE_CHANGE).size());
assertNull(store.listAll(SubscriptionType.NOTIFICATION));
// Generating notifications
@SuppressWarnings("boxing") List<DeviceStateNotification> notifications = Stream.iterate(0, n -> n + 1).limit(102).map(i -> {
return (i % 2 == 0) ? new DeviceStateNotification((i % 5 == 0) ? DeviceState.REGISTRATION_UPDATE : DeviceState.EXPIRED_REGISTRATION, "0161661e9ce10000000000010010033e") : new DeviceStateNotification((i % 5 == 0) ? DeviceState.REGISTRATION_UPDATE : DeviceState.REGISTRATION, "0161661edbab000000000001001002b7");
}).collect(Collectors.toList());
obs2.addCallback(new NotificationCallback<>(new Callback<DeviceStateNotification>() {
@Override
public void execute(DeviceStateNotification arg) {
receivedNotifications.add(arg);
}
}, null));
executor = Executors.newScheduledThreadPool(1);
int Interval = 300;
handle = executor.scheduleWithFixedDelay(new Runnable() {
private int i = 0;
@Override
public void run() {
if (i < notifications.size()) {
try {
store.notify(SubscriptionType.DEVICE_STATE_CHANGE, notifications.get(i));
} catch (MbedCloudException e) {
e.printStackTrace();
}
i++;
}
}
}, 0, Interval, TimeUnit.MILLISECONDS);
// Waiting for all notifications to be emitted
Thread.sleep((notifications.size() + 1) * Interval);
DeviceStateNotification receivedNotificationForObs1 = future.get(2, TimeUnit.SECONDS);
assertNotNull(receivedNotificationForObs1);
assertEquals("0161661e9ce10000000000010010033e", receivedNotificationForObs1.getDeviceId());
assertEquals(DeviceState.REGISTRATION_UPDATE, receivedNotificationForObs1.getState());
assertFalse(receivedNotifications.isEmpty());
// odd Multiples of 5 between 0 and 102: 10
assertEquals(10, receivedNotifications.size());
// Observer 2 only cares about changes related to devices like 016%2b7 and REGISTRATION_UPDATE state
receivedNotifications.forEach(n -> {
assertEquals("0161661edbab000000000001001002b7", n.getDeviceId());
assertEquals(DeviceState.REGISTRATION_UPDATE, n.getState());
});
assertTrue(store.hasObserver(obs1));
store.completeAll();
store.unsubscribeAll();
assertFalse(store.hasObservers());
assertFalse(store.hasObserver(obs1));
if (handle != null) {
handle.cancel(true);
}
executor.shutdownNow();
} catch (Exception e) {
if (handle != null) {
handle.cancel(true);
}
if (executor != null) {
executor.shutdownNow();
}
e.printStackTrace();
fail(e.getMessage());
}
}
Aggregations