Fixes some of the flakiness in Telecom
- Fixes some flakiness in the tests
- Mocks out the ToneGenerator
Test: Run Telecom Unit Tests
Change-Id: If3bd51fe4a82068cc0d712d2e499abde4fdb0481
diff --git a/scripts/telecom_testing.sh b/scripts/telecom_testing.sh
index 0ece427..723b041 100644
--- a/scripts/telecom_testing.sh
+++ b/scripts/telecom_testing.sh
@@ -10,6 +10,7 @@
running tests (mmma).
-e Run code coverage. Coverage will be output into the coverage/
directory in the repo root.
+ -g Run build commands with USE_GOMA=true
-h This help message.
"
@@ -20,8 +21,9 @@
local installwdep=false
local debug=false
local coverage=false
+ local goma=false
- while getopts "c:p:hadie" opt; do
+ while getopts "c:p:hadieg" opt; do
case "$opt" in
h)
echo "$usage"
@@ -40,6 +42,8 @@
installwdep=true;;
e)
coverage=true;;
+ g)
+ goma=true;;
p)
project=$OPTARG;;
esac
@@ -67,6 +71,8 @@
if [ $install = true ] ; then
local olddir=$(pwd)
local emma_opt=
+ local goma_opt=
+
cd $T
# Build and exit script early if build fails
@@ -76,10 +82,14 @@
emma_opt="EMMA_INSTRUMENT=false"
fi
+ if [ $goma = true ] ; then
+ goma_opt="USE_GOMA=true"
+ fi
+
if [ $installwdep = true ] ; then
- (export ${emma_opt}; mmma -j40 "$build_dir")
+ (export ${emma_opt}; mmma ${goma_opt} -j40 "$build_dir")
else
- (export ${emma_opt}; mmm "$build_dir")
+ (export ${emma_opt}; mmm ${goma_opt} "$build_dir")
fi
if [ $? -ne 0 ] ; then
echo "Make failed! try using -a instead of -i if building with coverage"
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 99e9e03..8a65c09 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -305,7 +305,8 @@
Timeouts.Adapter timeoutsAdapter,
AsyncRingtonePlayer asyncRingtonePlayer,
PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
- EmergencyCallHelper emergencyCallHelper) {
+ EmergencyCallHelper emergencyCallHelper,
+ InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory) {
mContext = context;
mLock = lock;
mPhoneNumberUtilsAdapter = phoneNumberUtilsAdapter;
@@ -345,7 +346,7 @@
mDockManager);
InCallTonePlayer.Factory playerFactory = new InCallTonePlayer.Factory(
- callAudioRoutePeripheralAdapter, lock);
+ callAudioRoutePeripheralAdapter, lock, toneGeneratorFactory);
SystemSettingsUtil systemSettingsUtil = new SystemSettingsUtil();
RingtoneFactory ringtoneFactory = new RingtoneFactory(this, context);
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index 62c692b..a258aee 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -40,11 +40,13 @@
private CallAudioManager mCallAudioManager;
private final CallAudioRoutePeripheralAdapter mCallAudioRoutePeripheralAdapter;
private final TelecomSystem.SyncRoot mLock;
+ private final ToneGeneratorFactory mToneGeneratorFactory;
Factory(CallAudioRoutePeripheralAdapter callAudioRoutePeripheralAdapter,
- TelecomSystem.SyncRoot lock) {
+ TelecomSystem.SyncRoot lock, ToneGeneratorFactory toneGeneratorFactory) {
mCallAudioRoutePeripheralAdapter = callAudioRoutePeripheralAdapter;
mLock = lock;
+ mToneGeneratorFactory = toneGeneratorFactory;
}
public void setCallAudioManager(CallAudioManager callAudioManager) {
@@ -53,10 +55,14 @@
public InCallTonePlayer createPlayer(int tone) {
return new InCallTonePlayer(tone, mCallAudioManager,
- mCallAudioRoutePeripheralAdapter, mLock);
+ mCallAudioRoutePeripheralAdapter, mLock, mToneGeneratorFactory);
}
}
+ public interface ToneGeneratorFactory {
+ ToneGenerator get (int streamType, int volume);
+ }
+
// The possible tones that we can play.
public static final int TONE_INVALID = 0;
public static final int TONE_BUSY = 1;
@@ -111,6 +117,8 @@
private Session mSession;
private final Object mSessionLock = new Object();
+ private final ToneGeneratorFactory mToneGenerator;
+
/**
* Initializes the tone player. Private; use the {@link Factory} to create tone players.
*
@@ -120,12 +128,14 @@
int toneId,
CallAudioManager callAudioManager,
CallAudioRoutePeripheralAdapter callAudioRoutePeripheralAdapter,
- TelecomSystem.SyncRoot lock) {
+ TelecomSystem.SyncRoot lock,
+ ToneGeneratorFactory toneGeneratorFactory) {
mState = STATE_OFF;
mToneId = toneId;
mCallAudioManager = callAudioManager;
mCallAudioRoutePeripheralAdapter = callAudioRoutePeripheralAdapter;
mLock = lock;
+ mToneGenerator = toneGeneratorFactory;
}
/** {@inheritDoc} */
@@ -227,7 +237,7 @@
// signal, and is not as important.
try {
Log.v(this, "Creating generator");
- toneGenerator = new ToneGenerator(stream, toneVolume);
+ toneGenerator = mToneGenerator.get(stream, toneVolume);
} catch (RuntimeException e) {
Log.w(this, "Failed to create ToneGenerator.", e);
return;
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index d2a1959..b40381b 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -189,7 +189,8 @@
Timeouts.Adapter timeoutsAdapter,
AsyncRingtonePlayer asyncRingtonePlayer,
PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
- IncomingCallNotifier incomingCallNotifier) {
+ IncomingCallNotifier incomingCallNotifier,
+ InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory) {
mContext = context.getApplicationContext();
LogUtils.initLogging(mContext);
DefaultDialerManagerAdapter defaultDialerAdapter =
@@ -253,7 +254,8 @@
timeoutsAdapter,
asyncRingtonePlayer,
phoneNumberUtilsAdapter,
- emergencyCallHelper);
+ emergencyCallHelper,
+ toneGeneratorFactory);
mIncomingCallNotifier = incomingCallNotifier;
incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
diff --git a/src/com/android/server/telecom/components/TelecomService.java b/src/com/android/server/telecom/components/TelecomService.java
index 56c1e08..d9d60b8 100644
--- a/src/com/android/server/telecom/components/TelecomService.java
+++ b/src/com/android/server/telecom/components/TelecomService.java
@@ -21,6 +21,7 @@
import android.content.Context;
import android.content.Intent;
import android.media.IAudioService;
+import android.media.ToneGenerator;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.ServiceManager;
@@ -35,6 +36,7 @@
import com.android.server.telecom.DefaultDialerCache;
import com.android.server.telecom.HeadsetMediaButton;
import com.android.server.telecom.HeadsetMediaButtonFactory;
+import com.android.server.telecom.InCallTonePlayer;
import com.android.server.telecom.InCallWakeLockControllerFactory;
import com.android.server.telecom.CallAudioManager;
import com.android.server.telecom.PhoneAccountRegistrar;
@@ -129,7 +131,7 @@
new InCallWakeLockControllerFactory() {
@Override
public InCallWakeLockController create(Context context,
- CallsManager callsManager) {
+ CallsManager callsManager) {
return new InCallWakeLockController(
new TelecomWakeLock(context,
PowerManager.FULL_WAKE_LOCK,
@@ -158,7 +160,8 @@
new Timeouts.Adapter(),
new AsyncRingtonePlayer(),
new PhoneNumberUtilsAdapterImpl(),
- new IncomingCallNotifier(context)
+ new IncomingCallNotifier(context),
+ ToneGenerator::new
));
}
if (BluetoothAdapter.getDefaultAdapter() != null) {
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
index d0d7c8e..129d86e 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
@@ -915,6 +915,8 @@
waitForStateMachineActionCompletion(stateMachine, CallAudioModeStateMachine.RUN_RUNNABLE);
+ Handler h = stateMachine.getHandler();
+ waitForHandlerAction(h, TEST_TIMEOUT);
stateMachine.quitStateMachine();
// Verify that no substantive interactions have taken place with the
diff --git a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
index 255af74..1c74bfa 100644
--- a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
@@ -439,7 +439,7 @@
mResourceConfiguration.setLocale(Locale.TAIWAN);
// TODO: Move into actual tests
- when(mAudioManager.isWiredHeadsetOn()).thenReturn(false);
+ doReturn(false).when(mAudioManager).isWiredHeadsetOn();
doAnswer(new Answer<List<ResolveInfo>>() {
@Override
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index a522cae..205d778 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -44,6 +44,7 @@
import android.content.Intent;
import android.media.AudioManager;
import android.media.IAudioService;
+import android.media.ToneGenerator;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -170,6 +171,21 @@
return mIsEmergencyCall;
}
}
+
+ private class IncomingCallAddedListener extends CallsManagerListenerBase {
+
+ private final CountDownLatch mCountDownLatch;
+
+ public IncomingCallAddedListener(CountDownLatch latch) {
+ mCountDownLatch = latch;
+ }
+
+ @Override
+ public void onCallAdded(com.android.server.telecom.Call call) {
+ mCountDownLatch.countDown();
+ }
+ }
+
PhoneNumberUtilsAdapter mPhoneNumberUtilsAdapter = new EmergencyNumberUtilsAdapter();
@Mock HeadsetMediaButton mHeadsetMediaButton;
@@ -320,6 +336,8 @@
// Finally, register the ConnectionServices with the PhoneAccountRegistrar of the
// now-running TelecomSystem
setupConnectionServices();
+
+ waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
}
@Override
@@ -407,7 +425,8 @@
mTimeoutsAdapter,
mAsyncRingtonePlayer,
mPhoneNumberUtilsAdapter,
- mIncomingCallNotifier);
+ mIncomingCallNotifier,
+ (streamType, volume) -> mock(ToneGenerator.class));
mComponentContextFixture.setTelecomManager(new TelecomManager(
mComponentContextFixture.getTestDouble(),
@@ -749,6 +768,10 @@
final int startingNumCalls = mInCallServiceFixtureX.mCallById.size();
boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null;
connectionServiceFixture.mConnectionServiceDelegate.mVideoState = videoState;
+ CountDownLatch incomingCallAddedLatch = new CountDownLatch(1);
+ IncomingCallAddedListener callAddedListener =
+ new IncomingCallAddedListener(incomingCallAddedLatch);
+ mTelecomSystem.getCallsManager().addListener(callAddedListener);
Bundle extras = new Bundle();
extras.putParcelable(
@@ -773,6 +796,9 @@
mCallerInfoAsyncQueryFactoryFixture.mRequests.forEach(
CallerInfoAsyncQueryFactoryFixture.Request::reply);
+ //Wait for/Verify call blocking happened asynchronously
+ incomingCallAddedLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS);
+
IContentProvider blockedNumberProvider =
mSpyContext.getContentResolver().acquireProvider(BlockedNumberContract.AUTHORITY);
verify(blockedNumberProvider, timeout(TEST_TIMEOUT)).call(
diff --git a/tests/src/com/android/server/telecom/tests/TelecomTestCase.java b/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
index b909a54..b735df9 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
@@ -37,6 +37,7 @@
mMockitoHelper.setUp(getContext(), getClass());
mComponentContextFixture = new ComponentContextFixture();
Log.setSessionContext(mComponentContextFixture.getTestDouble().getApplicationContext());
+ Log.getSessionManager().mCleanStaleSessions = null;
MockitoAnnotations.initMocks(this);
}