| /* 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")); |
| } |
| } |