IncomingCallFilterTest.java revision 6d4b66df3d918e3f17263ff40ca3ba0ec5a46719
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17package com.android.server.telecom.tests; 18 19import android.content.ContentResolver; 20import android.content.IContentProvider; 21import android.net.Uri; 22import android.test.suitebuilder.annotation.SmallTest; 23 24import com.android.server.telecom.Call; 25import com.android.server.telecom.Timeouts; 26import com.android.server.telecom.callfiltering.CallFilterResultCallback; 27import com.android.server.telecom.callfiltering.CallFilteringResult; 28import com.android.server.telecom.callfiltering.IncomingCallFilter; 29import com.android.server.telecom.TelecomSystem; 30 31import org.mockito.Mock; 32 33import java.util.ArrayList; 34import java.util.Collections; 35import java.util.List; 36 37import static org.mockito.Matchers.any; 38import static org.mockito.Matchers.eq; 39import static org.mockito.Mockito.atMost; 40import static org.mockito.Mockito.timeout; 41import static org.mockito.Mockito.verify; 42import static org.mockito.Mockito.when; 43 44public class IncomingCallFilterTest extends TelecomTestCase { 45 @Mock private CallFilterResultCallback mResultCallback; 46 @Mock private Call mCall; 47 private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() {}; 48 49 @Mock private IncomingCallFilter.CallFilter mFilter1; 50 @Mock private IncomingCallFilter.CallFilter mFilter2; 51 @Mock private IncomingCallFilter.CallFilter mFilter3; 52 53 @Mock private Timeouts.Adapter mTimeoutsAdapter; 54 55 private static final Uri TEST_HANDLE = Uri.parse("tel:1235551234"); 56 private static final long LONG_TIMEOUT = 1000000; 57 private static final long SHORT_TIMEOUT = 100; 58 59 private static final CallFilteringResult RESULT1 = 60 new CallFilteringResult( 61 true, // shouldAllowCall 62 false, // shouldReject 63 true, // shouldAddToCallLog 64 true // shouldShowNotification 65 ); 66 67 private static final CallFilteringResult RESULT2 = 68 new CallFilteringResult( 69 false, // shouldAllowCall 70 true, // shouldReject 71 false, // shouldAddToCallLog 72 true // shouldShowNotification 73 ); 74 75 private static final CallFilteringResult RESULT3 = 76 new CallFilteringResult( 77 false, // shouldAllowCall 78 true, // shouldReject 79 true, // shouldAddToCallLog 80 false // shouldShowNotification 81 ); 82 83 private static final CallFilteringResult DEFAULT_RESULT = RESULT1; 84 85 public void setUp() throws Exception { 86 super.setUp(); 87 mContext = mComponentContextFixture.getTestDouble().getApplicationContext(); 88 when(mCall.getHandle()).thenReturn(TEST_HANDLE); 89 setTimeoutLength(LONG_TIMEOUT); 90 } 91 92 @SmallTest 93 public void testSingleFilter() { 94 IncomingCallFilter testFilter = new IncomingCallFilter(mContext, mResultCallback, mCall, 95 mLock, mTimeoutsAdapter, Collections.singletonList(mFilter1)); 96 testFilter.performFiltering(); 97 verify(mFilter1).startFilterLookup(mCall, testFilter); 98 99 testFilter.onCallFilteringComplete(mCall, RESULT1); 100 waitForHandlerAction(testFilter.getHandler(), SHORT_TIMEOUT * 2); 101 verify(mResultCallback).onCallFilteringComplete(eq(mCall), eq(RESULT1)); 102 } 103 104 @SmallTest 105 public void testMultipleFilters() { 106 List<IncomingCallFilter.CallFilter> filters = 107 new ArrayList<IncomingCallFilter.CallFilter>() {{ 108 add(mFilter1); 109 add(mFilter2); 110 add(mFilter3); 111 }}; 112 IncomingCallFilter testFilter = new IncomingCallFilter(mContext, mResultCallback, mCall, 113 mLock, mTimeoutsAdapter, filters); 114 testFilter.performFiltering(); 115 verify(mFilter1).startFilterLookup(mCall, testFilter); 116 verify(mFilter2).startFilterLookup(mCall, testFilter); 117 verify(mFilter3).startFilterLookup(mCall, testFilter); 118 119 testFilter.onCallFilteringComplete(mCall, RESULT1); 120 testFilter.onCallFilteringComplete(mCall, RESULT2); 121 testFilter.onCallFilteringComplete(mCall, RESULT3); 122 waitForHandlerAction(testFilter.getHandler(), SHORT_TIMEOUT * 2); 123 verify(mResultCallback).onCallFilteringComplete(eq(mCall), eq( 124 new CallFilteringResult( 125 false, // shouldAllowCall 126 true, // shouldReject 127 false, // shouldAddToCallLog 128 false // shouldShowNotification 129 ))); 130 } 131 132 @SmallTest 133 public void testFilterTimeout() throws Exception { 134 setTimeoutLength(SHORT_TIMEOUT); 135 IncomingCallFilter testFilter = new IncomingCallFilter(mContext, mResultCallback, mCall, 136 mLock, mTimeoutsAdapter, Collections.singletonList(mFilter1)); 137 testFilter.performFiltering(); 138 verify(mResultCallback, timeout((int) SHORT_TIMEOUT * 2)).onCallFilteringComplete(eq(mCall), 139 eq(DEFAULT_RESULT)); 140 testFilter.onCallFilteringComplete(mCall, RESULT1); 141 waitForHandlerAction(testFilter.getHandler(), SHORT_TIMEOUT * 2); 142 // verify that we don't report back again with the result 143 verify(mResultCallback, atMost(1)).onCallFilteringComplete(any(Call.class), 144 any(CallFilteringResult.class)); 145 } 146 147 @SmallTest 148 public void testFilterTimeoutDoesntTrip() throws Exception { 149 setTimeoutLength(SHORT_TIMEOUT); 150 IncomingCallFilter testFilter = new IncomingCallFilter(mContext, mResultCallback, mCall, 151 mLock, mTimeoutsAdapter, Collections.singletonList(mFilter1)); 152 testFilter.performFiltering(); 153 testFilter.onCallFilteringComplete(mCall, RESULT1); 154 waitForHandlerAction(testFilter.getHandler(), SHORT_TIMEOUT * 2); 155 Thread.sleep(SHORT_TIMEOUT); 156 verify(mResultCallback, atMost(1)).onCallFilteringComplete(any(Call.class), 157 any(CallFilteringResult.class)); 158 } 159 160 @SmallTest 161 public void testToString() { 162 assertEquals("[Allow, logged, notified]", RESULT1.toString()); 163 assertEquals("[Reject, notified]", RESULT2.toString()); 164 assertEquals("[Reject, logged]", RESULT3.toString()); 165 } 166 167 private void setTimeoutLength(long length) throws Exception { 168 when(mTimeoutsAdapter.getCallScreeningTimeoutMillis(any(ContentResolver.class))) 169 .thenReturn(length); 170 } 171} 172