From 90820a50b614e8b5f6a9830536553167e1914faa Mon Sep 17 00:00:00 2001 From: Brandon Maxwell Date: Fri, 12 Feb 2016 17:47:41 -0800 Subject: 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 --- InCallUI/src/com/android/incallui/async/PausableExecutor.java | 8 ++++++++ .../src/com/android/incallui/async/PausableExecutorImpl.java | 3 +++ .../com/android/incallui/async/SingleProdThreadExecutor.java | 11 +++++++++-- .../com/android/incallui/ringtone/InCallTonePlayerTest.java | 7 ++----- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/InCallUI/src/com/android/incallui/async/PausableExecutor.java b/InCallUI/src/com/android/incallui/async/PausableExecutor.java index fdeef360c..1b8201a79 100644 --- a/InCallUI/src/com/android/incallui/async/PausableExecutor.java +++ b/InCallUI/src/com/android/incallui/async/PausableExecutor.java @@ -44,6 +44,14 @@ public interface PausableExecutor extends Executor { @NeededForTesting 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 e493feb3d..15900e57b 100644 --- a/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java +++ b/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java @@ -29,6 +29,9 @@ public class PausableExecutorImpl implements PausableExecutor { @Override public void ackMilestoneForTesting() {} + @Override + public void ackAllMilestonesForTesting() {} + @Override public void awaitMilestoneForTesting() {} diff --git a/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java b/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java index 839bb2e96..5717c9478 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 @@ public final class SingleProdThreadExecutor implements PausableExecutor { 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) {} @@ -48,9 +49,15 @@ public final class SingleProdThreadExecutor implements PausableExecutor { notify(); } + @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 096d21122..59611f701 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 @@ public class InCallTonePlayerTest extends AndroidTestCase { 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() { -- cgit v1.2.3