package com.openxc.sinks;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.client.methods.HttpPost;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.FakeHttp;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.openxc.TestUtils;
import com.openxc.messages.SimpleVehicleMessage;
import com.openxc.messages.VehicleMessage;
@RunWith(RobolectricTestRunner.class)
public class UploaderSinkTest {
UploaderSink sink;
VehicleMessage message = new SimpleVehicleMessage("foo", "bar");
Gson gson;
@Before
public void setUp() throws IOException, DataSinkException {
FakeHttp.getFakeHttpLayer().interceptHttpRequests(false);
FakeHttp.setDefaultHttpResponse(200, "dummy");
sink = new UploaderSink(RuntimeEnvironment.application, "http://localhost");
gson = new Gson();
}
@After
public void tearDown() throws IOException, DataSinkException {
sink.stop();
}
@Test
public void testNothingUploadedYet() throws DataSinkException {
assertFalse(FakeHttp.httpRequestWasMade());
}
@Test
public void testUploadBatch() throws DataSinkException, IOException {
TestUtils.pause(50);
for(int i = 0; i < 25; i++) {
sink.receive(message);
}
TestUtils.pause(1000);
assertTrue(FakeHttp.httpRequestWasMade());
Type listType = new TypeToken<List<SimpleVehicleMessage>>() {}.getType();
ArrayList<SimpleVehicleMessage> messages = new ArrayList<>();
HttpPost request;
while((request = (HttpPost) FakeHttp.getNextSentHttpRequest()) != null) {
InputStream payload = request.getEntity().getContent();
int length = payload.available();
byte[] buffer = new byte[length];
payload.read(buffer);
messages.addAll((List<SimpleVehicleMessage>)gson.fromJson(new String(buffer), listType));
}
assertThat(messages, hasSize(25));
for(SimpleVehicleMessage deserializedMessage : messages) {
assertThat(message, equalTo((VehicleMessage) deserializedMessage));
}
}
}