Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e88018f authored by Aishwarya Mallampati's avatar Aishwarya Mallampati Committed by Jack Yu
Browse files

Added unit tests for FDN changes.

Bug: 218262162
Test: Manual
      atest com.android.internal.telephony.SmsControllerTest
      atest com.android.internal.telephony.GsmCdmaPhoneTest
Merged-In: I678d5d8b1287e1fdeab88294eb093ea571865632
Change-Id: I678d5d8b1287e1fdeab88294eb093ea571865632
parent 8c54c1dc
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.TelephonyManager;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
import com.android.telephony.Rlog;

@@ -57,7 +58,8 @@ public class SmsController extends ISmsImplBase {

    private final Context mContext;

    protected SmsController(Context context) {
    @VisibleForTesting
    public SmsController(Context context) {
        mContext = context;
        ServiceRegisterer smsServiceRegisterer = TelephonyFrameworkInitializer
                .getTelephonyServiceManager()
@@ -900,7 +902,8 @@ public class SmsController extends ISmsImplBase {
     * @param destAddr destination address of the message
     * @return true if either destAddr or smscAddr is blocked due to FDN.
     */
    private boolean isNumberBlockedByFDN(int subId, String destAddr, String callingPackage) {
    @VisibleForTesting
    public boolean isNumberBlockedByFDN(int subId, String destAddr, String callingPackage) {
        int phoneId = SubscriptionManager.getPhoneId(subId);
        if (!FdnUtils.isFdnEnabled(phoneId)) {
            return false;
+37 −0
Original line number Diff line number Diff line
@@ -2040,6 +2040,43 @@ public class GsmCdmaPhoneTest extends TelephonyTest {
        fdnCheckCleanup();
    }

    @Test
    public void testDial_fdnCheck() throws Exception{
        // dial setup
        mSST.mSS = mServiceState;
        doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState();
        mCT.mForegroundCall = mGsmCdmaCall;
        mCT.mBackgroundCall = mGsmCdmaCall;
        mCT.mRingingCall = mGsmCdmaCall;
        doReturn(GsmCdmaCall.State.IDLE).when(mGsmCdmaCall).getState();
        replaceInstance(Phone.class, "mImsPhone", mPhoneUT, mImsPhone);

        // FDN check setup
        fdnCheckSetup();
        ArrayList<AdnRecord> fdnList = new ArrayList<>();
        doReturn(fdnList).when(adnRecordCache).getRecordsIfLoaded(IccConstants.EF_FDN);

        // FDN check success - no exception is returned
        AdnRecord dialRecord = new AdnRecord(null, "1234567890");
        fdnList.add(0, dialRecord);
        Connection connection = mPhoneUT.dial("1234567890",
                new PhoneInternalInterface.DialArgs.Builder().build());
        verify(mCT).dialGsm(eq("1234567890"), any(PhoneInternalInterface.DialArgs.class));

        // FDN check failure - returns CallStateException
        fdnList.remove(0);
        try {
            connection = mPhoneUT.dial("1234567890",
                    new PhoneInternalInterface.DialArgs.Builder().build());
            fail("Expected CallStateException with ERROR_FDN_BLOCKED thrown.");
        } catch(CallStateException e) {
            assertEquals(CallStateException.ERROR_FDN_BLOCKED, e.getError());
        }

        // clean up
        fdnCheckCleanup();
    }

    public void fdnCheckCleanup() {
        doReturn(false).when(mUiccCardApplication3gpp).getIccFdnAvailable();
        doReturn(false).when(mUiccCardApplication3gpp).getIccFdnEnabled();
+168 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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 android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import com.android.internal.telephony.uicc.AdnRecord;
import com.android.internal.telephony.uicc.AdnRecordCache;
import com.android.internal.telephony.uicc.IccConstants;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.doReturn;

import java.util.ArrayList;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class SmsControllerTest extends TelephonyTest {

    // Mocked classes
    private AdnRecordCache mAdnRecordCache;

    // SmsController under test
    private SmsController mSmsControllerUT;
    private final String smscAddrStr = "+1206313004";
    private String mCallingPackage;

    @Before
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());
        mAdnRecordCache = Mockito.mock(AdnRecordCache.class);
        mSmsControllerUT = new SmsController(mContext);
        mCallingPackage = mContext.getOpPackageName();
    }

    @After
    public void tearDown() throws Exception {
        mAdnRecordCache = null;
        super.tearDown();
    }

    private void fdnCheckSetup() {
        // FDN check setup
        doReturn(mAdnRecordCache).when(mSimRecords).getAdnCache();
        doReturn(mUiccProfile).when(mUiccController).getUiccProfileForPhone(anyInt());
        doReturn(true).when(mUiccCardApplication3gpp).getIccFdnAvailable();
        doReturn(true).when(mUiccCardApplication3gpp).getIccFdnEnabled();
        doReturn(false).when(mTelephonyManager).isEmergencyNumber(anyString());
        doReturn("us").when(mTelephonyManager).getSimCountryIso();
        doReturn(smscAddrStr).when(mIccSmsInterfaceManager).getSmscAddressFromIccEf(anyString());
    }

    private void fdnCheckCleanup() {
        doReturn(false).when(mUiccCardApplication3gpp).getIccFdnAvailable();
        doReturn(false).when(mUiccCardApplication3gpp).getIccFdnEnabled();
    }

    @Test
    public void isNumberBlockedByFdn_fdnListHasBothDestAddrAndSmscAddr() {
        // FDN check setup
        fdnCheckSetup();
        ArrayList<AdnRecord> fdnList = new ArrayList<>();
        doReturn(fdnList).when(mAdnRecordCache).getRecordsIfLoaded(IccConstants.EF_FDN);

        // FDN list has both destination addr and smsc addr
        AdnRecord smscAddrRecord = new AdnRecord(null, smscAddrStr);
        AdnRecord destAddrRecord = new AdnRecord(null, "1234");
        fdnList.add(0, smscAddrRecord);
        fdnList.add(1, destAddrRecord);

        // Returns false as list contains both dest addr and smsc addr
        assertFalse(mSmsControllerUT.isNumberBlockedByFDN(1, "1234",
                mCallingPackage));

        // Clean up
        fdnCheckCleanup();
    }

    @Test
    public void isNumberBlockedByFdn_fdnListHasDestAddr() {
        // FDN check setup
        fdnCheckSetup();
        ArrayList<AdnRecord> fdnList = new ArrayList<>();
        doReturn(fdnList).when(mAdnRecordCache).getRecordsIfLoaded(IccConstants.EF_FDN);

        // FDN list has only destination addr
        AdnRecord destAddrRecord = new AdnRecord(null, "1234");
        fdnList.add(0, destAddrRecord);

        // Returns true as list does not contain smsc addr
        assertTrue(mSmsControllerUT.isNumberBlockedByFDN(1, "1234", mCallingPackage));

        // Clean up
        fdnCheckCleanup();
    }

    @Test
    public void isNumberBlockedByFdn_fdnListHasSmscAddr() {
        // FDN check setup
        fdnCheckSetup();
        ArrayList<AdnRecord> fdnList = new ArrayList<>();
        doReturn(fdnList).when(mAdnRecordCache).getRecordsIfLoaded(IccConstants.EF_FDN);

        // FDN list has both destination addr and smsc addr
        AdnRecord smscAddrRecord = new AdnRecord(null, smscAddrStr);
        fdnList.add(0, smscAddrRecord);

        // Returns true as list does not contain dest addr
        assertTrue(mSmsControllerUT.isNumberBlockedByFDN(1, "1234", mCallingPackage));

        // Clean up
        fdnCheckCleanup();
    }

    @Test
    public void isNumberBlockedByFdn_destAddrIsEmergencyNumber() {
        // FDN check setup
        fdnCheckSetup();
        ArrayList<AdnRecord> fdnList = new ArrayList<>();
        doReturn(fdnList).when(mAdnRecordCache).getRecordsIfLoaded(IccConstants.EF_FDN);

        doReturn(true).when(mTelephonyManager).isEmergencyNumber(anyString());
        // Returns false as dest addr is emergency number
        assertFalse(mSmsControllerUT.isNumberBlockedByFDN(1, "1234",
                mCallingPackage));

        // Clean up
        fdnCheckCleanup();
    }

    @Test
    public void isNumberBlockedByFdn_fdnDisabled() {
        // FDN check setup
        fdnCheckSetup();

        doReturn(false).when(mUiccCardApplication3gpp).getIccFdnEnabled();
        // Returns false as fdn is not enabled
        assertFalse(mSmsControllerUT.isNumberBlockedByFDN(1, "1234",
                mCallingPackage));

        // Clean up
        fdnCheckCleanup();
    }
}
 No newline at end of file