1d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/* Copyright (C) 2010 The Android Open Source Project
2d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
3d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Licensed under the Apache License, Version 2.0 (the "License");
4d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * you may not use this file except in compliance with the License.
5d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * You may obtain a copy of the License at
6d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
7d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *      http://www.apache.org/licenses/LICENSE-2.0
8d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
9d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Unless required by applicable law or agreed to in writing, software
10d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * distributed under the License is distributed on an "AS IS" BASIS,
11d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * See the License for the specific language governing permissions and
13d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * limitations under the License.
14d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
15d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
16d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpackage com.android.exchange.utility;
17d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
18d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.emailcommon.utility.Utility;
19d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
20d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.test.suitebuilder.annotation.SmallTest;
21d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
22d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport junit.framework.TestCase;
23d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
24d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/**
25d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Test for {@link SimpleIcsWriter}.
26d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * You can run this entire test case with:
27d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *   runtest -c com.android.exchange.utility.SimpleIcsWriterTests exchange
28d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
29d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank@SmallTest
30d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpublic class SimpleIcsWriterTests extends TestCase {
31d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private static final String CRLF = "\r\n";
32d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private static final String UTF8_1_BYTE = "a";
33d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private static final String UTF8_2_BYTES = "\u00A2";
34d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private static final String UTF8_3_BYTES = "\u20AC";
35d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private static final String UTF8_4_BYTES = "\uD852\uDF62";
36d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
37d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /**
38d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * Test for {@link SimpleIcsWriter#writeTag}.  It also covers {@link SimpleIcsWriter#getBytes()}
39d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * and {@link SimpleIcsWriter#escapeTextValue}.
40d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     */
41d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public void testWriteTag() {
42d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        final SimpleIcsWriter ics = new SimpleIcsWriter();
43d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        ics.writeTag("TAG1", null);
44d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        ics.writeTag("TAG2", "");
45d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        ics.writeTag("TAG3", "xyz");
46d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        ics.writeTag("SUMMARY", "TEST-TEST,;\r\n\\TEST");
47d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        ics.writeTag("SUMMARY2", "TEST-TEST,;\r\n\\TEST");
48d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        final String actual = Utility.fromUtf8(ics.getBytes());
49d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
50d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals(
51d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                "TAG3:xyz" + CRLF +
52d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                "SUMMARY:TEST-TEST\\,\\;\\n\\\\TEST" + CRLF + // escaped
53d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                "SUMMARY2:TEST-TEST,;\r\n\\TEST" + CRLF // not escaped
54d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                , actual);
55d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
56d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
57d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /**
58d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * Verify that: We're folding lines correctly, and we're not splitting up a UTF-8 character.
59d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     */
60d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public void testWriteLine() {
61d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        for (String last : new String[] {UTF8_1_BYTE, UTF8_2_BYTES, UTF8_3_BYTES, UTF8_4_BYTES}) {
62d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            for (int i = 70; i < 160; i++) {
63d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                String input = stringOfLength(i) + last;
64d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                checkWriteLine(input);
65d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
66d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
67d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
68d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
69d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /**
70d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * @return a String of {@code length} bytes in UTF-8.
71d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     */
72d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private static String stringOfLength(int length) {
73d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        StringBuilder sb = new StringBuilder();
74d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        for (int i = 0; i < length; i++) {
75d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            sb.append('0' +(i % 10));
76d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
77d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return sb.toString();
78d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
79d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
80d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private void checkWriteLine(String input) {
81d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        final SimpleIcsWriter ics = new SimpleIcsWriter();
82d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        ics.writeLine(input);
83d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        final byte[] bytes = ics.getBytes();
84d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
85d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        // Verify that no lines are longer than 75 bytes.
86d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        int numBytes = 0;
87d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        for (byte b : bytes) {
88d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            if (b == '\r') {
89d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                continue; // ignore
90d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
91d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            if (b == '\n') {
92d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                assertTrue("input=" + input, numBytes <= 75);
93d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                numBytes = 0;
94d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                continue;
95d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
96d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            numBytes++;
97d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
98d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertTrue("input=" + input, numBytes <= 75);
99d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
100d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        // If we're splitting up a UTF-8 character, fromUtf8() won't restore it correctly.
101d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        // If it becomes the same as input, we're doing the right thing.
102d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        final String actual = Utility.fromUtf8(bytes);
103d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        final String unfolded = actual.replace("\r\n\t", "");
104d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals("input=" + input, input + "\r\n", unfolded);
105d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
106d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
107d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public void testQuoteParamValue() {
108d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertNull(SimpleIcsWriter.quoteParamValue(null));
109d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals("\"\"", SimpleIcsWriter.quoteParamValue(""));
110d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals("\"a\"", SimpleIcsWriter.quoteParamValue("a"));
111d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals("\"''\"", SimpleIcsWriter.quoteParamValue("\"'"));
112d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals("\"abc\"", SimpleIcsWriter.quoteParamValue("abc"));
113d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        assertEquals("\"a'b'c\"", SimpleIcsWriter.quoteParamValue("a\"b\"c"));
114d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
115d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank}
116