package com.getsentry.raven.appengine.connection;
import com.google.appengine.api.taskqueue.*;
import mockit.*;
import com.getsentry.raven.connection.Connection;
import com.getsentry.raven.event.Event;
import com.getsentry.raven.event.EventBuilder;
import org.hamcrest.Matchers;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static mockit.Deencapsulation.getField;
import static mockit.Deencapsulation.setField;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class AppEngineAsyncConnectionTest {
@Tested
private AppEngineAsyncConnection asyncConnection = null;
@Injectable
private Connection mockConnection = null;
@Injectable
private Queue mockQueue = null;
@SuppressWarnings("unused")
@Mocked("getDefaultQueue")
private QueueFactory queueFactory = null;
@Injectable("7b55a129-6975-4434-8edc-29ceefd38c95")
private String mockConnectionId = null;
private static DeferredTask extractDeferredTask(TaskOptions taskOptions) throws Exception {
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(taskOptions.getPayload()));
return (DeferredTask) ois.readObject();
}
private static AppEngineAsyncConnection getTaskConnection(DeferredTask deferredTask) throws Exception {
Map<UUID, AppEngineAsyncConnection> appEngineAsyncConnectionRegister
= getField(AppEngineAsyncConnection.class, "APP_ENGINE_ASYNC_CONNECTIONS");
return appEngineAsyncConnectionRegister.get(Deencapsulation.<UUID>getField(deferredTask, "connectionId"));
}
@BeforeMethod
public void setUp() throws Exception {
asyncConnection = new AppEngineAsyncConnection(mockConnectionId, mockConnection);
new NonStrictExpectations() {{
QueueFactory.getDefaultQueue();
result = mockQueue;
}};
}
@Test
public void testRegisterNewInstance(
@Injectable("1bac02f7-c9ed-41b8-9126-e2da257a06ef") final String mockConnectionId) throws Exception {
AppEngineAsyncConnection asyncConnection2 = new AppEngineAsyncConnection(mockConnectionId, mockConnection);
Map<String, AppEngineAsyncConnection> appEngineAsyncConnectionRegister
= getField(AppEngineAsyncConnection.class, "APP_ENGINE_ASYNC_CONNECTIONS");
assertThat(appEngineAsyncConnectionRegister, hasEntry(mockConnectionId, asyncConnection2));
}
@Test
public void testUnregisterInstance(
@Injectable("648f76e2-39ed-40e0-91a2-b1887a03b782") final String mockConnectionId) throws Exception {
new AppEngineAsyncConnection(mockConnectionId, mockConnection).close();
Map<String, AppEngineAsyncConnection> appEngineAsyncConnectionRegister
= getField(AppEngineAsyncConnection.class, "APP_ENGINE_ASYNC_CONNECTIONS");
assertThat(appEngineAsyncConnectionRegister, not(hasKey(mockConnectionId)));
}
@Test
public void testSendEventQueued() throws Exception {
final Event event = new EventBuilder().build();
asyncConnection.send(event);
new Verifications() {{
TaskOptions taskOptions;
DeferredTask deferredTask;
mockQueue.add(taskOptions = withCapture());
deferredTask = extractDeferredTask(taskOptions);
assertThat(getField(deferredTask, "event"), Matchers.<Object>equalTo(event));
}};
}
@Test
public void testQueuedEventSubmitted(@SuppressWarnings("unused")
@Mocked("setDoNotRetry") DeferredTaskContext deferredTaskContext)
throws Exception {
final Event event = new EventBuilder().build();
new NonStrictExpectations() {{
mockQueue.add((TaskOptions) any);
result = new Delegate<TaskHandle>() {
@SuppressWarnings("unused")
TaskHandle add(TaskOptions taskOptions) {
try {
extractDeferredTask(taskOptions).run();
} catch (Exception e) {
throw new RuntimeException("Couldn't extract the task", e);
}
return null;
}
};
}};
asyncConnection.send(event);
new Verifications() {{
DeferredTaskContext.setDoNotRetry(true);
mockConnection.send((Event) any);
}};
}
@Test
public void testEventLinkedToCorrectConnection(
@Injectable("eb37bfe4-7316-47e8-94e4-073aefd0fbf8") final String mockConnectionId) throws Exception {
final AppEngineAsyncConnection asyncConnection2 = new AppEngineAsyncConnection(mockConnectionId, mockConnection);
final Event event = new EventBuilder().build();
asyncConnection.send(event);
asyncConnection2.send(event);
new Verifications() {{
List<TaskOptions> taskOptionsList = new ArrayList<>();
DeferredTask deferredTask;
mockQueue.add(withCapture(taskOptionsList));
deferredTask = extractDeferredTask(taskOptionsList.get(0));
assertThat(getTaskConnection(deferredTask), is(asyncConnection));
deferredTask = extractDeferredTask(taskOptionsList.get(1));
assertThat(getTaskConnection(deferredTask), is(asyncConnection2));
}};
}
}