diff --git a/src/main/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrApi.java b/src/main/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrApi.java index 969ca15..2ec07b7 100644 --- a/src/main/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrApi.java +++ b/src/main/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrApi.java @@ -12,6 +12,7 @@ import java.util.WeakHashMap; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import java.util.stream.Collectors; import org.aeonbits.owner.ConfigFactory; import org.apache.commons.lang3.StringUtils; @@ -74,7 +75,8 @@ private static XCMailrClient getXCMailrClient() */ public static Mailbox createTemporaryEmail(String email, boolean forwardEnabled) { - Mailbox mailbox = new Mailbox(email, DateUtils.addMinutes(new Date(), getConfiguration().temporaryMailValidMinutes()).getTime(), forwardEnabled); + Mailbox mailbox = new Mailbox(email, DateUtils.addMinutes(new Date(), getConfiguration().temporaryMailValidMinutes()).getTime(), + forwardEnabled); try { mailbox = getXCMailrClient().mailboxes().createMailbox(mailbox); @@ -147,7 +149,8 @@ public static Mailbox getMailbox(String email) * boolean value if the received e-mails should be forwarded to an account owner e-mail * @return {@link Mailbox} object with information about updated mailbox */ - public static Mailbox updateMailbox(final String address, final String newAddress, final Integer minutesActive, final Boolean forwardEnabled) + public static Mailbox updateMailbox(final String address, final String newAddress, final Integer minutesActive, + final Boolean forwardEnabled) { Mailbox oldMailbox = getMailbox(address); int validMinutes = (int) Math.round((new Date(oldMailbox.deactivationTime).getTime() - new Date().getTime() * 1.0) / 60000); @@ -242,7 +245,7 @@ public static void deleteMailbox(String address) public static void fetchAttachment(Mail mail, String attachmentName, File file) { try (InputStream inputStream = getXCMailrClient().mails().openAttachment(mail.id, attachmentName); - OutputStream outputStream = new FileOutputStream(file);) + OutputStream outputStream = new FileOutputStream(file);) { outputStream.write(inputStream.readAllBytes()); } @@ -262,7 +265,7 @@ public static void fetchAttachment(Mail mail, String attachmentName, File file) */ public static List retrieveAllMailsFromMailbox(String mailboxAddress) { - return fetchEmails(mailboxAddress, null, null, null, null, null, false); + return fetchEmails(mailboxAddress, null, null, null, null, null, false, null); } /** @@ -276,7 +279,7 @@ public static List retrieveAllMailsFromMailbox(String mailboxAddress) */ public static Mail retrieveLastEmailBySubject(String email, String subject) { - List mails = fetchEmails(email, null, subject, null, null, null, true); + List mails = fetchEmails(email, null, subject, null, null, null, true, null); return mails != null ? mails.get(0) : null; } @@ -291,10 +294,16 @@ public static Mail retrieveLastEmailBySubject(String email, String subject) */ public static Mail retrieveLastEmailBySender(String email, String sender) { - List mails = fetchEmails(email, sender, null, null, null, null, true); + List mails = fetchEmails(email, sender, null, null, null, null, true, null); return mails != null ? mails.get(0) : null; } + public static Date getTimestampOfLastEmail(String email) + { + var emails = fetchEmailsFromRemote(email, null, null, null, null, null, false, null); + return emails != null && emails.size() > 0 ? new Date(emails.get(emails.size() - 1).receivedTime) : new Date(); + } + /** * Gets all received e-mails which match the specified parameters * @@ -314,7 +323,8 @@ public static Mail retrieveLastEmailBySender(String email, String sender) * a boolean indicating whether only the last e-mail or more should be returned. * @return the retrieved {@link List} of {@link Mail} objects */ - public static List fetchEmails(String email, String from, String subject, String textContent, String htmlContent, String headers, boolean lastMatch) + public static List fetchEmails(String email, String from, String subject, String textContent, String htmlContent, String headers, + boolean lastMatch, Date lastestEmailDate) { assertPatternIsValid(from); assertPatternIsValid(subject); @@ -331,7 +341,7 @@ public static List fetchEmails(String email, String from, String subject, LOGGER.warn("No e-mail retrieved while polling."); return null; } - List mails = fetchEmailsFromRemote(email, from, subject, textContent, htmlContent, headers, lastMatch); + List mails = fetchEmailsFromRemote(email, from, subject, textContent, htmlContent, headers, lastMatch, lastestEmailDate); if (mails != null && !mails.isEmpty()) { return mails; @@ -350,8 +360,8 @@ public static List fetchEmails(String email, String from, String subject, } } - private static List fetchEmailsFromRemote(String email, String from, String subject, String textContent, String htmlContent, String headers, - boolean lastMatch) + private static List fetchEmailsFromRemote(String email, String from, String subject, String textContent, String htmlContent, + String headers, boolean lastMatch, Date lastestEmailDate) { MailFilterOptions filters = new MailFilterOptions(); @@ -380,6 +390,10 @@ private static List fetchEmailsFromRemote(String email, String from, Strin try { mails = getXCMailrClient().mails().listMails(email, filters); + if (lastestEmailDate != null) + { + mails = mails.stream().filter(mail -> new Date(mail.receivedTime).after(lastestEmailDate)).collect(Collectors.toList()); + } } catch (Exception e) { diff --git a/src/test/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrRetrieveEmailsTest.java b/src/test/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrRetrieveEmailsTest.java index 137163f..f2a8a98 100644 --- a/src/test/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrRetrieveEmailsTest.java +++ b/src/test/java/com/xceptance/neodymium/plugin/xcmailr/XcMailrRetrieveEmailsTest.java @@ -3,9 +3,11 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; +import java.util.Date; import java.util.List; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.time.DateUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -24,7 +26,9 @@ public class XcMailrRetrieveEmailsTest extends AbstractXcMailrApiTest private final File fileToSend = new File("src/test/resources/com/xceptance/neodymium/plugin/xcmailr/message.txt"); - private final EmailAccount emailAccount = new EmailAccount(CREDENTIALS.smtpServerEmail(), CREDENTIALS.smtpServerLogin(), CREDENTIALS.smtpServerPassword(), CREDENTIALS.smtpServerHost(), CREDENTIALS.smtpServerPort(), false, true); + private final EmailAccount emailAccount = new EmailAccount(CREDENTIALS.smtpServerEmail(), CREDENTIALS.smtpServerLogin(), + CREDENTIALS.smtpServerPassword(), CREDENTIALS.smtpServerHost(), + CREDENTIALS.smtpServerPort(), false, true); @Before public void createTempEmailAndSendMessage() throws IOException, URISyntaxException, InterruptedException @@ -98,7 +102,7 @@ public void testRetrieveLastEmailBySendertExpectNull() public void fetchLastEmail() { // fetch last received e-mail - Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, null, null, true).get(0); + Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, null, null, true, null).get(0); validateMessage(mail); } @@ -109,10 +113,37 @@ public void fetchLastEmail() public void fetchLastEmailBySender() { // fetch last received e-mail with specified plain text - Mail mail = XcMailrApi.fetchEmails(emailUnderTest, emailAccount.getEmail(), null, null, null, null, true).get(0); + Mail mail = XcMailrApi.fetchEmails(emailUnderTest, emailAccount.getEmail(), null, null, null, null, true, null).get(0); validateMessage(mail); } + /** + * test that it's possible to fetch last received e-mail after specific date + */ + @Test + public void fetchLastEmailByLastDate() + { + List mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, null, null, true, DateUtils.addMinutes(new Date(), 1)); + Assert.assertNull(mail); + Date now = new Date(); + SendEmail.send(emailAccount, emailUnderTest, subject, textToSend, fileToSend); + mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, null, null, true, now); + Assert.assertTrue(mail.size() == 1); + validateMessage(mail.get(0)); + } + + /** + * test the {@link XcMailrApi#getTimestampOfLastEmail(String)} methods return correct time + */ + @Test + public void testGetTimestampOfLastEmail() + { + long date = XcMailrApi.fetchEmails(emailUnderTest, emailAccount.getEmail(), null, null, null, null, true, null).get(0).receivedTime; + + Date lastEmailDate = XcMailrApi.getTimestampOfLastEmail(emailUnderTest); + Assert.assertTrue(date - lastEmailDate.getTime() < 1000); + } + /** * test that it's possible to fetch last received e-mail with a specific plain text */ @@ -120,7 +151,7 @@ public void fetchLastEmailBySender() public void fetchLastEmailBySubject() { // fetch last received e-mail with specified plain text - Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, subject, null, null, null, true).get(0); + Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, subject, null, null, null, true, null).get(0); validateMessage(mail); } @@ -133,7 +164,7 @@ public void fetchLastEmailByTextContent() String textToRetrieve = textToSend.replaceAll("\\?", "\\\\?").replaceAll("\\)", "\\\\)").replaceAll("\\n", "\\\\r\\\\n"); // fetch last received e-mail with specified plain text - Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, textToRetrieve, null, null, true).get(0); + Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, textToRetrieve, null, null, true, null).get(0); validateMessage(mail); } @@ -146,7 +177,7 @@ public void fetchLastEmailByHtmlContent() String textToRetrieve = textToSend.replaceAll("\\?", "\\\\?").replaceAll("\\)", "\\\\)").replaceAll("\\n", "\\\\r\\\\n"); // fetch last received e-mail with specified HTML text - Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, textToRetrieve, null, true).get(0); + Mail mail = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, textToRetrieve, null, true, null).get(0); validateMessage(mail); } @@ -157,7 +188,7 @@ public void fetchLastEmailByHtmlContent() public void fetchLastEmailByTextContentWithInvalidPattern() { Assert.assertThrows("entered pattern \"" + textToSend + "\" is invalid", RuntimeException.class, () -> { - XcMailrApi.fetchEmails(emailUnderTest, null, null, textToSend, null, null, true); + XcMailrApi.fetchEmails(emailUnderTest, null, null, textToSend, null, null, true, null); }); } @@ -168,7 +199,7 @@ public void fetchLastEmailByTextContentWithInvalidPattern() public void fetchLastEmailByHtmlContentWithInvalidPattern() { Assert.assertThrows("entered pattern \"" + textToSend + "\" is invalid", RuntimeException.class, () -> { - XcMailrApi.fetchEmails(emailUnderTest, null, null, null, textToSend, null, true); + XcMailrApi.fetchEmails(emailUnderTest, null, null, null, textToSend, null, true, null); }); } @@ -189,7 +220,7 @@ public void fetchEmailsFromTempEmail() } // fetch all received e-mails - List mails = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, null, null, false); + List mails = XcMailrApi.fetchEmails(emailUnderTest, null, null, null, null, null, false, null); Assert.assertEquals(2, mails.size()); for (Mail mail : mails)