19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Leeimport com.android.internal.telephony.GsmAlphabet;
20b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class GsmAlphabetTest extends TestCase {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String sGsmExtendedChars = "{|}\\[~]\f\u20ac";
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void test7bitWithHeader() throws Exception {
3264c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();
3364c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        concatRef.refNumber = 1;
3464c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        concatRef.seqNumber = 2;
3564c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        concatRef.msgCount = 2;
3664c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        concatRef.isEightBits = true;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SmsHeader header = new SmsHeader();
3864c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        header.concatRef = concatRef;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4064c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        String message = "aaaaaaaaaabbbbbbbbbbcccccccccc";
4164c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink        byte[] userData = GsmAlphabet.stringToGsm7BitPackedWithHeader(message,
42b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby                SmsHeader.toByteArray(header), 0, 0);
43b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        int septetCount = GsmAlphabet.countGsmSeptetsUsingTables(message, true, 0, 0);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String parsedMessage = GsmAlphabet.gsm7BitPackedToString(
45b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby                userData, SmsHeader.toByteArray(header).length+2, septetCount, 1, 0, 0);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(message, parsedMessage);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // TODO: This method should *really* be a series of individual test methods.
50b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby    // However, it's a SmallTest because it executes quickly.
51b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby    @SmallTest
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testBasic() throws Exception {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // '@' maps to char 0
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0, GsmAlphabet.charToGsm('@'));
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56cbcd9be4104b3872902898b84fae92d1623fd8f1Jake Hamby        // `a (a with grave accent) maps to last GSM character
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0x7f, GsmAlphabet.charToGsm('\u00e0'));
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are the extended chars
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // They should all return GsmAlphabet.GSM_EXTENDED_ESCAPE
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0, s = sGsmExtendedChars.length(); i < s; i++) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(GsmAlphabet.GSM_EXTENDED_ESCAPE,
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    GsmAlphabet.charToGsm(sGsmExtendedChars.charAt(i)));
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // euro symbol
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(GsmAlphabet.GSM_EXTENDED_ESCAPE,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.charToGsm('\u20ac'));
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // An unmappable char (the 'cent' char) maps to a space
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(GsmAlphabet.charToGsm(' '),
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.charToGsm('\u00a2'));
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // unmappable = space = 1 septet
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(1, GsmAlphabet.countGsmSeptets('\u00a2'));
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test extended table
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0, s = sGsmExtendedChars.length(); i < s; i++) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(sGsmExtendedChars.charAt(i),
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    GsmAlphabet.gsmExtendedToChar(
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            GsmAlphabet.charToGsmExtended(sGsmExtendedChars.charAt(i))));
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Unmappable extended char
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(GsmAlphabet.charToGsm(' '),
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.charToGsmExtended('@'));
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // gsmToChar()
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals('@', GsmAlphabet.gsmToChar(0));
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
102b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // `a (a with grave accent) maps to last GSM character
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals('\u00e0', GsmAlphabet.gsmToChar(0x7f));
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals('\uffff',
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsmToChar(GsmAlphabet.GSM_EXTENDED_ESCAPE));
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Out-of-range/unmappable value
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(' ', GsmAlphabet.gsmToChar(0x80));
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // gsmExtendedToChar()
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals('{', GsmAlphabet.gsmExtendedToChar(0x28));
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // No double-escapes
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(' ', GsmAlphabet.gsmExtendedToChar(
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.GSM_EXTENDED_ESCAPE));
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
121b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // Reserved for extension to extension table (mapped to space)
122b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals(' ', GsmAlphabet.gsmExtendedToChar(GsmAlphabet.GSM_EXTENDED_ESCAPE));
123b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby
124b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // Unmappable (mapped to character in default or national locking shift table)
125b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals('@', GsmAlphabet.gsmExtendedToChar(0));
126b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals('\u00e0', GsmAlphabet.gsmExtendedToChar(0x7f));
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // stringTo7BitPacked, gsm7BitPackedToString
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] packed;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder testString = new StringBuilder(300);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Check all alignment cases
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 9; i++, testString.append('@')) {
137b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby            packed = GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(testString.toString(),
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    GsmAlphabet.gsm7BitPackedToString(packed, 1, 0xff & packed[0]));
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Check full non-extended alphabet
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 0x80; i++) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char c;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i == GsmAlphabet.GSM_EXTENDED_ESCAPE) {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            c = GsmAlphabet.gsmToChar(i);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            testString.append(c);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // These are all non-extended chars, so it should be
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // one septet per char
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(1, GsmAlphabet.countGsmSeptets(c));
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
158b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed = GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(testString.toString(),
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm7BitPackedToString(packed, 1, 0xff & packed[0]));
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test extended chars too
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testString.append(sGsmExtendedChars);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0, s = sGsmExtendedChars.length(); i < s; i++) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // These are all extended chars, so it should be
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // two septets per char
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals(2, GsmAlphabet.countGsmSeptets(sGsmExtendedChars.charAt(i)));
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
173b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed = GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(testString.toString(),
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm7BitPackedToString(packed, 1, 0xff & packed[0]));
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // stringTo7BitPacked handles up to 255 septets
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testString.setLength(0);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 255; i++) {
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            testString.append('@');
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
184b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed = GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(testString.toString(),
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm7BitPackedToString(packed, 1, 0xff & packed[0]));
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // > 255 septets throws runtime exception
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testString.append('@');
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
192b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby            GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("expected exception");
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (EncodeException ex) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // exception expected
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Try 254 septets with 127 extended chars
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testString.setLength(0);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < (255 / 2); i++) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            testString.append('{');
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
205b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed = GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(testString.toString(),
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm7BitPackedToString(packed, 1, 0xff & packed[0]));
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // > 255 septets throws runtime exception
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        testString.append('{');
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
213b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby            GsmAlphabet.stringToGsm7BitPacked(testString.toString(), 0, 0);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("expected exception");
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (EncodeException ex) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // exception expected
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // Reserved for extension to extension table (mapped to space)
220b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed = new byte[]{(byte)(0x1b | 0x80), 0x1b >> 1};
221b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals(" ", GsmAlphabet.gsm7BitPackedToString(packed, 0, 2));
222b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby
223b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // Unmappable (mapped to character in default alphabet table)
224b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed[0] = 0x1b;
225b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed[1] = 0x00;
226b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals("@", GsmAlphabet.gsm7BitPackedToString(packed, 0, 2));
227b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed[0] = (byte)(0x1b | 0x80);
228b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        packed[1] = (byte)(0x7f >> 1);
229b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals("\u00e0", GsmAlphabet.gsm7BitPackedToString(packed, 0, 2));
230b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // 8 bit unpacked format
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Note: we compare hex strings here
235b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // because Assert doesn't have array comparisons
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte unpacked[];
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239767a662ecde33c3979bf02b793d392aca0403162Wink Saville        unpacked = IccUtils.hexStringToBytes("566F696365204D61696C");
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Voice Mail",
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243767a662ecde33c3979bf02b793d392aca0403162Wink Saville        assertEquals(IccUtils.bytesToHexString(unpacked),
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville                IccUtils.bytesToHexString(
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        GsmAlphabet.stringToGsm8BitPacked("Voice Mail")));
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked = GsmAlphabet.stringToGsm8BitPacked(sGsmExtendedChars);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // two bytes for every extended char
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(2 * sGsmExtendedChars.length(), unpacked.length);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(sGsmExtendedChars,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // should be two bytes per extended char
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(2 * sGsmExtendedChars.length(), unpacked.length);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test truncation of unaligned extended chars
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked = new byte[3];
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmAlphabet.stringToGsm8BitUnpackedField(sGsmExtendedChars, unpacked,
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, unpacked.length);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Should be one extended char and an 0xff at the end
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0xff, 0xff & unpacked[2]);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(sGsmExtendedChars.substring(0, 1),
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test truncation of normal chars
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked = new byte[3];
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmAlphabet.stringToGsm8BitUnpackedField("abcd", unpacked,
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, unpacked.length);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("abc",
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test truncation of mixed normal and extended chars
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked = new byte[3];
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmAlphabet.stringToGsm8BitUnpackedField("a{cd", unpacked,
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, unpacked.length);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("a{",
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test padding after normal char
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked = new byte[3];
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmAlphabet.stringToGsm8BitUnpackedField("a", unpacked,
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                0, unpacked.length);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("a",
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0xff, 0xff & unpacked[1]);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0xff, 0xff & unpacked[2]);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test malformed input -- escape char followed by end of field
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked[0] = 0;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked[1] = 0;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked[2] = GsmAlphabet.GSM_EXTENDED_ESCAPE;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("@@",
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length));
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // non-zero offset
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("@",
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 1, unpacked.length - 1));
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // test non-zero offset
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked[0] = 0;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmAlphabet.stringToGsm8BitUnpackedField("abcd", unpacked,
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                1, unpacked.length - 1);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0, unpacked[0]);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("ab",
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 1, unpacked.length - 1));
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // test non-zero offset with truncated extended char
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unpacked[0] = 0;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmAlphabet.stringToGsm8BitUnpackedField("a{", unpacked,
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                1, unpacked.length - 1);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0, unpacked[0]);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("a",
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 1, unpacked.length - 1));
327b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby
328b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // Reserved for extension to extension table (mapped to space)
329b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        unpacked[0] = 0x1b;
330b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        unpacked[1] = 0x1b;
331b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals(" ", GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, 2));
332b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby
333b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        // Unmappable (mapped to character in default or national locking shift table)
334b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        unpacked[1] = 0x00;
335b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals("@", GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, 2));
336b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        unpacked[1] = 0x7f;
337b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby        assertEquals("\u00e0", GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, 2));
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
339b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee
340b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee    @SmallTest
341b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee    public void testGsm8BitUpackedWithEuckr() throws Exception {
342b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        // Some feature phones in Korea store contacts as euc-kr.
343b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        // Test this situations.
344b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        byte unpacked[];
345b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee
346b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        // Test general alphabet strings.
347b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        unpacked = IccUtils.hexStringToBytes("61626320646566FF");
348b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        assertEquals("abc def",
349b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length, "euc-kr"));
350b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee
351b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        // Test korean strings.
352b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        unpacked = IccUtils.hexStringToBytes("C5D7BDBAC6AEFF");
353b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        assertEquals("\uD14C\uC2A4\uD2B8",
354b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length, "euc-kr"));
355b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee
356b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        // Test gsm Extented Characters.
357b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        unpacked = GsmAlphabet.stringToGsm8BitPacked(sGsmExtendedChars);
358b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee        assertEquals(sGsmExtendedChars,
359b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee                GsmAlphabet.gsm8BitUnpackedToString(unpacked, 0, unpacked.length, "euc-kr"));
360b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
362