Merge pull request #2739 from k9mail/add_kotlin_for_tests
Add Kotlin for tests
This commit is contained in:
commit
24aacd47a1
8 changed files with 370 additions and 404 deletions
|
@ -5,6 +5,7 @@ buildscript {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:2.3.0'
|
classpath 'com.android.tools.build:gradle:2.3.0'
|
||||||
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
kotlinVersion=1.1.4-3
|
||||||
androidCompileSdkVersion=25
|
androidCompileSdkVersion=25
|
||||||
androidBuildToolsVersion=25.0.2
|
androidBuildToolsVersion=25.0.2
|
||||||
androidSupportLibraryVersion=25.2.0
|
androidSupportLibraryVersion=25.2.0
|
||||||
|
@ -7,3 +8,4 @@ robolectricVersion=3.2.2
|
||||||
junitVersion=4.12
|
junitVersion=4.12
|
||||||
mockitoVersion=1.10.19
|
mockitoVersion=1.10.19
|
||||||
okioVersion=1.11.0
|
okioVersion=1.11.0
|
||||||
|
truthVersion=0.35
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
apply plugin: 'com.android.library'
|
apply plugin: 'com.android.library'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
if (!rootProject.optimizeForDevelopment) {
|
if (!rootProject.optimizeForDevelopment) {
|
||||||
apply from: '../gradle/plugins/checkstyle-android.gradle'
|
apply from: '../gradle/plugins/checkstyle-android.gradle'
|
||||||
|
@ -25,9 +26,11 @@ dependencies {
|
||||||
androidTestCompile 'com.android.support.test:runner:0.4.1'
|
androidTestCompile 'com.android.support.test:runner:0.4.1'
|
||||||
androidTestCompile 'com.madgag.spongycastle:pg:1.51.0.0'
|
androidTestCompile 'com.madgag.spongycastle:pg:1.51.0.0'
|
||||||
|
|
||||||
|
testCompile "org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlinVersion}"
|
||||||
testCompile "com.squareup.okio:okio:${okioVersion}"
|
testCompile "com.squareup.okio:okio:${okioVersion}"
|
||||||
testCompile "org.robolectric:robolectric:${robolectricVersion}"
|
testCompile "org.robolectric:robolectric:${robolectricVersion}"
|
||||||
testCompile "junit:junit:${junitVersion}"
|
testCompile "junit:junit:${junitVersion}"
|
||||||
|
testCompile "com.google.truth:truth:${truthVersion}"
|
||||||
testCompile "org.mockito:mockito-core:${mockitoVersion}"
|
testCompile "org.mockito:mockito-core:${mockitoVersion}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,355 +0,0 @@
|
||||||
package com.fsck.k9.mail;
|
|
||||||
|
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import com.fsck.k9.mail.Message.RecipientType;
|
|
||||||
import com.fsck.k9.mail.internet.BinaryTempFileBody;
|
|
||||||
import com.fsck.k9.mail.internet.BinaryTempFileMessageBody;
|
|
||||||
import com.fsck.k9.mail.internet.CharsetSupport;
|
|
||||||
import com.fsck.k9.mail.internet.MimeBodyPart;
|
|
||||||
import com.fsck.k9.mail.internet.MimeHeader;
|
|
||||||
import com.fsck.k9.mail.internet.MimeMessage;
|
|
||||||
import com.fsck.k9.mail.internet.MimeMessageHelper;
|
|
||||||
import com.fsck.k9.mail.internet.MimeMultipart;
|
|
||||||
import com.fsck.k9.mail.internet.TextBody;
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.apache.james.mime4j.util.MimeUtil;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
|
|
||||||
|
|
||||||
@RunWith(K9LibRobolectricTestRunner.class)
|
|
||||||
public class MessageTest {
|
|
||||||
|
|
||||||
private Context context;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
context = RuntimeEnvironment.application;
|
|
||||||
|
|
||||||
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));
|
|
||||||
BinaryTempFileBody.setTempDirectory(context.getCacheDir());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String SEVEN_BIT_RESULT =
|
|
||||||
"From: from@example.com\r\n"
|
|
||||||
+ "To: to@example.com\r\n"
|
|
||||||
+ "Subject: Test Message\r\n"
|
|
||||||
+ "Date: Wed, 28 Aug 2013 08:51:09 -0400\r\n"
|
|
||||||
+ "MIME-Version: 1.0\r\n"
|
|
||||||
+ "Content-Type: multipart/mixed; boundary=\"----Boundary103\"\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
||||||
+ "Content-Type: text/plain;\r\n"
|
|
||||||
+ " charset=utf-8\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "Testing=2E\r\n"
|
|
||||||
+ "This is a text body with some greek characters=2E\r\n"
|
|
||||||
+ "=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8\r\n"
|
|
||||||
+ "End of test=2E\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103\r\n"
|
|
||||||
+ "Content-Type: application/octet-stream\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: base64\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103\r\n"
|
|
||||||
+ "Content-Type: message/rfc822\r\n"
|
|
||||||
+ "Content-Disposition: attachment\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "From: from@example.com\r\n"
|
|
||||||
+ "To: to@example.com\r\n"
|
|
||||||
+ "Subject: Test Message\r\n"
|
|
||||||
+ "Date: Wed, 28 Aug 2013 08:51:09 -0400\r\n"
|
|
||||||
+ "MIME-Version: 1.0\r\n"
|
|
||||||
+ "Content-Type: multipart/mixed; boundary=\"----Boundary102\"\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
||||||
+ "Content-Type: text/plain;\r\n"
|
|
||||||
+ " charset=utf-8\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "Testing=2E\r\n"
|
|
||||||
+ "This is a text body with some greek characters=2E\r\n"
|
|
||||||
+ "=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8\r\n"
|
|
||||||
+ "End of test=2E\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102\r\n"
|
|
||||||
+ "Content-Type: application/octet-stream\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: base64\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102\r\n"
|
|
||||||
+ "Content-Type: message/rfc822\r\n"
|
|
||||||
+ "Content-Disposition: attachment\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "From: from@example.com\r\n"
|
|
||||||
+ "To: to@example.com\r\n"
|
|
||||||
+ "Subject: Test Message\r\n"
|
|
||||||
+ "Date: Wed, 28 Aug 2013 08:51:09 -0400\r\n"
|
|
||||||
+ "MIME-Version: 1.0\r\n"
|
|
||||||
+ "Content-Type: multipart/mixed; boundary=\"----Boundary101\"\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary101\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
||||||
+ "Content-Type: text/plain;\r\n"
|
|
||||||
+ " charset=utf-8\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "Testing=2E\r\n"
|
|
||||||
+ "This is a text body with some greek characters=2E\r\n"
|
|
||||||
+ "=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8\r\n"
|
|
||||||
+ "End of test=2E\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary101\r\n"
|
|
||||||
+ "Content-Type: application/octet-stream\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: base64\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary101--\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102--\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103--\r\n";
|
|
||||||
|
|
||||||
private static final String TO_BODY_PART_RESULT =
|
|
||||||
"Content-Type: multipart/mixed; boundary=\"----Boundary103\"\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
||||||
+ "Content-Type: text/plain;\r\n"
|
|
||||||
+ " charset=utf-8\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "Testing=2E\r\n"
|
|
||||||
+ "This is a text body with some greek characters=2E\r\n"
|
|
||||||
+ "=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8\r\n"
|
|
||||||
+ "End of test=2E\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103\r\n"
|
|
||||||
+ "Content-Type: application/octet-stream\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: base64\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103\r\n"
|
|
||||||
+ "Content-Type: message/rfc822\r\n"
|
|
||||||
+ "Content-Disposition: attachment\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "From: from@example.com\r\n"
|
|
||||||
+ "To: to@example.com\r\n"
|
|
||||||
+ "Subject: Test Message\r\n"
|
|
||||||
+ "Date: Wed, 28 Aug 2013 08:51:09 -0400\r\n"
|
|
||||||
+ "MIME-Version: 1.0\r\n"
|
|
||||||
+ "Content-Type: multipart/mixed; boundary=\"----Boundary102\"\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
||||||
+ "Content-Type: text/plain;\r\n"
|
|
||||||
+ " charset=utf-8\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "Testing=2E\r\n"
|
|
||||||
+ "This is a text body with some greek characters=2E\r\n"
|
|
||||||
+ "=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8\r\n"
|
|
||||||
+ "End of test=2E\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102\r\n"
|
|
||||||
+ "Content-Type: application/octet-stream\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: base64\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102\r\n"
|
|
||||||
+ "Content-Type: message/rfc822\r\n"
|
|
||||||
+ "Content-Disposition: attachment\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "From: from@example.com\r\n"
|
|
||||||
+ "To: to@example.com\r\n"
|
|
||||||
+ "Subject: Test Message\r\n"
|
|
||||||
+ "Date: Wed, 28 Aug 2013 08:51:09 -0400\r\n"
|
|
||||||
+ "MIME-Version: 1.0\r\n"
|
|
||||||
+ "Content-Type: multipart/mixed; boundary=\"----Boundary101\"\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: 7bit\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary101\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
||||||
+ "Content-Type: text/plain;\r\n"
|
|
||||||
+ " charset=utf-8\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "Testing=2E\r\n"
|
|
||||||
+ "This is a text body with some greek characters=2E\r\n"
|
|
||||||
+ "=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8\r\n"
|
|
||||||
+ "End of test=2E\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary101\r\n"
|
|
||||||
+ "Content-Type: application/octet-stream\r\n"
|
|
||||||
+ "Content-Transfer-Encoding: base64\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary101--\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary102--\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "------Boundary103--\r\n";
|
|
||||||
|
|
||||||
private int mMimeBoundary;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSetSendDateSetsSentDate() throws Exception {
|
|
||||||
Message message = sampleMessage();
|
|
||||||
final int milliseconds = 0;
|
|
||||||
Date date = new Date(milliseconds);
|
|
||||||
message.setSentDate(date, false);
|
|
||||||
Date sentDate = message.getSentDate();
|
|
||||||
assertNotNull(sentDate);
|
|
||||||
assertEquals(milliseconds, sentDate.getTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSetSendDateFormatsHeaderCorrectlyWithCurrentTimeZone() throws Exception {
|
|
||||||
Message message = sampleMessage();
|
|
||||||
message.setSentDate(new Date(0), false);
|
|
||||||
assertEquals("Thu, 01 Jan 1970 09:00:00 +0900", message.getHeader("Date")[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSetSendDateFormatsHeaderCorrectlyWithoutTimeZone() throws Exception {
|
|
||||||
Message message = sampleMessage();
|
|
||||||
message.setSentDate(new Date(0), true);
|
|
||||||
assertEquals("Thu, 01 Jan 1970 00:00:00 +0000", message.getHeader("Date")[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMessage() throws MessagingException, IOException {
|
|
||||||
MimeMessage message;
|
|
||||||
ByteArrayOutputStream out;
|
|
||||||
|
|
||||||
BinaryTempFileBody.setTempDirectory(context.getCacheDir());
|
|
||||||
|
|
||||||
mMimeBoundary = 101;
|
|
||||||
message = nestedMessage(nestedMessage(sampleMessage()));
|
|
||||||
out = new ByteArrayOutputStream();
|
|
||||||
message.writeTo(out);
|
|
||||||
assertEquals(SEVEN_BIT_RESULT, out.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private MimeMessage nestedMessage(MimeMessage subMessage)
|
|
||||||
throws MessagingException, IOException {
|
|
||||||
BinaryTempFileMessageBody tempMessageBody = new BinaryTempFileMessageBody(MimeUtil.ENC_8BIT);
|
|
||||||
|
|
||||||
OutputStream out = tempMessageBody.getOutputStream();
|
|
||||||
try {
|
|
||||||
subMessage.writeTo(out);
|
|
||||||
} finally {
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
MimeBodyPart bodyPart = new MimeBodyPart(tempMessageBody, "message/rfc822");
|
|
||||||
bodyPart.setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, "attachment");
|
|
||||||
bodyPart.setEncoding(MimeUtil.ENC_7BIT);
|
|
||||||
|
|
||||||
MimeMessage parentMessage = sampleMessage();
|
|
||||||
((Multipart) parentMessage.getBody()).addBodyPart(bodyPart);
|
|
||||||
|
|
||||||
return parentMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MimeMessage sampleMessage() throws MessagingException, IOException {
|
|
||||||
MimeMessage message = new MimeMessage();
|
|
||||||
message.setFrom(new Address("from@example.com"));
|
|
||||||
message.setRecipient(RecipientType.TO, new Address("to@example.com"));
|
|
||||||
message.setSubject("Test Message");
|
|
||||||
message.setHeader("Date", "Wed, 28 Aug 2013 08:51:09 -0400");
|
|
||||||
message.setEncoding(MimeUtil.ENC_7BIT);
|
|
||||||
|
|
||||||
MimeMultipart multipartBody = new MimeMultipart("multipart/mixed", generateBoundary());
|
|
||||||
multipartBody.addBodyPart(textBodyPart());
|
|
||||||
multipartBody.addBodyPart(binaryBodyPart());
|
|
||||||
MimeMessageHelper.setBody(message, multipartBody);
|
|
||||||
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MimeBodyPart binaryBodyPart() throws IOException,
|
|
||||||
MessagingException {
|
|
||||||
String encodedTestString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
||||||
+ "abcdefghijklmnopqrstuvwxyz0123456789+/\r\n";
|
|
||||||
|
|
||||||
BinaryTempFileBody tempFileBody = new BinaryTempFileBody(MimeUtil.ENC_BASE64);
|
|
||||||
|
|
||||||
InputStream in = new ByteArrayInputStream(
|
|
||||||
encodedTestString.getBytes("UTF-8"));
|
|
||||||
|
|
||||||
OutputStream out = tempFileBody.getOutputStream();
|
|
||||||
try {
|
|
||||||
IOUtils.copy(in, out);
|
|
||||||
} finally {
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
MimeBodyPart bodyPart = new MimeBodyPart(tempFileBody,
|
|
||||||
"application/octet-stream");
|
|
||||||
bodyPart.setEncoding(MimeUtil.ENC_BASE64);
|
|
||||||
|
|
||||||
return bodyPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MimeBodyPart textBodyPart() throws MessagingException {
|
|
||||||
TextBody textBody = new TextBody(
|
|
||||||
"Testing.\r\n"
|
|
||||||
+ "This is a text body with some greek characters.\r\n"
|
|
||||||
+ "αβγδεζηθ\r\n"
|
|
||||||
+ "End of test.\r\n");
|
|
||||||
textBody.setCharset("utf-8");
|
|
||||||
|
|
||||||
MimeBodyPart bodyPart = new MimeBodyPart();
|
|
||||||
MimeMessageHelper.setBody(bodyPart, textBody);
|
|
||||||
CharsetSupport.setCharset("utf-8", bodyPart);
|
|
||||||
return bodyPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String generateBoundary() {
|
|
||||||
return "----Boundary" + Integer.toString(mMimeBoundary++);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testToBodyPart() throws MessagingException, IOException {
|
|
||||||
MimeMessage message;
|
|
||||||
ByteArrayOutputStream out;
|
|
||||||
|
|
||||||
BinaryTempFileBody.setTempDirectory(context.getCacheDir());
|
|
||||||
|
|
||||||
mMimeBoundary = 101;
|
|
||||||
message = nestedMessage(nestedMessage(sampleMessage()));
|
|
||||||
out = new ByteArrayOutputStream();
|
|
||||||
MimeBodyPart bodyPart = message.toBodyPart();
|
|
||||||
bodyPart.writeTo(out);
|
|
||||||
assertEquals(TO_BODY_PART_RESULT, out.toString());
|
|
||||||
}
|
|
||||||
}
|
|
324
k9mail-library/src/test/java/com/fsck/k9/mail/MessageTest.kt
Normal file
324
k9mail-library/src/test/java/com/fsck/k9/mail/MessageTest.kt
Normal file
|
@ -0,0 +1,324 @@
|
||||||
|
package com.fsck.k9.mail
|
||||||
|
|
||||||
|
|
||||||
|
import com.fsck.k9.mail.Message.RecipientType
|
||||||
|
import com.fsck.k9.mail.internet.*
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import okio.Buffer
|
||||||
|
import org.apache.james.mime4j.util.MimeUtil
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.robolectric.RuntimeEnvironment
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
@RunWith(K9LibRobolectricTestRunner::class)
|
||||||
|
class MessageTest {
|
||||||
|
private val context = RuntimeEnvironment.application
|
||||||
|
private var mimeBoundary: Int = 0
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"))
|
||||||
|
BinaryTempFileBody.setTempDirectory(context.cacheDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setSendDate_shouldSetSendDate() {
|
||||||
|
val message = sampleMessage()
|
||||||
|
val date = Date(0L)
|
||||||
|
|
||||||
|
message.setSentDate(date, false)
|
||||||
|
|
||||||
|
assertThat(message.sentDate).isEqualTo(date)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setSendDate_withoutHidingTimeZone_shouldCreateDateHeaderWithTimezone() {
|
||||||
|
val message = sampleMessage()
|
||||||
|
|
||||||
|
message.setSentDate(Date(0L), false)
|
||||||
|
|
||||||
|
assertThat(message.getFirstHeader("Date")).isEqualTo("Thu, 01 Jan 1970 09:00:00 +0900")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setSendDate_withHidingTimeZone_shouldCreateDateHeaderWithTimezoneSetToZero() {
|
||||||
|
val message = sampleMessage()
|
||||||
|
|
||||||
|
message.setSentDate(Date(0L), true)
|
||||||
|
|
||||||
|
assertThat(message.getFirstHeader("Date")).isEqualTo("Thu, 01 Jan 1970 00:00:00 +0000")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun writeTo_withNestedMessage() {
|
||||||
|
mimeBoundary = 101
|
||||||
|
val message = nestedMessage(nestedMessage(sampleMessage()))
|
||||||
|
val out = ByteArrayOutputStream()
|
||||||
|
|
||||||
|
message.writeTo(out)
|
||||||
|
|
||||||
|
assertThat(out.toString()).isEqualTo("""
|
||||||
|
From: from@example.com
|
||||||
|
To: to@example.com
|
||||||
|
Subject: Test Message
|
||||||
|
Date: Wed, 28 Aug 2013 08:51:09 -0400
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="----Boundary103"
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
------Boundary103
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
Testing=2E
|
||||||
|
This is a text body with some greek characters=2E
|
||||||
|
=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8
|
||||||
|
End of test=2E
|
||||||
|
|
||||||
|
------Boundary103
|
||||||
|
Content-Type: application/octet-stream
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
|
||||||
|
|
||||||
|
------Boundary103
|
||||||
|
Content-Type: message/rfc822
|
||||||
|
Content-Disposition: attachment
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
From: from@example.com
|
||||||
|
To: to@example.com
|
||||||
|
Subject: Test Message
|
||||||
|
Date: Wed, 28 Aug 2013 08:51:09 -0400
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="----Boundary102"
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
------Boundary102
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
Testing=2E
|
||||||
|
This is a text body with some greek characters=2E
|
||||||
|
=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8
|
||||||
|
End of test=2E
|
||||||
|
|
||||||
|
------Boundary102
|
||||||
|
Content-Type: application/octet-stream
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
|
||||||
|
|
||||||
|
------Boundary102
|
||||||
|
Content-Type: message/rfc822
|
||||||
|
Content-Disposition: attachment
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
From: from@example.com
|
||||||
|
To: to@example.com
|
||||||
|
Subject: Test Message
|
||||||
|
Date: Wed, 28 Aug 2013 08:51:09 -0400
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="----Boundary101"
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
------Boundary101
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
Testing=2E
|
||||||
|
This is a text body with some greek characters=2E
|
||||||
|
=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8
|
||||||
|
End of test=2E
|
||||||
|
|
||||||
|
------Boundary101
|
||||||
|
Content-Type: application/octet-stream
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
|
||||||
|
|
||||||
|
------Boundary101--
|
||||||
|
|
||||||
|
------Boundary102--
|
||||||
|
|
||||||
|
------Boundary103--
|
||||||
|
|
||||||
|
""".trimIndent().crlf())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun toBodyPart() {
|
||||||
|
mimeBoundary = 101
|
||||||
|
val message = nestedMessage(nestedMessage(sampleMessage()))
|
||||||
|
val out = ByteArrayOutputStream()
|
||||||
|
val bodyPart = message.toBodyPart()
|
||||||
|
|
||||||
|
bodyPart.writeTo(out)
|
||||||
|
|
||||||
|
assertThat(out.toString()).isEqualTo("""
|
||||||
|
Content-Type: multipart/mixed; boundary="----Boundary103"
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
------Boundary103
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
Testing=2E
|
||||||
|
This is a text body with some greek characters=2E
|
||||||
|
=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8
|
||||||
|
End of test=2E
|
||||||
|
|
||||||
|
------Boundary103
|
||||||
|
Content-Type: application/octet-stream
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
|
||||||
|
|
||||||
|
------Boundary103
|
||||||
|
Content-Type: message/rfc822
|
||||||
|
Content-Disposition: attachment
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
From: from@example.com
|
||||||
|
To: to@example.com
|
||||||
|
Subject: Test Message
|
||||||
|
Date: Wed, 28 Aug 2013 08:51:09 -0400
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="----Boundary102"
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
------Boundary102
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
Testing=2E
|
||||||
|
This is a text body with some greek characters=2E
|
||||||
|
=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8
|
||||||
|
End of test=2E
|
||||||
|
|
||||||
|
------Boundary102
|
||||||
|
Content-Type: application/octet-stream
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
|
||||||
|
|
||||||
|
------Boundary102
|
||||||
|
Content-Type: message/rfc822
|
||||||
|
Content-Disposition: attachment
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
From: from@example.com
|
||||||
|
To: to@example.com
|
||||||
|
Subject: Test Message
|
||||||
|
Date: Wed, 28 Aug 2013 08:51:09 -0400
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: multipart/mixed; boundary="----Boundary101"
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
|
||||||
|
------Boundary101
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
Testing=2E
|
||||||
|
This is a text body with some greek characters=2E
|
||||||
|
=CE=B1=CE=B2=CE=B3=CE=B4=CE=B5=CE=B6=CE=B7=CE=B8
|
||||||
|
End of test=2E
|
||||||
|
|
||||||
|
------Boundary101
|
||||||
|
Content-Type: application/octet-stream
|
||||||
|
Content-Transfer-Encoding: base64
|
||||||
|
|
||||||
|
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
|
||||||
|
|
||||||
|
------Boundary101--
|
||||||
|
|
||||||
|
------Boundary102--
|
||||||
|
|
||||||
|
------Boundary103--
|
||||||
|
|
||||||
|
""".trimIndent().crlf())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun sampleMessage(): MimeMessage {
|
||||||
|
val message = MimeMessage().apply {
|
||||||
|
setFrom(Address("from@example.com"))
|
||||||
|
setRecipient(RecipientType.TO, Address("to@example.com"))
|
||||||
|
subject = "Test Message"
|
||||||
|
setHeader("Date", "Wed, 28 Aug 2013 08:51:09 -0400")
|
||||||
|
setEncoding(MimeUtil.ENC_7BIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
val multipartBody = MimeMultipart("multipart/mixed", generateBoundary()).apply {
|
||||||
|
addBodyPart(textBodyPart())
|
||||||
|
addBodyPart(binaryBodyPart())
|
||||||
|
}
|
||||||
|
|
||||||
|
MimeMessageHelper.setBody(message, multipartBody)
|
||||||
|
|
||||||
|
return message
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun nestedMessage(subMessage: MimeMessage): MimeMessage {
|
||||||
|
val tempMessageBody = BinaryTempFileMessageBody(MimeUtil.ENC_8BIT).apply {
|
||||||
|
outputStream.use { subMessage.writeTo(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
val bodyPart = MimeBodyPart(tempMessageBody, "message/rfc822").apply {
|
||||||
|
setHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, "attachment")
|
||||||
|
setEncoding(MimeUtil.ENC_7BIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sampleMessage().apply {
|
||||||
|
val multipart = body as Multipart
|
||||||
|
multipart.addBodyPart(bodyPart)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun binaryBodyPart(): MimeBodyPart {
|
||||||
|
val buffer = Buffer().writeUtf8("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\r\n")
|
||||||
|
val tempFileBody = BinaryTempFileBody(MimeUtil.ENC_BASE64).apply {
|
||||||
|
outputStream.use { buffer.writeTo(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
return MimeBodyPart(tempFileBody, "application/octet-stream").apply {
|
||||||
|
setEncoding(MimeUtil.ENC_BASE64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun textBodyPart(): MimeBodyPart {
|
||||||
|
val textBody = TextBody("""
|
||||||
|
Testing.
|
||||||
|
This is a text body with some greek characters.
|
||||||
|
αβγδεζηθ
|
||||||
|
End of test.
|
||||||
|
|
||||||
|
""".trimIndent().crlf()
|
||||||
|
).apply {
|
||||||
|
setCharset("utf-8")
|
||||||
|
}
|
||||||
|
|
||||||
|
return MimeBodyPart().apply {
|
||||||
|
MimeMessageHelper.setBody(this, textBody)
|
||||||
|
CharsetSupport.setCharset("utf-8", this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateBoundary(): String {
|
||||||
|
return "----Boundary${mimeBoundary++}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Message.getFirstHeader(header: String): String = getHeader(header)[0]
|
||||||
|
|
||||||
|
private fun String.crlf() = replace("\n", "\r\n")
|
|
@ -1,4 +1,5 @@
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
if (!rootProject.optimizeForDevelopment) {
|
if (!rootProject.optimizeForDevelopment) {
|
||||||
apply from: '../gradle/plugins/checkstyle-android.gradle'
|
apply from: '../gradle/plugins/checkstyle-android.gradle'
|
||||||
|
@ -39,8 +40,10 @@ dependencies {
|
||||||
|
|
||||||
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
|
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
|
||||||
|
|
||||||
|
testCompile "org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlinVersion}"
|
||||||
testCompile "org.robolectric:robolectric:${robolectricVersion}"
|
testCompile "org.robolectric:robolectric:${robolectricVersion}"
|
||||||
testCompile "junit:junit:${junitVersion}"
|
testCompile "junit:junit:${junitVersion}"
|
||||||
|
testCompile "com.google.truth:truth:${truthVersion}"
|
||||||
testCompile "org.mockito:mockito-core:${mockitoVersion}"
|
testCompile "org.mockito:mockito-core:${mockitoVersion}"
|
||||||
testCompile "org.jdom:jdom2:2.0.6"
|
testCompile "org.jdom:jdom2:2.0.6"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
package com.fsck.k9.view;
|
|
||||||
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
|
|
||||||
import com.fsck.k9.K9RobolectricTestRunner;
|
|
||||||
import com.fsck.k9.mail.Address;
|
|
||||||
import com.fsck.k9.mail.Message;
|
|
||||||
import com.fsck.k9.mail.internet.MimeMessage;
|
|
||||||
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
|
|
||||||
@RunWith(K9RobolectricTestRunner.class)
|
|
||||||
public class MessageHeaderTest {
|
|
||||||
|
|
||||||
private static final Address FROM_ADDRESS = Address.parse("from@example1.com")[0];
|
|
||||||
private static final Address SENDER_ADDRESS = Address.parse("sender@example2.com")[0];
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldShowSender_withSender_shouldReturnTrue() {
|
|
||||||
Message message = createMessage(FROM_ADDRESS, SENDER_ADDRESS);
|
|
||||||
|
|
||||||
boolean showSender = MessageHeader.shouldShowSender(message);
|
|
||||||
|
|
||||||
assertTrue(showSender);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void shouldShowSender_withoutSender_shouldReturnFalse() {
|
|
||||||
Message message = createMessage(FROM_ADDRESS, null);
|
|
||||||
|
|
||||||
boolean showSender = MessageHeader.shouldShowSender(message);
|
|
||||||
|
|
||||||
assertFalse(showSender);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Message createMessage(Address from, Address sender) {
|
|
||||||
Message message = new MimeMessage();
|
|
||||||
message.setFrom(from);
|
|
||||||
message.setSender(sender);
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
}
|
|
37
k9mail/src/test/java/com/fsck/k9/view/MessageHeaderTest.kt
Normal file
37
k9mail/src/test/java/com/fsck/k9/view/MessageHeaderTest.kt
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
package com.fsck.k9.view
|
||||||
|
|
||||||
|
import com.fsck.k9.K9RobolectricTestRunner
|
||||||
|
import com.fsck.k9.mail.Address
|
||||||
|
import com.fsck.k9.mail.internet.MimeMessage
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@RunWith(K9RobolectricTestRunner::class)
|
||||||
|
class MessageHeaderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun shouldShowSender_withSender_shouldReturnTrue() {
|
||||||
|
val message = createMessage("from@example1.com", "sender@example2.com")
|
||||||
|
|
||||||
|
val showSender = MessageHeader.shouldShowSender(message)
|
||||||
|
|
||||||
|
assertThat(showSender).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun shouldShowSender_withoutSender_shouldReturnFalse() {
|
||||||
|
val message = createMessage("from@example1.com")
|
||||||
|
|
||||||
|
val showSender = MessageHeader.shouldShowSender(message)
|
||||||
|
|
||||||
|
assertThat(showSender).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createMessage(from: String, sender: String? = null) = MimeMessage().apply {
|
||||||
|
setFrom(from.toAddress())
|
||||||
|
setSender(sender?.toAddress())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.toAddress() = Address.parse(this)[0]
|
||||||
|
}
|
Loading…
Reference in a new issue