/*
* Copyright 2014-2016 CyberVision, Inc.
*
* Licensed 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 org.kaaproject.kaa.client.channel;
import org.junit.Assert;
import org.junit.Test;
import org.kaaproject.kaa.client.channel.impl.ChannelRuntimeException;
import org.kaaproject.kaa.client.channel.impl.transports.DefaultEventTransport;
import org.kaaproject.kaa.client.event.EventManager;
import org.kaaproject.kaa.client.persistence.KaaClientState;
import org.kaaproject.kaa.common.TransportType;
import org.kaaproject.kaa.common.endpoint.gen.Event;
import org.kaaproject.kaa.common.endpoint.gen.EventListenersResponse;
import org.kaaproject.kaa.common.endpoint.gen.EventSequenceNumberResponse;
import org.kaaproject.kaa.common.endpoint.gen.EventSyncRequest;
import org.kaaproject.kaa.common.endpoint.gen.EventSyncResponse;
import org.mockito.Mockito;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DefaultEventTransportTest {
@Test(expected = ChannelRuntimeException.class)
public void testSyncNegative() {
KaaClientState clientState = Mockito.mock(KaaClientState.class);
EventTransport transport = new DefaultEventTransport(clientState);
transport.sync();
}
@Test
public void testSync() {
KaaChannelManager channelManager = Mockito.mock(KaaChannelManager.class);
KaaClientState clientState = Mockito.mock(KaaClientState.class);
EventTransport transport = new DefaultEventTransport(clientState);
transport.setChannelManager(channelManager);
transport.sync();
Mockito.verify(channelManager, Mockito.times(1)).sync(TransportType.EVENT);
}
@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());
}
@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);
}
@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);
}
@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++);
}
}
@Test
public void testSequenceNumberSynchronization() {
int restoredEventSN = 10;
KaaClientState clientState = Mockito.mock(KaaClientState.class);
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));
EventManager manager1 = Mockito.mock(EventManager.class);
Mockito.when(manager1.pollPendingEvents()).thenReturn(events1);
Mockito.when(manager1.peekPendingEvents()).thenReturn(events1);
EventTransport transport = new DefaultEventTransport(clientState);
transport.setEventManager(manager1);
int requestId = 1;
transport.createEventRequest(requestId++);
int lastReceivedSN = 5;
EventSyncResponse eventResponse1 = new EventSyncResponse(
new EventSequenceNumberResponse(lastReceivedSN), null, null);
transport.onEventResponse(eventResponse1);
EventSyncRequest eventRequest2 = transport.createEventRequest(requestId);
Assert.assertTrue(eventRequest2.getEventSequenceNumberRequest() == null);
Assert.assertTrue(eventRequest2.getEvents().size() == events1.size());
int synchronizedSN = lastReceivedSN + 1;
for (Event e : eventRequest2.getEvents()) {
Assert.assertEquals(synchronizedSN++, e.getSeqNum().intValue());
}
transport.onSyncResposeIdReceived(requestId++);
List<Event> events2 = Arrays.asList(new Event(synchronizedSN, null, null, null, null));
EventManager manager2 = Mockito.mock(EventManager.class);
Mockito.when(manager2.pollPendingEvents()).thenReturn(events2);
transport.setEventManager(manager2);
EventSyncRequest eventRequest4 = transport.createEventRequest(requestId++);
Assert.assertTrue(eventRequest4.getEvents().get(0).getSeqNum() == synchronizedSN);
}
}