@Override public void produceEvent(String eventFqn, byte[] data, String target, TransactionId trxId) { if (trxId == null) { LOG.info("Producing event [eventClassFQN: {}, target: {}]", eventFqn, (target != null ? target : "broadcast")); // NOSONAR synchronized (eventsGuard) { currentEvents.add(new Event(state.getAndIncrementEventSeqNum(), eventFqn, ByteBuffer.wrap(data), null, target)); } if (!isEngaged) { transport.sync(); } } else { LOG.info("Adding event [eventClassFQN: {}, target: {}] to transaction {}", eventFqn, target != null ? target : "broadcast", trxId); // NOSONAR synchronized (trxGuard) { List<Event> events = transactions.get(trxId); if (events != null) { events.add(new Event(-1, eventFqn, ByteBuffer.wrap(data), null, target)); } else { LOG.warn("Transaction with id {} is missing. Ignoring event"); } } } }
/** * Converts Avro {@link org.kaaproject.kaa.common.endpoint.gen.Event} to * {@link Event}. * * @param event the avro structure * @return the event */ public static Event convert(org.kaaproject.kaa.common.endpoint.gen.Event event) { if (event == null) { return null; } return new Event( event.getSeqNum(), event.getEventClassFQN(), event.getEventData(), event.getSource(), event.getTarget()); }
@Override public void commit(TransactionId trxId) { LOG.debug("Commiting events transaction with id {}", trxId); synchronized (trxGuard) { List<Event> eventsToCommit = transactions.remove(trxId); synchronized (eventsGuard) { for (Event e : eventsToCommit) { e.setSeqNum(state.getAndIncrementEventSeqNum()); currentEvents.add(e); } } if (!isEngaged) { transport.sync(); } } }
if (!events.isEmpty() && events.get(0).getSeqNum() != startEventSn.get()) { LOG.info("Put in order event sequence numbers (expected: {}, actual: {})", startEventSn, events.get(0).getSeqNum()); e.setSeqNum(startEventSn.getAndIncrement()); Collections.sort(events, eventSeqNumberComparator); for (Event event : events) { eventManager.onGenericEvent(event.getEventClassFQN(), event.getEventData().array(), event.getSource());
@Test public void testSychronizedSN() { int restoredEventSN = 10; int lastEventSN = restoredEventSN - 1; KaaClientState clientState = Mockito.mock(KaaClientState.class); Mockito.when(clientState.getEventSeqNum()).thenReturn(restoredEventSN); List<Event> events = Arrays.asList(new Event(restoredEventSN++, null, null, null, null) , new Event(restoredEventSN++, null, null, null, null) , new Event(restoredEventSN++, null, null, null, null)); EventManager manager = Mockito.mock(EventManager.class); Mockito.when(manager.pollPendingEvents()).thenReturn(events); EventTransport transport = new DefaultEventTransport(clientState); transport.setEventManager(manager); int requestId = 1; transport.createEventRequest(requestId++); EventSyncResponse eventResponse = new EventSyncResponse( new EventSequenceNumberResponse(lastEventSN), null, null); transport.onEventResponse(eventResponse); EventSyncRequest eventRequest2 = transport.createEventRequest(requestId); Assert.assertTrue(eventRequest2.getEventSequenceNumberRequest() == null); Assert.assertTrue(eventRequest2.getEvents().size() == events.size()); int expectedEventSN = lastEventSN + 1; for (Event e : eventRequest2.getEvents()) { Assert.assertTrue(e.getSeqNum() == expectedEventSN++); } }
assertEquals("kaa.test.event.SomeEvent", request.getEvents().get(0).getEventClassFQN()); assertEquals("theTarget", request.getEvents().get(0).getTarget()); assertArrayEquals(new byte[0], request.getEvents().get(0).getEventData().array());
@Test public void testCreateRequest() { KaaClientState clientState = Mockito.mock(KaaClientState.class); EventManager manager = Mockito.mock(EventManager.class); Event event1 = new Event(); event1.setSeqNum(1); Event event2 = new Event(); event2.setSeqNum(2); Mockito.when(manager.pollPendingEvents()).thenReturn(Arrays.asList(event1, event2)); EventTransport transport = new DefaultEventTransport(clientState); transport.createEventRequest(1); transport.setEventManager(manager); transport.createEventRequest(2); transport.onEventResponse(new EventSyncResponse(new EventSequenceNumberResponse(0), null, null)); Mockito.verify(manager, Mockito.times(1)).fillEventListenersSyncRequest(Mockito.any(EventSyncRequest.class)); transport.createEventRequest(3); EventSyncRequest request = transport.createEventRequest(4); Assert.assertEquals(2, request.getEvents().size()); }
Mockito.when(clientState.getEventSeqNum()).thenReturn(restoredEventSN); List<Event> events1 = Arrays.asList(new Event(restoredEventSN++, null, null, null, null) , new Event(restoredEventSN++, null, null, null, null) , new Event(restoredEventSN++, null, null, null, null)); Assert.assertEquals(synchronizedSN++, e.getSeqNum().intValue()); List<Event> events2 = Arrays.asList(new Event(synchronizedSN, null, null, null, null)); EventManager manager2 = Mockito.mock(EventManager.class); Mockito.when(manager2.pollPendingEvents()).thenReturn(events2); Assert.assertTrue(eventRequest4.getEvents().get(0).getSeqNum() == synchronizedSN);
/** * Converts {@link Event} to * {@link org.kaaproject.kaa.common.endpoint.gen.Event}. * * @param event the event * @return the Avro event */ public static org.kaaproject.kaa.common.endpoint.gen.Event convert(Event event) { if (event == null) { return null; } return new org.kaaproject.kaa.common.endpoint.gen.Event( event.getSeqNum(), event.getEventClassFqn(), event.getEventData(), event.getSource(), event.getTarget()); }
@Test public void onEventResponse() throws Exception { KaaClientState clientState = Mockito.mock(KaaClientState.class); EventManager manager = Mockito.mock(EventManager.class); EventTransport transport = new DefaultEventTransport(clientState); EventSyncResponse response = new EventSyncResponse(); transport.onEventResponse(response); transport.setEventManager(manager); transport.onEventResponse(response); List<Event> events = new ArrayList<>(1); response.setEvents(events); transport.onEventResponse(response); events.add(new Event(5, "eventClassFQN", ByteBuffer.wrap(new byte[]{1, 2, 3}), "source", "target")); transport.onEventResponse(response); List<EventListenersResponse> listeners = new ArrayList<>(1); response.setEventListenersResponses(listeners); transport.onEventResponse(response); listeners.add(new EventListenersResponse()); transport.onEventResponse(response); Mockito.verify(manager, Mockito.times(3)).onGenericEvent(Mockito.eq("eventClassFQN"), Mockito.eq(new byte[]{1, 2, 3}), Mockito.eq("source")); Mockito.verify(manager, Mockito.times(1)).eventListenersResponseReceived(listeners); }
@Test public void testRemoveByResponseId() { KaaClientState clientState = Mockito.mock(KaaClientState.class); EventManager manager = Mockito.mock(EventManager.class); Mockito.when(manager.pollPendingEvents()).thenReturn(Arrays.asList(new Event(), new Event())); EventTransport transport = new DefaultEventTransport(clientState); transport.createEventRequest(1); transport.setEventManager(manager); transport.createEventRequest(2); transport.onEventResponse(new EventSyncResponse(new EventSequenceNumberResponse(0), null, null)); transport.createEventRequest(3); transport.onSyncResposeIdReceived(3); EventSyncRequest request = transport.createEventRequest(4); Assert.assertTrue(request.getEvents().size() == 1); }
@Override public Event build() { try { Event record = new Event(); record.seqNum = fieldSetFlags()[0] ? this.seqNum : (java.lang.Integer) defaultValue(fields()[0]); record.eventClassFQN = fieldSetFlags()[1] ? this.eventClassFQN : (java.lang.String) defaultValue(fields()[1]); record.eventData = fieldSetFlags()[2] ? this.eventData : (java.nio.ByteBuffer) defaultValue(fields()[2]); record.source = fieldSetFlags()[3] ? this.source : (java.lang.String) defaultValue(fields()[3]); record.target = fieldSetFlags()[4] ? this.target : (java.lang.String) defaultValue(fields()[4]); return record; } catch (Exception e) { throw new org.apache.avro.AvroRuntimeException(e); } } }
@Test public void testEventSequenceNumberSyncRequest() { KaaClientState clientState = Mockito.mock(KaaClientState.class); List<Event> events = Arrays.asList(new Event(1, null, null, null, null)); EventManager manager = Mockito.mock(EventManager.class); Mockito.when(manager.pollPendingEvents()).thenReturn(events); EventTransport transport = new DefaultEventTransport(clientState); transport.setEventManager(manager); int requestId = 1; EventSyncRequest eventRequest1 = transport.createEventRequest(requestId++); Assert.assertTrue(eventRequest1.getEventSequenceNumberRequest() != null); Assert.assertTrue(eventRequest1.getEvents() == null); EventSyncRequest eventRequest2 = transport.createEventRequest(requestId++); Assert.assertTrue(eventRequest2.getEventSequenceNumberRequest() != null); Assert.assertTrue(eventRequest2.getEvents() == null); }