mirror of
https://github.com/samsonjs/media.git
synced 2026-03-25 09:25:53 +00:00
Fix remaining test_utils module nullness issues
#fixit PiperOrigin-RevId: 561636758
This commit is contained in:
parent
bbfba27cac
commit
ab64e6f92d
3 changed files with 59 additions and 30 deletions
|
|
@ -15,6 +15,8 @@
|
|||
*/
|
||||
package androidx.media3.test.utils;
|
||||
|
||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||
|
||||
import android.content.ContentProvider;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
|
|
@ -59,11 +61,16 @@ public final class AssetContentProvider extends ContentProvider
|
|||
|
||||
@Override
|
||||
public Cursor query(
|
||||
Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
|
||||
Uri uri,
|
||||
@Nullable String[] projection,
|
||||
@Nullable String selection,
|
||||
@Nullable String[] selectionArgs,
|
||||
@Nullable String sortOrder) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
|
||||
if (uri.getPath() == null) {
|
||||
return null;
|
||||
|
|
@ -74,14 +81,18 @@ public final class AssetContentProvider extends ContentProvider
|
|||
if (pipeMode) {
|
||||
ParcelFileDescriptor fileDescriptor =
|
||||
openPipeHelper(
|
||||
uri, /* mimeType= */ null, /* opts= */ null, /* args= */ null, /* func= */ this);
|
||||
uri,
|
||||
/* mimeType= */ "application/octet-stream",
|
||||
/* opts= */ null,
|
||||
/* args= */ null,
|
||||
/* func= */ this);
|
||||
return new AssetFileDescriptor(
|
||||
fileDescriptor, /* startOffset= */ 0, AssetFileDescriptor.UNKNOWN_LENGTH);
|
||||
} else {
|
||||
return getContext().getAssets().openFd(fileName);
|
||||
return checkNotNull(getContext()).getAssets().openFd(fileName);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
FileNotFoundException exception = new FileNotFoundException(e.getMessage());
|
||||
FileNotFoundException exception = new FileNotFoundException(checkNotNull(e.getMessage()));
|
||||
exception.initCause(e);
|
||||
throw exception;
|
||||
}
|
||||
|
|
@ -98,12 +109,16 @@ public final class AssetContentProvider extends ContentProvider
|
|||
}
|
||||
|
||||
@Override
|
||||
public int delete(Uri uri, String selection, String[] selectionArgs) {
|
||||
public int delete(Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
|
||||
public int update(
|
||||
Uri uri,
|
||||
@Nullable ContentValues values,
|
||||
@Nullable String selection,
|
||||
@Nullable String[] selectionArgs) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
|
|
@ -115,7 +130,7 @@ public final class AssetContentProvider extends ContentProvider
|
|||
@Nullable Bundle opts,
|
||||
@Nullable Object args) {
|
||||
try (FileOutputStream outputStream = new FileOutputStream(output.getFileDescriptor())) {
|
||||
byte[] data = TestUtil.getByteArray(getContext(), getFileName(uri));
|
||||
byte[] data = TestUtil.getByteArray(checkNotNull(getContext()), getFileName(uri));
|
||||
outputStream.write(data);
|
||||
} catch (IOException e) {
|
||||
if (isBrokenPipe(e)) {
|
||||
|
|
@ -129,7 +144,7 @@ public final class AssetContentProvider extends ContentProvider
|
|||
}
|
||||
|
||||
private static String getFileName(Uri uri) {
|
||||
return uri.getPath().replaceFirst("/", "");
|
||||
return checkNotNull(uri.getPath()).replaceFirst("/", "");
|
||||
}
|
||||
|
||||
private static boolean isBrokenPipe(IOException e) {
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
package androidx.media3.test.utils;
|
||||
|
||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
import static junit.framework.TestCase.assertFalse;
|
||||
|
|
@ -50,6 +51,7 @@ import java.util.Arrays;
|
|||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
|
||||
/** Helper class to run an ExoPlayer test. */
|
||||
@UnstableApi
|
||||
|
|
@ -79,15 +81,15 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
*/
|
||||
public static final class Builder {
|
||||
private final TestExoPlayerBuilder testPlayerBuilder;
|
||||
private Timeline timeline;
|
||||
private @MonotonicNonNull Timeline timeline;
|
||||
private List<MediaSource> mediaSources;
|
||||
private Format[] supportedFormats;
|
||||
private Object manifest;
|
||||
private ActionSchedule actionSchedule;
|
||||
private Surface surface;
|
||||
private Player.Listener playerListener;
|
||||
private AnalyticsListener analyticsListener;
|
||||
private Integer expectedPlayerEndedCount;
|
||||
private @MonotonicNonNull Object manifest;
|
||||
private @MonotonicNonNull ActionSchedule actionSchedule;
|
||||
private @MonotonicNonNull Surface surface;
|
||||
private Player.@MonotonicNonNull Listener playerListener;
|
||||
private @MonotonicNonNull AnalyticsListener analyticsListener;
|
||||
private @MonotonicNonNull Integer expectedPlayerEndedCount;
|
||||
private boolean pauseAtEndOfMediaItems;
|
||||
private int initialMediaItemIndex;
|
||||
private long initialPositionMs;
|
||||
|
|
@ -355,7 +357,10 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
public ExoPlayerTestRunner build() {
|
||||
if (mediaSources.isEmpty() && !skipSettingMediaSources) {
|
||||
if (timeline == null) {
|
||||
timeline = new FakeTimeline(/* windowCount= */ 1, manifest);
|
||||
timeline =
|
||||
new FakeTimeline(
|
||||
/* windowCount= */ 1,
|
||||
manifest != null ? new Object[] {manifest} : new Object[] {});
|
||||
}
|
||||
mediaSources.add(new FakeMediaSource(timeline, supportedFormats));
|
||||
}
|
||||
|
|
@ -401,8 +406,8 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
private final ArrayList<Integer> playbackStates;
|
||||
private final boolean pauseAtEndOfMediaItems;
|
||||
|
||||
private ExoPlayer player;
|
||||
private Exception exception;
|
||||
private @MonotonicNonNull ExoPlayer player;
|
||||
private @MonotonicNonNull Exception exception;
|
||||
private boolean playerWasPrepared;
|
||||
|
||||
private ExoPlayerTestRunner(
|
||||
|
|
@ -468,7 +473,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
handler.post(
|
||||
() -> {
|
||||
try {
|
||||
player = playerBuilder.setLooper(Looper.myLooper()).build();
|
||||
player = playerBuilder.setLooper(checkNotNull(Looper.myLooper())).build();
|
||||
if (surface != null) {
|
||||
player.setVideoSurface(surface);
|
||||
}
|
||||
|
|
@ -651,7 +656,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
public void onTimelineChanged(Timeline timeline, @Player.TimelineChangeReason int reason) {
|
||||
timelineChangeReasons.add(reason);
|
||||
timelines.add(timeline);
|
||||
int currentIndex = player.getCurrentPeriodIndex();
|
||||
int currentIndex = checkNotNull(player).getCurrentPeriodIndex();
|
||||
if (periodIndices.isEmpty() || periodIndices.get(periodIndices.size() - 1) != currentIndex) {
|
||||
// Ignore timeline changes that do not change the period index.
|
||||
periodIndices.add(currentIndex);
|
||||
|
|
@ -661,7 +666,9 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
@Override
|
||||
public void onMediaItemTransition(
|
||||
@Nullable MediaItem mediaItem, @Player.MediaItemTransitionReason int reason) {
|
||||
mediaItems.add(mediaItem);
|
||||
if (mediaItem != null) {
|
||||
mediaItems.add(mediaItem);
|
||||
}
|
||||
mediaItemTransitionReasons.add(reason);
|
||||
}
|
||||
|
||||
|
|
@ -686,7 +693,7 @@ public final class ExoPlayerTestRunner implements Player.Listener, ActionSchedul
|
|||
Player.PositionInfo newPosition,
|
||||
@Player.DiscontinuityReason int reason) {
|
||||
discontinuityReasons.add(reason);
|
||||
int currentIndex = player.getCurrentPeriodIndex();
|
||||
int currentIndex = checkNotNull(player).getCurrentPeriodIndex();
|
||||
if ((reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION
|
||||
&& oldPosition.adGroupIndex != C.INDEX_UNSET
|
||||
&& newPosition.adGroupIndex != C.INDEX_UNSET)
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
package androidx.media3.test.utils;
|
||||
|
||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
import static com.google.common.truth.Truth.assertWithMessage;
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
|
|
@ -27,6 +28,7 @@ import android.util.Pair;
|
|||
import androidx.annotation.Nullable;
|
||||
import androidx.media3.common.Timeline;
|
||||
import androidx.media3.common.util.Assertions;
|
||||
import androidx.media3.common.util.NullableType;
|
||||
import androidx.media3.common.util.UnstableApi;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.media3.exoplayer.analytics.PlayerId;
|
||||
|
|
@ -46,6 +48,7 @@ import java.util.List;
|
|||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.LinkedBlockingDeque;
|
||||
import org.checkerframework.dataflow.qual.SideEffectFree;
|
||||
|
||||
/** A runner for {@link MediaSource} tests. */
|
||||
@UnstableApi
|
||||
|
|
@ -60,9 +63,9 @@ public class MediaSourceTestRunner {
|
|||
private final Allocator allocator;
|
||||
|
||||
private final LinkedBlockingDeque<Timeline> timelines;
|
||||
private final CopyOnWriteArrayList<Pair<Integer, MediaPeriodId>> completedLoads;
|
||||
private final CopyOnWriteArrayList<Pair<Integer, @NullableType MediaPeriodId>> completedLoads;
|
||||
|
||||
private Timeline timeline;
|
||||
@Nullable private Timeline timeline;
|
||||
|
||||
/**
|
||||
* @param mediaSource The source under test.
|
||||
|
|
@ -214,6 +217,7 @@ public class MediaSourceTestRunner {
|
|||
* to {@link #assertTimelineChangeBlocking()} or {@link #assertTimelineChange()} (or since the
|
||||
* runner was created if neither method has been called).
|
||||
*/
|
||||
@SideEffectFree
|
||||
public void assertNoTimelineChange() {
|
||||
assertThat(timelines).isEmpty();
|
||||
}
|
||||
|
|
@ -240,7 +244,7 @@ public class MediaSourceTestRunner {
|
|||
timeline = timelines.poll(TIMEOUT_MS, MILLISECONDS);
|
||||
assertThat(timeline).isNotNull(); // Null indicates the poll timed out.
|
||||
assertNoTimelineChange();
|
||||
return timeline;
|
||||
return checkNotNull(timeline);
|
||||
} catch (InterruptedException e) {
|
||||
// Should never happen.
|
||||
throw new RuntimeException(e);
|
||||
|
|
@ -255,13 +259,15 @@ public class MediaSourceTestRunner {
|
|||
*/
|
||||
public void assertPrepareAndReleaseAllPeriods() throws InterruptedException {
|
||||
Timeline.Period period = new Timeline.Period();
|
||||
Timeline timeline = checkNotNull(this.timeline);
|
||||
for (int i = 0; i < timeline.getPeriodCount(); i++) {
|
||||
timeline.getPeriod(i, period, /* setIds= */ true);
|
||||
assertPrepareAndReleasePeriod(new MediaPeriodId(period.uid, period.windowIndex));
|
||||
Object periodUid = checkNotNull(period.uid);
|
||||
assertPrepareAndReleasePeriod(new MediaPeriodId(periodUid, period.windowIndex));
|
||||
for (int adGroupIndex = 0; adGroupIndex < period.getAdGroupCount(); adGroupIndex++) {
|
||||
for (int adIndex = 0; adIndex < period.getAdCountInAdGroup(adGroupIndex); adIndex++) {
|
||||
assertPrepareAndReleasePeriod(
|
||||
new MediaPeriodId(period.uid, adGroupIndex, adIndex, period.windowIndex));
|
||||
new MediaPeriodId(periodUid, adGroupIndex, adIndex, period.windowIndex));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -296,7 +302,7 @@ public class MediaSourceTestRunner {
|
|||
*/
|
||||
public void assertCompletedManifestLoads(Integer... windowIndices) {
|
||||
List<Integer> expectedWindowIndices = new ArrayList<>(Arrays.asList(windowIndices));
|
||||
for (Pair<Integer, MediaPeriodId> windowIndexAndMediaPeriodId : completedLoads) {
|
||||
for (Pair<Integer, @NullableType MediaPeriodId> windowIndexAndMediaPeriodId : completedLoads) {
|
||||
if (windowIndexAndMediaPeriodId.second == null) {
|
||||
assertWithMessage("Missing expected load")
|
||||
.that(expectedWindowIndices)
|
||||
|
|
@ -318,11 +324,12 @@ public class MediaSourceTestRunner {
|
|||
*/
|
||||
public void assertCompletedMediaPeriodLoads(MediaPeriodId... mediaPeriodIds) {
|
||||
Timeline.Period period = new Timeline.Period();
|
||||
Timeline timeline = checkNotNull(this.timeline);
|
||||
HashSet<MediaPeriodId> expectedLoads = new HashSet<>(Arrays.asList(mediaPeriodIds));
|
||||
for (Pair<Integer, MediaPeriodId> windowIndexAndMediaPeriodId : completedLoads) {
|
||||
for (Pair<Integer, @NullableType MediaPeriodId> windowIndexAndMediaPeriodId : completedLoads) {
|
||||
int windowIndex = windowIndexAndMediaPeriodId.first;
|
||||
MediaPeriodId mediaPeriodId = windowIndexAndMediaPeriodId.second;
|
||||
if (expectedLoads.remove(mediaPeriodId)) {
|
||||
if (mediaPeriodId != null && expectedLoads.remove(mediaPeriodId)) {
|
||||
int periodIndex = timeline.getIndexOfPeriod(mediaPeriodId.periodUid);
|
||||
assertThat(windowIndex).isEqualTo(timeline.getPeriod(periodIndex, period).windowIndex);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue