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