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