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