Update Robolectric and Truth.

PiperOrigin-RevId: 233612344
This commit is contained in:
tonihei 2019-02-12 16:36:03 +00:00 committed by Andrew Lewis
parent f299a65a33
commit edabbd52d0
40 changed files with 176 additions and 33 deletions

View File

@ -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'

View File

@ -26,6 +26,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -26,6 +26,8 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -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 {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -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 {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -26,6 +26,8 @@ android {
minSdkVersion 19
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -27,6 +27,8 @@ android {
targetSdkVersion project.ext.targetSdkVersion
consumerProguardFiles 'proguard-rules.txt'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -28,6 +28,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -26,6 +26,8 @@ android {
minSdkVersion 17
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -26,6 +26,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -27,6 +27,8 @@ android {
targetSdkVersion project.ext.targetSdkVersion
consumerProguardFiles 'proguard-rules.txt'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -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 {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -26,6 +26,8 @@ android {
minSdkVersion project.ext.minSdkVersion
targetSdkVersion project.ext.targetSdkVersion
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -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 {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -1,3 +1,4 @@
## Project-wide Gradle settings.
android.useDeprecatedNdk=true
android.enableUnitTestBinaryResources=true
buildDir=buildout

View File

@ -53,6 +53,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -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;

View File

@ -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() {

View File

@ -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();
@ -92,6 +96,31 @@ public class AudioFocusManagerTest {
assertThat(lastRequest).isNotNull();
}
@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
@ -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;

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -35,6 +35,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -35,6 +35,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -35,6 +35,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -34,6 +34,8 @@ android {
// testCoverageEnabled = true
// }
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -27,6 +27,8 @@ android {
targetSdkVersion project.ext.targetSdkVersion
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -33,6 +33,8 @@ android {
// See: https://github.com/junit-team/junit4/pull/1187.
disable 'InvalidPackage'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -1 +0,0 @@
manifest=src/test/AndroidManifest.xml

View File

@ -32,6 +32,8 @@ android {
// which is not part of Android.
disable 'InvalidPackage'
}
testOptions.unitTests.includeAndroidResources = true
}
dependencies {

View File

@ -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);
}
}