package net.hockeyapp.android.metrics; import android.content.Context; 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.util.ArrayList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.Mockito.spy; @RunWith(AndroidJUnit4.class) public class PersistenceTests extends InstrumentationTestCase { private PublicPersistence sut; @Before public void setUp() throws Exception { super.setUp(); injectInstrumentation(InstrumentationRegistry.getInstrumentation()); Context context = getInstrumentation().getContext(); Sender mockSender = mock(Sender.class); sut = new PublicPersistence(context, mockSender); mockSender.setPersistence(sut); } @Test public void testInstanceInitialisation() { Assert.assertNotNull(sut); Assert.assertNotNull(sut.mServedFiles); } @Test public void testTelemetryDirectoryGetsCreated() { File mock = mock(File.class); sut = new PublicPersistence(getInstrumentation().getContext(), mock, null); verify(mock).mkdirs(); } @Test public void testCallingPersistTriggersWriteToDisk() { Context context = getInstrumentation().getContext(); Sender mockSender = mock(Sender.class); PublicPersistence sut = new PublicPersistence(context, mockSender); Persistence spy = spy(sut); String[] testData = {"test", "data"}; String testSerializedString = "test\ndata"; spy.persist(testData); verify(spy).writeToDisk(testSerializedString); } @Test public void testDeleteFileWorks() { File mockFile = mock(File.class); when(mockFile.delete()).thenReturn(true); sut.mServedFiles = mock(ArrayList.class); sut.deleteFile(mockFile); verify(mockFile).delete(); verify(sut.mServedFiles).remove(mockFile); } @Test public void testMakeAvailableUnblocksFile() { File mockFile = mock(File.class); sut.mServedFiles = mock(ArrayList.class); sut.makeAvailable(mockFile); verify(sut.mServedFiles).remove(mockFile); verifyNoMoreInteractions(sut.mServedFiles); } @Test public void testNextFileRequestReturnsUnreservedFile() { // Mock file system with 2 files File mockDirectory = mock(File.class); File mockFile1 = mock(File.class); File mockFile2 = mock(File.class); File[] mockFiles = {mockFile1, mockFile2}; sut = new PublicPersistence(getInstrumentation().getContext(), mockDirectory, null); when(mockDirectory.listFiles()).thenReturn(mockFiles); // Mock served list containing 1 file ArrayList<File> servedFiles = new ArrayList<File>(); servedFiles.add(mockFile1); sut.mServedFiles = servedFiles; // Test one unreserved file left File result = sut.nextAvailableFileInDirectory(); Assert.assertEquals(mockFile2, result); Assert.assertTrue(sut.mServedFiles.contains(mockFile2)); // Test all files are already in use result = sut.nextAvailableFileInDirectory(); Assert.assertNull(result); } @Test public void testloadFileWorks() { //TODO: Write test after sender integration } }