private List<ImapMessage> getMessages(SearchResponse searchResponse, MessageRetrievalListener<ImapMessage> listener) throws MessagingException { List<ImapMessage> messages = new ArrayList<>(); List<Long> uids = searchResponse.getNumbers(); // Sort the uids in numerically decreasing order // By doing it in decreasing order, we ensure newest messages are dealt with first // This makes the most sense when a limit is imposed, and also prevents UI from going // crazy adding stuff at the top. Collections.sort(uids, Collections.reverseOrder()); for (int i = 0, count = uids.size(); i < count; i++) { String uid = uids.get(i).toString(); if (listener != null) { listener.messageStarted(uid, i, count); } ImapMessage message = new ImapMessage(uid, this); messages.add(message); if (listener != null) { listener.messageFinished(message, i, count); } } return messages; }
@Override public Void answer(InvocationOnMock invocation) { FetchProfile fetchProfile = (FetchProfile) invocation.getArguments()[1]; if (invocation.getArguments()[2] != null) { MessageRetrievalListener listener = (MessageRetrievalListener) invocation.getArguments()[2]; if (fetchProfile.contains(FetchProfile.Item.ENVELOPE)) { listener.messageStarted("UID", 1, 1); listener.messageFinished(message, 1, 1); listener.messagesFinished(1); } } return null; } }).when(remoteFolder).fetch(any(List.class), any(FetchProfile.class), nullable(MessageRetrievalListener.class));
listener.messageFinished(message, i, -1); listener.messageFinished(message, i, -1);
listener.messagesFinished(j);
@Test public void searchLocalMessagesSynchronous_shouldNotifyWhenStoreFinishesRetrievingAMessage() throws Exception { setAccountsInPreferences(Collections.singletonMap(ACCOUNT_UUID, account)); LocalMessage localMessage = mock(LocalMessage.class); when(localMessage.getFolder()).thenReturn(localFolder); when(search.getAccountUuids()).thenReturn(new String[]{"allAccounts"}); when(localStore.searchForMessages(nullable(MessageRetrievalListener.class), eq(search))) .thenThrow(new MessagingException("Test")); controller.searchLocalMessagesSynchronous(search, listener); verify(localStore).searchForMessages(messageRetrievalListenerCaptor.capture(), eq(search)); messageRetrievalListenerCaptor.getValue().messageFinished(localMessage, 1, 1); verify(listener).listLocalMessagesAddMessages(eq(account), eq((String) null), eq(Collections.singletonList(localMessage))); }
listener.messageStarted(message.getUid(), i++, (end - start) + 1); listener.messageFinished(message, i++, (end - start) + 1);
listener.messageStarted(uids[i], i, uidsLength); listener.messageFinished(message, i, uidsLength);
Pop3Message message = messages.get(i); if (listener != null) { listener.messageStarted(message.getUid(), i, count); message.setSize(msgSize); if (listener != null) { listener.messageFinished(message, i, count); if (pop3Message != null && msgUidIndex.contains(pop3Message.getUid())) { if (listener != null) { listener.messageStarted(pop3Message.getUid(), i, count); listener.messageFinished(pop3Message, i, count);
WebDavMessage message = messages.get(i); if (listener != null) { listener.messageStarted(messages.get(i).getUid(), i, count); listener.messageFinished(messages.get(i), i, count);
@Test public void getMessages_should_request_message_search() throws MessagingException { int totalMessages = 23; int messageStart = 1; int messageEnd = 11; setupFolderWithMessages(totalMessages); String messagesXml = "<xml>MessagesXml</xml>"; buildSearchResponse(mockDataSet); when(mockStore.getMessagesXml()).thenReturn(messagesXml); when(mockStore.processRequest(eq("https://localhost/webDavStoreUrl/testFolder"), eq("SEARCH"), eq(messagesXml), Matchers.<Map<String, String>>any())).thenReturn(mockDataSet); folder.getMessages(messageStart, messageEnd, new Date(), listener); verify(listener, times(5)).messageStarted(anyString(), anyInt(), eq(5)); verify(listener, times(5)).messageFinished(any(WebDavMessage.class), anyInt(), eq(5)); }
@Test public void folder_can_handle_empty_response_to_body_request() throws MessagingException, IOException { setupStoreForMessageFetching(); List<WebDavMessage> messages = setup25MessagesToFetch(); when(mockHttpClient.executeOverride(any(HttpUriRequest.class), nullable(HttpContext.class))).thenAnswer( new Answer<HttpResponse>() { @Override public HttpResponse answer(InvocationOnMock invocation) throws Throwable { HttpResponse httpResponse = mock(HttpResponse.class); StatusLine statusLine = mock(StatusLine.class); when(httpResponse.getStatusLine()).thenReturn(statusLine); when(statusLine.getStatusCode()).thenReturn(200); return httpResponse; } }); FetchProfile profile = new FetchProfile(); profile.add(FetchProfile.Item.BODY_SANE); folder.fetch(messages, profile, listener); verify(listener, times(25)).messageStarted(any(String.class), anyInt(), eq(25)); verify(listener, times(25)).messageFinished(any(WebDavMessage.class), anyInt(), eq(25)); }
@Test public void getMessages_sequenceNumbers_withListener_shouldCallListener() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); setupUidSearchResponses("* SEARCH 99"); folder.open(OPEN_MODE_RW); MessageRetrievalListener<ImapMessage> listener = createMessageRetrievalListener(); List<ImapMessage> messages = folder.getMessages(singleton(1L), true, listener); ImapMessage message = messages.get(0); verify(listener).messageStarted("99", 0, 1); verify(listener).messageFinished(message, 0, 1); verifyNoMoreInteractions(listener); }
@Test public void getMessages_withListener_shouldCallListener() throws Exception { ImapFolder folder = createFolder("Folder"); prepareImapFolderForOpen(OPEN_MODE_RW); setupUidSearchResponses("* SEARCH 99"); folder.open(OPEN_MODE_RW); MessageRetrievalListener<ImapMessage> listener = createMessageRetrievalListener(); List<ImapMessage> messages = folder.getMessages(1, 10, null, listener); ImapMessage message = messages.get(0); verify(listener).messageStarted("99", 0, 1); verify(listener).messageFinished(message, 0, 1); verifyNoMoreInteractions(listener); }
@Test public void folder_can_fetch_sensible_body_data_and_notifies_listener() throws MessagingException, IOException, URISyntaxException { setupStoreForMessageFetching(); List<WebDavMessage> messages = setup25MessagesToFetch(); when(mockHttpClient.executeOverride(any(HttpUriRequest.class), nullable(HttpContext.class))).thenAnswer( new Answer<HttpResponse>() { @Override public HttpResponse answer(InvocationOnMock invocation) throws Throwable { HttpResponse httpResponse = mock(HttpResponse.class); StatusLine statusLine = mock(StatusLine.class); when(httpResponse.getStatusLine()).thenReturn(statusLine); when(statusLine.getStatusCode()).thenReturn(200); BasicHttpEntity httpEntity = new BasicHttpEntity(); String body = ""; httpEntity.setContent(new ByteArrayInputStream(body.getBytes("UTF-8"))); when(httpResponse.getEntity()).thenReturn(httpEntity); return httpResponse; } }); FetchProfile profile = new FetchProfile(); profile.add(FetchProfile.Item.BODY_SANE); folder.fetch(messages, profile, listener); verify(listener, times(25)).messageStarted(any(String.class), anyInt(), eq(25)); verify(listener, times(25)).messageFinished(any(WebDavMessage.class), anyInt(), eq(25)); }
listener.messageStarted(wdMessage.getUid(), i, count); listener.messageFinished(wdMessage, i, count);
@Test public void folder_ignores_exception_thrown_when_closing() throws MessagingException, IOException { setupStoreForMessageFetching(); List<WebDavMessage> messages = setup25MessagesToFetch(); when(mockHttpClient.executeOverride(any(HttpUriRequest.class), nullable(HttpContext.class))).thenAnswer( new Answer<HttpResponse>() { @Override public HttpResponse answer(InvocationOnMock invocation) throws Throwable { HttpResponse httpResponse = mock(HttpResponse.class); StatusLine statusLine = mock(StatusLine.class); when(httpResponse.getStatusLine()).thenReturn(statusLine); when(statusLine.getStatusCode()).thenReturn(200); BasicHttpEntity httpEntity = new BasicHttpEntity(); InputStream mockInputStream = mock(InputStream.class); when(mockInputStream.read(any(byte[].class), anyInt(), anyInt())).thenReturn(1).thenReturn(-1); doThrow(new IOException("Test")).when(mockInputStream).close(); httpEntity.setContent(mockInputStream); when(httpResponse.getEntity()).thenReturn(httpEntity); return httpResponse; } }); FetchProfile profile = new FetchProfile(); profile.add(FetchProfile.Item.BODY_SANE); folder.fetch(messages, profile, listener); verify(listener, times(25)).messageStarted(any(String.class), anyInt(), eq(25)); verify(listener, times(25)).messageFinished(any(WebDavMessage.class), anyInt(), eq(25)); }
@Test public void folder_does_not_notify_listener_twice_when_fetching_flags_and_bodies() throws MessagingException, IOException, URISyntaxException { setupStoreForMessageFetching(); when(mockStore.processRequest(anyString(), anyString(), anyString(), anyMapOf(String.class, String.class))) .thenReturn(mockDataSet); List<WebDavMessage> messages = setup25MessagesToFetch(); when(mockHttpClient.executeOverride(any(HttpUriRequest.class), nullable(HttpContext.class))).thenAnswer( new Answer<HttpResponse>() { @Override public HttpResponse answer(InvocationOnMock invocation) throws Throwable { HttpResponse httpResponse = mock(HttpResponse.class); StatusLine statusLine = mock(StatusLine.class); when(httpResponse.getStatusLine()).thenReturn(statusLine); when(statusLine.getStatusCode()).thenReturn(200); BasicHttpEntity httpEntity = new BasicHttpEntity(); String body = ""; httpEntity.setContent(new ByteArrayInputStream(body.getBytes("UTF-8"))); when(httpResponse.getEntity()).thenReturn(httpEntity); return httpResponse; } }); FetchProfile profile = new FetchProfile(); profile.add(FetchProfile.Item.FLAGS); profile.add(FetchProfile.Item.BODY); folder.fetch(messages, profile, listener); verify(listener, times(25)).messageStarted(any(String.class), anyInt(), anyInt()); verify(listener, times(25)).messageFinished(any(WebDavMessage.class), anyInt(), anyInt()); }
listener.messageStarted(uid, messageNumber++, messageMap.size()); listener.messageFinished(imapMessage, messageNumber, messageMap.size());
try { if (listener != null && !fp.contains(FetchProfile.Item.ENVELOPE)) { listener.messageStarted(pop3Message.getUid(), i, count); listener.messageFinished(pop3Message, i, count);
listener.messageStarted(uid, messageNumber++, 1); listener.messageFinished(message, messageNumber, 1);