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