1649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen/*
2649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * Copyright (C) 2016 The Android Open Source Project
3649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen *
4649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * Licensed under the Apache License, Version 2.0 (the "License");
5649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * you may not use this file except in compliance with the License.
6649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * You may obtain a copy of the License at
7649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen *
8649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen *      http://www.apache.org/licenses/LICENSE-2.0
9649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen *
10649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * Unless required by applicable law or agreed to in writing, software
11649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * distributed under the License is distributed on an "AS IS" BASIS,
12649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * See the License for the specific language governing permissions and
14649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen * limitations under the License
15649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen */
16649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
17649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenpackage com.android.internal.telephony;
18649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
19a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yenimport static org.mockito.Matchers.anyInt;
20a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yenimport static org.mockito.Mockito.when;
21a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
22a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yenimport android.content.ComponentName;
23649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenimport android.content.Context;
24a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yenimport android.telecom.PhoneAccountHandle;
25649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenimport android.telephony.TelephonyManager;
26649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenimport android.telephony.VisualVoicemailSmsFilterSettings;
27649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
28a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yenimport com.android.internal.telephony.VisualVoicemailSmsFilter.PhoneAccountHandleConverter;
29a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
30649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenimport junit.framework.TestCase;
31649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
32649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenimport org.mockito.Mockito;
33649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
34a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yenimport java.util.Arrays;
35a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
36a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen/**
37a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen * Unit test for {@link VisualVoicemailSmsFilter}
38a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen */
39649d6ef94525802e2911d4063431e3207e452810Ta-wei Yenpublic class VisualVoicemailSmsFilterTest extends TestCase {
40649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
41ad6a054e845a0443d8464c7ebcfc3b58530bd66cTa-wei Yen    /**
42a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * PDU for the following message:
43a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * <p>originating number: 129
44a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * <p>message: //VVM:SYNC:ev=NM;id=143;c=6;t=v;s=11111111111;dt=07/03/2017 18:17 -0800;l=4
45ad6a054e845a0443d8464c7ebcfc3b58530bd66cTa-wei Yen     */
46a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    private static final byte[][] SYNC_PDU = {{
47a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x07, (byte) 0x91, (byte) 0x41, (byte) 0x50, (byte) 0x74, (byte) 0x02,
48a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x50, (byte) 0xF5, (byte) 0x44, (byte) 0x03, (byte) 0xC9, (byte) 0x21,
49a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0xF9, (byte) 0x00, (byte) 0x00, (byte) 0x71, (byte) 0x30, (byte) 0x70,
50a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x81, (byte) 0x71, (byte) 0x81, (byte) 0x2B, (byte) 0x53, (byte) 0x06,
51a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x05, (byte) 0x04, (byte) 0x07, (byte) 0x10, (byte) 0x01, (byte) 0x01,
52a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0xAF, (byte) 0x97, (byte) 0xD5, (byte) 0xDA, (byte) 0xD4, (byte) 0x4D,
53a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0xB3, (byte) 0xCE, (byte) 0xA1, (byte) 0xAE, (byte) 0x6C, (byte) 0xEF,
54a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x39, (byte) 0x9B, (byte) 0xBB, (byte) 0x34, (byte) 0xB9, (byte) 0x17,
55a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0xA3, (byte) 0xCD, (byte) 0x76, (byte) 0xE3, (byte) 0x9E, (byte) 0x6D,
56a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x47, (byte) 0xEF, (byte) 0xD9, (byte) 0x77, (byte) 0xF3, (byte) 0x5E,
57a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x2C, (byte) 0x16, (byte) 0x8B, (byte) 0xC5, (byte) 0x62, (byte) 0xB1,
58a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x58, (byte) 0x2C, (byte) 0x16, (byte) 0xDB, (byte) 0x91, (byte) 0xE9,
59a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x3D, (byte) 0xD8, (byte) 0xED, (byte) 0x05, (byte) 0x9B, (byte) 0xBD,
60a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x64, (byte) 0xB0, (byte) 0xD8, (byte) 0x0D, (byte) 0x14, (byte) 0xC3,
61a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0xE9, (byte) 0x62, (byte) 0x37, (byte) 0x50, (byte) 0x0B, (byte) 0x86,
62a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen            (byte) 0x83, (byte) 0xC1, (byte) 0x76, (byte) 0xEC, (byte) 0x1E, (byte) 0x0D}};
63a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
64a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    private Context mContext;
65a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    private TelephonyManager mTelephonyManager;
66a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
67a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    @Override
68a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void setUp() throws Exception {
69a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        super.setUp();
70a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        mContext = Mockito.mock(Context.class);
71a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        mTelephonyManager = Mockito.mock(TelephonyManager.class);
72a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        when(mContext.getSystemServiceName(TelephonyManager.class))
73649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen                .thenReturn(Context.TELEPHONY_SERVICE);
74a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        when(mContext.getSystemService(Context.TELEPHONY_SERVICE))
75a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .thenReturn(mTelephonyManager);
76649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
77a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        VisualVoicemailSmsFilter.setPhoneAccountHandleConverterForTest(
78a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                new PhoneAccountHandleConverter() {
79a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                    @Override
80a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                    public PhoneAccountHandle fromSubId(int subId) {
81a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                        return new PhoneAccountHandle(
82a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                                new ComponentName("com.android.internal.telephony",
83a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                                        "VisualVoicemailSmsFilterTest"), "foo");
84a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                    }
85a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                });
86a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
87649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
88a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    @Override
89a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void tearDown() throws Exception {
90a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        VisualVoicemailSmsFilter.setPhoneAccountHandleConverterForTest(null);
91a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        super.tearDown();
92a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
93a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
94a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
95a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    /**
96a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * Notification SMS targeting over devices do not follow 3GPP or 3GPP2 standards, but instead
97a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * use a plain text message. {@link android.telephony.SmsMessage#createFromPdu(byte[], String)}
98a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * will fail to parse it and return an invalid object, causing {@link NullPointerException} on
99a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     * any operation if not handled.
100a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen     */
101a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testUnsupportedPdu() {
102a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
103a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(new VisualVoicemailSmsFilterSettings.Builder().build());
104649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
105649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen        byte[][] pdus = {
106649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen                ("MBOXUPDATE?m=11;server=example.com;"
107649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen                        + "port=143;name=1234567890@example.com;pw=CphQJKnYS4jEiDO").getBytes()};
108a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertFalse(
109a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                VisualVoicemailSmsFilter.filter(mContext, pdus, SmsConstants.FORMAT_3GPP, 0, 0));
110649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen    }
111649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen
112a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testOriginatingNumber_unspecified_filtered() {
113a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(new VisualVoicemailSmsFilterSettings.Builder().build());
114a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertTrue(VisualVoicemailSmsFilter
115a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, 0, 0));
116a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
117a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
118a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testOriginatingNumber_match_filtered() {
119a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(
120a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                new VisualVoicemailSmsFilterSettings.Builder().setOriginatingNumbers(
121a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                        Arrays.asList("129")
122a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                ).build());
123a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertTrue(VisualVoicemailSmsFilter
124a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, 0, 0));
125a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
126a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
127a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testOriginatingNumber_mismatch_notFiltered() {
128a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(
129a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                new VisualVoicemailSmsFilterSettings.Builder().setOriginatingNumbers(
130a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                        Arrays.asList("128")
131a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                ).build());
132a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertFalse(VisualVoicemailSmsFilter
133a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, 0, 0));
134a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
135a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
136a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testDestinationPort_anyMatch_filtered() {
137a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(new VisualVoicemailSmsFilterSettings.Builder()
138a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .setDestinationPort(123).build());
139a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertTrue(VisualVoicemailSmsFilter
140a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, 123, 0));
141a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
142a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
143a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testDestinationPort_anyData_filtered() {
144a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(new VisualVoicemailSmsFilterSettings.Builder()
145a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .setDestinationPort(VisualVoicemailSmsFilterSettings.DESTINATION_PORT_DATA_SMS)
146a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .build());
147a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertTrue(VisualVoicemailSmsFilter
148a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, 456, 0));
149a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
150a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
151a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testDestinationPort_anyData_textReceived_notFiltered() {
152a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(new VisualVoicemailSmsFilterSettings.Builder()
153a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .setDestinationPort(VisualVoicemailSmsFilterSettings.DESTINATION_PORT_DATA_SMS)
154a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .build());
155a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertFalse(VisualVoicemailSmsFilter
156a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, -1, 0));
157a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
158a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
159a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
160a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    public void testDestinationPort_mismatch_notFiltered() {
161a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        setSettings(new VisualVoicemailSmsFilterSettings.Builder()
162a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .setDestinationPort(123).build());
163a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        assertFalse(VisualVoicemailSmsFilter
164a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .filter(mContext, SYNC_PDU, SmsConstants.FORMAT_3GPP, 456, 0));
165a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
166a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen
167a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    private void setSettings(VisualVoicemailSmsFilterSettings settings) {
168a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen        when(mTelephonyManager.getActiveVisualVoicemailSmsFilterSettings(anyInt()))
169a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen                .thenReturn(settings);
170a6db15590a22000a92d72102ba98b92f608458f3Ta-wei Yen    }
171649d6ef94525802e2911d4063431e3207e452810Ta-wei Yen}
172