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