Added ackAllMilestones api to PausableExecutor
+ This API simplifies tests, specifically their tearDown methods.
Rather than needing to call ackMilestone numerous times to clean up
at the end of the test, this method can be called to ensure that the
thread running the production code isn't blocked on the tests.
Change-Id: I60730c52491b315aee571f4ae158f62d34b0dbc2
diff --git a/InCallUI/src/com/android/incallui/async/PausableExecutor.java b/InCallUI/src/com/android/incallui/async/PausableExecutor.java
index fdeef36..1b8201a 100644
--- a/InCallUI/src/com/android/incallui/async/PausableExecutor.java
+++ b/InCallUI/src/com/android/incallui/async/PausableExecutor.java
@@ -45,6 +45,14 @@
void ackMilestoneForTesting();
/**
+ * Method called from the test code to inform this executor that the tests are finished with all
+ * milestones. Future calls to {@link #milestone()} or {@link #awaitMilestoneForTesting()}
+ * should return immediately.
+ */
+ @NeededForTesting
+ void ackAllMilestonesForTesting();
+
+ /**
* Method called from the test code to block until a milestone has been reached in the
* production code.
*/
diff --git a/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java b/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java
index e493feb..15900e5 100644
--- a/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java
+++ b/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java
@@ -30,6 +30,9 @@
public void ackMilestoneForTesting() {}
@Override
+ public void ackAllMilestonesForTesting() {}
+
+ @Override
public void awaitMilestoneForTesting() {}
@Override
diff --git a/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java b/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java
index 839bb2e..5717c94 100644
--- a/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java
+++ b/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java
@@ -30,12 +30,13 @@
private int mMilestonesReached;
private int mMilestonesAcked;
+ private boolean mHasAckedAllMilestones;
@Override
public synchronized void milestone() {
++mMilestonesReached;
notify();
- while (mMilestonesReached > mMilestonesAcked) {
+ while (!mHasAckedAllMilestones && mMilestonesReached > mMilestonesAcked) {
try {
wait();
} catch (InterruptedException e) {}
@@ -49,8 +50,14 @@
}
@Override
+ public synchronized void ackAllMilestonesForTesting() {
+ mHasAckedAllMilestones = true;
+ notify();
+ }
+
+ @Override
public synchronized void awaitMilestoneForTesting() throws InterruptedException {
- while (mMilestonesReached <= mMilestonesAcked) {
+ while (!mHasAckedAllMilestones && mMilestonesReached <= mMilestonesAcked) {
wait();
}
}
diff --git a/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java b/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
index 096d211..59611f7 100644
--- a/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
+++ b/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
@@ -61,11 +61,8 @@
super.tearDown();
// Stop any playing so the InCallTonePlayer isn't stuck waiting for the tone to complete
mInCallTonePlayer.stop();
- // 3 milestones in InCallTonePlayer, ack them to ensure that the prod thread doesn't block
- // forever. It's fine to ack for more milestones than are hit
- mExecutor.ackMilestoneForTesting();
- mExecutor.ackMilestoneForTesting();
- mExecutor.ackMilestoneForTesting();
+ // Ack all milestones to ensure that the prod thread doesn't block forever
+ mExecutor.ackAllMilestonesForTesting();
}
public void testIsPlayingTone_False() {