/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.isNull; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; import android.provider.Telephony; import android.test.suitebuilder.annotation.SmallTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; public class WapPushOverSmsTest extends TelephonyTest { @Mock protected IMms.Stub mIMmsStub; private WapPushOverSms mWapPushOverSmsUT; @Before public void setUp() throws Exception { super.setUp("WapPushOverSmsTest"); // Note that this replaces only cached services in ServiceManager. If a service is not found // in the cache, a real instance is used. mServiceManagerMockedServices.put("imms", mIMmsStub); doReturn(mIMmsStub).when(mIMmsStub).queryLocalInterface(anyString()); mWapPushOverSmsUT = new WapPushOverSms(mContext); } @After public void tearDown() throws Exception { mWapPushOverSmsUT = null; super.tearDown(); } @Test @SmallTest public void testDispatchWapPdu() { doReturn(true).when(mWspTypeDecoder).decodeUintvarInteger(anyInt()); doReturn(true).when(mWspTypeDecoder).decodeContentType(anyInt()); doReturn((long)2).when(mWspTypeDecoder).getValue32(); doReturn(2).when(mWspTypeDecoder).getDecodedDataLength(); doReturn(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO).when(mWspTypeDecoder).getValueString(); byte[] pdu = new byte[]{ (byte) 0xFF, (byte) 0x06, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF }; mWapPushOverSmsUT.dispatchWapPdu(pdu, null, mInboundSmsHandler); ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mInboundSmsHandler).dispatchIntent(intentArgumentCaptor.capture(), eq(android.Manifest.permission.RECEIVE_WAP_PUSH), eq(AppOpsManager.OP_RECEIVE_WAP_PUSH), any(Bundle.class), isNull(BroadcastReceiver.class), eq(UserHandle.SYSTEM)); Intent intent = intentArgumentCaptor.getValue(); assertEquals(Telephony.Sms.Intents.WAP_PUSH_DELIVER_ACTION, intent.getAction()); assertEquals(0xFF, intent.getIntExtra("transactionId", 0)); assertEquals(0x06, intent.getIntExtra("pduType", 0)); byte[] header = intent.getByteArrayExtra("header"); assertEquals(2, header.length); for (int i = 0; i < header.length; i++) { assertEquals((byte)0xFF, header[i]); } byte[] data = intent.getByteArrayExtra("data"); assertEquals(pdu.length, data.length); for (int i = 0; i < pdu.length; i++) { assertEquals(pdu[i], data[i]); } assertEquals(mWspTypeDecoder.getContentParameters(), intent.getSerializableExtra("contentTypeParameters")); } @Test @SmallTest public void testDispatchWapPduFromBlockedNumber_noIntentsDispatched() throws Exception { when(mIMmsStub.getCarrierConfigValues(anyInt())).thenReturn(new Bundle()); mFakeBlockedNumberContentProvider.mBlockedNumbers.add("16178269168"); doReturn(true).when(mWspTypeDecoder).decodeUintvarInteger(anyInt()); doReturn(true).when(mWspTypeDecoder).decodeContentType(anyInt()); doReturn((long) 2).when(mWspTypeDecoder).getValue32(); doReturn(2).when(mWspTypeDecoder).getDecodedDataLength(); doReturn(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO).when(mWspTypeDecoder).getValueString(); byte pdu[] = {1, 6, 0, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 118, 110, 100, 46, 119, 97, 112, 46, 109, 109, 115, 45, 109, 101, 115, 115, 97, 103, 101, 0, -116, -126, -104, 77, 109, 115, 84, 114, 97, 110, 115, 97, 99, 116, 105, 111, 110, 73, 68, 0, -115, 18, -119, 8, -128, 49, 54, 49, 55, 56, 50, 54, 57, 49, 54, 56, 47, 84, 89, 80, 69, 61, 80, 76, 77, 78, 0, -118, -128, -114, 2, 3, -24, -120, 3, -127, 3, 3, -12, -128, -106, 84, 101, 115, 116, 32, 77, 109, 115, 32, 83, 117, 98, 106, 101, 99, 116, 0, -125, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 103, 111, 111, 103, 108, 101, 46, 99, 111, 109, 47, 115, 97, 100, 102, 100, 100, 0}; assertEquals(Telephony.Sms.Intents.RESULT_SMS_HANDLED, mWapPushOverSmsUT.dispatchWapPdu(pdu, null, mInboundSmsHandler)); verify(mInboundSmsHandler, never()).dispatchIntent( any(Intent.class), any(String.class), anyInt(), any(Bundle.class), any(BroadcastReceiver.class), any(UserHandle.class)); } }