View Javadoc

1   /*
2    * $Id: ImapCustomSeenHandlingTestCase.java 22518 2011-07-22 07:00:22Z claude.mamo $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.email.functional;
12  
13  import static org.junit.Assert.assertNotNull;
14  import static org.junit.Assert.assertTrue;
15  
16  import org.mule.tck.functional.CountdownCallback;
17  import org.mule.tck.functional.FunctionalTestComponent;
18  import org.mule.transport.email.GreenMailUtilities;
19  import org.mule.transport.email.ImapConnector;
20  
21  import com.icegreen.greenmail.store.StoredMessage;
22  import com.icegreen.greenmail.user.UserManager;
23  
24  import java.util.Arrays;
25  import java.util.Collection;
26  import java.util.List;
27  
28  import javax.mail.Flags;
29  import javax.mail.internet.MimeMessage;
30  
31  import org.junit.Test;
32  import org.junit.runners.Parameterized.Parameters;
33  
34  public class ImapCustomSeenHandlingTestCase extends AbstractEmailFunctionalTestCase
35  {
36      private CountdownCallback messageReceived = new CountdownCallback(1);
37  
38      public ImapCustomSeenHandlingTestCase(ConfigVariant variant, String configResources)
39      {
40          super(variant, false, ImapConnector.IMAP, configResources);
41  
42          // do not start Mule the IMAP server must be filled with appropriate test data first
43          setStartContext(false);
44      }
45  
46      @Override
47      protected String getConfigResources()
48      {
49          return "imap-custom-seen-flag.xml";
50      }
51      
52      @Parameters
53      public static Collection<Object[]> parameters()
54      {
55          return Arrays.asList(new Object[][]{
56              {ConfigVariant.SERVICE, "imap-functional-test-service.xml"},
57              {ConfigVariant.FLOW, "imap-functional-test-service.xml"}
58          });
59      }      
60  
61      @Test
62      public void testMessagesMatchingFilterGetCustomFlagSet() throws Exception
63      {
64          putMailMessageMatchingFilterIntoImapServer();
65          setupTestComponentListener();
66  
67          // now that everything is set up, start the context and let the polling begin
68          muleContext.start();
69  
70          // wait for the message to be processed
71          assertTrue(messageReceived.await(RECEIVE_TIMEOUT));
72          assertMessageIsFlagged();
73      }
74  
75      private void putMailMessageMatchingFilterIntoImapServer() throws Exception
76      {
77          String email = "barney@mule.org";
78  
79          UserManager userManager = server.getManagers().getUserManager();
80          MimeMessage message = GreenMailUtilities.toMessage(TEST_MESSAGE, email, null);
81          GreenMailUtilities.storeEmail(userManager, email, DEFAULT_USER, DEFAULT_PASSWORD, message);
82      }
83  
84      private void setupTestComponentListener() throws Exception
85      {
86          FunctionalTestComponent component = getFunctionalTestComponent("custom-flags");
87          assertNotNull(component);
88  
89          component.setEventCallback(messageReceived);
90      }
91  
92      private void assertMessageIsFlagged() throws Exception
93      {
94          // our superclass puts one message per default so we definitely have more than one message
95          // here. Just check if one is there with the required flag
96          boolean flaggedMessageFound = anyMessageIsFlagged();
97          assertTrue("no FLAGGED message found", flaggedMessageFound);
98      }
99  
100     private boolean anyMessageIsFlagged()
101     {
102         for (StoredMessage message : allImapMessages())
103         {
104             if (message.getFlags().contains(Flags.Flag.FLAGGED))
105             {
106                 return true;
107             }
108         }
109         return false;
110     }
111 
112     /**
113      * We cannot use <code>server.getReceivedMessages()</code> to obtain all messages from the
114      * IMAP server, the {@link MimeMessage} instances that are returned by that method do not
115      * have all the flags set.
116      */
117     @SuppressWarnings("unchecked")
118     private List<StoredMessage> allImapMessages()
119     {
120         return server.getManagers().getImapHostManager().getAllMessages();
121     }
122 }