Loading k9mail-library/src/test/java/com/fsck/k9/mail/transport/SmtpTransportTest.java +81 −107 Original line number Diff line number Diff line package com.fsck.k9.mail.transport; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.AuthType; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.CertificateValidationException; import com.fsck.k9.mail.ConnectionSecurity; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.ServerSettings; import com.fsck.k9.mail.ServerSettings.Type; import com.fsck.k9.mail.filter.Base64; import com.fsck.k9.mail.internet.MimeMessage; import com.fsck.k9.mail.ssl.TrustedSocketFactory; Loading @@ -16,30 +21,22 @@ import com.fsck.k9.mail.transport.mockServer.MockSmtpServer; import com.fsck.k9.mail.transport.mockServer.TestMessage; import com.fsck.k9.mailstore.BinaryMemoryBody; import com.fsck.k9.testHelpers.TestTrustedSocketFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = 21) public class SmtpTransportTest { private String host; private int port; private ConnectionSecurity connectionSecurity; Loading @@ -51,71 +48,24 @@ public class SmtpTransportTest { private StoreConfig storeConfig = mock(StoreConfig.class); private TrustedSocketFactory socketFactory; @Before public void before() { socketFactory = new TestTrustedSocketFactory(); resetConnectionParameters(); } private void resetConnectionParameters() { host = null; port = -1; username = null; password = null; authenticationType = null; clientCertificateAlias = null; connectionSecurity = null; extensions = new ArrayList<>(); } private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server) throws IOException, MessagingException { server.start(); host = server.getHost(); port = server.getPort(); String uri = SmtpTransport.createUri(new ServerSettings( ServerSettings.Type.SMTP, host, port, connectionSecurity, authenticationType, username, password, clientCertificateAlias)); when(storeConfig.getTransportUri()).thenReturn(uri); return createSmtpTransport(storeConfig, socketFactory); } private SmtpTransport createSmtpTransport( StoreConfig storeConfig, TrustedSocketFactory socketFactory) throws MessagingException { return new SmtpTransport(storeConfig, socketFactory); } private void setupConnectAndPlainAuthentication(MockSmtpServer server) { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; server.output("220 localhost Simple Mail Transfer Service Ready"); server.expect("EHLO localhost"); server.output("250-localhost Hello client.localhost"); for (String extension: extensions) { server.output("250-"+extension); } server.output("250 AUTH LOGIN PLAIN CRAM-MD5"); server.expect("AUTH PLAIN AHVzZXIAcGFzc3dvcmQ="); server.output("235 2.7.0 Authentication successful"); } @Test public void SmtpTransport_withValidUri_canBeCreated() throws MessagingException { public void SmtpTransport_withValidUri_canBeCreated() throws Exception { StoreConfig storeConfig = mock(StoreConfig.class); when(storeConfig.getTransportUri()).thenReturn( "smtp://user:password:CRAM_MD5@server:123456"); when(storeConfig.getTransportUri()).thenReturn("smtp://user:password:CRAM_MD5@server:123456"); TrustedSocketFactory trustedSocketFactory = mock(TrustedSocketFactory.class); new SmtpTransport(storeConfig, trustedSocketFactory); } @Test(expected = MessagingException.class) public void SmtpTransport_withInvalidUri_throwsMessagingException() throws MessagingException { public void SmtpTransport_withInvalidUri_throwsMessagingException() throws Exception { StoreConfig storeConfig = mock(StoreConfig.class); when(storeConfig.getTransportUri()).thenReturn("smpt://"); TrustedSocketFactory trustedSocketFactory = mock(TrustedSocketFactory.class); Loading @@ -124,8 +74,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityOrPasswordPlainAuth_connectsToServer_withoutLogin() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityOrPasswordPlainAuth_connectsToServer_withoutLogin() throws Exception { username = "user"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; Loading @@ -144,8 +93,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityPlainAuth_connectsToServer() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityPlainAuth_connectsToServer() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; Loading @@ -167,8 +115,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityPlainAuth_usesLoginIfPlainUnavailable() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityPlainAuth_usesLoginIfPlainUnavailable() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; Loading @@ -194,8 +141,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityPlainAuth_withNeither_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityPlainAuth_withNeither_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; Loading @@ -212,8 +158,7 @@ public class SmtpTransportTest { transport.open(); fail("Exception expected"); } catch (MessagingException e) { assertEquals("Authentication methods SASL PLAIN and LOGIN are unavailable.", e.getMessage()); assertEquals("Authentication methods SASL PLAIN and LOGIN are unavailable.", e.getMessage()); } server.verifyConnectionStillOpen(); Loading @@ -221,8 +166,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityCramMd5Auth_connectsToServer() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityCramMd5Auth_connectsToServer() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.CRAM_MD5; Loading @@ -246,8 +190,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityCramMd5Auth_withNoSupport_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityCramMd5Auth_withNoSupport_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.CRAM_MD5; Loading @@ -264,8 +207,7 @@ public class SmtpTransportTest { transport.open(); fail("Exception expected"); } catch (MessagingException e) { assertEquals("Authentication method CRAM-MD5 is unavailable.", e.getMessage()); assertEquals("Authentication method CRAM-MD5 is unavailable.", e.getMessage()); } server.verifyConnectionStillOpen(); Loading @@ -273,8 +215,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityExternalAuth_connectsToServer() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityExternalAuth_connectsToServer() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.EXTERNAL; Loading @@ -296,8 +237,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityExternal_withNoSupport_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityExternal_withNoSupport_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.EXTERNAL; Loading @@ -320,9 +260,9 @@ public class SmtpTransportTest { server.verifyConnectionStillOpen(); server.verifyInteractionCompleted(); } @Test public void open_withNoSecurityAutomatic_connectsToServerWithCramMD5IfSupported() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityAutomatic_connectsToServerWithCramMD5IfSupported() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.AUTOMATIC; Loading @@ -346,8 +286,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityAutomatic_withCramMD5Unsupported_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityAutomatic_withCramMD5Unsupported_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.AUTOMATIC; Loading @@ -373,8 +312,7 @@ public class SmtpTransportTest { } @Test public void open_triesHELO_whenServerDoesntSupportEHLO() throws MessagingException, IOException, InterruptedException { public void open_triesHELO_whenServerDoesntSupportEHLO() throws Exception { username = "user"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; Loading @@ -394,9 +332,7 @@ public class SmtpTransportTest { } @Test public void sendMessage_withNoAddressToSendTo_doesntOpenConnection() throws MessagingException, IOException, InterruptedException { public void sendMessage_withNoAddressToSendTo_doesntOpenConnection() throws Exception { MimeMessage message = new MimeMessage(); MockSmtpServer server = new MockSmtpServer(); Loading @@ -409,9 +345,7 @@ public class SmtpTransportTest { } @Test public void sendMessage_withToAddressToSendTo_opensConnection() throws MessagingException, IOException, InterruptedException { public void sendMessage_withToAddressToSendTo_opensConnection() throws Exception { TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); message.setRecipients(Message.RecipientType.TO, new Address[] { new Address("user2@localhost") }); Loading @@ -430,14 +364,12 @@ public class SmtpTransportTest { server.expect("QUIT"); server.output("221 BYE"); SmtpTransport transport = startServerAndCreateSmtpTransport(server); transport.sendMessage(message); } @Test public void sendMessage_with8BitEncoding_usesEncoding() throws MessagingException, IOException, InterruptedException { public void sendMessage_with8BitEncoding_usesEncoding() throws Exception { extensions.add("8BITMIME"); TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); Loading @@ -457,14 +389,12 @@ public class SmtpTransportTest { server.expect("QUIT"); server.output("221 BYE"); SmtpTransport transport = startServerAndCreateSmtpTransport(server); transport.sendMessage(message); } @Test public void sendMessage_withMessageTooLarge_throwsException() throws MessagingException, IOException, InterruptedException { public void sendMessage_withMessageTooLarge_throwsException() throws Exception { extensions.add("SIZE 1000"); TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); Loading @@ -487,8 +417,7 @@ public class SmtpTransportTest { } @Test public void sendMessage_withNegativeReply_throwsException() throws MessagingException, IOException, InterruptedException { public void sendMessage_withNegativeReply_throwsException() throws Exception { TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); message.setRecipients(Message.RecipientType.TO, new Address[] { new Address("user2@localhost") }); Loading Loading @@ -518,4 +447,49 @@ public class SmtpTransportTest { assertEquals("4.7.0 Temporary system problem", e.getReplyText()); } } private void resetConnectionParameters() { host = null; port = -1; username = null; password = null; authenticationType = null; clientCertificateAlias = null; connectionSecurity = null; extensions = new ArrayList<>(); } private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server) throws IOException, MessagingException { server.start(); host = server.getHost(); port = server.getPort(); ServerSettings serverSettings = new ServerSettings(Type.SMTP, host, port, connectionSecurity, authenticationType, username, password, clientCertificateAlias); String uri = SmtpTransport.createUri(serverSettings); when(storeConfig.getTransportUri()).thenReturn(uri); return createSmtpTransport(storeConfig, socketFactory); } private SmtpTransport createSmtpTransport(StoreConfig storeConfig, TrustedSocketFactory socketFactory) throws MessagingException { return new SmtpTransport(storeConfig, socketFactory); } private void setupConnectAndPlainAuthentication(MockSmtpServer server) { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; server.output("220 localhost Simple Mail Transfer Service Ready"); server.expect("EHLO localhost"); server.output("250-localhost Hello client.localhost"); for (String extension : extensions) { server.output("250-" + extension); } server.output("250 AUTH LOGIN PLAIN CRAM-MD5"); server.expect("AUTH PLAIN AHVzZXIAcGFzc3dvcmQ="); server.output("235 2.7.0 Authentication successful"); } } k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/MockSmtpServer.java +8 −9 Original line number Diff line number Diff line package com.fsck.k9.mail.transport.mockServer; import android.annotation.SuppressLint; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import org.apache.commons.io.IOUtils; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; Loading @@ -28,14 +21,18 @@ import java.util.concurrent.TimeUnit; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import android.annotation.SuppressLint; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import okio.BufferedSink; import okio.BufferedSource; import okio.Okio; import org.apache.commons.io.IOUtils; @SuppressLint("NewApi") Loading Loading @@ -185,10 +182,12 @@ public class MockSmtpServer { public interface Logger { void log(String message); void log(String format, Object... args); } private interface SmtpInteraction {} private interface SmtpInteraction { } private static class ExpectedCommand implements SmtpInteraction { private final String command; Loading k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/TestMessage.java +2 −9 Original line number Diff line number Diff line package com.fsck.k9.mail.transport.mockServer; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.internet.MimeMessage; public class TestMessage extends MimeMessage { public class TestMessage extends MimeMessage { private long mId; private int mAttachmentCount; private String mSubject; private String mPreview = ""; private long mThreadId; private long mRootId; private long messagePartId; private String mimeType; public long getMessagePartId() { return messagePartId; } Loading Loading @@ -72,7 +67,6 @@ public class TestMessage extends MimeMessage { this.mFrom = new Address[] { from }; } @Override public void setReplyTo(Address[] replyTo) { if (replyTo == null || replyTo.length == 0) { Loading @@ -82,7 +76,6 @@ public class TestMessage extends MimeMessage { } } /* * For performance reasons, we add headers instead of setting them (see super implementation) * which removes (expensive) them before adding them Loading k9mail-library/src/test/java/com/fsck/k9/testHelpers/TestTrustedSocketFactory.java +3 −3 Original line number Diff line number Diff line package com.fsck.k9.testHelpers; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.ssl.TrustedSocketFactory; import com.fsck.k9.mail.store.imap.ImapConnectionTest; import java.io.IOException; import java.net.Socket; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.ssl.TrustedSocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; public class TestTrustedSocketFactory implements TrustedSocketFactory { @Override public Socket createSocket(Socket socket, String host, int port, String clientCertificateAlias) Loading Loading
k9mail-library/src/test/java/com/fsck/k9/mail/transport/SmtpTransportTest.java +81 −107 Original line number Diff line number Diff line package com.fsck.k9.mail.transport; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.AuthType; import com.fsck.k9.mail.AuthenticationFailedException; import com.fsck.k9.mail.CertificateValidationException; import com.fsck.k9.mail.ConnectionSecurity; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.ServerSettings; import com.fsck.k9.mail.ServerSettings.Type; import com.fsck.k9.mail.filter.Base64; import com.fsck.k9.mail.internet.MimeMessage; import com.fsck.k9.mail.ssl.TrustedSocketFactory; Loading @@ -16,30 +21,22 @@ import com.fsck.k9.mail.transport.mockServer.MockSmtpServer; import com.fsck.k9.mail.transport.mockServer.TestMessage; import com.fsck.k9.mailstore.BinaryMemoryBody; import com.fsck.k9.testHelpers.TestTrustedSocketFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = 21) public class SmtpTransportTest { private String host; private int port; private ConnectionSecurity connectionSecurity; Loading @@ -51,71 +48,24 @@ public class SmtpTransportTest { private StoreConfig storeConfig = mock(StoreConfig.class); private TrustedSocketFactory socketFactory; @Before public void before() { socketFactory = new TestTrustedSocketFactory(); resetConnectionParameters(); } private void resetConnectionParameters() { host = null; port = -1; username = null; password = null; authenticationType = null; clientCertificateAlias = null; connectionSecurity = null; extensions = new ArrayList<>(); } private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server) throws IOException, MessagingException { server.start(); host = server.getHost(); port = server.getPort(); String uri = SmtpTransport.createUri(new ServerSettings( ServerSettings.Type.SMTP, host, port, connectionSecurity, authenticationType, username, password, clientCertificateAlias)); when(storeConfig.getTransportUri()).thenReturn(uri); return createSmtpTransport(storeConfig, socketFactory); } private SmtpTransport createSmtpTransport( StoreConfig storeConfig, TrustedSocketFactory socketFactory) throws MessagingException { return new SmtpTransport(storeConfig, socketFactory); } private void setupConnectAndPlainAuthentication(MockSmtpServer server) { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; server.output("220 localhost Simple Mail Transfer Service Ready"); server.expect("EHLO localhost"); server.output("250-localhost Hello client.localhost"); for (String extension: extensions) { server.output("250-"+extension); } server.output("250 AUTH LOGIN PLAIN CRAM-MD5"); server.expect("AUTH PLAIN AHVzZXIAcGFzc3dvcmQ="); server.output("235 2.7.0 Authentication successful"); } @Test public void SmtpTransport_withValidUri_canBeCreated() throws MessagingException { public void SmtpTransport_withValidUri_canBeCreated() throws Exception { StoreConfig storeConfig = mock(StoreConfig.class); when(storeConfig.getTransportUri()).thenReturn( "smtp://user:password:CRAM_MD5@server:123456"); when(storeConfig.getTransportUri()).thenReturn("smtp://user:password:CRAM_MD5@server:123456"); TrustedSocketFactory trustedSocketFactory = mock(TrustedSocketFactory.class); new SmtpTransport(storeConfig, trustedSocketFactory); } @Test(expected = MessagingException.class) public void SmtpTransport_withInvalidUri_throwsMessagingException() throws MessagingException { public void SmtpTransport_withInvalidUri_throwsMessagingException() throws Exception { StoreConfig storeConfig = mock(StoreConfig.class); when(storeConfig.getTransportUri()).thenReturn("smpt://"); TrustedSocketFactory trustedSocketFactory = mock(TrustedSocketFactory.class); Loading @@ -124,8 +74,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityOrPasswordPlainAuth_connectsToServer_withoutLogin() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityOrPasswordPlainAuth_connectsToServer_withoutLogin() throws Exception { username = "user"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; Loading @@ -144,8 +93,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityPlainAuth_connectsToServer() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityPlainAuth_connectsToServer() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; Loading @@ -167,8 +115,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityPlainAuth_usesLoginIfPlainUnavailable() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityPlainAuth_usesLoginIfPlainUnavailable() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; Loading @@ -194,8 +141,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityPlainAuth_withNeither_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityPlainAuth_withNeither_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; Loading @@ -212,8 +158,7 @@ public class SmtpTransportTest { transport.open(); fail("Exception expected"); } catch (MessagingException e) { assertEquals("Authentication methods SASL PLAIN and LOGIN are unavailable.", e.getMessage()); assertEquals("Authentication methods SASL PLAIN and LOGIN are unavailable.", e.getMessage()); } server.verifyConnectionStillOpen(); Loading @@ -221,8 +166,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityCramMd5Auth_connectsToServer() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityCramMd5Auth_connectsToServer() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.CRAM_MD5; Loading @@ -246,8 +190,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityCramMd5Auth_withNoSupport_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityCramMd5Auth_withNoSupport_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.CRAM_MD5; Loading @@ -264,8 +207,7 @@ public class SmtpTransportTest { transport.open(); fail("Exception expected"); } catch (MessagingException e) { assertEquals("Authentication method CRAM-MD5 is unavailable.", e.getMessage()); assertEquals("Authentication method CRAM-MD5 is unavailable.", e.getMessage()); } server.verifyConnectionStillOpen(); Loading @@ -273,8 +215,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityExternalAuth_connectsToServer() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityExternalAuth_connectsToServer() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.EXTERNAL; Loading @@ -296,8 +237,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityExternal_withNoSupport_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityExternal_withNoSupport_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.EXTERNAL; Loading @@ -320,9 +260,9 @@ public class SmtpTransportTest { server.verifyConnectionStillOpen(); server.verifyInteractionCompleted(); } @Test public void open_withNoSecurityAutomatic_connectsToServerWithCramMD5IfSupported() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityAutomatic_connectsToServerWithCramMD5IfSupported() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.AUTOMATIC; Loading @@ -346,8 +286,7 @@ public class SmtpTransportTest { } @Test public void open_withNoSecurityAutomatic_withCramMD5Unsupported_throwsException() throws MessagingException, IOException, InterruptedException { public void open_withNoSecurityAutomatic_withCramMD5Unsupported_throwsException() throws Exception { username = "user"; password = "password"; authenticationType = AuthType.AUTOMATIC; Loading @@ -373,8 +312,7 @@ public class SmtpTransportTest { } @Test public void open_triesHELO_whenServerDoesntSupportEHLO() throws MessagingException, IOException, InterruptedException { public void open_triesHELO_whenServerDoesntSupportEHLO() throws Exception { username = "user"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; Loading @@ -394,9 +332,7 @@ public class SmtpTransportTest { } @Test public void sendMessage_withNoAddressToSendTo_doesntOpenConnection() throws MessagingException, IOException, InterruptedException { public void sendMessage_withNoAddressToSendTo_doesntOpenConnection() throws Exception { MimeMessage message = new MimeMessage(); MockSmtpServer server = new MockSmtpServer(); Loading @@ -409,9 +345,7 @@ public class SmtpTransportTest { } @Test public void sendMessage_withToAddressToSendTo_opensConnection() throws MessagingException, IOException, InterruptedException { public void sendMessage_withToAddressToSendTo_opensConnection() throws Exception { TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); message.setRecipients(Message.RecipientType.TO, new Address[] { new Address("user2@localhost") }); Loading @@ -430,14 +364,12 @@ public class SmtpTransportTest { server.expect("QUIT"); server.output("221 BYE"); SmtpTransport transport = startServerAndCreateSmtpTransport(server); transport.sendMessage(message); } @Test public void sendMessage_with8BitEncoding_usesEncoding() throws MessagingException, IOException, InterruptedException { public void sendMessage_with8BitEncoding_usesEncoding() throws Exception { extensions.add("8BITMIME"); TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); Loading @@ -457,14 +389,12 @@ public class SmtpTransportTest { server.expect("QUIT"); server.output("221 BYE"); SmtpTransport transport = startServerAndCreateSmtpTransport(server); transport.sendMessage(message); } @Test public void sendMessage_withMessageTooLarge_throwsException() throws MessagingException, IOException, InterruptedException { public void sendMessage_withMessageTooLarge_throwsException() throws Exception { extensions.add("SIZE 1000"); TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); Loading @@ -487,8 +417,7 @@ public class SmtpTransportTest { } @Test public void sendMessage_withNegativeReply_throwsException() throws MessagingException, IOException, InterruptedException { public void sendMessage_withNegativeReply_throwsException() throws Exception { TestMessage message = new TestMessage(); message.setFrom(new Address("user@localhost")); message.setRecipients(Message.RecipientType.TO, new Address[] { new Address("user2@localhost") }); Loading Loading @@ -518,4 +447,49 @@ public class SmtpTransportTest { assertEquals("4.7.0 Temporary system problem", e.getReplyText()); } } private void resetConnectionParameters() { host = null; port = -1; username = null; password = null; authenticationType = null; clientCertificateAlias = null; connectionSecurity = null; extensions = new ArrayList<>(); } private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server) throws IOException, MessagingException { server.start(); host = server.getHost(); port = server.getPort(); ServerSettings serverSettings = new ServerSettings(Type.SMTP, host, port, connectionSecurity, authenticationType, username, password, clientCertificateAlias); String uri = SmtpTransport.createUri(serverSettings); when(storeConfig.getTransportUri()).thenReturn(uri); return createSmtpTransport(storeConfig, socketFactory); } private SmtpTransport createSmtpTransport(StoreConfig storeConfig, TrustedSocketFactory socketFactory) throws MessagingException { return new SmtpTransport(storeConfig, socketFactory); } private void setupConnectAndPlainAuthentication(MockSmtpServer server) { username = "user"; password = "password"; authenticationType = AuthType.PLAIN; connectionSecurity = ConnectionSecurity.NONE; server.output("220 localhost Simple Mail Transfer Service Ready"); server.expect("EHLO localhost"); server.output("250-localhost Hello client.localhost"); for (String extension : extensions) { server.output("250-" + extension); } server.output("250 AUTH LOGIN PLAIN CRAM-MD5"); server.expect("AUTH PLAIN AHVzZXIAcGFzc3dvcmQ="); server.output("235 2.7.0 Authentication successful"); } }
k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/MockSmtpServer.java +8 −9 Original line number Diff line number Diff line package com.fsck.k9.mail.transport.mockServer; import android.annotation.SuppressLint; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import org.apache.commons.io.IOUtils; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; Loading @@ -28,14 +21,18 @@ import java.util.concurrent.TimeUnit; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; import android.annotation.SuppressLint; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import okio.BufferedSink; import okio.BufferedSource; import okio.Okio; import org.apache.commons.io.IOUtils; @SuppressLint("NewApi") Loading Loading @@ -185,10 +182,12 @@ public class MockSmtpServer { public interface Logger { void log(String message); void log(String format, Object... args); } private interface SmtpInteraction {} private interface SmtpInteraction { } private static class ExpectedCommand implements SmtpInteraction { private final String command; Loading
k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/TestMessage.java +2 −9 Original line number Diff line number Diff line package com.fsck.k9.mail.transport.mockServer; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.internet.MimeMessage; public class TestMessage extends MimeMessage { public class TestMessage extends MimeMessage { private long mId; private int mAttachmentCount; private String mSubject; private String mPreview = ""; private long mThreadId; private long mRootId; private long messagePartId; private String mimeType; public long getMessagePartId() { return messagePartId; } Loading Loading @@ -72,7 +67,6 @@ public class TestMessage extends MimeMessage { this.mFrom = new Address[] { from }; } @Override public void setReplyTo(Address[] replyTo) { if (replyTo == null || replyTo.length == 0) { Loading @@ -82,7 +76,6 @@ public class TestMessage extends MimeMessage { } } /* * For performance reasons, we add headers instead of setting them (see super implementation) * which removes (expensive) them before adding them Loading
k9mail-library/src/test/java/com/fsck/k9/testHelpers/TestTrustedSocketFactory.java +3 −3 Original line number Diff line number Diff line package com.fsck.k9.testHelpers; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.ssl.TrustedSocketFactory; import com.fsck.k9.mail.store.imap.ImapConnectionTest; import java.io.IOException; import java.net.Socket; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.ssl.TrustedSocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; public class TestTrustedSocketFactory implements TrustedSocketFactory { @Override public Socket createSocket(Socket socket, String host, int port, String clientCertificateAlias) Loading