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