/** * Copyright (c) 2011-2012 Optimax Software Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Optimax Software, ElasticInbox, nor the names * of its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.elasticinbox.core.cassandra; import static me.prettyprint.hector.api.factory.HFactory.createMutator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.UUID; import me.prettyprint.cassandra.serializers.BytesArraySerializer; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.cassandra.serializers.UUIDSerializer; import me.prettyprint.cassandra.service.CassandraHostConfigurator; import me.prettyprint.hector.api.Cluster; import me.prettyprint.hector.api.ConsistencyLevelPolicy; import me.prettyprint.hector.api.Keyspace; import me.prettyprint.hector.api.factory.HFactory; import me.prettyprint.hector.api.mutation.Mutator; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.elasticinbox.core.AccountDAO; import com.elasticinbox.core.MessageDAO; import com.elasticinbox.core.OverQuotaException; import com.elasticinbox.core.cassandra.persistence.LabelIndexPersistence; import com.elasticinbox.core.cassandra.utils.QuorumConsistencyLevel; import com.elasticinbox.core.message.id.MessageIdBuilder; import com.elasticinbox.core.model.Address; import com.elasticinbox.core.model.AddressList; import com.elasticinbox.core.model.Mailbox; import com.elasticinbox.core.model.Message; import com.elasticinbox.core.model.ReservedLabels; public class CassandraMessageDAOTest { final static StringSerializer strSe = StringSerializer.get(); final static UUIDSerializer uuidSe = UUIDSerializer.get(); final static BytesArraySerializer byteSe = BytesArraySerializer.get(); final static String KEYSPACE = "ElasticInbox"; final static String MAILBOX = "testmessagedao@elasticinbox.com"; Cluster cluster; Keyspace keyspace; CassandraDAOFactory dao; @Before public void setupCase() throws IllegalArgumentException, IOException { System.setProperty("elasticinbox.config", "../../config/elasticinbox.yaml"); // Consistency Level Policy ConsistencyLevelPolicy clp = new QuorumConsistencyLevel(); // Host config CassandraHostConfigurator conf = new CassandraHostConfigurator("127.0.0.1:9160"); cluster = HFactory.getOrCreateCluster("TestCluster", conf); keyspace = HFactory.createKeyspace(KEYSPACE, cluster, clp); dao = new CassandraDAOFactory(); CassandraDAOFactory.setKeyspace(keyspace); AccountDAO accountDAO = dao.getAccountDAO(); accountDAO.add(new Mailbox(MAILBOX)); } @After public void teardownCase() throws IOException { keyspace = null; cluster = null; AccountDAO accountDAO = dao.getAccountDAO(); accountDAO.delete(new Mailbox(MAILBOX)); } @Test public void testStaleMessageIdRemoval() throws IOException, OverQuotaException { Mailbox mailbox = new Mailbox(MAILBOX); Message message = getDummyMessage(); message.addLabel(ReservedLabels.NOTIFICATIONS.getId()); MessageDAO messageDAO = dao.getMessageDAO(); List<UUID> validMessageIds = new ArrayList<UUID>(); List<UUID> invalidMessageIds = new ArrayList<UUID>(); // save message under different message ids, and store message ids for (int i=0; i<5; i++) { UUID messageId = new MessageIdBuilder().build(); validMessageIds.add(messageId); messageDAO.put(mailbox, messageId, message, null); } // generate stale message ids for (int i=0; i<5; i++) { UUID messageId = new MessageIdBuilder().build(); invalidMessageIds.add(messageId); } // add stale message ids to indexes only (without message metadata) Mutator<String> m = createMutator(keyspace, strSe); LabelIndexPersistence.add(m, mailbox.getId(), invalidMessageIds, message.getLabels()); m.execute(); // get all messages from NOTIFICATION label List<UUID> allMessageIds = messageDAO.getMessageIds(mailbox, ReservedLabels.NOTIFICATIONS.getId(), new MessageIdBuilder().build(), 100, true); // check if all message ids returned assertTrue(allMessageIds.containsAll(validMessageIds)); assertTrue(allMessageIds.containsAll(invalidMessageIds)); // delete all message ids messageDAO.delete(mailbox, allMessageIds); // get all messages from NOTIFICATION label allMessageIds = messageDAO.getMessageIds(mailbox, ReservedLabels.NOTIFICATIONS.getId(), new MessageIdBuilder().build(), 100, true); // check if all message ids deleted assertEquals(0, allMessageIds.size()); } private static Message getDummyMessage() { Address address = new Address("Test", "test@elasticinbox.com"); AddressList al = new AddressList(address); Message message = new Message(); message.setFrom(al); message.setTo(al); message.setSize(1024L); message.setSubject("Test"); message.setPlainBody("Test"); message.addLabel(ReservedLabels.ALL_MAILS.getId()); return message; } }