Automated import from //branches/master/...@142676,142676

This commit is contained in:
Tadashi Takaoka 2009-03-25 15:27:34 -07:00 committed by The Android Open Source Project
parent 9d8375cba6
commit 123ef48a0d
2 changed files with 78 additions and 4 deletions

View File

@ -518,12 +518,14 @@ public class EncoderUtil {
if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) { if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) {
return prefix + encodeB(bytes) + ENC_WORD_SUFFIX; return prefix + encodeB(bytes) + ENC_WORD_SUFFIX;
} else { } else {
String part1 = text.substring(0, text.length() / 2); int splitOffset = text.offsetByCodePoints(text.length() / 2, -1);
String part1 = text.substring(0, splitOffset);
byte[] bytes1 = encode(part1, charset); byte[] bytes1 = encode(part1, charset);
String word1 = encodeB(prefix, part1, usedCharacters, charset, String word1 = encodeB(prefix, part1, usedCharacters, charset,
bytes1); bytes1);
String part2 = text.substring(text.length() / 2); String part2 = text.substring(splitOffset);
byte[] bytes2 = encode(part2, charset); byte[] bytes2 = encode(part2, charset);
String word2 = encodeB(prefix, part2, 0, charset, bytes2); String word2 = encodeB(prefix, part2, 0, charset, bytes2);
@ -544,12 +546,14 @@ public class EncoderUtil {
if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) { if (totalLength <= ENCODED_WORD_MAX_LENGTH - usedCharacters) {
return prefix + encodeQ(bytes, usage) + ENC_WORD_SUFFIX; return prefix + encodeQ(bytes, usage) + ENC_WORD_SUFFIX;
} else { } else {
String part1 = text.substring(0, text.length() / 2); int splitOffset = text.offsetByCodePoints(text.length() / 2, -1);
String part1 = text.substring(0, splitOffset);
byte[] bytes1 = encode(part1, charset); byte[] bytes1 = encode(part1, charset);
String word1 = encodeQ(prefix, part1, usage, usedCharacters, String word1 = encodeQ(prefix, part1, usage, usedCharacters,
charset, bytes1); charset, bytes1);
String part2 = text.substring(text.length() / 2); String part2 = text.substring(splitOffset);
byte[] bytes2 = encode(part2, charset); byte[] bytes2 = encode(part2, charset);
String word2 = encodeQ(prefix, part2, usage, 0, charset, bytes2); String word2 = encodeQ(prefix, part2, usage, 0, charset, bytes2);

View File

@ -50,6 +50,38 @@ public class MimeUtilityTest extends TestCase {
/** a string without any unicode */ /** a string without any unicode */
private final String SHORT_PLAIN = "abcd"; private final String SHORT_PLAIN = "abcd";
/** long subject which will be split into two MIME/Base64 chunks */
private final String LONG_UNICODE_SPLIT =
"$" +
"\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC" +
"\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC\u20AC";
private final String LONG_UNICODE_SPLIT_ENCODED =
"=?UTF-8?B?JOKCrOKCrOKCrOKCrOKCrOKCrOKCrOKCrA==?=" + "\r\n " +
"=?UTF-8?B?4oKs4oKs4oKs4oKs4oKs4oKs4oKs4oKs4oKs4oKs4oKs4oKs?=";
/** strings that use supplemental characters and really stress encode/decode */
// actually it's U+10400
private final String SHORT_SUPPLEMENTAL = "\uD801\uDC00";
private final String SHORT_SUPPLEMENTAL_ENCODED = "=?UTF-8?B?8JCQgA==?=";
private final String LONG_SUPPLEMENTAL = SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL +
SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL +
SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL;
private final String LONG_SUPPLEMENTAL_ENCODED =
"=?UTF-8?B?8JCQgPCQkIDwkJCA8JCQgA==?=" + "\r\n " +
"=?UTF-8?B?8JCQgPCQkIDwkJCA8JCQgPCQkIDwkJCA?=";
private final String LONG_SUPPLEMENTAL_2 = "a" + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL +
SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL +
SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL + SHORT_SUPPLEMENTAL;
private final String LONG_SUPPLEMENTAL_ENCODED_2 =
"=?UTF-8?B?YfCQkIDwkJCA8JCQgPCQkIA=?=" + "\r\n " +
"=?UTF-8?B?8JCQgPCQkIDwkJCA8JCQgPCQkIDwkJCA?=";
// Earth is U+1D300.
private final String LONG_SUPPLEMENTAL_QP =
"*Monogram for Earth \uD834\uDF00. Monogram for Human \u268b.";
private final String LONG_SUPPLEMENTAL_QP_ENCODED =
"=?UTF-8?Q?*Monogram_for_Earth_?=" + "\r\n " +
"=?UTF-8?Q?=F0=9D=8C=80._Monogram_for_Human_=E2=9A=8B.?=";
/** a typical no-param header */ /** a typical no-param header */
private final String HEADER_NO_PARAMETER = private final String HEADER_NO_PARAMETER =
"header"; "header";
@ -172,6 +204,44 @@ public class MimeUtilityTest extends TestCase {
assertEquals(SHORT_UNICODE_ENCODED, result1); assertEquals(SHORT_UNICODE_ENCODED, result1);
} }
/**
* Test that foldAndEncode2 is working for long strings which needs splitting.
*/
public void testFoldAndEncode2WithLongSplit() {
String result = MimeUtility.foldAndEncode2(LONG_UNICODE_SPLIT, "Subject: ".length());
assertEquals("long string", LONG_UNICODE_SPLIT_ENCODED, result);
}
/**
* Tests of foldAndEncode2 that involve supplemental characters (UTF-32)
*
* Note that the difference between LONG_SUPPLEMENTAL and LONG_SUPPLEMENTAL_2 is the
* insertion of a single character at the head of the string. This is intended to disrupt
* the code that splits the long string into multiple encoded words, and confirm that it
* properly applies the breaks between UTF-32 code points.
*/
public void testFoldAndEncode2Supplemental() {
String result1 = MimeUtility.foldAndEncode2(SHORT_SUPPLEMENTAL, "Subject: ".length());
String result2 = MimeUtility.foldAndEncode2(LONG_SUPPLEMENTAL, "Subject: ".length());
String result3 = MimeUtility.foldAndEncode2(LONG_SUPPLEMENTAL_2, "Subject: ".length());
assertEquals("short supplemental", SHORT_SUPPLEMENTAL_ENCODED, result1);
assertEquals("long supplemental", LONG_SUPPLEMENTAL_ENCODED, result2);
assertEquals("long supplemental 2", LONG_SUPPLEMENTAL_ENCODED_2, result3);
}
/**
* Tests of foldAndEncode2 that involve supplemental characters (UTF-32)
*
* Note that the difference between LONG_SUPPLEMENTAL and LONG_SUPPLEMENTAL_QP is that
* the former will be encoded as base64 but the latter will be encoded as quoted printable.
*/
public void testFoldAndEncode2SupplementalQuotedPrintable() {
String result = MimeUtility.foldAndEncode2(LONG_SUPPLEMENTAL_QP, "Subject: ".length());
assertEquals("long supplement quoted printable",
LONG_SUPPLEMENTAL_QP_ENCODED, result);
}
// TODO: more tests for foldAndEncode2(String s) // TODO: more tests for foldAndEncode2(String s)
// TODO: more tests for fold(String s, int usedCharacters) // TODO: more tests for fold(String s, int usedCharacters)