package com.fsck.k9.mail.store.imap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.fsck.k9.mail.K9LibRobolectricTestRunner; import com.fsck.k9.mail.PushReceiver; import com.fsck.k9.mail.store.StoreConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(K9LibRobolectricTestRunner.class) public class ImapPusherTest { private ImapStore imapStore; private TestImapPusher imapPusher; @Before public void setUp() throws Exception { imapStore = mock(ImapStore.class); PushReceiver pushReceiver = mock(PushReceiver.class); imapPusher = new TestImapPusher(imapStore, pushReceiver); } @Test public void start_shouldSetLastRefreshToCurrentTime() throws Exception { List<String> folderNames = Collections.singletonList("INBOX"); imapPusher.start(folderNames); assertEquals(TestImapPusher.CURRENT_TIME_MILLIS, imapPusher.getLastRefresh()); } @Test public void start_withSingleFolderName_shouldCreateImapFolderPusherAndCallStartOnIt() throws Exception { List<String> folderNames = Collections.singletonList("INBOX"); imapPusher.start(folderNames); List<ImapFolderPusher> imapFolderPushers = imapPusher.getImapFolderPushers(); assertEquals(1, imapFolderPushers.size()); ImapFolderPusher imapFolderPusher = imapFolderPushers.get(0); verify(imapFolderPusher).start(); } @Test public void start_calledAfterStart_shouldStopFirstImapFolderPusher() throws Exception { imapPusher.start(Collections.singletonList("Drafts")); imapPusher.start(Collections.singletonList("INBOX")); ImapFolderPusher draftsPusher = imapPusher.getImapFolderPushers().get(0); verify(draftsPusher).stop(); } @Test public void start_withTwoFolderNames_shouldCreateTwoImapFolderPushersAndCallStart() throws Exception { List<String> folderNames = Arrays.asList("Important", "Drafts"); imapPusher.start(folderNames); List<ImapFolderPusher> imapFolderPushers = imapPusher.getImapFolderPushers(); assertEquals(2, imapFolderPushers.size()); ImapFolderPusher imapFolderPusherOne = imapFolderPushers.get(0); ImapFolderPusher imapFolderPusherTwo = imapFolderPushers.get(1); verify(imapFolderPusherOne).start(); verify(imapFolderPusherTwo).start(); } @Test public void stop_withoutStartBeingCalled_shouldNotCreateAnyImapFolderPushers() throws Exception { imapPusher.stop(); List<ImapFolderPusher> imapFolderPushers = imapPusher.getImapFolderPushers(); assertEquals(0, imapFolderPushers.size()); } @Test public void stop_afterStartWithSingleFolderName_shouldStopImapFolderPusher() throws Exception { List<String> folderNames = Collections.singletonList("Archive"); imapPusher.start(folderNames); imapPusher.stop(); List<ImapFolderPusher> imapFolderPushers = imapPusher.getImapFolderPushers(); assertEquals(1, imapFolderPushers.size()); ImapFolderPusher imapFolderPusher = imapFolderPushers.get(0); verify(imapFolderPusher).stop(); } @Test public void stop_withImapFolderPusherThrowing_shouldNotThrow() throws Exception { List<String> folderNames = Collections.singletonList("Archive"); imapPusher.start(folderNames); ImapFolderPusher imapFolderPusher = imapPusher.getImapFolderPushers().get(0); doThrow(RuntimeException.class).when(imapFolderPusher).stop(); imapPusher.stop(); } @Test public void refresh_shouldCallRefreshOnStartedImapFolderPusher() throws Exception { List<String> folderNames = Collections.singletonList("Trash"); imapPusher.start(folderNames); imapPusher.refresh(); List<ImapFolderPusher> imapFolderPushers = imapPusher.getImapFolderPushers(); assertEquals(1, imapFolderPushers.size()); ImapFolderPusher imapFolderPusher = imapFolderPushers.get(0); verify(imapFolderPusher).refresh(); } @Test public void refresh_withImapFolderPusherThrowing_shouldNotThrow() throws Exception { List<String> folderNames = Collections.singletonList("Folder"); imapPusher.start(folderNames); ImapFolderPusher imapFolderPusher = imapPusher.getImapFolderPushers().get(0); doThrow(RuntimeException.class).when(imapFolderPusher).refresh(); imapPusher.refresh(); } @Test public void getRefreshInterval() throws Exception { StoreConfig storeConfig = mock(StoreConfig.class); when(storeConfig.getIdleRefreshMinutes()).thenReturn(23); when(imapStore.getStoreConfig()).thenReturn(storeConfig); int result = imapPusher.getRefreshInterval(); assertEquals(23 * 60 * 1000, result); } @Test public void getLastRefresh_shouldBeMinusOneInitially() throws Exception { long result = imapPusher.getLastRefresh(); assertEquals(-1L, result); } static class TestImapPusher extends ImapPusher { public static final long CURRENT_TIME_MILLIS = 1454375675162L; private final List<ImapFolderPusher> imapFolderPushers = new ArrayList<>(); public TestImapPusher(ImapStore store, PushReceiver receiver) { super(store, receiver); } @Override ImapFolderPusher createImapFolderPusher(String folderName) { ImapFolderPusher imapFolderPusher = mock(ImapFolderPusher.class); imapFolderPushers.add(imapFolderPusher); return imapFolderPusher; } public List<ImapFolderPusher> getImapFolderPushers() { return imapFolderPushers; } @Override long currentTimeMillis() { return CURRENT_TIME_MILLIS; } } }