/* Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.exchange.utility; import com.android.emailcommon.utility.Utility; import android.test.suitebuilder.annotation.SmallTest; import junit.framework.TestCase; /** * Test for {@link SimpleIcsWriter}. * You can run this entire test case with: * runtest -c com.android.exchange.utility.SimpleIcsWriterTests exchange */ @SmallTest public class SimpleIcsWriterTests extends TestCase { private static final String CRLF = "\r\n"; private static final String UTF8_1_BYTE = "a"; private static final String UTF8_2_BYTES = "\u00A2"; private static final String UTF8_3_BYTES = "\u20AC"; private static final String UTF8_4_BYTES = "\uD852\uDF62"; /** * Test for {@link SimpleIcsWriter#writeTag}. It also covers {@link SimpleIcsWriter#getBytes()} * and {@link SimpleIcsWriter#escapeTextValue}. */ public void testWriteTag() { final SimpleIcsWriter ics = new SimpleIcsWriter(); ics.writeTag("TAG1", null); ics.writeTag("TAG2", ""); ics.writeTag("TAG3", "xyz"); ics.writeTag("SUMMARY", "TEST-TEST,;\r\n\\TEST"); ics.writeTag("SUMMARY2", "TEST-TEST,;\r\n\\TEST"); final String actual = Utility.fromUtf8(ics.getBytes()); assertEquals( "TAG3:xyz" + CRLF + "SUMMARY:TEST-TEST\\,\\;\\n\\\\TEST" + CRLF + // escaped "SUMMARY2:TEST-TEST,;\r\n\\TEST" + CRLF // not escaped , actual); } /** * Verify that: We're folding lines correctly, and we're not splitting up a UTF-8 character. */ public void testWriteLine() { for (String last : new String[] {UTF8_1_BYTE, UTF8_2_BYTES, UTF8_3_BYTES, UTF8_4_BYTES}) { for (int i = 70; i < 160; i++) { String input = stringOfLength(i) + last; checkWriteLine(input); } } } /** * @return a String of {@code length} bytes in UTF-8. */ private static String stringOfLength(int length) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { sb.append('0' +(i % 10)); } return sb.toString(); } private void checkWriteLine(String input) { final SimpleIcsWriter ics = new SimpleIcsWriter(); ics.writeLine(input); final byte[] bytes = ics.getBytes(); // Verify that no lines are longer than 75 bytes. int numBytes = 0; for (byte b : bytes) { if (b == '\r') { continue; // ignore } if (b == '\n') { assertTrue("input=" + input, numBytes <= 75); numBytes = 0; continue; } numBytes++; } assertTrue("input=" + input, numBytes <= 75); // If we're splitting up a UTF-8 character, fromUtf8() won't restore it correctly. // If it becomes the same as input, we're doing the right thing. final String actual = Utility.fromUtf8(bytes); final String unfolded = actual.replace("\r\n\t", ""); assertEquals("input=" + input, input + "\r\n", unfolded); } public void testQuoteParamValue() { assertNull(SimpleIcsWriter.quoteParamValue(null)); assertEquals("\"\"", SimpleIcsWriter.quoteParamValue("")); assertEquals("\"a\"", SimpleIcsWriter.quoteParamValue("a")); assertEquals("\"''\"", SimpleIcsWriter.quoteParamValue("\"'")); assertEquals("\"abc\"", SimpleIcsWriter.quoteParamValue("abc")); assertEquals("\"a'b'c\"", SimpleIcsWriter.quoteParamValue("a\"b\"c")); } }