Package org.apache.james.mailbox.store

Source Code of org.apache.james.mailbox.store.SearchUtilsTest

/****************************************************************
* 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;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import javax.mail.Flags;

import org.apache.james.mailbox.model.SearchQuery;
import org.apache.james.mailbox.model.SearchQuery.AddressType;
import org.apache.james.mailbox.model.SearchQuery.DateResolution;
import org.apache.james.mailbox.store.mail.model.Message;
import org.apache.james.mailbox.store.search.MessageSearches;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SearchUtilsTest {

    private static final String RHUBARD = "Rhubard";

    private static final String CUSTARD = "Custard";

    private static final Date SUN_SEP_9TH_2001 = new Date(1000000000000L);

    private static final int SIZE = 1729;

    private static final String DATE_FIELD = "Date";

    private static final String SUBJECT_FIELD = "Subject";

    private static final String RFC822_SUN_SEP_9TH_2001 = "Sun, 9 Sep 2001 09:10:48 +0000 (GMT)";

    private static final String TEXT = RHUBARD + RHUBARD + RHUBARD;

    MessageBuilder builder;

    Collection<Long> recent;
    private Logger log = LoggerFactory.getLogger(getClass());
   
    private Calendar getGMT() {
        return Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.UK);
    }
   
    private Date getDate(int day, int month, int year) {
        Calendar cal = getGMT();
        cal.set(year, month -1, day);
        return cal.getTime();
    }
    @Before
    public void setUp() throws Exception {
        recent = new ArrayList<Long>();
        builder = new MessageBuilder();
        builder.uid = 1009;
    }
   
    @Test
    public void testMatchSizeLessThan() throws Exception {
        builder.size = SIZE;
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeLessThan(SIZE - 1), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeLessThan(SIZE), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.sizeLessThan(SIZE + 1), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(
                SearchQuery.sizeLessThan(Integer.MAX_VALUE), row, recent, log));
    }

    @Test
    public void testMatchSizeMoreThan() throws Exception {
        builder.size = SIZE;
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.sizeGreaterThan(SIZE - 1), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeGreaterThan(SIZE), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeGreaterThan(SIZE + 1),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .sizeGreaterThan(Integer.MAX_VALUE), row, recent, log));
    }

    @Test
    public void testMatchSizeEquals() throws Exception {
        builder.size = SIZE;
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeEquals(SIZE - 1), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.sizeEquals(SIZE), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeEquals(SIZE + 1), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.sizeEquals(Integer.MAX_VALUE),
                row, recent, log));
    }

    @Test
    public void testMatchInternalDateEquals() throws Exception {
        builder.internalDate = SUN_SEP_9TH_2001;
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2000), DateResolution.Day),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.internalDateOn(getDate(8, 9, 2001), DateResolution.Day),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2001), DateResolution.Day),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.internalDateOn(getDate(10, 9, 2001), DateResolution.Day),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2002), DateResolution.Day),
                row, recent, log));
    }

   
    @Test
    public void testMatchInternalDateBefore() throws Exception {
        builder.internalDate = SUN_SEP_9TH_2001;
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.internalDateBefore(getDate(9, 9, 2000), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.internalDateBefore(getDate(8, 9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.internalDateBefore(getDate(9, 9, 2001), DateResolution.Day), row, recent, log));
        assertTrue(new MessageSearches().isMatch(
                SearchQuery.internalDateBefore(getDate(10, 9, 2001), DateResolution.Day), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.internalDateBefore(getDate(9, 9, 2002), DateResolution.Day),
                row, recent, log));
    }

    @Test
    public void testMatchInternalDateAfter() throws Exception {
        builder.internalDate = SUN_SEP_9TH_2001;
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2000), DateResolution.Day),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.internalDateAfter(getDate(8, 9, 2001), DateResolution.Day),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2001), DateResolution.Day),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.internalDateAfter(getDate(10, 9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2002), DateResolution.Day),
                row, recent, log));
    }

    @Test
    public void testMatchHeaderDateAfter() throws Exception {
        builder.header(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2000), DateResolution.Day), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(8,
                9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD,
                getDate(10, 9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2002), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter("BOGUS", getDate(9, 9,
                2001), DateResolution.Day), row, recent, log));
    }

    @Test
    public void testShouldMatchCapsHeaderDateAfter() throws Exception {
        builder.header(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2000), DateResolution.Day), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(8,
                9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD,
                getDate(10, 9, 2001), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2002), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter("BOGUS", getDate(9, 9,
                2001), DateResolution.Day), row, recent, log));
    }

    @Test
    public void testShouldMatchLowersHeaderDateAfter() throws Exception {
        builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2000), DateResolution.Day), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(8,
                9, 2001),DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD,
                getDate(10, 9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(9,
                9, 2002), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter("BOGUS", getDate(9, 9,
                2001), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testMatchHeaderDateOn() throws Exception {
        builder.header(DATE_FIELD, RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2000), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(8, 9,
                2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(10,
                9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2002), DateResolution.Day), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn("BOGUS", getDate(9, 9,
                2001), DateResolution.Day), row, recent, log));
    }

    @Test
    public void testShouldMatchCapsHeaderDateOn() throws Exception {
        builder.header(DATE_FIELD.toUpperCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2000), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(8, 9,
                2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(10,
                9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2002), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn("BOGUS", getDate(9, 9,
                2001), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testShouldMatchLowersHeaderDateOn() throws Exception {
        builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2000), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(8, 9,
                2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(10,
                9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(9, 9,
                2002), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn("BOGUS", getDate(9, 9,
                2001), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testMatchHeaderDateBefore() throws Exception {
        builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(9, 9, 2000), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(8, 9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(9, 9, 2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(10, 9, 2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(9,
                9, 2002), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore("BOGUS", getDate(9,
                9, 2001), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testShouldMatchCapsHeaderDateBefore() throws Exception {
        builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(9, 9, 2000), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(8, 9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(9, 9, 2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(10, 9, 2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(9,
                9, 2002), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore("BOGUS", getDate(9,
                9, 2001), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testShouldMatchLowersHeaderDateBefore() throws Exception {
        builder.header(DATE_FIELD.toLowerCase(), RFC822_SUN_SEP_9TH_2001);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(9, 9, 2000), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(8, 9, 2001), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(9, 9, 2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD,
                getDate(10, 9, 2001), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(9,
                9, 2002), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore("BOGUS", getDate(9,
                9, 2001), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testMatchHeaderContainsCaps() throws Exception {
        builder.header(SUBJECT_FIELD, TEXT.toUpperCase());
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                CUSTARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                RHUBARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                CUSTARD), row, recent, log));
    }

    @Test
    public void testMatchHeaderContainsLowers() throws Exception {
        builder.header(SUBJECT_FIELD, TEXT.toUpperCase());
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                CUSTARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                RHUBARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                CUSTARD), row, recent, log));
    }

    @Test
    public void testMatchHeaderContains() throws Exception {
        builder.header(SUBJECT_FIELD, TEXT.toUpperCase());
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                CUSTARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                RHUBARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                CUSTARD), row, recent, log));
    }

    @Test
    public void testShouldMatchLowerHeaderContains() throws Exception {
        builder.header(SUBJECT_FIELD.toLowerCase(), TEXT);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                CUSTARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                RHUBARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                CUSTARD), row, recent, log));
    }

    @Test
    public void testShouldMatchCapsHeaderContains() throws Exception {
        builder.header(SUBJECT_FIELD.toUpperCase(), TEXT);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                CUSTARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(DATE_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                TEXT), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                RHUBARD), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerContains(SUBJECT_FIELD,
                CUSTARD), row, recent, log));
    }

    @Test
    public void testMatchHeaderExists() throws Exception {
        builder.header(SUBJECT_FIELD, TEXT);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerExists(DATE_FIELD), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerExists(SUBJECT_FIELD),
                row, recent, log));
    }

    @Test
    public void testShouldMatchLowersHeaderExists() throws Exception {
        builder.header(SUBJECT_FIELD.toLowerCase(), TEXT);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerExists(DATE_FIELD), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerExists(SUBJECT_FIELD),
                row, recent, log));
    }

    @Test
    public void testShouldMatchUppersHeaderExists() throws Exception {
        builder.header(SUBJECT_FIELD.toLowerCase(), TEXT);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerExists(DATE_FIELD), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerExists(SUBJECT_FIELD),
                row, recent, log));
    }

    @Test
    public void testShouldMatchUidRange() throws Exception {
        builder.setKey(1, 1729);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.uid(range(1, 1)), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.uid(range(1728, 1728)), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.uid(range(1729, 1729)), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.uid(range(1730, 1730)), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.uid(range(1, 1728)), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.uid(range(1, 1729)), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.uid(range(1729, 1800)), row,
                recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .uid(range(1730, Long.MAX_VALUE)), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.uid(range(1730,
                Long.MAX_VALUE, 1, 1728)), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.uid(range(1730, Long.MAX_VALUE,
                1, 1729)), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .uid(range(1, 1728, 1800, 1810)), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.uid(range(1, 1, 1729, 1729)),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.uid(range(1, 1, 1800, 1800)),
                row, recent, log));
    }

    @Test
    public void testShouldMatchSeenFlagSet() throws Exception {
        builder.setFlags(true, false, false, false, false, false);
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT),
                row, recent, log));
    }

    @Test
    public void testShouldMatchAnsweredFlagSet() throws Exception {
        builder.setFlags(false, false, true, false, false, false);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.ANSWERED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT),
                row, recent, log));
    }

    @Test
    public void testShouldMatchFlaggedFlagSet() throws Exception {
        builder.setFlags(false, true, false, false, false, false);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT),
                row, recent, log));
    }

    @Test
    public void testShouldMatchDraftFlagSet() throws Exception {
        builder.setFlags(false, false, false, true, false, false);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT),
                row, recent, log));
    }

   
    @Test
    public void testShouldMatchDeletedFlagSet() throws Exception {
        builder.setFlags(false, false, false, false, true, false);
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT),
                row, recent, log));
    }

    @Test
    public void testShouldMatchSeenRecentSet() throws Exception {
        builder.setFlags(false, false, false, false, false, false);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid()));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.FLAGGED),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.DELETED),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsSet(Flags.Flag.RECENT),
                row, recent, log));
    }

    @Test
    public void testShouldMatchSeenFlagUnSet() throws Exception {
        builder.setFlags(false, true, true, true, true, true);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid()));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.FLAGGED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.DELETED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent, log));
    }

    @Test
    public void testShouldMatchAnsweredFlagUnSet() throws Exception {
        builder.setFlags(true, true, false, true, true, true);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid()));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.FLAGGED), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.DELETED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent, log));
    }

    @Test
    public void testShouldMatchFlaggedFlagUnSet() throws Exception {
        builder.setFlags(true, false, true, true, true, true);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid()));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.DELETED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent, log));
    }

    @Test
    public void testShouldMatchDraftFlagUnSet() throws Exception {
        builder.setFlags(true, true, true, false, true, true);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid()));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.FLAGGED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.ANSWERED), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.DELETED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent, log));
    }

    @Test
    public void testShouldMatchDeletedFlagUnSet() throws Exception {
        builder.setFlags(true, true, true, true, false, true);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid()));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.FLAGGED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertTrue(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.DELETED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(
                SearchQuery.flagIsUnSet(Flags.Flag.RECENT), row, recent, log));
    }

    @Test
    public void testShouldMatchSeenRecentUnSet() throws Exception {
        builder.setFlags(true, true, true, true, true, true);
        Message<Long> row = builder.build();
        recent.add(new Long(row.getUid() + 1));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.SEEN),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.FLAGGED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.ANSWERED), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT),
                row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .flagIsUnSet(Flags.Flag.DELETED), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.flagIsUnSet(Flags.Flag.RECENT),
                row, recent, log));
    }

    @Test
    public void testShouldMatchAll() throws Exception {
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.all(), row, recent, log));
    }

    @Test
    public void testShouldMatchNot() throws Exception {
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.not(SearchQuery.all()), row,
                recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.not(SearchQuery
                .headerExists(DATE_FIELD)), row, recent, log));
    }

    @Test
    public void testShouldMatchOr() throws Exception {
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.or(SearchQuery.all(),
                SearchQuery.headerExists(DATE_FIELD)), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.or(SearchQuery
                .headerExists(DATE_FIELD), SearchQuery.all()), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .or(SearchQuery.headerExists(DATE_FIELD), SearchQuery
                        .headerExists(DATE_FIELD)), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.or(SearchQuery.all(),
                SearchQuery.all()), row, recent, log));
    }

    @Test
    public void testShouldMatchAnd() throws Exception {
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.and(SearchQuery.all(),
                SearchQuery.headerExists(DATE_FIELD)), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.and(SearchQuery
                .headerExists(DATE_FIELD), SearchQuery.all()), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery
                .and(SearchQuery.headerExists(DATE_FIELD), SearchQuery
                        .headerExists(DATE_FIELD)), row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.and(SearchQuery.all(),
                SearchQuery.all()), row, recent, log));
    }
   
    private SearchQuery.NumericRange[] range(long low, long high) {
        SearchQuery.NumericRange[] results = { new SearchQuery.NumericRange(
                low, high) };
        return results;
    }

    private SearchQuery.NumericRange[] range(long lowOne, long highOne,
            long lowTwo, long highTwo) {
        SearchQuery.NumericRange[] results = {
                new SearchQuery.NumericRange(lowOne, highOne),
                new SearchQuery.NumericRange(lowTwo, highTwo) };
        return results;
    }
   
   
    @Test
    public void testMatchHeaderDateOnWithOffset() throws Exception {
        builder.header(DATE_FIELD, "Mon, 26 Mar 2007 00:00:00 +0300");
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(26, 3,
                2007), DateResolution.Day),row, recent, log));
       
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(25, 3,
                2007), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateOn(DATE_FIELD, getDate(27, 3,
                2007), DateResolution.Day),row, recent, log));
    }
   

    @Test
    public void testShouldMatchHeaderDateBeforeWithOffset() throws Exception {
        builder.header(DATE_FIELD, "Mon, 26 Mar 2007 00:00:00 +0300");
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(26, 3,
                2007), DateResolution.Day),row, recent, log));
       
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(27, 3,
                2007), DateResolution.Day),row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateBefore(DATE_FIELD, getDate(25, 3,
                2007), DateResolution.Day),row, recent, log));
    }

    @Test
    public void testShouldMatchHeaderDateAfterWithOffset() throws Exception {
        builder.header(DATE_FIELD, "Mon, 26 Mar 2007 00:00:00 +0300");
        Message<Long> row = builder.build();
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(26, 3,
                2007), DateResolution.Day),row, recent, log));
       
        assertFalse(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(27, 3,
                2007), DateResolution.Day),row, recent, log));
        assertTrue(new MessageSearches().isMatch(SearchQuery.headerDateAfter(DATE_FIELD, getDate(25, 3,
                2007), DateResolution.Day),row, recent, log));
    }
   
    @Test
    public void testShouldMatchAddressHeaderWithComments() throws Exception {
        builder.header("To", "<user-from (comment)@ (comment) domain.org>");
        Message<Long> row = builder.build();
        assertTrue(new MessageSearches().isMatch(SearchQuery.address(AddressType.To, "user-from@domain.org"), row, recent, log));
        assertFalse(new MessageSearches().isMatch(SearchQuery.address(AddressType.From, "user-from@domain.org"), row, recent, log));
    }

}
TOP

Related Classes of org.apache.james.mailbox.store.SearchUtilsTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.