From 42be85d8a976c049ea237a48a35beada80638b85 Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Fri, 29 May 2015 10:39:14 -0700 Subject: Fix CallDetailActivity tests. + Reset the AsyncTaskExecutor's instance between calls in tests. I don't know why this is necessary, but it fixes a class of problems which were happening. + Don't try to release a media player if it has not been prepared. + Handle possible race conditions since MediaPlayer's async prepare may be buffering or finished when a test assert is executed. + Add asset file no longer provided by variablespeed library. - Cleanup some stream copy code. Change-Id: I0ae5fde00514c6dcdb1e9c063435a13eed6e8528 --- .../dialer/calllog/CallLogAsyncTaskUtil.java | 7 +++ .../voicemail/VoicemailPlaybackPresenter.java | 18 +++++++- tests/assets/README.txt | 3 ++ tests/assets/quick_test_recording.mp3 | Bin 0 -> 30591 bytes .../com/android/dialer/CallDetailActivityTest.java | 50 +++++++++++---------- 5 files changed, 53 insertions(+), 25 deletions(-) create mode 100644 tests/assets/README.txt create mode 100644 tests/assets/quick_test_recording.mp3 diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java index 20e213c4f..aa186eb69 100644 --- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java +++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java @@ -34,6 +34,8 @@ import com.android.dialer.util.AsyncTaskExecutor; import com.android.dialer.util.AsyncTaskExecutors; import com.android.dialer.util.TelecomUtil; +import com.google.common.annotations.VisibleForTesting; + public class CallLogAsyncTaskUtil { private static String TAG = CallLogAsyncTaskUtil.class.getSimpleName(); @@ -297,4 +299,9 @@ public class CallLogAsyncTaskUtil { } }); } + + @VisibleForTesting + public static void resetForTest() { + sAsyncTaskExecutor = null; + } } diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java index 1ab87fd24..1ee376582 100644 --- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java +++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java @@ -43,6 +43,7 @@ import com.android.common.io.MoreCloseables; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import java.io.IOException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.RejectedExecutionException; @@ -124,6 +125,7 @@ public class VoicemailPlaybackPresenter private Uri mVoicemailUri; private int mPosition; + private boolean mIsPrepared; private boolean mIsPlaying; private boolean mShouldResumePlaybackAfterSeeking; @@ -172,6 +174,7 @@ public class VoicemailPlaybackPresenter mView.setPresenter(this); + mIsPrepared = false; checkForContent(); } @@ -184,6 +187,11 @@ public class VoicemailPlaybackPresenter } public void onDestroy() { + if (mIsPrepared) { + mMediaPlayer.release(); + mIsPrepared = false; + } + if (mScheduledExecutorService != null) { mScheduledExecutorService.shutdown(); mScheduledExecutorService = null; @@ -350,7 +358,7 @@ public class VoicemailPlaybackPresenter mMediaPlayer.setDataSource(mContext, mVoicemailUri); mMediaPlayer.setAudioStreamType(PLAYBACK_STREAM); mMediaPlayer.prepareAsync(); - } catch (Exception e) { + } catch (IOException e) { handleError(e); } } @@ -360,6 +368,8 @@ public class VoicemailPlaybackPresenter */ @Override public void onPrepared(MediaPlayer mp) { + mIsPrepared = true; + mView.enableUiElements(); if (mIsPlaying) { @@ -380,7 +390,11 @@ public class VoicemailPlaybackPresenter } private void handleError(Exception e) { - mMediaPlayer.release(); + if (mIsPrepared) { + mMediaPlayer.release(); + mIsPrepared = false; + } + mView.onPlaybackError(e); setPosition(0, false); } diff --git a/tests/assets/README.txt b/tests/assets/README.txt new file mode 100644 index 000000000..6cea058cf --- /dev/null +++ b/tests/assets/README.txt @@ -0,0 +1,3 @@ +quick_test_recording.mp3 is copyright 2011 by Hugo Hudson and is licensed under a +Creative Commons Attribution 3.0 Unported License: + http://creativecommons.org/licenses/by/3.0/ diff --git a/tests/assets/quick_test_recording.mp3 b/tests/assets/quick_test_recording.mp3 new file mode 100644 index 000000000..ad7cb9c20 Binary files /dev/null and b/tests/assets/quick_test_recording.mp3 differ diff --git a/tests/src/com/android/dialer/CallDetailActivityTest.java b/tests/src/com/android/dialer/CallDetailActivityTest.java index 4dc9ebb81..97b1b0989 100644 --- a/tests/src/com/android/dialer/CallDetailActivityTest.java +++ b/tests/src/com/android/dialer/CallDetailActivityTest.java @@ -33,12 +33,12 @@ import android.test.suitebuilder.annotation.Suppress; import android.view.Menu; import android.widget.TextView; +import com.android.dialer.calllog.CallLogAsyncTaskUtil; import com.android.dialer.util.AsyncTaskExecutors; import com.android.dialer.util.FakeAsyncTaskExecutor; import com.android.contacts.common.test.IntegrationTestUtils; import com.android.dialer.util.LocaleTestUtils; import com.android.internal.view.menu.ContextMenuBuilder; -import com.google.common.io.Closeables; import java.io.IOException; import java.io.InputStream; @@ -90,27 +90,29 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2 0) { out.write(buffer, 0, bytesRead); } } @@ -285,6 +280,14 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2 view1s = mTestUtils.getTextViewsWithString(mActivityUnderTest, text1); + List view2s = mTestUtils.getTextViewsWithString(mActivityUnderTest, text2); + assertEquals("There should have been one TextView with text '" + text1 + "' or text '" + + text2 + "' but found " + view1s + view2s, 1, view1s.size() + view2s.size()); + } + private void assertZeroTextViewsContaining(String text) throws Throwable { assertNotNull(mActivityUnderTest); List views = mTestUtils.getTextViewsWithString(mActivityUnderTest, text); @@ -300,6 +303,7 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2