SmtpSenderUnitTests.java revision 96c5af40d639d629267794f4f0338a267ff94ce5
196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License.
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage com.android.email.mail.transport;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport com.android.email.mail.Address;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport com.android.email.mail.MessagingException;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport com.android.email.mail.Transport;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport com.android.email.mail.Message.RecipientType;
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport com.android.email.mail.internet.MimeMessage;
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.AndroidTestCase;
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.util.Date;
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This is a series of unit tests for the SMTP Sender class.  These tests must be locally
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * complete - no server(s) required.
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project@SmallTest
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class SmtpSenderUnitTests extends AndroidTestCase {
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /* These values are provided by setUp() */
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private SmtpSender mSender = null;
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Setup code.  We generate a lightweight SmtpSender for testing.
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected void setUp() throws Exception {
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.setUp();
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // These are needed so we can get at the inner classes
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mSender = new SmtpSender("smtp://user:password@server:999");
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Confirms simple non-SSL non-TLS login
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testSimpleLogin() throws MessagingException {
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        MockTransport mockTransport = openAndInjectMockTransport();
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // try to open it
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setupOpen(mockTransport, null);
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mSender.open();
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO: Test with SSL negotiation (faked)
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO: Test with SSL required but not supported
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO: Test with TLS negotiation (faked)
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO: Test with TLS required but not supported
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO: Test other capabilities.
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO: Test AUTH LOGIN
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test:  Open and send a single message (sunny day)
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Note:  The final expect (for the ".") is a bit awkward because SmtpSender transmits the
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * final line as "\r\n." instead of "" and ".".
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testSendSingleMessage() throws MessagingException {
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        MockTransport mockTransport = openAndInjectMockTransport();
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // Since SmtpSender.sendMessage() does a close then open, we need to preset for the open
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expectClose();
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setupOpen(mockTransport, null);
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // prepare and send a really simple message
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        MimeMessage message = new MimeMessage();
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // TODO use a fixed date for these tests
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        message.setSentDate(new Date());
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Address from = new Address("Jones@Registry.Org", null);
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Address to = new Address("Smith@Registry.Org", null);
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        message.setFrom(from);
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        message.setRecipients(RecipientType.TO, new Address[] { to });
9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // prepare for the message traffic we'll see
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // TODO We should have a method to do this for any Message
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("MAIL FROM: <Jones@Registry.Org>",
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                "250 2.1.0 <Jones@Registry.Org> sender ok");
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("RCPT TO: <Smith@Registry.Org>",
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                "250 2.1.5 <Smith@Registry.Org> recipient ok");
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("DATA", "354 enter mail, end with . on a line by itself");
10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("Message-ID: .*", (String)null);
10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("Date: .*", (String)null);
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("From: Jones@Registry.Org", (String)null);
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("To: Smith@Registry.Org", (String)null);
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("\r\n\\.", "250 2.0.0 kv2f1a00C02Rf8w3Vv mail accepted for delivery");
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // Now trigger the transmission
10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mSender.sendMessage(message);
10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Set up a basic MockTransport. open it, and inject it into mStore
11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private MockTransport openAndInjectMockTransport() {
11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // Create mock transport and inject it into the SmtpSender that's already set up
11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        MockTransport mockTransport = new MockTransport();
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.setSecurity(Transport.CONNECTION_SECURITY_NONE);
11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mSender.setTransport(mockTransport);
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return mockTransport;
12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Helper which stuffs the mock with enough strings to satisfy a call to SmtpSender.open()
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     *
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param mockTransport the mock transport we're using
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param capabilities if non-null, comma-separated list of capabilities
12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void setupOpen(MockTransport mockTransport, String capabilities) {
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect(null, "220 MockTransport 2000 Ready To Assist You Peewee");
13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("EHLO .*", "250-10.20.30.40 hello");
13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if (capabilities == null) {
13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mockTransport.expect(null, "250-HELP");
13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mockTransport.expect(null, "250-AUTH LOGIN PLAIN CRAM-MD5");
13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mockTransport.expect(null, "250-SIZE 15728640");
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mockTransport.expect(null, "250-ENHANCEDSTATUSCODES");
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            mockTransport.expect(null, "250-8BITMIME");
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        } else {
13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            for (String capability : capabilities.split(",")) {
13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                mockTransport.expect(null, "250-" + capability);
14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            }
14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect(null, "250+OK");
14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mockTransport.expect("AUTH PLAIN .*", "235 2.7.0 ... authentication succeeded");
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
146