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 org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.File;
import java.net.HttpURLConnection;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(AndroidJUnit4.class)
public class SenderTests extends InstrumentationTestCase {
private Sender sut;
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
Persistence mockPersistence = mock(PublicPersistence.class);
when(mockPersistence.nextAvailableFileInDirectory()).thenReturn(mock(File.class));
when(mockPersistence.load(mock(File.class))).thenReturn("SomethingToTest");
sut = new Sender();
sut.setPersistence(mockPersistence);
}
@Test
public void testInstanceInitialisation() throws Exception {
Assert.assertNotNull(sut);
Assert.assertEquals(0, sut.requestCount());
Assert.assertNotNull(sut.getPersistence());
assertNull(sut.getCustomServerURL());
}
@Test
public void testCreateConnection() {
HttpURLConnection connection = sut.createConnection();
assertNotNull(connection);
}
@Test
public void testSending() {
// Sender sut = new Sender();
HttpURLConnection connection1 = sut.createConnection();
File mockFile1 = mock(File.class);
PublicPersistence persistenceMock = mock(PublicPersistence.class);
when(persistenceMock.nextAvailableFileInDirectory()).thenReturn(mock(File.class));
sut.setPersistence(persistenceMock);
sut.triggerSendingForTesting(connection1, mockFile1, "test1");
Assert.assertEquals(1, sut.requestCount());
sut.sendAvailableFiles();
verify(persistenceMock).nextAvailableFileInDirectory();
}
@Test
public void testResponseCodeHandling() {
int[] recoverableCodes = new int[]{408, 429, 500, 503, 511};
int[] successCodes = new int[]{200, 201, 202, 203};
int[] errorsAndWhatNot = new int[]{100, 400, 403, 405};
for (int code : recoverableCodes) {
assertTrue(sut.isRecoverableError(code));
}
for (int code : successCodes) {
assertFalse(sut.isRecoverableError(code));
}
for (int code : errorsAndWhatNot) {
assertFalse(sut.isRecoverableError(code));
}
for (int code : successCodes) {
assertTrue(sut.isExpected(code));
}
for (int code : recoverableCodes) {
assertFalse(sut.isExpected(code));
}
for (int code : errorsAndWhatNot) {
assertFalse(sut.isExpected(code));
}
}
@Test
public void testFilesGetDeletedAfterUnrecoverable() {
File mockFile1 = mock(File.class);
sut.onResponse(sut.createConnection(), 501, "test", mockFile1);
verify(sut.getPersistence()).deleteFile(mockFile1);
}
@Test
public void testFilesGetUnblockedForRecoverableError() {
File mockFile = mock(File.class);
sut.onResponse(sut.createConnection(), 500, "test", mockFile);
verify(sut.getPersistence()).makeAvailable(mockFile);
}
}