117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby/* 217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * Copyright (C) 2010 The Android Open Source Project 317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * 417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * you may not use this file except in compliance with the License. 617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * You may obtain a copy of the License at 717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * 817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * http://www.apache.org/licenses/LICENSE-2.0 917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * 1017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * Unless required by applicable law or agreed to in writing, software 1117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 1217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * See the License for the specific language governing permissions and 1417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby * limitations under the License. 1517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby */ 1617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 1717f616823a562ceb3a008f91e05d43bc56d37caeJake Hambypackage com.android.internal.telephony; 1817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 1917f616823a562ceb3a008f91e05d43bc56d37caeJake Hambyimport android.telephony.SmsMessage; 2017f616823a562ceb3a008f91e05d43bc56d37caeJake Hambyimport android.telephony.TelephonyManager; 2117f616823a562ceb3a008f91e05d43bc56d37caeJake Hambyimport android.test.AndroidTestCase; 22b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport android.test.suitebuilder.annotation.LargeTest; 23b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport android.test.suitebuilder.annotation.MediumTest; 2417f616823a562ceb3a008f91e05d43bc56d37caeJake Hambyimport android.test.suitebuilder.annotation.SmallTest; 25b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport android.util.Log; 2617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 27b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport java.util.Random; 28b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 29b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport static android.telephony.SmsMessage.MAX_USER_DATA_BYTES; 30b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport static android.telephony.SmsMessage.MAX_USER_DATA_BYTES_WITH_HEADER; 3117f616823a562ceb3a008f91e05d43bc56d37caeJake Hambyimport static android.telephony.SmsMessage.MAX_USER_DATA_SEPTETS; 32b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyimport static android.telephony.SmsMessage.MAX_USER_DATA_SEPTETS_WITH_HEADER; 3317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 34b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby/** 35b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * Test cases to verify selection of the optimal 7 bit encoding tables 36b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * (for all combinations of enabled national language tables) for messages 37b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * containing Turkish, Spanish, Portuguese, Greek, and other symbols 38b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * present in the GSM default and national language tables defined in 39b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * 3GPP TS 23.038. Also verifies correct SMS encoding for CDMA, which only 40b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * supports the GSM 7 bit default alphabet, ASCII 8 bit, and UCS-2. 41b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * Tests both encoding variations: unsupported characters mapped to space, 42b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * and unsupported characters force entire message to UCS-2. 43b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 4417f616823a562ceb3a008f91e05d43bc56d37caeJake Hambypublic class SmsMessageBodyTest extends AndroidTestCase { 45b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String TAG = "SmsMessageBodyTest"; 4617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 47b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // ASCII chars in the GSM 7 bit default alphabet 4817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final String sAsciiChars = "@$_ !\"#%&'()*+,-./0123456789" + 4917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby ":;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n\r"; 50b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 51b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Unicode chars in the GSM 7 bit default alphabet and both locking shift tables 52b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGsmDefaultChars = "\u00a3\u00a5\u00e9\u00c7\u0394\u00c9" + 53b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby "\u00dc\u00a7\u00fc\u00e0"; 54b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 55b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Unicode chars in the GSM 7 bit default table and Turkish locking shift tables 56b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGsmDefaultAndTurkishTables = "\u00f9\u00f2\u00c5\u00e5\u00df" + 57b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby "\u00a4\u00c4\u00d6\u00d1\u00e4\u00f6\u00f1"; 58b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 59b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Unicode chars in the GSM 7 bit default table but not the locking shift tables 60b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGsmDefaultTableOnly = "\u00e8\u00ec\u00d8\u00f8\u00c6\u00e6" + 61b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby "\u00a1\u00bf"; 62b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 63b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // ASCII chars in the GSM default extension table 64b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGsmExtendedAsciiChars = "{}[]\f"; 65b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 66b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // chars in GSM default extension table and Portuguese locking shift table 67b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGsmExtendedPortugueseLocking = "^\\|~"; 68b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 69b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Euro currency symbol 7017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final String sGsmExtendedEuroSymbol = "\u20ac"; 71b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 72b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // CJK ideographs, Hiragana, Katakana, full width letters, Cyrillic, etc. 7317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final String sUnicodeChars = "\u4e00\u4e01\u4e02\u4e03" + 7417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d" + 7517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\u4e0e\u4e0f\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048" + 7617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8" + 7717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18" + 7817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\uff70\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78" + 7917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408" + 8017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby "\u00a2\u00a9\u00ae\u2122"; 8117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 82b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // chars in Turkish single shift and locking shift tables 83b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sTurkishChars = "\u0131\u011e\u011f\u015e\u015f\u0130"; 84b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 85b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // chars in Spanish single shift table and Portuguese single and locking shift tables 86b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sPortugueseAndSpanishChars = "\u00c1\u00e1\u00cd\u00ed" 87b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby + "\u00d3\u00f3\u00da\u00fa"; 88b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 89b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // chars in all national language tables but not in the standard GSM alphabets 90b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sNationalLanguageTablesOnly = "\u00e7"; 91b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 92b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // chars in Portuguese single shift and locking shift tables 93b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sPortugueseChars = "\u00ea\u00d4\u00f4\u00c0\u00c2\u00e2" 94b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby + "\u00ca\u00c3\u00d5\u00e3\u00f5"; 95b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 96b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // chars in Portuguese locking shift table only 97b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sPortugueseLockingShiftChars = "\u00aa\u221e\u00ba`"; 98b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 99b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Greek letters in GSM alphabet missing from Portuguese locking and single shift tables 100b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGreekLettersNotInPortugueseTables = "\u039b\u039e"; 101b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 102b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Greek letters in GSM alphabet and Portuguese single shift (but not locking shift) table 103b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String sGreekLettersInPortugueseShiftTable = 104b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby "\u03a6\u0393\u03a9\u03a0\u03a8\u03a3\u0398"; 105b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 106b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // List of classes of characters in SMS tables 107b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final String[] sCharacterClasses = { 108b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGsmExtendedAsciiChars, 109b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGsmExtendedPortugueseLocking, 110b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGsmDefaultChars, 111b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGsmDefaultAndTurkishTables, 112b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGsmDefaultTableOnly, 113b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGsmExtendedEuroSymbol, 114b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sUnicodeChars, 115b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sTurkishChars, 116b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sPortugueseChars, 117b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sPortugueseLockingShiftChars, 118b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sPortugueseAndSpanishChars, 119b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGreekLettersNotInPortugueseTables, 120b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sGreekLettersInPortugueseShiftTable, 121b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sNationalLanguageTablesOnly, 122b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sAsciiChars 123b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby }; 124b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 125b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int sNumCharacterClasses = sCharacterClasses.length; 126b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 127b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // For each character class, whether it is present in a particular char table. 128b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // First three entries are locking shift tables, followed by four single shift tables 129b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final boolean[][] sCharClassPresenceInTables = { 130b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // ASCII chars in all GSM extension tables 131b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, false, false, true, true, true, true}, 132b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // ASCII chars in all GSM extension tables and Portuguese locking shift table 133b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, false, true, true, true, true, true}, 134b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // non-ASCII chars in GSM default alphabet and all locking tables 135b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {true, true, true, false, false, false, false}, 136b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // non-ASCII chars in GSM default alphabet and Turkish locking shift table 137b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {true, true, false, false, false, false, false}, 138b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // non-ASCII chars in GSM default alphabet table only 139b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {true, false, false, false, false, false, false}, 140b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Euro symbol is present in several tables 141b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, true, true, true, true, true, true}, 142b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Unicode characters not present in any 7 bit tables 143b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, false, false, false, false, false, false}, 144b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Characters specific to Turkish language 145b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, true, false, false, true, false, false}, 146b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Characters in Portuguese single shift and locking shift tables 147b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, false, true, false, false, false, true}, 148b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Characters in Portuguese locking shift table only 149b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, false, true, false, false, false, false}, 150b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Chars in Spanish single shift and Portuguese single and locking shift tables 151b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, false, true, false, false, true, true}, 152b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Greek letters in GSM default alphabet missing from Portuguese tables 153b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {true, true, false, false, false, false, false}, 154b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Greek letters in GSM alphabet and Portuguese single shift table 155b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {true, true, false, false, false, false, true}, 156b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Chars in all national language tables but not the standard GSM tables 157b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {false, true, true, false, true, true, true}, 158b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // ASCII chars in GSM default alphabet 159b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {true, true, true, false, false, false, false} 160b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby }; 161b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 16217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final int sTestLengthCount = 12; 16317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 16417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final int[] sSeptetTestLengths = 16517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby { 0, 1, 2, 80, 159, 160, 161, 240, 305, 306, 307, 320}; 16617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 16717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final int[] sUnicodeTestLengths = 16817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby { 0, 1, 2, 35, 69, 70, 71, 100, 133, 134, 135, 160}; 16917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 17017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final int[] sTestMsgCounts = 17117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby { 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3}; 17217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 17317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final int[] sSeptetUnitsRemaining = 17417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby {160, 159, 158, 80, 1, 0, 145, 66, 1, 0, 152, 139}; 17517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 17617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private static final int[] sUnicodeUnitsRemaining = 17717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby { 70, 69, 68, 35, 1, 0, 63, 34, 1, 0, 66, 41}; 17817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 179b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Combinations of enabled GSM national language single shift tables 180b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int[][] sEnabledSingleShiftTables = { 181b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // GSM default alphabet only 182b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1}, // Turkish (single shift only) 183b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1}, // Turkish (single and locking shift) 184b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {2}, // Spanish 185b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {3}, // Portuguese (single shift only) 186b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {3}, // Portuguese (single and locking shift) 187b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 2}, // Turkish + Spanish (single shift only) 188b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 2}, // Turkish + Spanish (single and locking shift) 189b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 3}, // Turkish + Portuguese (single shift only) 190b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 3}, // Turkish + Portuguese (single and locking shift) 191b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {2, 3}, // Spanish + Portuguese (single shift only) 192b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {2, 3}, // Spanish + Portuguese (single and locking shift) 193b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 2, 3}, // Turkish, Spanish, Portuguese (single shift only) 194b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 2, 3}, // Turkish, Spanish, Portuguese (single and locking shift) 195b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13} // all language tables 196b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby }; 197b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 198b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Combinations of enabled GSM national language locking shift tables 199b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int[][] sEnabledLockingShiftTables = { 200b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // GSM default alphabet only 201b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Turkish (single shift only) 202b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1}, // Turkish (single and locking shift) 203b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Spanish (no locking shift table) 204b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Portuguese (single shift only) 205b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {3}, // Portuguese (single and locking shift) 206b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Turkish + Spanish (single shift only) 207b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1}, // Turkish + Spanish (single and locking shift) 208b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Turkish + Portuguese (single shift only) 209b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 3}, // Turkish + Portuguese (single and locking shift) 210b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Spanish + Portuguese (single shift only) 211b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {3}, // Spanish + Portuguese (single and locking shift) 212b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {}, // Turkish, Spanish, Portuguese (single shift only) 213b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 3}, // Turkish, Spanish, Portuguese (single and locking shift) 214b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13} // all language tables 215b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby }; 216b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 217b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // LanguagePair counter indexes to check for each entry above 218b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int[][] sLanguagePairIndexesByEnabledIndex = { 219b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0}, // default tables only 220b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1}, // Turkish (single shift only) 221b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 4, 5}, // Turkish (single and locking shift) 222b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 2}, // Spanish 223b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 3}, // Portuguese (single shift only) 224b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 3, 8, 11}, // Portuguese (single and locking shift) 225b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 2}, // Turkish + Spanish (single shift only) 226b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 2, 4, 5, 6}, // Turkish + Spanish (single and locking shift) 227b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 3}, // Turkish + Portuguese (single shift only) 228b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 3, 4, 5, 7, 8, 9, 11}, // Turkish + Portuguese (single and locking shift) 229b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 2, 3}, // Spanish + Portuguese (single shift only) 230b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 2, 3, 8, 10, 11}, // Spanish + Portuguese (single and locking shift) 231b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 2, 3}, // all languages (single shift only) 232b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, // all languages (single and locking shift) 233b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} // all languages (no Indic chars in test) 234b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby }; 235b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 236b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /** 237b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * User data header requires one octet for length. Count as one septet, because 238b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * all combinations of header elements below will have at least one free bit 239b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * when padding to the nearest septet boundary. 240b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 241b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int UDH_SEPTET_COST_LENGTH = 1; 242b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 243b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /** 244b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * Using a non-default language locking shift table OR single shift table 245b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * requires a user data header of 3 octets, or 4 septets, plus UDH length. 246b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 247b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int UDH_SEPTET_COST_ONE_SHIFT_TABLE = 4; 248b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 249b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /** 250b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * Using a non-default language locking shift table AND single shift table 251b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * requires a user data header of 6 octets, or 7 septets, plus UDH length. 252b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 253b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int UDH_SEPTET_COST_TWO_SHIFT_TABLES = 7; 254b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 255b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /** 256b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * Multi-part messages require a user data header of 5 octets, or 6 septets, 257b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby * plus UDH length. 258b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby */ 259b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static final int UDH_SEPTET_COST_CONCATENATED_MESSAGE = 6; 26017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 26117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby @SmallTest 26217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby public void testCalcLengthAscii() throws Exception { 26317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby StringBuilder sb = new StringBuilder(320); 264b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] values = {0, 0, 0, SmsMessage.ENCODING_7BIT, 0, 0}; 26517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int startPos = 0; 26617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int asciiCharsLen = sAsciiChars.length(); 26717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 26817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby for (int i = 0; i < sTestLengthCount; i++) { 26917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int len = sSeptetTestLengths[i]; 27017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertTrue(sb.length() <= len); 27117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 27217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby while (sb.length() < len) { 27317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int addCount = len - sb.length(); 27417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int endPos = (asciiCharsLen - startPos > addCount) ? 27517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby (startPos + addCount) : asciiCharsLen; 27617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby sb.append(sAsciiChars, startPos, endPos); 27717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby startPos = (endPos == asciiCharsLen) ? 0 : endPos; 27817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 27917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals(len, sb.length()); 28017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 28117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby String testStr = sb.toString(); 28217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values[0] = sTestMsgCounts[i]; 28317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values[1] = len; 28417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values[2] = sSeptetUnitsRemaining[i]; 28517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 28617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callGsmLengthMethods(testStr, false, values); 28717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callGsmLengthMethods(testStr, true, values); 28817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callCdmaLengthMethods(testStr, false, values); 28917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callCdmaLengthMethods(testStr, true, values); 29017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 29117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 29217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 29317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby @SmallTest 29417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby public void testCalcLengthUnicode() throws Exception { 29517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby StringBuilder sb = new StringBuilder(160); 296b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] values = {0, 0, 0, SmsMessage.ENCODING_16BIT, 0, 0}; 297b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] values7bit = {1, 0, 0, SmsMessage.ENCODING_7BIT, 0, 0}; 29817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int startPos = 0; 29917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int unicodeCharsLen = sUnicodeChars.length(); 30017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 30117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby // start with length 1: empty string uses ENCODING_7BIT 30217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby for (int i = 1; i < sTestLengthCount; i++) { 30317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int len = sUnicodeTestLengths[i]; 30417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertTrue(sb.length() <= len); 30517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 30617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby while (sb.length() < len) { 30717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int addCount = len - sb.length(); 30817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int endPos = (unicodeCharsLen - startPos > addCount) ? 30917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby (startPos + addCount) : unicodeCharsLen; 31017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby sb.append(sUnicodeChars, startPos, endPos); 31117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby startPos = (endPos == unicodeCharsLen) ? 0 : endPos; 31217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 31317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals(len, sb.length()); 31417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 31517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby String testStr = sb.toString(); 31617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values[0] = sTestMsgCounts[i]; 31717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values[1] = len; 31817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values[2] = sUnicodeUnitsRemaining[i]; 31917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values7bit[1] = len; 32017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values7bit[2] = MAX_USER_DATA_SEPTETS - len; 32117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 32217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callGsmLengthMethods(testStr, false, values); 32317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callCdmaLengthMethods(testStr, false, values); 32417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callGsmLengthMethods(testStr, true, values7bit); 32517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby callCdmaLengthMethods(testStr, true, values7bit); 32617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 32717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 32817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 329b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static class LanguagePair { 330b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // index is 2 for Portuguese locking shift because there is no Spanish locking shift table 331b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private final int langTableIndex; 332b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private final int langShiftTableIndex; 333b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int length; 334b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int missingChars7bit; 335b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 336b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby LanguagePair(int langTable, int langShiftTable) { 337b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby langTableIndex = langTable; 338b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby langShiftTableIndex = langShiftTable; 339b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 340b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 341b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby void clear() { 342b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby length = 0; 343b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby missingChars7bit = 0; 344b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 345b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 346b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby void addChar(boolean[] charClassTableRow) { 347b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (charClassTableRow[langTableIndex]) { 348b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby length++; 349b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else if (charClassTableRow[3 + langShiftTableIndex]) { 350b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby length += 2; 351b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 352b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby length++; // use ' ' for unmapped char in 7 bit only mode 353b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby missingChars7bit++; 354b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 355b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 356b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 357b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 358b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby private static class CounterHelper { 359b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby LanguagePair[] mCounters; 360b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] mStatsCounters; 361b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int mUnicodeCounter; 362b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 363b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby CounterHelper() { 364b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mCounters = new LanguagePair[12]; 365b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mStatsCounters = new int[12]; 366b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int i = 0; i < 12; i++) { 367b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mCounters[i] = new LanguagePair(i/4, i%4); 368b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 369b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 370b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 371b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby void clear() { 372b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Note: don't clear stats counters 373b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int i = 0; i < 12; i++) { 374b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mCounters[i].clear(); 375b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 376b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 377b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 378b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby void addChar(int charClass) { 379b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby boolean[] charClassTableRow = sCharClassPresenceInTables[charClass]; 380b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int i = 0; i < 12; i++) { 381b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mCounters[i].addChar(charClassTableRow); 382b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 383b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 384b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 385b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby void fillData(int enabledLangsIndex, boolean use7bitOnly, int[] values, int length) { 386b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] languagePairs = sLanguagePairIndexesByEnabledIndex[enabledLangsIndex]; 387b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int minNumSeptets = Integer.MAX_VALUE; 388b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int minNumSeptetsWithHeader = Integer.MAX_VALUE; 389b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int minNumMissingChars = Integer.MAX_VALUE; 390b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int langIndex = -1; 391b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int langShiftIndex = -1; 392b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int i : languagePairs) { 393b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby LanguagePair pair = mCounters[i]; 394b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int udhLength = 0; 395b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (i != 0) { 396b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength = UDH_SEPTET_COST_LENGTH; 397b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (i < 4 || i % 4 == 0) { 398b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength += UDH_SEPTET_COST_ONE_SHIFT_TABLE; 399b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 400b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength += UDH_SEPTET_COST_TWO_SHIFT_TABLES; 401b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 402b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 403b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int numSeptetsWithHeader; 404b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (pair.length > (MAX_USER_DATA_SEPTETS - udhLength)) { 405b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (udhLength == 0) { 406b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength = UDH_SEPTET_COST_LENGTH; 407b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 408b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength += UDH_SEPTET_COST_CONCATENATED_MESSAGE; 409b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int septetsPerPart = MAX_USER_DATA_SEPTETS - udhLength; 410b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int msgCount = (pair.length + septetsPerPart - 1) / septetsPerPart; 411b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby numSeptetsWithHeader = udhLength * msgCount + pair.length; 412b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 413b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby numSeptetsWithHeader = udhLength + pair.length; 414b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 415b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 416b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (use7bitOnly) { 417b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (pair.missingChars7bit < minNumMissingChars || (pair.missingChars7bit == 418b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby minNumMissingChars && numSeptetsWithHeader < minNumSeptetsWithHeader)) { 419b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby minNumSeptets = pair.length; 420b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby minNumSeptetsWithHeader = numSeptetsWithHeader; 421b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby minNumMissingChars = pair.missingChars7bit; 422b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby langIndex = pair.langTableIndex; 423b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby langShiftIndex = pair.langShiftTableIndex; 424b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 425b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 426b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (pair.missingChars7bit == 0 && numSeptetsWithHeader < minNumSeptetsWithHeader) { 427b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby minNumSeptets = pair.length; 428b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby minNumSeptetsWithHeader = numSeptetsWithHeader; 429b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby langIndex = pair.langTableIndex; 430b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby langShiftIndex = pair.langShiftTableIndex; 431b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 432b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 433b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 434b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (langIndex == -1) { 435b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // nothing matches, use values for Unicode 436b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int byteCount = length * 2; 437b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (byteCount > MAX_USER_DATA_BYTES) { 438b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[0] = (byteCount + MAX_USER_DATA_BYTES_WITH_HEADER - 1) / 439b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby MAX_USER_DATA_BYTES_WITH_HEADER; 440b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[2] = ((values[0] * MAX_USER_DATA_BYTES_WITH_HEADER) - byteCount) / 2; 441b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 442b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[0] = 1; 443b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[2] = (MAX_USER_DATA_BYTES - byteCount) / 2; 444b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 445b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[1] = length; 446b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[3] = SmsMessage.ENCODING_16BIT; 447b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[4] = 0; 448b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[5] = 0; 449b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mUnicodeCounter++; 450b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 451b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int udhLength = 0; 452b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (langIndex != 0 || langShiftIndex != 0) { 453b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength = UDH_SEPTET_COST_LENGTH; 454b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (langIndex == 0 || langShiftIndex == 0) { 455b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength += UDH_SEPTET_COST_ONE_SHIFT_TABLE; 456b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 457b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength += UDH_SEPTET_COST_TWO_SHIFT_TABLES; 458b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 459b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 460b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int msgCount; 461b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (minNumSeptets > (MAX_USER_DATA_SEPTETS - udhLength)) { 462b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (udhLength == 0) { 463b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength = UDH_SEPTET_COST_LENGTH; 464b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 465b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength += UDH_SEPTET_COST_CONCATENATED_MESSAGE; 466b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int septetsPerPart = MAX_USER_DATA_SEPTETS - udhLength; 467b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby msgCount = (minNumSeptets + septetsPerPart - 1) / septetsPerPart; 468b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } else { 469b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby msgCount = 1; 470b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 471b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[0] = msgCount; 472b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[1] = minNumSeptets; 473b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[2] = (values[0] * (MAX_USER_DATA_SEPTETS - udhLength)) - minNumSeptets; 474b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[3] = SmsMessage.ENCODING_7BIT; 475b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[4] = (langIndex == 2 ? 3 : langIndex); // Portuguese is code 3, index 2 476b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby values[5] = langShiftIndex; 477b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby assertEquals("minNumSeptetsWithHeader", minNumSeptetsWithHeader, 478b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby udhLength * msgCount + minNumSeptets); 479b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mStatsCounters[langIndex * 4 + langShiftIndex]++; 480b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 481b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 482b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 483b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby void printStats() { 484b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby Log.d(TAG, "Unicode selection count: " + mUnicodeCounter); 485b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int i = 0; i < 12; i++) { 486b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby Log.d(TAG, "Language pair index " + i + " count: " + mStatsCounters[i]); 487b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 488b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 489b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 490b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 491b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby @LargeTest 492b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby public void testCalcLengthMixed7bit() throws Exception { 493b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby StringBuilder sb = new StringBuilder(320); 494b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby CounterHelper ch = new CounterHelper(); 495b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby Random r = new Random(0x4321); // use the same seed for reproducibility 496b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] expectedValues = new int[6]; 497b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] origLockingShiftTables = GsmAlphabet.getEnabledLockingShiftTables(); 498b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int[] origSingleShiftTables = GsmAlphabet.getEnabledSingleShiftTables(); 499b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int enabledLanguagesTestCases = sEnabledSingleShiftTables.length; 500b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby long startTime = System.currentTimeMillis(); 501b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 502b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Repeat for 10 test runs 503b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int run = 0; run < 10; run++) { 504b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sb.setLength(0); 505b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ch.clear(); 506b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int unicodeOnlyCount = 0; 507b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 508b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Test incrementally from 1 to 320 character random messages 509b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int i = 1; i < 320; i++) { 510b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // 1% chance to add from each special character class, else add an ASCII char 511b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int charClass = r.nextInt(100); 512b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (charClass >= sNumCharacterClasses) { 513b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby charClass = sNumCharacterClasses - 1; // last class is ASCII 514b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 515b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby int classLength = sCharacterClasses[charClass].length(); 516b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby char nextChar = sCharacterClasses[charClass].charAt(r.nextInt(classLength)); 517b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby sb.append(nextChar); 518b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ch.addChar(charClass); 519b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 520b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby// if (i % 20 == 0) { 521b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby// Log.d(TAG, "test string: " + sb); 522b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby// } 523b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 524b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Test string against all combinations of enabled languages 525b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby boolean unicodeOnly = true; 526b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (int j = 0; j < enabledLanguagesTestCases; j++) { 527b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby GsmAlphabet.setEnabledSingleShiftTables(sEnabledSingleShiftTables[j]); 528b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby GsmAlphabet.setEnabledLockingShiftTables(sEnabledLockingShiftTables[j]); 529b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ch.fillData(j, false, expectedValues, i); 530b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (expectedValues[3] == SmsMessage.ENCODING_7BIT) { 531b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby unicodeOnly = false; 532b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 533b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby callGsmLengthMethods(sb, false, expectedValues); 534b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // test 7 bit only mode 535b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ch.fillData(j, true, expectedValues, i); 536b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby callGsmLengthMethods(sb, true, expectedValues); 537b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 538b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // after 10 iterations with a Unicode-only string, skip to next test string 539b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // so we can spend more time testing strings that do encode into 7 bits. 540b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (unicodeOnly && ++unicodeOnlyCount == 10) { 541b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby// Log.d(TAG, "Unicode only: skipping to next test string"); 542b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby break; 543b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 544b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 545b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 546b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ch.printStats(); 547b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby Log.d(TAG, "Completed in " + (System.currentTimeMillis() - startTime) + " ms"); 548b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby GsmAlphabet.setEnabledLockingShiftTables(origLockingShiftTables); 549b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby GsmAlphabet.setEnabledSingleShiftTables(origSingleShiftTables); 550b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 551b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 55217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private void callGsmLengthMethods(CharSequence msgBody, boolean use7bitOnly, 55317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int[] expectedValues) 55417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby { 55517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby // deprecated GSM-specific method 55617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int[] values = android.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly); 55717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("msgCount", expectedValues[0], values[0]); 55817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitCount", expectedValues[1], values[1]); 55917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitsRemaining", expectedValues[2], values[2]); 56017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitSize", expectedValues[3], values[3]); 56117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 56217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int activePhone = TelephonyManager.getDefault().getPhoneType(); 56317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby if (TelephonyManager.PHONE_TYPE_GSM == activePhone) { 56417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby values = android.telephony.SmsMessage.calculateLength(msgBody, use7bitOnly); 56517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("msgCount", expectedValues[0], values[0]); 56617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitCount", expectedValues[1], values[1]); 56717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitsRemaining", expectedValues[2], values[2]); 56817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitSize", expectedValues[3], values[3]); 56917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 57017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 57117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby SmsMessageBase.TextEncodingDetails ted = 57217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby com.android.internal.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly); 57317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("msgCount", expectedValues[0], ted.msgCount); 57417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitCount", expectedValues[1], ted.codeUnitCount); 57517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitsRemaining", expectedValues[2], ted.codeUnitsRemaining); 57617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitSize", expectedValues[3], ted.codeUnitSize); 577b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby assertEquals("languageTable", expectedValues[4], ted.languageTable); 578b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby assertEquals("languageShiftTable", expectedValues[5], ted.languageShiftTable); 57917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 58017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 58117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby private void callCdmaLengthMethods(CharSequence msgBody, boolean use7bitOnly, 58217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int[] expectedValues) 58317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby { 58417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int activePhone = TelephonyManager.getDefault().getPhoneType(); 58517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby if (TelephonyManager.PHONE_TYPE_CDMA == activePhone) { 58617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby int[] values = android.telephony.SmsMessage.calculateLength(msgBody, use7bitOnly); 58717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("msgCount", expectedValues[0], values[0]); 58817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitCount", expectedValues[1], values[1]); 58917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitsRemaining", expectedValues[2], values[2]); 59017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitSize", expectedValues[3], values[3]); 59117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 59217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 59317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby SmsMessageBase.TextEncodingDetails ted = 59417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly); 59517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("msgCount", expectedValues[0], ted.msgCount); 59617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitCount", expectedValues[1], ted.codeUnitCount); 59717f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitsRemaining", expectedValues[2], ted.codeUnitsRemaining); 59817f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitSize", expectedValues[3], ted.codeUnitSize); 59917f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby 60017f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby ted = com.android.internal.telephony.cdma.sms.BearerData.calcTextEncodingDetails(msgBody, use7bitOnly); 60117f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("msgCount", expectedValues[0], ted.msgCount); 60217f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitCount", expectedValues[1], ted.codeUnitCount); 60317f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitsRemaining", expectedValues[2], ted.codeUnitsRemaining); 60417f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby assertEquals("codeUnitSize", expectedValues[3], ted.codeUnitSize); 60517f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby } 60617f616823a562ceb3a008f91e05d43bc56d37caeJake Hamby} 607