diff options
author | nchalko <nchalko@google.com> | 2018-02-20 15:29:34 -0800 |
---|---|---|
committer | Nick Chalko <nchalko@google.com> | 2018-02-21 11:12:53 -0800 |
commit | a220fc584a12d01122d0cd127288ec703e36ec9c (patch) | |
tree | 1956bc8c2c668fcc417f63c1c7d015f6d3122f05 | |
parent | 45cafba282fd7826c8441c7a5d208582efd80158 (diff) | |
download | TV-a220fc584a12d01122d0cd127288ec703e36ec9c.tar.gz |
CLEANUP: Migrate SampleSourceExtractorTest to robotest
PiperOrigin-RevId: 186372628
Change-Id: I9d3158cd6752e2181c74c52d91f13e19e618bd07
5 files changed, 22 insertions, 430 deletions
diff --git a/tests/tunerunit/Android.mk b/tests/tunerunit/Android.mk deleted file mode 100644 index f599706d..00000000 --- a/tests/tunerunit/Android.mk +++ /dev/null @@ -1,25 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := UsbTunerTvInputTests - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android-support-test \ - tv-test-common \ - -LOCAL_JAVA_LIBRARIES := \ - android.test.runner.stubs \ - android.test.base.stubs \ - android.test.mock.stubs \ - -LOCAL_INSTRUMENTATION_FOR := LiveTv - -LOCAL_SDK_VERSION := system_current -LOCAL_PROGUARD_ENABLED := disabled - -include $(BUILD_PACKAGE) diff --git a/tests/tunerunit/AndroidManifest.xml b/tests/tunerunit/AndroidManifest.xml deleted file mode 100644 index ae9609ac..00000000 --- a/tests/tunerunit/AndroidManifest.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2018 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 - --> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.tv.tests" > - - <uses-sdk android:targetSdkVersion="26" android:minSdkVersion="23" /> - - <instrumentation - android:name="android.support.test.runner.AndroidJUnitRunner" - android:label="Live Channel Unit Tests" - android:targetPackage="com.android.tv.tuner" /> - - <application android:label="TunerTest" > - <uses-library android:name="android.test.runner" /> - </application> - -</manifest>
\ No newline at end of file diff --git a/tests/tunerunit/src/com/android/tv/tuner/exoplayer/tests/AssetDataSource.java b/tests/tunerunit/src/com/android/tv/tuner/exoplayer/tests/AssetDataSource.java deleted file mode 100644 index b3defc55..00000000 --- a/tests/tunerunit/src/com/android/tv/tuner/exoplayer/tests/AssetDataSource.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2017 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.tv.tuner.exoplayer.tests; - -import android.content.Context; -import android.content.res.AssetManager; -import com.google.android.exoplayer.C; -import com.google.android.exoplayer.upstream.DataSource; -import com.google.android.exoplayer.upstream.DataSpec; -import java.io.EOFException; -import java.io.IOException; -import java.io.InputStream; - -/** A local asset. */ -// Copied from com.google.android.exoplayer.upstream.AssetDataSource for test. -final class AssetDataSource implements DataSource { - /** Thrown when an {@link IOException} is encountered reading a local asset. */ - private static final class AssetDataSourceException extends IOException { - private AssetDataSourceException(IOException cause) { - super(cause); - } - } - - private final AssetManager mAssetManager; - - private InputStream mInputStream; - private long mBytesRemaining; - private boolean mOpened; - - /** Constructs a new {@link DataSource} that retrieves data from a local asset. */ - AssetDataSource(Context context) { - mAssetManager = context.getAssets(); - } - - @Override - public long open(DataSpec dataSpec) throws AssetDataSourceException { - try { - String path = dataSpec.uri.getPath(); - if (path.startsWith("/android_asset/")) { - path = path.substring(15); - } else if (path.startsWith("/")) { - path = path.substring(1); - } - mInputStream = mAssetManager.open(path, AssetManager.ACCESS_RANDOM); - long skipped = mInputStream.skip(dataSpec.position); - if (skipped < dataSpec.position) { - // mAssetManager.open() returns an AssetInputStream, whose skip() implementation - // only skips fewer bytes than requested if the skip is beyond the end of the - // asset's data. - throw new EOFException(); - } - if (dataSpec.length != C.LENGTH_UNBOUNDED) { - mBytesRemaining = dataSpec.length; - } else { - mBytesRemaining = mInputStream.available(); - if (mBytesRemaining == Integer.MAX_VALUE) { - // mAssetManager.open() returns an AssetInputStream, whose available() - // implementation returns Integer.MAX_VALUE if the remaining length is greater - // than (or equal to) Integer.MAX_VALUE. We don't know the true length in this - // case, so treat as unbounded. - mBytesRemaining = C.LENGTH_UNBOUNDED; - } - } - } catch (IOException e) { - throw new AssetDataSourceException(e); - } - - mOpened = true; - return mBytesRemaining; - } - - @Override - public int read(byte[] buffer, int offset, int readLength) throws AssetDataSourceException { - if (mBytesRemaining == 0) { - return -1; - } else { - int bytesRead = 0; - try { - int bytesToRead = - mBytesRemaining == C.LENGTH_UNBOUNDED - ? readLength - : (int) Math.min(mBytesRemaining, readLength); - bytesRead = mInputStream.read(buffer, offset, bytesToRead); - } catch (IOException e) { - throw new AssetDataSourceException(e); - } - - if (bytesRead > 0 && mBytesRemaining != C.LENGTH_UNBOUNDED) { - mBytesRemaining -= bytesRead; - } - - return bytesRead; - } - } - - @Override - public void close() throws AssetDataSourceException { - if (mInputStream != null) { - try { - mInputStream.close(); - } catch (IOException e) { - throw new AssetDataSourceException(e); - } finally { - mInputStream = null; - if (mOpened) { - mOpened = false; - } - } - } - } -} diff --git a/tests/tunerunit/src/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java b/tests/tunerunit/src/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java deleted file mode 100644 index 4b75a107..00000000 --- a/tests/tunerunit/src/com/android/tv/tuner/exoplayer/tests/SampleSourceExtractorTest.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (C) 2015 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.tv.tuner.exoplayer.tests; - -import android.content.Context; -import android.net.Uri; -import android.os.SystemClock; -import android.support.test.filters.LargeTest; -import android.test.InstrumentationTestCase; -import android.util.Pair; -import com.android.tv.tuner.exoplayer.ExoPlayerSampleExtractor; -import com.android.tv.tuner.exoplayer.buffer.BufferManager; -import com.android.tv.tuner.exoplayer.buffer.BufferManager.StorageManager; -import com.android.tv.tuner.exoplayer.buffer.SampleChunk; -import com.android.tv.tuner.testing.buffer.VerySlowSampleChunk; -import com.android.tv.tuner.tvinput.PlaybackBufferListener; -import com.google.android.exoplayer.MediaFormat; -import com.google.android.exoplayer.SampleHolder; -import com.google.android.exoplayer.SampleSource; -import com.google.android.exoplayer.upstream.DataSource; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.SortedMap; - -@LargeTest -public class SampleSourceExtractorTest extends InstrumentationTestCase { - // Maximum bandwidth of 1080p channel is about 2.2MB/s. 2MB for a sample will suffice. - private static final int SAMPLE_BUFFER_SIZE = 1024 * 1024 * 2; - private static final int CONSUMING_SAMPLES_PERIOD = 100; - private static final int PREPARE_POLL_DELAY_MILLIS = 100; - private static final String TEST_TS_ASSET_PATH = "asset:///capture_stream.ts"; - - public void testTrickplayDisabled() throws Throwable { - DataSource source = new AssetDataSource(getInstrumentation().getContext()); - MockPlaybackBufferListener listener = new MockPlaybackBufferListener(); - ExoPlayerSampleExtractor extractor = - new ExoPlayerSampleExtractor( - Uri.parse(TEST_TS_ASSET_PATH), source, null, listener, false); - - assertEquals("Trickplay should be disabled", listener.getLastState(), Boolean.FALSE); - - // Prepares the extractor. - try { - while (!extractor.prepare()) { - Thread.sleep(PREPARE_POLL_DELAY_MILLIS); - } - } catch (IOException | InterruptedException e) { - fail("Exception occurred while preparing: " + e.getMessage()); - } - - // Selects all tracks. - List<MediaFormat> trackFormats = extractor.getTrackFormats(); - for (int i = 0; i < trackFormats.size(); ++i) { - extractor.selectTrack(i); - } - - // Consumes over some period. - SampleHolder sampleHolder = new SampleHolder(SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL); - sampleHolder.ensureSpaceForWrite(SAMPLE_BUFFER_SIZE); - for (int i = 0; i < CONSUMING_SAMPLES_PERIOD; ++i) { - boolean found = false; - while (!found) { - for (int j = 0; j < trackFormats.size(); ++j) { - int result = extractor.readSample(j, sampleHolder); - switch (result) { - case SampleSource.SAMPLE_READ: - found = true; - break; - case SampleSource.END_OF_STREAM: - fail("Failed to read samples"); - break; - default: - } - if (found) { - break; - } - } - Thread.yield(); - } - } - - extractor.release(); - } - - public void testDiskTooSlowTrickplayDisabled() throws Throwable { - StorageManager storageManager = - new StubStorageManager(getInstrumentation().getTargetContext()); - BufferManager bufferManager = - new BufferManager( - storageManager, new VerySlowSampleChunk.VerySlowSampleChunkCreator()); - bufferManager.setMinimumSampleSizeForSpeedCheck(0); - DataSource source = new AssetDataSource(getInstrumentation().getContext()); - MockPlaybackBufferListener listener = new MockPlaybackBufferListener(); - ExoPlayerSampleExtractor extractor = - new ExoPlayerSampleExtractor( - Uri.parse(TEST_TS_ASSET_PATH), source, bufferManager, listener, false); - - assertEquals( - "Trickplay should be enabled at the first", listener.getLastState(), Boolean.TRUE); - - // Prepares the extractor. - try { - while (!extractor.prepare()) { - Thread.sleep(PREPARE_POLL_DELAY_MILLIS); - } - } catch (IOException | InterruptedException e) { - fail("Exception occurred while preparing: " + e.getMessage()); - } - - // Selects all tracks. - List<MediaFormat> trackFormats = extractor.getTrackFormats(); - for (int i = 0; i < trackFormats.size(); ++i) { - extractor.selectTrack(i); - } - - // Consumes until once speed check is done. - SampleHolder sampleHolder = new SampleHolder(SampleHolder.BUFFER_REPLACEMENT_MODE_NORMAL); - sampleHolder.ensureSpaceForWrite(SAMPLE_BUFFER_SIZE); - while (!bufferManager.hasSpeedCheckDone()) { - boolean found = false; - while (!found) { - for (int j = 0; j < trackFormats.size(); ++j) { - int result = extractor.readSample(j, sampleHolder); - switch (result) { - case SampleSource.SAMPLE_READ: - found = true; - break; - case SampleSource.END_OF_STREAM: - fail("Failed to read samples"); - break; - default: - } - if (found) { - break; - } - } - Thread.yield(); - } - } - - extractor.release(); - - // Sleep for synchronization. - SystemClock.sleep(1000); - - assertEquals( - "Disk too slow event should be reported", listener.isReportedDiskTooSlow(), true); - } - - private static class StubStorageManager implements StorageManager { - private final Context mContext; - - StubStorageManager(Context context) { - mContext = context; - } - - @Override - public File getBufferDir() { - return mContext.getCacheDir(); - } - - @Override - public boolean isPersistent() { - return false; - } - - @Override - public boolean reachedStorageMax(long bufferSize, long pendingDelete) { - return false; - } - - @Override - public boolean hasEnoughBuffer(long pendingDelete) { - return true; - } - - @Override - public List<BufferManager.TrackFormat> readTrackInfoFiles(boolean isAudio) { - return null; - } - - @Override - public ArrayList<BufferManager.PositionHolder> readIndexFile(String trackId) - throws IOException { - return null; - } - - @Override - public void writeTrackInfoFiles(List<BufferManager.TrackFormat> formatList, boolean isAudio) - throws IOException { - // No-op. - } - - @Override - public void writeIndexFile( - String trackName, SortedMap<Long, Pair<SampleChunk, Integer>> index) - throws IOException { - // No-op. - } - } - - public class MockPlaybackBufferListener implements PlaybackBufferListener { - private Boolean mLastState; - private boolean mIsReportedDiskTooSlow; - - public Boolean getLastState() { - return mLastState; - } - - public boolean isReportedDiskTooSlow() { - return mIsReportedDiskTooSlow; - } - - // PlaybackBufferListener - @Override - public void onBufferStartTimeChanged(long startTimeMs) { - // No-op. - } - - @Override - public void onBufferStateChanged(boolean available) { - mLastState = available; - } - - @Override - public void onDiskTooSlow() { - mIsReportedDiskTooSlow = true; - } - } -} diff --git a/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java b/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java index 488c099f..e10a2991 100644 --- a/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java +++ b/tuner/src/com/android/tv/tuner/exoplayer/ExoPlayerSampleExtractor.java @@ -23,6 +23,7 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.SystemClock; +import android.support.annotation.VisibleForTesting; import android.util.Pair; import com.android.tv.tuner.exoplayer.audio.MpegTsDefaultAudioTrackRenderer; import com.android.tv.tuner.exoplayer.buffer.BufferManager; @@ -90,6 +91,25 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { BufferManager bufferManager, PlaybackBufferListener bufferListener, boolean isRecording) { + this( + uri, + source, + bufferManager, + bufferListener, + isRecording, + Looper.myLooper(), + new HandlerThread("SourceReaderThread")); + } + + @VisibleForTesting + public ExoPlayerSampleExtractor( + Uri uri, + DataSource source, + BufferManager bufferManager, + PlaybackBufferListener bufferListener, + boolean isRecording, + Looper workerLooper, + HandlerThread sourceReaderThread) { // It'll be used as a timeshift file chunk name's prefix. mId = System.currentTimeMillis(); @@ -101,7 +121,7 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { } }; - mSourceReaderThread = new HandlerThread("SourceReaderThread"); + mSourceReaderThread = sourceReaderThread; mSourceReaderWorker = new SourceReaderWorker( new ExtractorMediaSource( @@ -148,8 +168,7 @@ public class ExoPlayerSampleExtractor implements SampleExtractor { } }, new ExoPlayerExtractorsFactory(), - // Do not create a handler if we not on a looper. e.g. test. - Looper.myLooper() != null ? new Handler() : null, + new Handler(workerLooper), eventListener)); if (isRecording) { mSampleBuffer = |