Commit edabbd52 by tonihei Committed by Andrew Lewis

Update Robolectric and Truth.

PiperOrigin-RevId: 233612344
parent f299a65a
Showing with 176 additions and 33 deletions
......@@ -23,8 +23,8 @@ project.ext {
dexmakerVersion = '1.2'
mockitoVersion = '1.9.5'
junitVersion = '4.12'
truthVersion = '0.39'
robolectricVersion = '3.7.1'
truthVersion = '0.42'
robolectricVersion = '4.1'
autoValueVersion = '1.6'
checkerframeworkVersion = '2.5.0'
testRunnerVersion = '1.1.0-alpha3'
......
......@@ -26,6 +26,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -26,6 +26,8 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -32,6 +32,8 @@ android {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio.
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -33,6 +33,8 @@ android {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio.
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -26,6 +26,8 @@ android {
minSdkVersion 19
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -27,6 +27,8 @@ android {
targetSdkVersion project.ext.targetSdkVersion
consumerProguardFiles 'proguard-rules.txt'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -28,6 +28,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -26,6 +26,8 @@ android {
minSdkVersion 17
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -26,6 +26,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -27,6 +27,8 @@ android {
targetSdkVersion project.ext.targetSdkVersion
consumerProguardFiles 'proguard-rules.txt'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -33,6 +33,8 @@ android {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio.
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -26,6 +26,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -33,6 +33,8 @@ android {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] // Disable the automatic ndk-build call by Android Studio.
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
## Project-wide Gradle settings.
android.useDeprecatedNdk=true
android.enableUnitTestBinaryResources=true
buildDir=buildout
......@@ -53,6 +53,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -21,6 +21,7 @@ import android.media.AudioManager;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.annotation.VisibleForTesting;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Player;
......@@ -195,6 +196,11 @@ public final class AudioFocusManager {
// Internal methods.
@VisibleForTesting
/* package */ AudioManager.OnAudioFocusChangeListener getFocusListener() {
return focusListener;
}
@PlayerCommand
private int handleIdle(boolean playWhenReady) {
return playWhenReady ? PLAYER_COMMAND_PLAY_WHEN_READY : PLAYER_COMMAND_DO_NOT_PLAY;
......
......@@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.support.annotation.Nullable;
import android.view.Surface;
import com.google.android.exoplayer2.Player.DiscontinuityReason;
......@@ -2593,8 +2594,8 @@ public final class ExoPlayerTest {
// Internal methods.
private static ActionSchedule.Builder addSurfaceSwitch(ActionSchedule.Builder builder) {
final Surface surface1 = new Surface(null);
final Surface surface2 = new Surface(null);
final Surface surface1 = new Surface(new SurfaceTexture(/* texName= */ 0));
final Surface surface2 = new Surface(new SurfaceTexture(/* texName= */ 1));
return builder
.executeRunnable(
new PlayerRunnable() {
......
......@@ -22,15 +22,18 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
import android.content.Context;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.util.Util;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowAudioManager;
/** Unit tests for {@link AudioFocusManager}. */
......@@ -69,6 +72,7 @@ public class AudioFocusManagerTest {
}
@Test
@Config(maxSdk = 25)
public void setAudioAttributes_withNullUsage_releasesAudioFocus() {
// Create attributes and request audio focus.
AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build();
......@@ -93,6 +97,31 @@ public class AudioFocusManagerTest {
}
@Test
@Config(minSdk = 26)
public void setAudioAttributes_withNullUsage_releasesAudioFocus_v26() {
// Create attributes and request audio focus.
AudioAttributes media = new AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).build();
Shadows.shadowOf(audioManager)
.setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
assertThat(
audioFocusManager.setAudioAttributes(
media, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
assertThat(getAudioFocusGainFromRequest(request)).isEqualTo(AudioManager.AUDIOFOCUS_GAIN);
// Ensure that setting null audio attributes with audio focus releases audio focus.
assertThat(
audioFocusManager.setAudioAttributes(
/* audioAttributes= */ null, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
AudioFocusRequest lastRequest =
Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest();
assertThat(lastRequest).isNotNull();
}
@Test
public void setAudioAttributes_withUsageAlarm_throwsIllegalArgumentException() {
// Ensure that audio attributes that map to AUDIOFOCUS_GAIN_TRANSIENT* throw
AudioAttributes alarm = new AudioAttributes.Builder().setUsage(C.USAGE_ALARM).build();
......@@ -117,7 +146,7 @@ public class AudioFocusManagerTest {
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN);
assertThat(getAudioFocusGainFromRequest(request)).isEqualTo(AudioManager.AUDIOFOCUS_GAIN);
}
@Test
......@@ -133,7 +162,7 @@ public class AudioFocusManagerTest {
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
assertThat(request.durationHint).isEqualTo(AudioManager.AUDIOFOCUS_GAIN);
assertThat(getAudioFocusGainFromRequest(request)).isEqualTo(AudioManager.AUDIOFOCUS_GAIN);
}
@Test
......@@ -189,12 +218,12 @@ public class AudioFocusManagerTest {
media, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
audioFocusManager
.getFocusListener()
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
assertThat(testPlayerControl.lastVolumeMultiplier).isLessThan(1.0f);
assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(NO_COMMAND_RECEIVED);
request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN);
audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN);
assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f);
}
......@@ -215,12 +244,12 @@ public class AudioFocusManagerTest {
media, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
audioFocusManager
.getFocusListener()
.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_WAIT_FOR_CALLBACK);
assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f);
request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN);
audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_GAIN);
assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
}
......@@ -237,14 +266,13 @@ public class AudioFocusManagerTest {
media, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
request.listener.onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
assertThat(testPlayerControl.lastVolumeMultiplier).isEqualTo(1.0f);
assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_WAIT_FOR_CALLBACK);
}
@Test
@Config(maxSdk = 25)
public void onAudioFocusChange_withAudioFocusLost_sendsDoNotPlayAndAbandondsFocus() {
// Ensure that AUDIOFOCUS_LOSS causes AudioFocusManager to pause playback and abandon audio
// focus.
......@@ -271,6 +299,32 @@ public class AudioFocusManagerTest {
}
@Test
@Config(minSdk = 26)
public void onAudioFocusChange_withAudioFocusLost_sendsDoNotPlayAndAbandondsFocus_v26() {
// Ensure that AUDIOFOCUS_LOSS causes AudioFocusManager to pause playback and abandon audio
// focus.
AudioAttributes media =
new AudioAttributes.Builder()
.setUsage(C.USAGE_MEDIA)
.setContentType(C.CONTENT_TYPE_SPEECH)
.build();
Shadows.shadowOf(audioManager)
.setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
assertThat(
audioFocusManager.setAudioAttributes(
media, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull();
audioFocusManager.getFocusListener().onAudioFocusChange(AudioManager.AUDIOFOCUS_LOSS);
assertThat(testPlayerControl.lastPlayerCommand).isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY);
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest())
.isEqualTo(Shadows.shadowOf(audioManager).getLastAudioFocusRequest().audioFocusRequest);
}
@Test
@Config(maxSdk = 25)
public void handleStop_withAudioFocus_abandonsAudioFocus() {
// Ensure that handleStop causes AudioFocusManager to abandon audio focus.
AudioAttributes media =
......@@ -295,6 +349,32 @@ public class AudioFocusManagerTest {
}
@Test
@Config(minSdk = 26)
public void handleStop_withAudioFocus_abandonsAudioFocus_v26() {
// Ensure that handleStop causes AudioFocusManager to abandon audio focus.
AudioAttributes media =
new AudioAttributes.Builder()
.setUsage(C.USAGE_MEDIA)
.setContentType(C.CONTENT_TYPE_SPEECH)
.build();
Shadows.shadowOf(audioManager)
.setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
assertThat(
audioFocusManager.setAudioAttributes(
media, /* playWhenReady= */ true, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_PLAY_WHEN_READY);
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull();
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
audioFocusManager.handleStop();
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest())
.isEqualTo(request.audioFocusRequest);
}
@Test
@Config(maxSdk = 25)
public void handleStop_withoutAudioFocus_stillAbandonsFocus() {
// Ensure that handleStop causes AudioFocusManager to call through to abandon audio focus
// even if focus wasn't requested.
......@@ -320,6 +400,7 @@ public class AudioFocusManagerTest {
}
@Test
@Config(maxSdk = 25)
public void handleStop_withoutHandlingAudioFocus_isNoOp() {
// Ensure that handleStop is a no-op if audio focus isn't handled.
Shadows.shadowOf(audioManager)
......@@ -337,6 +418,31 @@ public class AudioFocusManagerTest {
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull();
}
@Test
@Config(minSdk = 26)
public void handleStop_withoutHandlingAudioFocus_isNoOp_v26() {
// Ensure that handleStop is a no-op if audio focus isn't handled.
Shadows.shadowOf(audioManager)
.setNextFocusRequestResponse(AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
assertThat(
audioFocusManager.setAudioAttributes(
/* audioAttributes= */ null, /* playWhenReady= */ false, Player.STATE_READY))
.isEqualTo(PLAYER_COMMAND_DO_NOT_PLAY);
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull();
ShadowAudioManager.AudioFocusRequest request =
Shadows.shadowOf(audioManager).getLastAudioFocusRequest();
assertThat(request).isNull();
audioFocusManager.handleStop();
assertThat(Shadows.shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isNull();
}
private int getAudioFocusGainFromRequest(ShadowAudioManager.AudioFocusRequest audioFocusRequest) {
return Util.SDK_INT >= 26
? audioFocusRequest.audioFocusRequest.getFocusGain()
: audioFocusRequest.durationHint;
}
private static class TestPlayerControl implements AudioFocusManager.PlayerControl {
private float lastVolumeMultiplier = 1.0f;
private int lastPlayerCommand = NO_COMMAND_RECEIVED;
......
......@@ -35,6 +35,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -35,6 +35,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -35,6 +35,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -34,6 +34,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -27,6 +27,8 @@ android {
targetSdkVersion project.ext.targetSdkVersion
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -33,6 +33,8 @@ android {
// See: https://github.com/junit-team/junit4/pull/1187.
disable 'InvalidPackage'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -32,6 +32,8 @@ android {
// which is not part of Android.
disable 'InvalidPackage'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {
......
......@@ -165,7 +165,7 @@ public final class RobolectricUtil {
public boolean enqueueMessage(Message msg, long when) {
Looper looper = ShadowLooper.getLooperForThread(looperThread);
if (shadowOf(looper) instanceof CustomLooper
&& shadowOf(looper) != ShadowLooper.getShadowMainLooper()) {
&& shadowOf(looper) != shadowOf(Looper.getMainLooper())) {
((CustomLooper) shadowOf(looper)).addPendingMessage(msg, when);
} else {
super.enqueueMessage(msg, when);
......@@ -177,7 +177,7 @@ public final class RobolectricUtil {
public void removeMessages(Handler handler, int what, Object object) {
Looper looper = ShadowLooper.getLooperForThread(looperThread);
if (shadowOf(looper) instanceof CustomLooper
&& shadowOf(looper) != ShadowLooper.getShadowMainLooper()) {
&& shadowOf(looper) != shadowOf(Looper.getMainLooper())) {
((CustomLooper) shadowOf(looper)).removeMessages(handler, what, object);
}
}
......@@ -186,7 +186,7 @@ public final class RobolectricUtil {
public void removeCallbacksAndMessages(Handler handler, Object object) {
Looper looper = ShadowLooper.getLooperForThread(looperThread);
if (shadowOf(looper) instanceof CustomLooper
&& shadowOf(looper) != ShadowLooper.getShadowMainLooper()) {
&& shadowOf(looper) != shadowOf(Looper.getMainLooper())) {
((CustomLooper) shadowOf(looper)).removeMessages(handler, ANY_MESSAGE, object);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment