http://git-wip-us.apache.org/repos/asf/james-project/blob/d5b3a42c/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java new file mode 100644 index 0000000..d52cbfe --- /dev/null +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java @@ -0,0 +1,655 @@ +/**************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information * + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the * + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the * + * specific language governing permissions and limitations * + * under the License. * + ****************************************************************/ + +package org.apache.james.mailbox.store.search; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Date; + +import javax.mail.Flags; + +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.SearchQuery; +import org.apache.james.mailbox.store.StoreMailboxManager; +import org.apache.james.mailbox.store.StoreMessageManager; +import org.apache.james.mailbox.store.mail.model.Mailbox; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Lists; + +public abstract class AbstractMessageSearchIndexTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMessageSearchIndexTest.class); + + protected MessageSearchIndex messageSearchIndex; + protected StoreMailboxManager storeMailboxManager; + private Mailbox mailbox; + private MailboxSession session; + + @Before + public void setUp() throws Exception { + initializeMailboxManager(); + + session = storeMailboxManager.createSystemSession("benwa", LOGGER); + + storeMailboxManager.createMailbox(new MailboxPath("#private", "benwa", "INBOX"), session); + StoreMessageManager messageManager = (StoreMessageManager) storeMailboxManager.getMailbox(new MailboxPath("#private", "benwa", "INBOX"), session); + mailbox = messageManager.getMailboxEntity(); + + // sentDate: Wed, 3 Jun 2015 09:05:46 +0000 + // Internal date : 2014/01/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/spamMail.eml"), + new Date(1388617200000L), + session, + true, + new Flags(Flags.Flag.DELETED)); + // sentDate: Thu, 4 Jun 2015 09:23:37 +0000 + // Internal date : 2014/02/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/mail1.eml"), + new Date(1391295600000L), + session, + true, + new Flags(Flags.Flag.ANSWERED)); + // sentDate: Thu, 4 Jun 2015 09:27:37 +0000 + // Internal date : 2014/03/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/mail2.eml"), + new Date(1393714800000L), + session, + true, + new Flags(Flags.Flag.DRAFT)); + // sentDate: Tue, 2 Jun 2015 08:16:19 +0000 + // Internal date : 2014/05/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/mail3.eml"), + new Date(1398981600000L), + session, + true, + new Flags(Flags.Flag.RECENT)); + // sentDate: Fri, 15 May 2015 06:35:59 +0000 + // Internal date : 2014/04/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/mail4.eml"), + new Date(1396389600000L), + session, + true, + new Flags(Flags.Flag.FLAGGED)); + // sentDate: Wed, 03 Jun 2015 19:14:32 +0000 + // Internal date : 2014/06/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/pgpSignedMail.eml"), + new Date(1401660000000L), + session, + true, + new Flags(Flags.Flag.SEEN)); + // sentDate: Thu, 04 Jun 2015 07:36:08 +0000 + // Internal date : 2014/07/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/htmlMail.eml"), + new Date(1404252000000L), + session, + false, + new Flags()); + // sentDate: Thu, 4 Jun 2015 06:08:41 +0200 + // Internal date : 2014/08/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/mail.eml"), + new Date(1406930400000L), + session, + true, + new Flags("Hello")); + // sentDate: Tue, 2 Jun 2015 12:00:55 +0200 + // Internal date : 2014/09/02 00:00:00.000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("eml/frnog.eml"), + new Date(1409608800000L), + session, + true, + new Flags("Hello you")); + + await(); + } + + protected abstract void await(); + protected abstract void initializeMailboxManager() throws Exception; + + @Test + public void emptySearchQueryShouldReturnAllUids() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void allShouldReturnAllUids() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.all()); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void bodyContainsShouldReturnUidOfMessageContainingTheGivenText() throws MailboxException { + /* + Only mail4.eml contains word MAILET-94 + */ + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.bodyContains("MAILET-94")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void bodyContainsShouldReturnUidOfMessageContainingTheApproximativeText() throws MailboxException { + /* + mail1.eml contains words created AND summary + mail.eml contains created and thus matches the query with a low score + */ + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.bodyContains("created summary")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 8L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsDeletedWhenUsedWithFlagDeleted() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DELETED)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsAnsweredWhenUsedWithFlagAnswered() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.ANSWERED)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsDraftWhenUsedWithFlagDraft() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DRAFT)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(3L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsRecentWhenUsedWithFlagRecent() throws MailboxException { + // Only message 7 is not marked as RECENT + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.RECENT)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsFlaggedWhenUsedWithFlagFlagged() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.FLAGGED)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsSeenWhenUsedWithFlagSeen() throws MailboxException { + // Only message 6 is marked as read. + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.SEEN)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(6L); + } + + @Test + public void flagIsSetShouldReturnUidsOfMessageContainingAGivenUserFlag() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet("Hello")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(8L); + } + + @Test + public void userFlagsShouldBeMatchedExactly() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet("Hello bonjour")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .isEmpty(); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsDeletedWhenUsedWithFlagDeleted() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.DELETED)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsAnsweredWhenUsedWithFlagAnswered() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsDraftWhenUsedWithFlagDraft() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsRecentWhenUsedWithFlagRecent() throws MailboxException { + // Only message 7 is not marked as RECENT + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.RECENT)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsFlaggedWhenUsedWithFlagFlagged() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsSeendWhenUsedWithFlagSeen() throws MailboxException { + // Only message 6 is marked as read. + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.SEEN)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidsOfMessageNotContainingAGivenUserFlag() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet("Hello")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 9L); + } + + @Test + public void internalDateAfterShouldReturnMessagesAfterAGivenDate() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + // Date : 2014/07/02 00:00:00.000 ( Paris time zone ) + searchQuery.andCriteria(SearchQuery.internalDateAfter(new Date(1404252000000L), SearchQuery.DateResolution.Day)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L, 8L, 9L); + } + + @Test + public void internalDateBeforeShouldReturnMessagesBeforeAGivenDate() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + // Date : 2014/02/02 00:00:00.000 ( Paris time zone ) + searchQuery.andCriteria(SearchQuery.internalDateBefore(new Date(1391295600000L), SearchQuery.DateResolution.Day)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L); + } + + @Test + public void internalDateOnShouldReturnMessagesOfTheGivenDate() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + // Date : 2014/03/02 00:00:00.000 ( Paris time zone ) + searchQuery.andCriteria(SearchQuery.internalDateOn(new Date(1393714800000L), SearchQuery.DateResolution.Day)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(3L); + } + + @Test + public void modSeqEqualsShouldReturnUidsOfMessageHavingAGivenModSeq() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.modSeqEquals(2L)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L); + } + + @Test + public void modSeqGreaterThanShouldReturnUidsOfMessageHavingAGreaterModSeq() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(7L)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L, 8L, 9L); + } + + @Test + public void modSeqLessThanShouldReturnUidsOfMessageHavingAGreaterModSeq() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.modSeqLessThan(3L)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L); + } + + @Test + public void sizeGreaterThanShouldReturnUidsOfMessageExceedingTheSpecifiedSize() throws Exception { + // Only message 7 is over 10 KB + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.sizeGreaterThan(10000L)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L); + } + + @Test + public void sizeLessThanShouldReturnUidsOfMessageNotExceedingTheSpecifiedSize() throws Exception { + // Only message 2 3 4 5 9 are under 5 KB + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.sizeLessThan(5000L)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 5L, 9L); + } + + @Test + public void headerContainsShouldReturnUidsOfMessageHavingThisHeaderWithTheSpecifiedValue() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerContains("Precedence", "list")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 6L, 8L, 9L); + } + + @Test + public void headerExistsShouldReturnUidsOfMessageHavingThisHeader() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerExists("Precedence")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L); + } + + @Test + public void addressShouldReturnUidHavingRightExpeditorWhenFromIsSpecified() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.From, "[email protected]")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(8L); + } + + @Test + public void addressShouldReturnUidHavingRightRecipientWhenToIsSpecified() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.To, "[email protected]")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L); + } + + @Test + public void addressShouldReturnUidHavingRightRecipientWhenCcIsSpecified() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Cc, "[email protected]")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void addressShouldReturnUidHavingRightRecipientWhenBccIsSpecified() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Bcc, "[email protected]")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(9L); + } + + @Test + public void uidShouldreturnExistingUidsOnTheGivenRanges() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 4L), new SearchQuery.NumericRange(6L, 7L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 6L, 7L); + } + + @Test + public void uidShouldreturnEveryThing() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void youShouldBeAbleToSpecifySeveralCriterionOnASingleQuery() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerExists("Precedence")); + searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(6L)); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(6L, 8L, 9L); + } + + @Test + public void andShouldReturnResultsMatchingBothRequests() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria( + SearchQuery.and( + SearchQuery.headerExists("Precedence"), + SearchQuery.modSeqGreaterThan(6L))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(6L, 8L, 9L); + } + + @Test + public void orShouldReturnResultsMatchinganyRequests() throws Exception { + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 4L)}; + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria( + SearchQuery.or( + SearchQuery.uid(numericRanges), + SearchQuery.modSeqGreaterThan(6L))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 6L, 7L, 8L, 9L); + } + + @Test + public void notShouldReturnResultsThatDoNotMatchAQuery() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria( + SearchQuery.not(SearchQuery.headerExists("Precedence"))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L); + } + + @Test + public void sortShouldOrderMessages() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.all()); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(1L, 2L, 3L, 5L, 4L, 6L, 7L, 8L, 9L); + } + + @Test + public void revertSortingShouldReturnElementsInAReversedOrder() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.all()); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(9L, 8L, 7L, 6L, 4L, 5L, 3L, 2L, 1L); + } + + @Test + public void headerDateAfterShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + // Date : 2015/06/04 11:00:00.000 ( Paris time zone ) + searchQuery.andCriteria(SearchQuery.headerDateAfter("sentDate", new Date(1433408400000L), SearchQuery.DateResolution.Second)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(3L, 2L); + } + + @Test + public void headerDateBeforeShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + // Date : 2015/06/01 00:00:00.000 ( Paris time zone ) + searchQuery.andCriteria(SearchQuery.headerDateBefore("sentDate", new Date(1433109600000L), SearchQuery.DateResolution.Day)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void headerDateOnShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + // Date : 2015/06/02 08:00:00.000 ( Paris time zone ) + searchQuery.andCriteria(SearchQuery.headerDateOn("sentDate", new Date(1433224800000L), SearchQuery.DateResolution.Day)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(4L, 9L); + } + + @Test + public void mailsContainsShouldIncludeMailHavingAttachmentsMatchingTheRequest() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.mailContains("root mailing list")); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 6L); + } + + @Test + public void sortOnCcShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxCc))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(3L, 5L, 4L, 2L); + // 2 : No cc + // 3 : Cc : [email protected] + // 4 : [email protected] + // 5 : [email protected] + } + + @Test + public void sortOnFromShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxFrom))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(3L, 2L, 4L, 5L); + // 2 : [email protected] + // 3 : [email protected] + // 4 : [email protected] + // 5 : [email protected] + } + + @Test + public void sortOnToShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxTo))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(5L, 2L, 3L, 4L); + // 2 : [email protected] + // 3 : [email protected] + // 4 : [email protected] + // 5 : [email protected] + } + + @Test + public void sortOnSubjectShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.BaseSubject))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(4L, 3L, 2L, 5L); + // 2 : [jira] [Created] (MAILBOX-234) Convert Message into JSON + // 3 : [jira] [Closed] (MAILBOX-217) We should index attachment in elastic search + // 4 : [jira] [Closed] (MAILBOX-11) MailboxQuery ignore namespace + // 5 : [jira] [Resolved] (MAILET-94) James Mailet should use latest version of other James subprojects + } + + @Test + public void sortOnSizeShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Size))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(2L, 3L, 5L, 4L); + // 2 : 3210 o + // 3 : 3647 o + // 4 : 4360 o + // 5 : 3653 o + } + + @Test + public void sortOnDisplayFromShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayFrom))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(4L, 3L, 5L, 2L); + // 2 : Tellier Benoit (JIRA) + // 3 : efij + // 4 : abcd + // 5 : Eric Charles (JIRA) + } + + @Test + public void sortOnDisplayToShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayTo))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(3L, 2L, 4L, 5L); + // 2 : abc + // 3 : aaa + // 4 : server + // 5 : zzz + } + + @Test + public void sortOnSentDateShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.SentDate))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(5L, 4L, 2L, 3L); + // 2 : 4 Jun 2015 09:23:37 + // 3 : 4 Jun 2015 09:27:37 + // 4 : 2 Jun 2015 08:16:19 + // 5 : 15 May 2015 06:35:59 + } + + @Test + public void sortOnIdShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Uid))); + assertThat(messageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(2L, 3L, 4L, 5L); + } +}
http://git-wip-us.apache.org/repos/asf/james-project/blob/d5b3a42c/mailbox/store/src/test/resources/eml/frnog.eml ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/resources/eml/frnog.eml b/mailbox/store/src/test/resources/eml/frnog.eml new file mode 100644 index 0000000..505fbde --- /dev/null +++ b/mailbox/store/src/test/resources/eml/frnog.eml @@ -0,0 +1,94 @@ +Return-Path: <[email protected]> +Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) + by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; + Tue, 02 Jun 2015 12:01:42 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from localhost (spam.minet.net [192.168.102.97]) + by mx2.minet.net (Postfix) with ESMTP id E92F2A25320 + for <[email protected]>; Tue, 2 Jun 2015 12:01:46 +0200 (CEST) +X-Virus-Scanned: by amavisd-new using ClamAV at minet.net +X-Spam-Flag: NO +X-Spam-Score: -1.499 +X-Spam-Level: +X-Spam-Status: No, score=-1.499 required=1 tests=[BAYES_00=-1.5, + UNPARSEABLE_RELAY=0.001] autolearn=ham +Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) + by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) + with ESMTP id bRNLR9Tbk4Jg for <[email protected]>; + Tue, 2 Jun 2015 10:01:46 +0000 (UTC) +Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=217.24.82.4; helo=cabale.usenet-fr.net; [email protected]; [email protected] +Received: from cabale.usenet-fr.net (cabale.usenet-fr.net [217.24.82.4]) + by mx2.minet.net (Postfix) with ESMTP id 089E7A2531A + for <[email protected]>; Tue, 2 Jun 2015 12:01:45 +0200 (CEST) +Received: by cabale.usenet-fr.net (Postfix, from userid 90) + id A267298A5DC6; Tue, 2 Jun 2015 12:01:44 +0200 (CEST) +X-Original-To: [email protected] +Delivered-To: [email protected] +Received: from mta.mail.waycom.net (mta.mail.waycom.net [194.177.32.18]) + by cabale.usenet-fr.net (Postfix) with ESMTP id AE2E798A58FC + for <[email protected]>; Tue, 2 Jun 2015 12:01:01 +0200 (CEST) +Received: from [127.0.0.1] (localhost [127.0.0.1]) + by mta.mail.waycom.net (Postfix) with ESMTP id D30D6567E1 + for <[email protected]>; Tue, 2 Jun 2015 12:00:56 +0200 (CEST) +Received: from [127.0.0.1] (localhost [127.0.0.1]) + wcm-hv1-exch1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) with Microsoft SMTP + Server (TLS) id 15.0.847.32; Tue, 2 Jun 2015 12:00:56 +0200 +Message-ID: <[email protected]> +Date: Tue, 2 Jun 2015 12:00:55 +0200 +From: Guillaume Genty <[email protected]> +Organization: Waycom +MIME-Version: 1.0 +To: <[email protected]> +Cc: [email protected] +Bcc: [email protected] +Content-Type: text/plain; charset="utf-8"; format=flowed +Content-Transfer-Encoding: 8bit +X-ClientProxiedBy: WCM-HV1-EXCH1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) To + wcm-hv1-exch1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) +X-C2ProcessedOrg: 9180093e-3f32-48c9-b36b-0805cbe4c266 +Subject: [FRnOG] [BIZ] Collecte de liens C2E/CELAN en DOM +X-Loop: [email protected] +X-Sequence: 5349 +Errors-to: [email protected] +Precedence: list +Precedence: bulk +Sender: [email protected] +X-mailing-list: [email protected] +List-Id: <frnog.frnog.org> +List-Archive: <http://sympa.frnog.org/wss/arc/frnog> +List-Help: <mailto:[email protected]?subject=help> +List-Owner: <mailto:[email protected]> +List-Post: <mailto:[email protected]> +List-Subscribe: <mailto:[email protected]?subject=subscribe%20frnog> +List-Unsubscribe: <mailto:[email protected]?subject=unsubscribe%20frnog> + +Bonjour le FRnOG, + + +Je cherche un partenaire dans les DOM avec de la collecte C2E et/ou +CELAN capable de revendre des liens et de remonter le trafic (en niveau +2, L2TP ou PPP sur L2TP) en métropole, idéalement à TH2. + +Nous aurions besoin des DOM suivants: +- Guadeloupe +- Martinique +- Guyane +- La Réunion +(Toutes les plaques DOM sauf îles du nord) + +Merci d'avance ! + + +Cordialement, + +-- +Guillaume Genty | WAYCOM +Directeur Technique Adjoint +24-28 Avenue du Général de Gaulle | F-92150 Suresnes, FRANCE +T. : +33 (0)1 41 44 83 00 | F. : +33 (0)1 41 44 00 22 [email protected] | www.waycom.net + + +--------------------------- +Liste de diffusion du FRnOG +http://www.frnog.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
