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