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

Commit c6e42ef0 authored by Abhijith Shastry's avatar Abhijith Shastry
Browse files

Add unit tests for send to voicemail, and number blocking.

BUG: 26682702

Change-Id: Id5cd03d48ac5022e15039e420ea5daeb91f0c623
parent 39af15e6
Loading
Loading
Loading
Loading
+197 −9
Original line number Original line Diff line number Diff line
@@ -16,19 +16,33 @@


package com.android.server.telecom.tests;
package com.android.server.telecom.tests;


import com.android.internal.util.IndentingPrintWriter;
import static org.mockito.Matchers.any;
import com.android.server.telecom.Analytics;
import static org.mockito.Matchers.anyInt;
import com.android.server.telecom.Log;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;


import android.content.Context;
import android.content.Context;
import android.content.IContentProvider;
import android.media.AudioManager;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Process;
import android.os.Process;
import android.provider.BlockedNumberContract;
import android.telecom.Call;
import android.telecom.Call;
import android.telecom.CallAudioState;
import android.telecom.CallAudioState;
import android.telecom.Connection;
import android.telecom.Connection;
import android.telecom.ConnectionRequest;
import android.telecom.DisconnectCause;
import android.telecom.DisconnectCause;
import android.telecom.ParcelableCall;
import android.telecom.ParcelableCall;
import android.telecom.ParcelableCallAnalytics;
import android.telecom.ParcelableCallAnalytics;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
import android.telecom.VideoProfile;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.LargeTest;
@@ -36,6 +50,15 @@ import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.SmallTest;


import com.android.internal.telecom.IInCallAdapter;
import com.android.internal.telecom.IInCallAdapter;
import com.android.internal.telephony.CallerInfo;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.telecom.Analytics;
import com.android.server.telecom.Log;

import com.google.common.base.Predicate;

import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;


import java.io.StringWriter;
import java.io.StringWriter;
import java.util.List;
import java.util.List;
@@ -43,12 +66,7 @@ import java.util.Map;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.CyclicBarrier;

import java.util.concurrent.TimeUnit;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;


/**
/**
 * Performs various basic call tests in Telecom.
 * Performs various basic call tests in Telecom.
@@ -68,6 +86,7 @@ public class BasicCallTests extends TelecomSystemTest {
                mInCallServiceFixtureX.getCall(ids.mCallId).getState());
                mInCallServiceFixtureX.getCall(ids.mCallId).getState());
        assertEquals(Call.STATE_DISCONNECTED,
        assertEquals(Call.STATE_DISCONNECTED,
                mInCallServiceFixtureY.getCall(ids.mCallId).getState());
                mInCallServiceFixtureY.getCall(ids.mCallId).getState());
        verifyNoBlockChecks();
    }
    }


    @LargeTest
    @LargeTest
@@ -80,6 +99,7 @@ public class BasicCallTests extends TelecomSystemTest {
                mInCallServiceFixtureX.getCall(ids.mCallId).getState());
                mInCallServiceFixtureX.getCall(ids.mCallId).getState());
        assertEquals(Call.STATE_DISCONNECTED,
        assertEquals(Call.STATE_DISCONNECTED,
                mInCallServiceFixtureY.getCall(ids.mCallId).getState());
                mInCallServiceFixtureY.getCall(ids.mCallId).getState());
        verifyNoBlockChecks();
    }
    }


    /**
    /**
@@ -217,6 +237,141 @@ public class BasicCallTests extends TelecomSystemTest {
                mInCallServiceFixtureY.getCall(ids.mCallId).getState());
                mInCallServiceFixtureY.getCall(ids.mCallId).getState());
    }
    }


    @LargeTest
    public void testIncomingCallFromContactWithSendToVoicemailIsRejected() throws Exception {
        Bundle extras = new Bundle();
        extras.putParcelable(
                TelecomManager.EXTRA_INCOMING_CALL_ADDRESS,
                Uri.fromParts(PhoneAccount.SCHEME_TEL, "650-555-1212", null));
        mTelecomSystem.getTelecomServiceImpl().getBinder()
                .addNewIncomingCall(mPhoneAccountA0.getAccountHandle(), extras);

        verify(mConnectionServiceFixtureA.getTestDouble())
                .createConnection(any(PhoneAccountHandle.class), anyString(),
                        any(ConnectionRequest.class), eq(true), eq(false));

        assertEquals(1, mCallerInfoAsyncQueryFactoryFixture.mRequests.size());
        for (CallerInfoAsyncQueryFactoryFixture.Request request :
                mCallerInfoAsyncQueryFactoryFixture.mRequests) {
            CallerInfo sendToVoicemailCallerInfo = new CallerInfo();
            sendToVoicemailCallerInfo.shouldSendToVoicemail = true;
            request.replyWithCallerInfo(sendToVoicemailCallerInfo);
        }

        assertTrueWithTimeout(new Predicate<Void>() {
            @Override
            public boolean apply(Void aVoid) {
                return mConnectionServiceFixtureA.mConnectionService.rejectedCallIds.size() == 1;
            }
        });
        assertTrueWithTimeout(new Predicate<Void>() {
            @Override
            public boolean apply(Void aVoid) {
                return mMissedCallNotifier.missedCallsNotified.size() == 1;
            }
        });

        verify(mInCallServiceFixtureX.getTestDouble(), never())
                .setInCallAdapter(any(IInCallAdapter.class));
        verify(mInCallServiceFixtureY.getTestDouble(), never())
                .setInCallAdapter(any(IInCallAdapter.class));
    }

    @LargeTest
    public void testIncomingCallCallerInfoLookupTimesOutIsAllowed() throws Exception {
        Bundle extras = new Bundle();
        extras.putParcelable(
                TelecomManager.EXTRA_INCOMING_CALL_ADDRESS,
                Uri.fromParts(PhoneAccount.SCHEME_TEL, "650-555-1212", null));
        mTelecomSystem.getTelecomServiceImpl().getBinder()
                .addNewIncomingCall(mPhoneAccountA0.getAccountHandle(), extras);

        verify(mConnectionServiceFixtureA.getTestDouble())
                .createConnection(any(PhoneAccountHandle.class), anyString(),
                        any(ConnectionRequest.class), eq(true), eq(false));

        // Never reply to the caller info lookup.
        assertEquals(1, mCallerInfoAsyncQueryFactoryFixture.mRequests.size());

        verify(mInCallServiceFixtureX.getTestDouble(), timeout(TEST_TIMEOUT))
                .setInCallAdapter(any(IInCallAdapter.class));

        assertEquals(0, mConnectionServiceFixtureA.mConnectionService.rejectedCallIds.size());
        assertEquals(0, mMissedCallNotifier.missedCallsNotified.size());

        assertTrueWithTimeout(new Predicate<Void>() {
            @Override
            public boolean apply(Void v) {
                return mInCallServiceFixtureX.mInCallAdapter != null;
            }
        });

        verify(mInCallServiceFixtureX.getTestDouble(), timeout(TEST_TIMEOUT))
                .addCall(any(ParcelableCall.class));

        disconnectCall(mInCallServiceFixtureX.mLatestCallId,
                mConnectionServiceFixtureA.mLatestConnectionId);
    }

    @LargeTest
    public void testIncomingCallFromBlockedNumberIsRejected() throws Exception {
        String phoneNumber = "650-555-1212";
        blockNumber(phoneNumber);

        Bundle extras = new Bundle();
        extras.putParcelable(
                TelecomManager.EXTRA_INCOMING_CALL_ADDRESS,
                Uri.fromParts(PhoneAccount.SCHEME_TEL, phoneNumber, null));
        mTelecomSystem.getTelecomServiceImpl().getBinder()
                .addNewIncomingCall(mPhoneAccountA0.getAccountHandle(), extras);

        verify(mConnectionServiceFixtureA.getTestDouble())
                .createConnection(any(PhoneAccountHandle.class), anyString(),
                        any(ConnectionRequest.class), eq(true), eq(false));

        assertEquals(1, mCallerInfoAsyncQueryFactoryFixture.mRequests.size());
        for (CallerInfoAsyncQueryFactoryFixture.Request request :
                mCallerInfoAsyncQueryFactoryFixture.mRequests) {
            request.reply();
        }

        assertTrueWithTimeout(new Predicate<Void>() {
            @Override
            public boolean apply(Void aVoid) {
                return mConnectionServiceFixtureA.mConnectionService.rejectedCallIds.size() == 1;
            }
        });
        assertEquals(0, mMissedCallNotifier.missedCallsNotified.size());

        verify(mInCallServiceFixtureX.getTestDouble(), never())
                .setInCallAdapter(any(IInCallAdapter.class));
        verify(mInCallServiceFixtureY.getTestDouble(), never())
                .setInCallAdapter(any(IInCallAdapter.class));
    }

    @LargeTest
    public void testIncomingCallBlockCheckTimesoutIsAllowed() throws Exception {
        final CountDownLatch latch = new CountDownLatch(1);
        String phoneNumber = "650-555-1212";
        blockNumberWithAnswer(phoneNumber, new Answer<Bundle>() {
            @Override
            public Bundle answer(InvocationOnMock invocation) throws Throwable {
                latch.await(TEST_TIMEOUT * 2, TimeUnit.MILLISECONDS);
                Bundle bundle = new Bundle();
                bundle.putBoolean(BlockedNumberContract.RES_NUMBER_IS_BLOCKED, true);
                return bundle;
            }
        });

        IdPair ids = startAndMakeActiveIncomingCall(
                phoneNumber, mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA);
        latch.countDown();

        assertEquals(0, mConnectionServiceFixtureA.mConnectionService.rejectedCallIds.size());
        assertEquals(0, mMissedCallNotifier.missedCallsNotified.size());
        disconnectCall(ids.mCallId, ids.mConnectionId);
    }

    public void do_testDeadlockOnOutgoingCall() throws Exception {
    public void do_testDeadlockOnOutgoingCall() throws Exception {
        final IdPair ids = startOutgoingPhoneCall("650-555-1212",
        final IdPair ids = startOutgoingPhoneCall("650-555-1212",
                mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA,
                mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA,
@@ -537,4 +692,37 @@ public class BasicCallTests extends TelecomSystemTest {
        assertEquals(DisconnectCause.ERROR, callAnalytics1.callTerminationReason.getCode());
        assertEquals(DisconnectCause.ERROR, callAnalytics1.callTerminationReason.getCode());
        assertEquals(DisconnectCause.REMOTE, callAnalytics2.callTerminationReason.getCode());
        assertEquals(DisconnectCause.REMOTE, callAnalytics2.callTerminationReason.getCode());
    }
    }

    private void blockNumber(String phoneNumber) throws Exception {
        blockNumberWithAnswer(phoneNumber, new Answer<Bundle>() {
            @Override
            public Bundle answer(InvocationOnMock invocation) throws Throwable {
                Bundle bundle = new Bundle();
                bundle.putBoolean(BlockedNumberContract.RES_NUMBER_IS_BLOCKED, true);
                return bundle;
            }
        });
    }

    private void blockNumberWithAnswer(String phoneNumber, Answer answer) throws Exception {
        when(getBlockedNumberProvider().call(
                anyString(),
                eq(BlockedNumberContract.SystemContract.METHOD_SHOULD_SYSTEM_BLOCK_NUMBER),
                eq(phoneNumber),
                isNull(Bundle.class))).thenAnswer(answer);
    }

    private void verifyNoBlockChecks() {
        verifyZeroInteractions(getBlockedNumberProvider());
    }

    private IContentProvider getBlockedNumberProvider() {
        return mSpyContext.getContentResolver().acquireProvider(BlockedNumberContract.AUTHORITY);
    }

    private void disconnectCall(String callId, String connectionId) throws Exception {
        mConnectionServiceFixtureA.sendSetDisconnected(connectionId, DisconnectCause.LOCAL);
        assertEquals(Call.STATE_DISCONNECTED, mInCallServiceFixtureX.getCall(callId).getState());
        assertEquals(Call.STATE_DISCONNECTED, mInCallServiceFixtureY.getCall(callId).getState());
    }
}
}
+10 −5
Original line number Original line Diff line number Diff line
@@ -89,7 +89,8 @@ public class CallLogManagerTest extends TelecomTestCase {
        super.setUp();
        super.setUp();
        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
        mCallLogManager = new CallLogManager(mContext, mMockPhoneAccountRegistrar);
        mCallLogManager = new CallLogManager(mContext, mMockPhoneAccountRegistrar);
        mContentProvider = mContext.getContentResolver().acquireProvider("test");
        mContentProvider =
                mContext.getContentResolver().acquireProvider("0@call_log");
        mDefaultAccountHandle = new PhoneAccountHandle(
        mDefaultAccountHandle = new PhoneAccountHandle(
                new ComponentName("com.android.server.telecom.tests", "CallLogManagerTest"),
                new ComponentName("com.android.server.telecom.tests", "CallLogManagerTest"),
                TEST_PHONE_ACCOUNT_ID,
                TEST_PHONE_ACCOUNT_ID,
@@ -111,7 +112,7 @@ public class CallLogManagerTest extends TelecomTestCase {
        UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        UserInfo userInfo = new UserInfo(CURRENT_USER_ID, "test", 0);
        UserInfo userInfo = new UserInfo(CURRENT_USER_ID, "test", 0);
        UserInfo otherUserInfo = new UserInfo(OTHER_USER_ID, "test2", 0);
        UserInfo otherUserInfo = new UserInfo(OTHER_USER_ID, "test2", 0);
        UserInfo managedProfileUserInfo = new UserInfo(OTHER_USER_ID, "test3",
        UserInfo managedProfileUserInfo = new UserInfo(MANAGED_USER_ID, "test3",
                UserInfo.FLAG_MANAGED_PROFILE);
                UserInfo.FLAG_MANAGED_PROFILE);


        doAnswer(new Answer<Uri>() {
        doAnswer(new Answer<Uri>() {
@@ -567,8 +568,8 @@ public class CallLogManagerTest extends TelecomTestCase {
    private void verifyNoInsertionInUser(int userId) {
    private void verifyNoInsertionInUser(int userId) {
        try {
        try {
            Uri uri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI, userId);
            Uri uri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI, userId);
            verify(mContentProvider, timeout(TEST_TIMEOUT_MILLIS).never()).insert(any(String.class),
            verify(getContentProviderForUser(userId), timeout(TEST_TIMEOUT_MILLIS).never())
                    eq(uri), any(ContentValues.class));
                    .insert(any(String.class), eq(uri), any(ContentValues.class));
        } catch (android.os.RemoteException e) {
        } catch (android.os.RemoteException e) {
            fail("Remote exception occurred during test execution");
            fail("Remote exception occurred during test execution");
        }
        }
@@ -578,7 +579,7 @@ public class CallLogManagerTest extends TelecomTestCase {
        ArgumentCaptor<ContentValues> captor = ArgumentCaptor.forClass(ContentValues.class);
        ArgumentCaptor<ContentValues> captor = ArgumentCaptor.forClass(ContentValues.class);
        try {
        try {
            Uri uri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI, userId);
            Uri uri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI, userId);
            verify(mContentProvider, timeout(TEST_TIMEOUT_MILLIS).atLeastOnce())
            verify(getContentProviderForUser(userId), timeout(TEST_TIMEOUT_MILLIS).atLeastOnce())
                    .insert(any(String.class), eq(uri), captor.capture());
                    .insert(any(String.class), eq(uri), captor.capture());
        } catch (android.os.RemoteException e) {
        } catch (android.os.RemoteException e) {
            fail("Remote exception occurred during test execution");
            fail("Remote exception occurred during test execution");
@@ -587,6 +588,10 @@ public class CallLogManagerTest extends TelecomTestCase {
        return captor.getValue();
        return captor.getValue();
    }
    }


    private IContentProvider getContentProviderForUser(int userId) {
        return mContext.getContentResolver().acquireProvider(userId + "@call_log");
    }

    private Call makeFakeCall(int disconnectCauseCode, boolean isConference, boolean isIncoming,
    private Call makeFakeCall(int disconnectCauseCode, boolean isConference, boolean isIncoming,
            long creationTimeMillis, long ageMillis, Uri callHandle,
            long creationTimeMillis, long ageMillis, Uri callHandle,
            PhoneAccountHandle phoneAccountHandle, int callVideoState,
            PhoneAccountHandle phoneAccountHandle, int callVideoState,
+8 −2
Original line number Original line Diff line number Diff line
@@ -23,6 +23,8 @@ import com.android.server.telecom.Log;


import android.content.Context;
import android.content.Context;


import org.mockito.Mockito;

import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
@@ -39,7 +41,11 @@ public class CallerInfoAsyncQueryFactoryFixture implements
        Object mCookie;
        Object mCookie;
        CallerInfoAsyncQuery.OnQueryCompleteListener mListener;
        CallerInfoAsyncQuery.OnQueryCompleteListener mListener;
        void reply() {
        void reply() {
            mListener.onQueryComplete(mToken, mCookie, new CallerInfo());
            replyWithCallerInfo(new CallerInfo());
        }

        void replyWithCallerInfo(CallerInfo callerInfo) {
            mListener.onQueryComplete(mToken, mCookie, callerInfo);
        }
        }
    }
    }


@@ -52,7 +58,7 @@ public class CallerInfoAsyncQueryFactoryFixture implements
            r.mCookie = cookie;
            r.mCookie = cookie;
            r.mListener = listener;
            r.mListener = listener;
            mRequests.add(r);
            mRequests.add(r);
            return null;
            return Mockito.mock(CallerInfoAsyncQuery.class);
        }
        }
    };
    };


+10 −3
Original line number Original line Diff line number Diff line
@@ -210,7 +210,7 @@ public class ComponentContextFixture implements TestFixture<Context> {
                @Override
                @Override
                protected IContentProvider acquireProvider(Context c, String name) {
                protected IContentProvider acquireProvider(Context c, String name) {
                    Log.i(this, "acquireProvider %s", name);
                    Log.i(this, "acquireProvider %s", name);
                    return mContentProvider;
                    return getOrCreateProvider(name);
                }
                }


                @Override
                @Override
@@ -221,7 +221,14 @@ public class ComponentContextFixture implements TestFixture<Context> {
                @Override
                @Override
                protected IContentProvider acquireUnstableProvider(Context c, String name) {
                protected IContentProvider acquireUnstableProvider(Context c, String name) {
                    Log.i(this, "acquireUnstableProvider %s", name);
                    Log.i(this, "acquireUnstableProvider %s", name);
                    return mContentProvider;
                    return getOrCreateProvider(name);
                }

                private IContentProvider getOrCreateProvider(String name) {
                    if (!mIContentProviderByUri.containsKey(name)) {
                        mIContentProviderByUri.put(name, mock(IContentProvider.class));
                    }
                    return mIContentProviderByUri.get(name);
                }
                }


                @Override
                @Override
@@ -397,7 +404,7 @@ public class ComponentContextFixture implements TestFixture<Context> {
    private final StatusBarManager mStatusBarManager = mock(StatusBarManager.class);
    private final StatusBarManager mStatusBarManager = mock(StatusBarManager.class);
    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
    private final IContentProvider mContentProvider = mock(IContentProvider.class);
    private final Map<String, IContentProvider> mIContentProviderByUri = new HashMap<>();
    private final Configuration mResourceConfiguration = new Configuration();
    private final Configuration mResourceConfiguration = new Configuration();


    private TelecomManager mTelecomManager = null;
    private TelecomManager mTelecomManager = null;
+7 −2
Original line number Original line Diff line number Diff line
@@ -44,6 +44,8 @@ import android.telecom.PhoneAccountHandle;
import android.telecom.StatusHints;
import android.telecom.StatusHints;
import android.telecom.TelecomManager;
import android.telecom.TelecomManager;


import com.google.android.collect.Lists;

import java.lang.Override;
import java.lang.Override;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
@@ -130,6 +132,7 @@ public class ConnectionServiceFixture implements TestFixture<IConnectionService>
    }
    }


    public class FakeConnectionService extends IConnectionService.Stub {
    public class FakeConnectionService extends IConnectionService.Stub {
        List<String> rejectedCallIds = Lists.newArrayList();


        @Override
        @Override
        public void addConnectionServiceAdapter(IConnectionServiceAdapter adapter)
        public void addConnectionServiceAdapter(IConnectionServiceAdapter adapter)
@@ -185,7 +188,9 @@ public class ConnectionServiceFixture implements TestFixture<IConnectionService>
        public void answer(String callId) throws RemoteException { }
        public void answer(String callId) throws RemoteException { }


        @Override
        @Override
        public void reject(String callId) throws RemoteException { }
        public void reject(String callId) throws RemoteException {
            rejectedCallIds.add(callId);
        }


        @Override
        @Override
        public void rejectWithMessage(String callId, String message) throws RemoteException { }
        public void rejectWithMessage(String callId, String message) throws RemoteException { }
@@ -245,7 +250,7 @@ public class ConnectionServiceFixture implements TestFixture<IConnectionService>
    private IConnectionService mConnectionServiceDelegateAdapter =
    private IConnectionService mConnectionServiceDelegateAdapter =
            IConnectionService.Stub.asInterface(mConnectionServiceDelegate.onBind(null));
            IConnectionService.Stub.asInterface(mConnectionServiceDelegate.onBind(null));


    private IConnectionService.Stub mConnectionService = new FakeConnectionService();
    FakeConnectionService mConnectionService = new FakeConnectionService();
    private IConnectionService.Stub mConnectionServiceSpy = Mockito.spy(mConnectionService);
    private IConnectionService.Stub mConnectionServiceSpy = Mockito.spy(mConnectionService);


    public class ConnectionInfo {
    public class ConnectionInfo {
Loading