package net.hockeyapp.android.metrics;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.InstrumentationTestCase;
import junit.framework.Assert;
import net.hockeyapp.android.metrics.model.Data;
import net.hockeyapp.android.metrics.model.Domain;
import net.hockeyapp.android.metrics.model.Envelope;
import net.hockeyapp.android.metrics.model.SessionState;
import net.hockeyapp.android.metrics.model.SessionStateData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.HashMap;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(AndroidJUnit4.class)
public class ChannelTests extends InstrumentationTestCase {
// Helper
private static final String MOCK_APP_ID = "appId";
private static final String MOCK_APP_VER = "appVer";
private static final String MOCK_IKEY = "iKey";
private static final String MOCK_OS_VER = "osVer";
private static final String MOCK_OS = "os";
private static final String MOCK_TAGS_KEY = "tagsKey";
private static final String MOCK_TAGS_VALUE = "tagsValue";
private PublicChannel sut;
private PublicTelemetryContext mockTelemetryContext;
private PublicPersistence mockPersistence;
private static PublicTelemetryContext getMockTelemetryContext() {
HashMap<String, String> tags = new HashMap<String, String>();
tags.put(MOCK_TAGS_KEY, MOCK_TAGS_VALUE);
PublicTelemetryContext mockContext = mock(PublicTelemetryContext.class);
when(mockContext.getPackageName()).thenReturn(MOCK_APP_ID);
when(mockContext.getContextTags()).thenReturn(tags);
when(mockContext.getAppVersion()).thenReturn(MOCK_APP_VER);
when(mockContext.getInstrumentationKey()).thenReturn(MOCK_IKEY);
when(mockContext.getOsVersion()).thenReturn(MOCK_OS_VER);
when(mockContext.getOsName()).thenReturn(MOCK_OS);
return mockContext;
}
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mockTelemetryContext = getMockTelemetryContext();
mockPersistence = mock(PublicPersistence.class);
sut = new PublicChannel(mockTelemetryContext, mockPersistence);
}
@Test
public void testInstanceInitialisation() {
Assert.assertNotNull(sut);
Assert.assertNotNull(sut.mTelemetryContext);
Assert.assertEquals(mockTelemetryContext, sut.mTelemetryContext);
Assert.assertNotNull(sut.mQueue);
Assert.assertEquals(0, sut.mQueue.size());
}
@Test
public void testLoggingItemAddsToQueue() {
Data<Domain> data = new Data<Domain>();
Channel.mMaxBatchCount = 3;
Assert.assertEquals(0, sut.mQueue.size());
sut.enqueueData(data);
Assert.assertEquals(1, sut.mQueue.size());
}
@Test
public void testQueueFlushesWhenMaxBatchCountReached() {
PublicChannel.mMaxBatchCount = 3;
Assert.assertEquals(0, sut.mQueue.size());
sut.enqueueData(new Data<Domain>());
Assert.assertEquals(1, sut.mQueue.size());
sut.enqueueData(new Data<Domain>());
Assert.assertEquals(2, sut.mQueue.size());
sut.enqueueData(new Data<Domain>());
Assert.assertEquals(0, sut.mQueue.size());
verify(mockPersistence).persist(any(String[].class));
}
@Test
public void testCreateEnvelopeForTelemetryData() {
SessionStateData sessionStateData = new SessionStateData();
sessionStateData.setState(SessionState.START);
Data<Domain> testData = new Data<Domain>();
testData.setBaseData(sessionStateData);
testData.setBaseType(sessionStateData.getBaseType());
testData.QualifiedName = sessionStateData.getEnvelopeName();
Envelope result = sut.createEnvelope(testData);
Assert.assertNotNull(result);
Assert.assertNotNull(result.getTime());
Assert.assertEquals(MOCK_IKEY, result.getIKey());
Assert.assertNotNull(result.getTags());
Assert.assertEquals(1, result.getTags().size());
Assert.assertTrue(result.getTags().containsKey(MOCK_TAGS_KEY));
Assert.assertEquals(MOCK_TAGS_VALUE, result.getTags().get(MOCK_TAGS_KEY));
Assert.assertNotNull(result.getData());
SessionState actualState = ((SessionStateData) ((Data<Domain>) result.getData()).getBaseData()).getState();
Assert.assertEquals(SessionState.START, actualState);
String actualBaseType = result.getData().getBaseType();
Assert.assertEquals(new SessionStateData().getBaseType(), actualBaseType);
}
}