package com.openxc.sources;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
import org.mockito.Matchers;
import org.mockito.ArgumentCaptor;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import com.openxc.messages.VehicleMessage;
@RunWith(RobolectricTestRunner.class)
public class BaseVehicleDataSourceTest {
SourceCallback mCallback;
BaseSourceSpy mSource;
@Before
public void setup() {
mCallback = mock(SourceCallback.class);
mSource = new BaseSourceSpy(mCallback);
}
@Test
public void disconnectedNoCallback() {
mSource.setCallback(null);
mSource.disconnected();
verify(mCallback, never()).sourceDisconnected(mSource);
}
@Test
public void connectedNoCallback() {
mSource.setCallback(null);
mSource.connected();
verify(mCallback, never()).sourceDisconnected(mSource);
}
@Test
public void callbackDisconnected() {
mSource.disconnected();
verify(mCallback).sourceDisconnected(mSource);
}
@Test
public void callbackConnected() {
mSource.connected();
verify(mCallback).sourceConnected(mSource);
}
@Test
public void disconnectsOnStop() {
mSource.stop();
mSource.disconnected();
verify(mCallback, times(1)).sourceDisconnected(mSource);
}
@Test
public void receivedMessagesAreTimestampped() {
mSource.inject(new VehicleMessage());
ArgumentCaptor<VehicleMessage> argument = ArgumentCaptor.forClass(
VehicleMessage.class);
verify(mCallback).receive(argument.capture());
assertTrue(argument.getValue().isTimestamped());
}
@Test
public void receiveMessageSentToCallback() {
mSource.inject(new VehicleMessage());
verify(mCallback).receive(Matchers.any(VehicleMessage.class));
}
@Test
public void nullMessageNotSentToCallback() {
mSource.inject(null);
verify(mCallback, never()).receive(Matchers.any(VehicleMessage.class));
}
@Test
public void handleWithNoCallback() {
mSource.setCallback(null);
mSource.inject(new VehicleMessage());
verify(mCallback, never()).receive(Matchers.any(VehicleMessage.class));
}
@Test
public void waitForCallbackAlreadySet() throws InterruptedException {
mSource.setCallback(mCallback);
Thread thread = new Thread() {
@Override
public void run() {
mSource.waitForCallback();
}
};
thread.start();
thread.join(10);
}
@Test
public void waitForCallback() throws InterruptedException {
mSource.setCallback(null);
Thread thread = new Thread() {
@Override
public void run() {
mSource.waitForCallback();
}
};
thread.start();
mSource.setCallback(mCallback);
thread.join(100);
// TODO need to assert something
}
private class BaseSourceSpy extends BaseVehicleDataSource {
public BaseSourceSpy(SourceCallback callback) {
super(callback);
}
public void inject(VehicleMessage message) {
handleMessage(message);
}
@Override
public boolean isConnected() {
return false;
}
}
}