1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.telephony;
18
19import android.database.Cursor;
20import android.database.MatrixCursor;
21import android.net.Uri;
22import android.telephony.TelephonyManager;
23import android.test.mock.MockContentProvider;
24import android.test.mock.MockContentResolver;
25import android.test.suitebuilder.annotation.SmallTest;
26
27import org.junit.After;
28import org.junit.Before;
29import org.junit.Test;
30
31import java.util.Arrays;
32
33import static org.junit.Assert.assertEquals;
34import static org.mockito.Matchers.anyInt;
35import static org.mockito.Mockito.doReturn;
36
37public class SmsNumberUtilsTest extends TelephonyTest {
38
39    private static final String TMO_MCC_MNC = "310260";
40    private static final String TAIWAN_FET_MCC_MNC = "46602";
41    private static final String INDIA_AIRTEL_MCC_MNC = "40553";
42    private static final String JAPAN_NTTDOCOMO_MCC_MNC = "44020";
43
44
45    // Simulate partial packages/providers/TelephonyProvider/res/xml/hbpcd_lookup_tables.xml
46    private class HbpcdContentProvider extends MockContentProvider {
47
48        public HbpcdContentProvider() {}
49
50        @Override
51        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
52                            String sortOrder) {
53            logd("HbpcdContentProvider: query");
54            logd("   uri = " + uri);
55            logd("   projection = " + Arrays.toString(projection));
56            logd("   selection = " + selection);
57            logd("   selectionArgs = " + Arrays.toString(selectionArgs));
58            logd("   sortOrder = " + sortOrder);
59
60            if (uri.compareTo(HbpcdLookup.MccIdd.CONTENT_URI) == 0) {
61                if (projection.length == 2 && projection[0].equals(HbpcdLookup.MccIdd.IDD) &&
62                        projection[1].equals(HbpcdLookup.MccIdd.MCC) && selectionArgs.length == 1) {
63                    MatrixCursor mc = new MatrixCursor(
64                            new String[]{HbpcdLookup.MccIdd.IDD});
65
66                    switch (Integer.parseInt(selectionArgs[0])) {
67                        case 310:
68                            mc.addRow(new Object[]{"011"}); // US IDD code
69                            break;
70                        case 466:
71                            mc.addRow(new Object[]{"002"}); // Taiwan IDD code
72                            break;
73                        case 440:
74                            mc.addRow(new Object[]{"010"}); // Japan IDD code
75                            break;
76                        case 405:
77                            mc.addRow(new Object[]{"010"}); // India IDD code
78                            break;
79                        default:
80                            logd("Unhandled MCC" + Integer.parseInt(selectionArgs[0]));
81                    }
82
83                    return mc;
84                } else {
85                    logd("Unhandled IDD look up request.");
86                }
87            } else if (uri.compareTo(HbpcdLookup.MccLookup.CONTENT_URI) == 0) {
88                if (projection.length == 1 && projection[0].equals(
89                        HbpcdLookup.MccLookup.COUNTRY_CODE) &&
90                        selection == null && selectionArgs == null) {
91                    MatrixCursor mccCursor = new MatrixCursor(
92                            new String[]{HbpcdLookup.MccLookup.COUNTRY_CODE});
93
94                    mccCursor.addRow(new Object[]{"1"});
95                    mccCursor.addRow(new Object[]{"886"});
96                    mccCursor.addRow(new Object[]{"81"});
97                    mccCursor.addRow(new Object[]{"91"});
98
99                    return mccCursor;
100                } else {
101                    logd("Unhandled mcc look up request");
102                }
103
104            } else {
105                logd("Unknown URI: " + uri);
106            }
107
108            return null;
109        }
110    }
111
112    HbpcdContentProvider mHbpcdContentProvider;
113
114    @Before
115    public void setUp() throws Exception {
116        logd("SmsNumberUtilsTest +Setup!");
117        super.setUp(getClass().getSimpleName());
118
119        mHbpcdContentProvider = new HbpcdContentProvider();
120
121        doReturn(TMO_MCC_MNC).when(mTelephonyManager).getNetworkOperator(anyInt());
122
123        ((MockContentResolver) mContextFixture.getTestDouble().getContentResolver())
124                .addProvider(HbpcdLookup.MccIdd.CONTENT_URI.getAuthority(), mHbpcdContentProvider);
125        mContextFixture.putStringArrayResource(
126                com.android.internal.R.array.config_sms_convert_destination_number_support,
127                new String[]{"true"});
128
129        logd("SmsNumberUtilsTest -Setup!");
130    }
131
132    @After
133    public void tearDown() throws Exception {
134        super.tearDown();
135    }
136
137    @Test
138    @SmallTest
139    public void testInvalidNumberConversion() {
140        assertEquals("123", SmsNumberUtils.filterDestAddr(mPhone, "123"));
141    }
142
143    @Test
144    @SmallTest
145    public void testNaPcCountryCodeAreaLocalNumberConversion() {
146        // NP_NANP_NBPCD_CC_AREA_LOCAL tests
147        doReturn(PhoneConstants.PHONE_TYPE_CDMA).when(mPhone).getPhoneType();
148        assertEquals("18583420022", SmsNumberUtils.filterDestAddr(mPhone, "+1-858-342-0022"));
149    }
150
151    @Test
152    @SmallTest
153    public void testPcCountryCodeAreaLocalNumberConversion() {
154        // NP_NBPCD_CC_AREA_LOCAL tests
155        assertEquals("01188671234567", SmsNumberUtils.filterDestAddr(mPhone, "+886-7-1234567"));
156    }
157
158    @Test
159    @SmallTest
160    public void testIndiaPcCountryCodeAreaLocalNumberConversion() {
161        // NP_NBPCD_CC_AREA_LOCAL tests
162        doReturn(INDIA_AIRTEL_MCC_MNC).when(mTelephonyManager).getNetworkOperator(anyInt());
163        assertEquals("0119172345678", SmsNumberUtils.filterDestAddr(mPhone, "+91-7-234-5678"));
164    }
165
166    @Test
167    @SmallTest
168    public void testPcHomeIddCountryCodeAreaLocalNumberConversion() {
169        // NP_NBPCD_HOMEIDD_CC_AREA_LOCAL tests
170        assertEquals("01188671234567", SmsNumberUtils.filterDestAddr(mPhone, "+011886-7-1234567"));
171    }
172
173    @Test
174    @SmallTest
175    public void testHomeIddCountryCodeAreaLocalNumberConversion() {
176        // NP_HOMEIDD_CC_AREA_LOCAL tests
177        assertEquals("01188671234567", SmsNumberUtils.filterDestAddr(mPhone, "011886-7-1234567"));
178    }
179
180    @Test
181    @SmallTest
182    public void testLocalIddCountryCodeAreaLocalNumberConversion() {
183        // NP_LOCALIDD_CC_AREA_LOCAL tests
184        doReturn(TAIWAN_FET_MCC_MNC).when(mTelephonyManager).getNetworkOperator(anyInt());
185        assertEquals("01118581234567", SmsNumberUtils.filterDestAddr(mPhone, "002-1-858-1234567"));
186    }
187
188    @Test
189    @SmallTest
190    public void testIndiaLocalIddCountryCodeAreaLocalNumberConversion() {
191        // NP_LOCALIDD_CC_AREA_LOCAL tests
192        doReturn(INDIA_AIRTEL_MCC_MNC).when(mTelephonyManager).getNetworkOperator(anyInt());
193        assertEquals("01118581234567", SmsNumberUtils.filterDestAddr(mPhone, "010-1-858-1234567"));
194    }
195
196    @Test
197    @SmallTest
198    public void testJapanLocalIddCountryCodeAreaLocalNumberConversion() {
199        // NP_LOCALIDD_CC_AREA_LOCAL tests
200        doReturn(JAPAN_NTTDOCOMO_MCC_MNC).when(mTelephonyManager).getNetworkOperator(anyInt());
201        assertEquals("01118581234567", SmsNumberUtils.filterDestAddr(mPhone, "010-1-858-1234567"));
202    }
203
204    @Test
205    @SmallTest
206    public void testCountryCodeAreaLocalNumberConversion() {
207        // NP_CC_AREA_LOCAL tests
208        assertEquals("011886286281234", SmsNumberUtils.filterDestAddr(mPhone, "886-2-86281234"));
209    }
210
211    @Test
212    @SmallTest
213    public void testNaLocalNumberConversion() {
214        // NP_NANP_LOCAL
215        assertEquals("2345678", SmsNumberUtils.filterDestAddr(mPhone, "234-5678"));
216    }
217
218    @Test
219    @SmallTest
220    public void testNaAreaLocalNumberConversion() {
221        // NP_NANP_AREA_LOCAL
222        assertEquals("8582345678", SmsNumberUtils.filterDestAddr(mPhone, "858-234-5678"));
223    }
224
225    @Test
226    @SmallTest
227    public void testNaNddAreaLocalNumberConversion() {
228        // NP_NANP_NDD_AREA_LOCAL
229        assertEquals("18582345678", SmsNumberUtils.filterDestAddr(mPhone, "1-858-234-5678"));
230    }
231
232    @Test
233    @SmallTest
234    public void testNaLocalIddCcAreaLocalNumberConversion() {
235        // NP_NANP_LOCALIDD_CC_AREA_LOCAL
236        assertEquals("+18582345678", SmsNumberUtils.filterDestAddr(mPhone, "011-1-858-234-5678"));
237    }
238
239    @Test
240    @SmallTest
241    public void testNaPcHomeIddCcAreaLocalNumberConversion() {
242        // NP_NANP_NBPCD_HOMEIDD_CC_AREA_LOCAL
243        assertEquals("01118582345678",
244                SmsNumberUtils.filterDestAddr(mPhone, "+011-1-858-234-5678"));
245    }
246}