diff --git a/extensions/ffmpeg/build.gradle b/extensions/ffmpeg/build.gradle
index b3962f26da..2c2499759d 100644
--- a/extensions/ffmpeg/build.gradle
+++ b/extensions/ffmpeg/build.gradle
@@ -38,6 +38,8 @@ dependencies {
implementation project(modulePrefix + 'library-core')
implementation 'com.android.support:support-annotations:' + supportLibraryVersion
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
+ testImplementation project(modulePrefix + 'testutils-robolectric')
+ testImplementation 'junit:junit:' + junitVersion
}
ext {
diff --git a/extensions/ffmpeg/src/test/AndroidManifest.xml b/extensions/ffmpeg/src/test/AndroidManifest.xml
new file mode 100644
index 0000000000..d53bca4ca2
--- /dev/null
+++ b/extensions/ffmpeg/src/test/AndroidManifest.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java b/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java
new file mode 100644
index 0000000000..7e99a11861
--- /dev/null
+++ b/extensions/ffmpeg/src/test/java/com/google/android/exoplayer2/ext/ffmpeg/DefaultRenderersFactoryTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 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.google.android.exoplayer2.ext.ffmpeg;
+
+import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.testutil.DefaultRenderersFactoryAsserts;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Unit test for {@link DefaultRenderersFactoryTest} with {@link FfmpegAudioRenderer}. */
+@RunWith(RobolectricTestRunner.class)
+public final class DefaultRenderersFactoryTest {
+
+ @Test
+ public void createRenderers_instantiatesVpxRenderer() {
+ DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
+ FfmpegAudioRenderer.class, C.TRACK_TYPE_AUDIO);
+ }
+}
diff --git a/extensions/ffmpeg/src/test/resources/robolectric.properties b/extensions/ffmpeg/src/test/resources/robolectric.properties
new file mode 100644
index 0000000000..2f3210368e
--- /dev/null
+++ b/extensions/ffmpeg/src/test/resources/robolectric.properties
@@ -0,0 +1 @@
+manifest=src/test/AndroidManifest.xml
diff --git a/extensions/flac/build.gradle b/extensions/flac/build.gradle
index d632b051d9..41148bbc7d 100644
--- a/extensions/flac/build.gradle
+++ b/extensions/flac/build.gradle
@@ -36,11 +36,12 @@ android {
}
dependencies {
- implementation 'com.android.support:support-annotations:' + supportLibraryVersion
implementation project(modulePrefix + 'library-core')
- androidTestImplementation 'androidx.test:runner:' + testRunnerVersion
+ implementation 'com.android.support:support-annotations:' + supportLibraryVersion
androidTestImplementation project(modulePrefix + 'testutils')
+ androidTestImplementation 'androidx.test:runner:' + testRunnerVersion
testImplementation project(modulePrefix + 'testutils-robolectric')
+ testImplementation 'org.robolectric:robolectric:' + robolectricVersion
}
ext {
diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java
index 8f5dcef16b..cf484732e2 100644
--- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java
+++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacExtractor.java
@@ -94,7 +94,7 @@ public final class FlacExtractor implements Extractor {
/** Constructs an instance with flags = 0. */
public FlacExtractor() {
- this(0);
+ this(/* flags= */ 0);
}
/**
diff --git a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java
index 424fcbb285..ac7646cc4b 100644
--- a/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java
+++ b/extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/LibflacAudioRenderer.java
@@ -42,7 +42,9 @@ public class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
*/
- public LibflacAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener,
+ public LibflacAudioRenderer(
+ Handler eventHandler,
+ AudioRendererEventListener eventListener,
AudioProcessor... audioProcessors) {
super(eventHandler, eventListener, audioProcessors);
}
diff --git a/extensions/flac/src/test/java/com/google/android/exoplayer2/ext/flac/DefaultRenderersFactoryTest.java b/extensions/flac/src/test/java/com/google/android/exoplayer2/ext/flac/DefaultRenderersFactoryTest.java
new file mode 100644
index 0000000000..dfae6551a5
--- /dev/null
+++ b/extensions/flac/src/test/java/com/google/android/exoplayer2/ext/flac/DefaultRenderersFactoryTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 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.google.android.exoplayer2.ext.flac;
+
+import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.testutil.DefaultRenderersFactoryAsserts;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Unit test for {@link DefaultRenderersFactoryTest} with {@link LibflacAudioRenderer}. */
+@RunWith(RobolectricTestRunner.class)
+public final class DefaultRenderersFactoryTest {
+
+ @Test
+ public void createRenderers_instantiatesVpxRenderer() {
+ DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
+ LibflacAudioRenderer.class, C.TRACK_TYPE_AUDIO);
+ }
+}
diff --git a/extensions/opus/build.gradle b/extensions/opus/build.gradle
index 5ec584bf56..212c985157 100644
--- a/extensions/opus/build.gradle
+++ b/extensions/opus/build.gradle
@@ -37,6 +37,8 @@ android {
dependencies {
implementation project(modulePrefix + 'library-core')
+ testImplementation project(modulePrefix + 'testutils-robolectric')
+ testImplementation 'junit:junit:' + junitVersion
androidTestImplementation 'androidx.test:runner:' + testRunnerVersion
}
diff --git a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java
index e288339058..59337c0847 100644
--- a/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java
+++ b/extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/LibopusAudioRenderer.java
@@ -47,7 +47,9 @@ public final class LibopusAudioRenderer extends SimpleDecoderAudioRenderer {
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
*/
- public LibopusAudioRenderer(Handler eventHandler, AudioRendererEventListener eventListener,
+ public LibopusAudioRenderer(
+ Handler eventHandler,
+ AudioRendererEventListener eventListener,
AudioProcessor... audioProcessors) {
super(eventHandler, eventListener, audioProcessors);
}
diff --git a/extensions/opus/src/test/AndroidManifest.xml b/extensions/opus/src/test/AndroidManifest.xml
new file mode 100644
index 0000000000..ac6a3bf68f
--- /dev/null
+++ b/extensions/opus/src/test/AndroidManifest.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/DefaultRenderersFactoryTest.java b/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/DefaultRenderersFactoryTest.java
new file mode 100644
index 0000000000..0fed3f3de6
--- /dev/null
+++ b/extensions/opus/src/test/java/com/google/android/exoplayer2/ext/opus/DefaultRenderersFactoryTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 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.google.android.exoplayer2.ext.opus;
+
+import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.testutil.DefaultRenderersFactoryAsserts;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Unit test for {@link DefaultRenderersFactoryTest} with {@link LibopusAudioRenderer}. */
+@RunWith(RobolectricTestRunner.class)
+public final class DefaultRenderersFactoryTest {
+
+ @Test
+ public void createRenderers_instantiatesVpxRenderer() {
+ DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
+ LibopusAudioRenderer.class, C.TRACK_TYPE_AUDIO);
+ }
+}
diff --git a/extensions/opus/src/test/resources/robolectric.properties b/extensions/opus/src/test/resources/robolectric.properties
new file mode 100644
index 0000000000..2f3210368e
--- /dev/null
+++ b/extensions/opus/src/test/resources/robolectric.properties
@@ -0,0 +1 @@
+manifest=src/test/AndroidManifest.xml
diff --git a/extensions/vp9/build.gradle b/extensions/vp9/build.gradle
index e82371e1f6..f6702e28bb 100644
--- a/extensions/vp9/build.gradle
+++ b/extensions/vp9/build.gradle
@@ -38,6 +38,8 @@ android {
dependencies {
implementation project(modulePrefix + 'library-core')
implementation 'com.android.support:support-annotations:' + supportLibraryVersion
+ testImplementation project(modulePrefix + 'testutils-robolectric')
+ testImplementation 'junit:junit:' + junitVersion
androidTestImplementation 'androidx.test:runner:' + testRunnerVersion
androidTestImplementation 'com.google.truth:truth:' + truthVersion
}
diff --git a/extensions/vp9/src/test/AndroidManifest.xml b/extensions/vp9/src/test/AndroidManifest.xml
new file mode 100644
index 0000000000..a0123f17db
--- /dev/null
+++ b/extensions/vp9/src/test/AndroidManifest.xml
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/extensions/vp9/src/test/java/com/google/android/exoplayer2/ext/vp9/DefaultRenderersFactoryTest.java b/extensions/vp9/src/test/java/com/google/android/exoplayer2/ext/vp9/DefaultRenderersFactoryTest.java
new file mode 100644
index 0000000000..3277c3ce83
--- /dev/null
+++ b/extensions/vp9/src/test/java/com/google/android/exoplayer2/ext/vp9/DefaultRenderersFactoryTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 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.google.android.exoplayer2.ext.vp9;
+
+import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.testutil.DefaultRenderersFactoryAsserts;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Unit test for {@link DefaultRenderersFactoryTest} with {@link LibvpxVideoRenderer}. */
+@RunWith(RobolectricTestRunner.class)
+public final class DefaultRenderersFactoryTest {
+
+ @Test
+ public void createRenderers_instantiatesVpxRenderer() {
+ DefaultRenderersFactoryAsserts.assertExtensionRendererCreated(
+ LibvpxVideoRenderer.class, C.TRACK_TYPE_VIDEO);
+ }
+}
diff --git a/extensions/vp9/src/test/resources/robolectric.properties b/extensions/vp9/src/test/resources/robolectric.properties
new file mode 100644
index 0000000000..2f3210368e
--- /dev/null
+++ b/extensions/vp9/src/test/resources/robolectric.properties
@@ -0,0 +1 @@
+manifest=src/test/AndroidManifest.xml
diff --git a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java
new file mode 100644
index 0000000000..ea6633c695
--- /dev/null
+++ b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2019 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.google.android.exoplayer2.testutil;
+
+import static com.google.android.exoplayer2.DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF;
+import static com.google.android.exoplayer2.DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON;
+import static com.google.android.exoplayer2.DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.os.Handler;
+import android.os.Looper;
+import com.google.android.exoplayer2.DefaultRenderersFactory;
+import com.google.android.exoplayer2.Renderer;
+import com.google.android.exoplayer2.audio.AudioRendererEventListener;
+import com.google.android.exoplayer2.metadata.Metadata;
+import com.google.android.exoplayer2.text.Cue;
+import com.google.android.exoplayer2.video.VideoRendererEventListener;
+import java.util.List;
+import org.robolectric.RuntimeEnvironment;
+
+/** Assertions for {@link DefaultRenderersFactory}. */
+public final class DefaultRenderersFactoryAsserts {
+
+ /**
+ * Asserts that an extension renderer of type {@code clazz} is not instantiated for {@link
+ * DefaultRenderersFactory#EXTENSION_RENDERER_MODE_OFF}, and that it's instantiated in the correct
+ * position relative to other renderers of the same type for {@link
+ * DefaultRenderersFactory#EXTENSION_RENDERER_MODE_ON} and {@link
+ * DefaultRenderersFactory#EXTENSION_RENDERER_MODE_PREFER}, assuming no other extension renderers
+ * can be loaded.
+ *
+ * @param clazz The extension renderer class.
+ * @param type The type of the renderer.
+ */
+ public static void assertExtensionRendererCreated(Class extends Renderer> clazz, int type) {
+ // In EXTENSION_RENDERER_MODE_OFF the renderer should not be created.
+ Renderer[] renderers = createRenderers(EXTENSION_RENDERER_MODE_OFF);
+ for (Renderer renderer : renderers) {
+ assertThat(renderer).isNotInstanceOf(clazz);
+ }
+
+ // In EXTENSION_RENDERER_MODE_ON the renderer should be created and last of its type.
+ renderers = createRenderers(EXTENSION_RENDERER_MODE_ON);
+ boolean found = false;
+ for (Renderer renderer : renderers) {
+ if (!found) {
+ if (clazz.isInstance(renderer)) {
+ found = true;
+ }
+ } else {
+ assertThat(renderer.getTrackType()).isNotEqualTo(type);
+ }
+ }
+ assertThat(found).isTrue();
+
+ // In EXTENSION_RENDERER_MODE_PREFER the renderer should be created and first of its type.
+ renderers = createRenderers(EXTENSION_RENDERER_MODE_PREFER);
+ found = false;
+ for (Renderer renderer : renderers) {
+ if (!found) {
+ if (clazz.isInstance(renderer)) {
+ found = true;
+ } else {
+ assertThat(renderer.getTrackType()).isNotEqualTo(type);
+ }
+ } else {
+ assertThat(renderer).isNotInstanceOf(clazz);
+ }
+ }
+ assertThat(found).isTrue();
+ }
+
+ private static Renderer[] createRenderers(
+ @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
+ DefaultRenderersFactory factory =
+ new DefaultRenderersFactory(RuntimeEnvironment.application)
+ .setExtensionRendererMode(extensionRendererMode);
+ return factory.createRenderers(
+ new Handler(Looper.getMainLooper()),
+ new VideoRendererEventListener() {},
+ new AudioRendererEventListener() {},
+ (List cues) -> {},
+ (Metadata metadata) -> {},
+ /* drmSessionManager= */ null);
+ }
+}