diff options
Diffstat (limited to 'variablespeed/tests/src/com/android/ex/variablespeed/MediaPlayerProxyTestCase.java')
-rw-r--r-- | variablespeed/tests/src/com/android/ex/variablespeed/MediaPlayerProxyTestCase.java | 581 |
1 files changed, 0 insertions, 581 deletions
diff --git a/variablespeed/tests/src/com/android/ex/variablespeed/MediaPlayerProxyTestCase.java b/variablespeed/tests/src/com/android/ex/variablespeed/MediaPlayerProxyTestCase.java deleted file mode 100644 index 37a0cce..0000000 --- a/variablespeed/tests/src/com/android/ex/variablespeed/MediaPlayerProxyTestCase.java +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.ex.variablespeed; - -import com.google.common.io.Closeables; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.res.AssetManager; -import android.net.Uri; -import android.provider.VoicemailContract; -import android.test.InstrumentationTestCase; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * Base test for checking implementations of {@link MediaPlayerProxy}. - * <p> - * The purpose behind this class is to collect tests that implementations of - * MediaPlayerProxy should support. - * <p> - * This allows tests to show that the built-in {@link android.media.MediaPlayer} is performing - * correctly with respect to the contract it provides, i.e. test my understanding of that contract. - * <p> - * It allows us to test the current {@link VariableSpeed} implementation, and make sure that this - * too corresponds with the MediaPlayer implementation. - * <p> - * These tests cannot be run on their own - you must provide a concrete subclass of this test case - - * and in that subclass you will provide an implementation of the abstract - * {@link #createTestMediaPlayer()} method to construct the player you would like to test. Every - * test will construct the player in {@link #setUp()} and release it in {@link #tearDown()}. - */ -public abstract class MediaPlayerProxyTestCase extends InstrumentationTestCase { - private static final float ERROR_TOLERANCE_MILLIS = 1000f; - - /** The phone number to use when inserting test data into the content provider. */ - private static final String CONTACT_NUMBER = "01234567890"; - - /** - * A map from filename + mime type to the uri we can use to play from the content provider. - * <p> - * This is lazily filled in by the {@link #getTestContentUri(String, String)} method. - * <p> - * This map is keyed from the concatenation of filename and mime type with a "+" separator, it's - * not perfect but it doesn't matter in this test code. - */ - private final Map<String, Uri> mContentUriMap = new HashMap<String, Uri>(); - - /** The system under test. */ - private MediaPlayerProxy mPlayer; - - private AwaitableCompletionListener mCompletionListener; - private AwaitableErrorListener mErrorListener; - - @Override - protected void setUp() throws Exception { - super.setUp(); - mPlayer = createTestMediaPlayer(); - mCompletionListener = new AwaitableCompletionListener(); - mErrorListener = new AwaitableErrorListener(); - } - - @Override - protected void tearDown() throws Exception { - mCompletionListener = null; - mErrorListener = null; - mPlayer.release(); - mPlayer = null; - cleanupContentUriIfNecessary(); - super.tearDown(); - } - - public abstract MediaPlayerProxy createTestMediaPlayer() throws Exception; - - /** Annotation to indicate that test should throw an {@link IllegalStateException}. */ - @Retention(RetentionPolicy.RUNTIME) - public @interface ShouldThrowIllegalStateException { - } - - @Override - protected void runTest() throws Throwable { - // Tests annotated with ShouldThrowIllegalStateException will fail if they don't. - // Tests not annotated this way are run as normal. - if (getClass().getMethod(getName()).isAnnotationPresent( - ShouldThrowIllegalStateException.class)) { - try { - super.runTest(); - fail("Expected this method to throw an IllegalStateException, but it didn't"); - } catch (IllegalStateException e) { - // Expected. - } - } else { - super.runTest(); - } - } - - public void testReleaseMultipleTimesHasNoEffect() throws Exception { - mPlayer.release(); - mPlayer.release(); - } - - public void testResetOnNewlyCreatedObject() throws Exception { - mPlayer.reset(); - } - - public void testSetDataSource() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - } - - @ShouldThrowIllegalStateException - public void testSetDataSourceTwice_ShouldFailWithIllegalState() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - } - - @ShouldThrowIllegalStateException - public void testSetDataSourceAfterRelease_ShouldFailWithIllegalState() throws Exception { - mPlayer.release(); - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - } - - public void testPrepare() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - } - - @ShouldThrowIllegalStateException - public void testPrepareBeforeSetDataSource_ShouldFail() throws Exception { - mPlayer.prepare(); - } - - @ShouldThrowIllegalStateException - public void testPrepareTwice_ShouldFailWithIllegalState() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.prepare(); - } - - public void testStartThenImmediatelyRelease() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - } - - public void testPlayABitThenRelease() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - Thread.sleep(2000); - } - - public void testPlayFully() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testGetDuration() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - int duration = mPlayer.getDuration(); - assertTrue("duration was " + duration, duration > 0); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - assertEquals(duration, mPlayer.getDuration()); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - assertEquals(duration, mPlayer.getDuration()); - } - - @ShouldThrowIllegalStateException - public void testGetDurationAfterRelease_ShouldFail() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.release(); - mPlayer.getDuration(); - } - - @ShouldThrowIllegalStateException - public void testGetPositionAfterRelease_ShouldFail() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.release(); - mPlayer.getCurrentPosition(); - } - - public void testGetCurrentPosition_ZeroBeforePlaybackBegins() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - assertEquals(0, mPlayer.getCurrentPosition()); - mPlayer.prepare(); - assertEquals(0, mPlayer.getCurrentPosition()); - } - - public void testGetCurrentPosition_DuringPlayback() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - Thread.sleep(2000); - assertEquals(2000, mPlayer.getCurrentPosition(), ERROR_TOLERANCE_MILLIS); - } - - public void testGetCurrentPosition_FinishedPlaying() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - assertEquals(mPlayer.getDuration(), mPlayer.getCurrentPosition(), ERROR_TOLERANCE_MILLIS); - } - - public void testGetCurrentPosition_DuringPlaybackWithSeek() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.seekTo(1500); - mPlayer.start(); - Thread.sleep(1500); - assertEquals(3000, mPlayer.getCurrentPosition(), ERROR_TOLERANCE_MILLIS); - } - - public void testSeekHalfWayBeforePlaying() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - assertTrue(mPlayer.getDuration() > 0); - mPlayer.seekTo(mPlayer.getDuration() / 2); - mPlayer.start(); - mPlayer.setOnCompletionListener(mCompletionListener); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testHalfWaySeekWithStutteringAudio() throws Exception { - // The audio contained in this file has a stutter if we seek to half way and play. - // It shouldn't have. - setDataSourceFromContentProvider(mPlayer, "fake_voicemail2.mp3", "audio/mp3"); - mPlayer.prepare(); - assertTrue(mPlayer.getDuration() > 0); - mPlayer.seekTo(mPlayer.getDuration() / 2); - mPlayer.start(); - mPlayer.setOnCompletionListener(mCompletionListener); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testResetWithoutReleaseAndThenReUse() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.reset(); - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.seekTo(mPlayer.getDuration() / 2); - mPlayer.start(); - Thread.sleep(1000); - } - - public void testResetAfterPlaybackThenReUse() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.prepare(); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - mPlayer.reset(); - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - Thread.sleep(2000); - } - - public void testResetDuringPlaybackThenReUse() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - Thread.sleep(2000); - mPlayer.reset(); - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - Thread.sleep(2000); - } - - public void testFinishPlayingThenSeekToHalfWayThenPlayAgain() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - mPlayer.seekTo(mPlayer.getDuration() / 2); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testPause_DuringPlayback() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - assertTrue(mPlayer.isPlaying()); - Thread.sleep(2000); - assertTrue(mPlayer.isPlaying()); - mPlayer.pause(); - assertFalse(mPlayer.isPlaying()); - } - - public void testPause_DoesNotInvokeCallback() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mPlayer.pause(); - Thread.sleep(200); - mCompletionListener.assertNoMoreCallbacks(); - } - - public void testReset_DoesNotInvokeCallback() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mPlayer.reset(); - Thread.sleep(200); - mCompletionListener.assertNoMoreCallbacks(); - } - - public void testPause_MultipleTimes() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.start(); - Thread.sleep(2000); - mPlayer.pause(); - mPlayer.pause(); - } - - public void testDoubleStartWaitingForFinish() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testTwoFastConsecutiveStarts() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - Thread.sleep(200); - mCompletionListener.assertNoMoreCallbacks(); - } - - public void testThreeFastConsecutiveStarts() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mPlayer.start(); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - Thread.sleep(4000); - mCompletionListener.assertNoMoreCallbacks(); - } - - public void testSeekDuringPlayback() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - Thread.sleep(2000); - mPlayer.seekTo(0); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - Thread.sleep(200); - mCompletionListener.assertNoMoreCallbacks(); - } - - public void testPlaySingleChannelLowSampleRate3gppFile() throws Exception { - setDataSourceFromContentProvider(mPlayer, "count_and_test.3gpp", "audio/3gpp"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testPlayTwoDifferentTypesWithSameMediaPlayer() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - mPlayer.reset(); - setDataSourceFromContentProvider(mPlayer, "count_and_test.3gpp", "audio/3gpp"); - mPlayer.prepare(); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testIllegalPreparingDoesntFireErrorListener() throws Exception { - mPlayer.setOnErrorListener(mErrorListener); - try { - mPlayer.prepare(); - fail("This should have thrown an IllegalStateException"); - } catch (IllegalStateException e) { - // Good, expected. - } - mErrorListener.assertNoMoreCallbacks(); - } - - public void testSetDataSourceForMissingFile_ThrowsIOExceptionInPrepare() throws Exception { - mPlayer.setOnErrorListener(mErrorListener); - mPlayer.setDataSource("/this/file/does/not/exist/"); - try { - mPlayer.prepare(); - fail("Should have thrown IOException"); - } catch (IOException e) { - // Good, expected. - } - // Synchronous prepare does not report errors to the error listener. - mErrorListener.assertNoMoreCallbacks(); - } - - public void testRepeatedlySeekingDuringPlayback() throws Exception { - // Start playback then seek repeatedly during playback to the same point. - // The real media player should play a stuttering audio, hopefully my player does too. - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - Thread.sleep(500); - for (int i = 0; i < 40; ++i) { - Thread.sleep(200); - mPlayer.seekTo(2000); - } - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testRepeatedlySeekingDuringPlaybackRandomAndVeryFast() throws Exception { - setDataSourceFromContentProvider(mPlayer, "quick_test_recording.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - Thread.sleep(500); - for (int i = 0; i < 40; ++i) { - Thread.sleep(250); - mPlayer.seekTo(1500 + (int) (Math.random() * 1000)); - } - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - } - - public void testSeekToEndThenPlayThenRateChangeCrash() throws Exception { - // Unit test for this bug: http://b/5140693 - // This test proves that the bug is fixed. - setDataSourceFromContentProvider(mPlayer, "fake_voicemail.mp3", "audio/mp3"); - mPlayer.prepare(); - mPlayer.seekTo(mPlayer.getDuration() - 1); - mPlayer.setOnCompletionListener(mCompletionListener); - mPlayer.start(); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - // Prior to the fix, this next line was causing a crash. - // The reason behind this was due to our having seeked so close to the end of the file - // that insufficient data was being read, and thus we weren't able to yet determine the - // sample rate and number of channels, which was causing an assertion failure when trying - // to create the time scaler. - setVariableSpeedRateIfSupported(1.0f); - } - - public void testVariableSpeedRateChangeAtDifferentTimes() throws Exception { - // Just check that we can set the rate at any point during playback. - setVariableSpeedRateIfSupported(1.05f); - setDataSourceFromContentProvider(mPlayer, "fake_voicemail.mp3", "audio/mp3"); - setVariableSpeedRateIfSupported(1.10f); - mPlayer.prepare(); - setVariableSpeedRateIfSupported(1.15f); - mPlayer.seekTo(mPlayer.getDuration() / 2); - setVariableSpeedRateIfSupported(1.20f); - mPlayer.setOnCompletionListener(mCompletionListener); - setVariableSpeedRateIfSupported(1.25f); - mPlayer.start(); - setVariableSpeedRateIfSupported(1.30f); - mCompletionListener.awaitOneCallback(10, TimeUnit.SECONDS); - setVariableSpeedRateIfSupported(1.35f); - } - - /** - * If we have a variable speed media player proxy, set the variable speed rate. - * <p> - * If we don't have a variable speed media player proxy, this method will be a no-op. - */ - private void setVariableSpeedRateIfSupported(float rate) { - if (mPlayer instanceof SingleThreadedMediaPlayerProxy) { - ((SingleThreadedMediaPlayerProxy) mPlayer).setVariableSpeed(rate); - } else if (mPlayer instanceof VariableSpeed) { - ((VariableSpeed) mPlayer).setVariableSpeed(rate); - } - } - - /** - * Gets the {@link Uri} for the test audio content we should play. - * <p> - * If this is the first time we've called this method, for a given file type and mime type, then - * we'll have to insert some data into the content provider so that we can play it. - * <p> - * This is not thread safe, but doesn't need to be because all unit tests are executed from a - * single thread, sequentially. - */ - private Uri getTestContentUri(String assetFilename, String assetMimeType) throws IOException { - String key = keyFor(assetFilename, assetMimeType); - if (mContentUriMap.containsKey(key)) { - return mContentUriMap.get(key); - } - ContentValues values = new ContentValues(); - values.put(VoicemailContract.Voicemails.DATE, String.valueOf(System.currentTimeMillis())); - values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER); - values.put(VoicemailContract.Voicemails.MIME_TYPE, assetMimeType); - String packageName = getInstrumentation().getTargetContext().getPackageName(); - Uri uri = getContentResolver().insert( - VoicemailContract.Voicemails.buildSourceUri(packageName), values); - AssetManager assets = getAssets(); - OutputStream outputStream = null; - InputStream inputStream = null; - try { - inputStream = assets.open(assetFilename); - outputStream = getContentResolver().openOutputStream(uri); - copyBetweenStreams(inputStream, outputStream); - mContentUriMap.put(key, uri); - return uri; - } finally { - Closeables.closeQuietly(outputStream); - Closeables.closeQuietly(inputStream); - } - } - - private String keyFor(String assetFilename, String assetMimeType) { - return assetFilename + "+" + assetMimeType; - } - - public void copyBetweenStreams(InputStream in, OutputStream out) throws IOException { - byte[] buffer = new byte[1024]; - int bytesRead; - while ((bytesRead = in.read(buffer)) != -1) { - out.write(buffer, 0, bytesRead); - } - } - - private void cleanupContentUriIfNecessary() { - for (Uri uri : mContentUriMap.values()) { - getContentResolver().delete(uri, null, null); - } - mContentUriMap.clear(); - } - - private void setDataSourceFromContentProvider(MediaPlayerProxy player, String assetFilename, - String assetMimeType) throws IOException { - player.setDataSource(getInstrumentation().getTargetContext(), - getTestContentUri(assetFilename, assetMimeType)); - } - - private ContentResolver getContentResolver() { - return getInstrumentation().getContext().getContentResolver(); - } - - private AssetManager getAssets() { - return getInstrumentation().getContext().getAssets(); - } -} |