mirror of
https://github.com/androidx/media.git
synced 2025-05-15 03:29:53 +08:00
Remove FakeClock.sleep.
This functionality isn't used and there is no point in supporting it. PiperOrigin-RevId: 353876038
This commit is contained in:
parent
0d85958a76
commit
06fe0900a9
@ -43,9 +43,6 @@ public interface Clock {
|
|||||||
/** @see android.os.SystemClock#uptimeMillis() */
|
/** @see android.os.SystemClock#uptimeMillis() */
|
||||||
long uptimeMillis();
|
long uptimeMillis();
|
||||||
|
|
||||||
/** @see android.os.SystemClock#sleep(long) */
|
|
||||||
void sleep(long sleepTimeMs);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link HandlerWrapper} using a specified looper and a specified callback for handling
|
* Creates a {@link HandlerWrapper} using a specified looper and a specified callback for handling
|
||||||
* messages.
|
* messages.
|
||||||
|
@ -43,11 +43,6 @@ public class SystemClock implements Clock {
|
|||||||
return android.os.SystemClock.uptimeMillis();
|
return android.os.SystemClock.uptimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void sleep(long sleepTimeMs) {
|
|
||||||
android.os.SystemClock.sleep(sleepTimeMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HandlerWrapper createHandler(Looper looper, @Nullable Callback callback) {
|
public HandlerWrapper createHandler(Looper looper, @Nullable Callback callback) {
|
||||||
return new SystemHandlerWrapper(new Handler(looper, callback));
|
return new SystemHandlerWrapper(new Handler(looper, callback));
|
||||||
|
@ -38,7 +38,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class FakeClock implements Clock {
|
public class FakeClock implements Clock {
|
||||||
|
|
||||||
private final List<Long> wakeUpTimes;
|
|
||||||
private final List<HandlerMessageData> handlerMessages;
|
private final List<HandlerMessageData> handlerMessages;
|
||||||
private final long bootTimeMs;
|
private final long bootTimeMs;
|
||||||
|
|
||||||
@ -65,7 +64,6 @@ public class FakeClock implements Clock {
|
|||||||
public FakeClock(long bootTimeMs, long initialTimeMs) {
|
public FakeClock(long bootTimeMs, long initialTimeMs) {
|
||||||
this.bootTimeMs = bootTimeMs;
|
this.bootTimeMs = bootTimeMs;
|
||||||
this.timeSinceBootMs = initialTimeMs;
|
this.timeSinceBootMs = initialTimeMs;
|
||||||
this.wakeUpTimes = new ArrayList<>();
|
|
||||||
this.handlerMessages = new ArrayList<>();
|
this.handlerMessages = new ArrayList<>();
|
||||||
SystemClock.setCurrentTimeMillis(initialTimeMs);
|
SystemClock.setCurrentTimeMillis(initialTimeMs);
|
||||||
}
|
}
|
||||||
@ -78,12 +76,6 @@ public class FakeClock implements Clock {
|
|||||||
public synchronized void advanceTime(long timeDiffMs) {
|
public synchronized void advanceTime(long timeDiffMs) {
|
||||||
timeSinceBootMs += timeDiffMs;
|
timeSinceBootMs += timeDiffMs;
|
||||||
SystemClock.setCurrentTimeMillis(timeSinceBootMs);
|
SystemClock.setCurrentTimeMillis(timeSinceBootMs);
|
||||||
for (Long wakeUpTime : wakeUpTimes) {
|
|
||||||
if (wakeUpTime <= timeSinceBootMs) {
|
|
||||||
notifyAll();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i = handlerMessages.size() - 1; i >= 0; i--) {
|
for (int i = handlerMessages.size() - 1; i >= 0; i--) {
|
||||||
if (handlerMessages.get(i).maybeSendToTarget(timeSinceBootMs)) {
|
if (handlerMessages.get(i).maybeSendToTarget(timeSinceBootMs)) {
|
||||||
handlerMessages.remove(i);
|
handlerMessages.remove(i);
|
||||||
@ -106,23 +98,6 @@ public class FakeClock implements Clock {
|
|||||||
return elapsedRealtime();
|
return elapsedRealtime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void sleep(long sleepTimeMs) {
|
|
||||||
if (sleepTimeMs <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Long wakeUpTimeMs = timeSinceBootMs + sleepTimeMs;
|
|
||||||
wakeUpTimes.add(wakeUpTimeMs);
|
|
||||||
while (timeSinceBootMs < wakeUpTimeMs) {
|
|
||||||
try {
|
|
||||||
wait();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
// Ignore InterruptedException as SystemClock.sleep does too.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wakeUpTimes.remove(wakeUpTimeMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HandlerWrapper createHandler(Looper looper, @Nullable Callback callback) {
|
public HandlerWrapper createHandler(Looper looper, @Nullable Callback callback) {
|
||||||
return new ClockHandler(looper, callback);
|
return new ClockHandler(looper, callback);
|
||||||
|
@ -16,14 +16,11 @@
|
|||||||
package com.google.android.exoplayer2.testutil;
|
package com.google.android.exoplayer2.testutil;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
|
||||||
|
|
||||||
import android.os.ConditionVariable;
|
import android.os.ConditionVariable;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import com.google.android.exoplayer2.util.Clock;
|
|
||||||
import com.google.android.exoplayer2.util.HandlerWrapper;
|
import com.google.android.exoplayer2.util.HandlerWrapper;
|
||||||
import java.util.concurrent.CountDownLatch;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
@ -31,8 +28,6 @@ import org.junit.runner.RunWith;
|
|||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class FakeClockTest {
|
public final class FakeClockTest {
|
||||||
|
|
||||||
private static final long TIMEOUT_MS = 10_000;
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void currentTimeMillis_withoutBootTime() {
|
public void currentTimeMillis_withoutBootTime() {
|
||||||
FakeClock fakeClock = new FakeClock(/* initialTimeMs= */ 10);
|
FakeClock fakeClock = new FakeClock(/* initialTimeMs= */ 10);
|
||||||
@ -62,48 +57,6 @@ public final class FakeClockTest {
|
|||||||
assertThat(fakeClock.elapsedRealtime()).isEqualTo(2500);
|
assertThat(fakeClock.elapsedRealtime()).isEqualTo(2500);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSleep() throws InterruptedException {
|
|
||||||
FakeClock fakeClock = new FakeClock(0);
|
|
||||||
SleeperThread sleeperThread = new SleeperThread(fakeClock, 1000);
|
|
||||||
sleeperThread.start();
|
|
||||||
assertThat(sleeperThread.waitUntilAsleep(TIMEOUT_MS)).isTrue();
|
|
||||||
assertThat(sleeperThread.isSleeping()).isTrue();
|
|
||||||
fakeClock.advanceTime(1000);
|
|
||||||
sleeperThread.join(TIMEOUT_MS);
|
|
||||||
assertThat(sleeperThread.isSleeping()).isFalse();
|
|
||||||
|
|
||||||
sleeperThread = new SleeperThread(fakeClock, 0);
|
|
||||||
sleeperThread.start();
|
|
||||||
sleeperThread.join();
|
|
||||||
assertThat(sleeperThread.isSleeping()).isFalse();
|
|
||||||
|
|
||||||
SleeperThread[] sleeperThreads = new SleeperThread[5];
|
|
||||||
sleeperThreads[0] = new SleeperThread(fakeClock, 1000);
|
|
||||||
sleeperThreads[1] = new SleeperThread(fakeClock, 1000);
|
|
||||||
sleeperThreads[2] = new SleeperThread(fakeClock, 2000);
|
|
||||||
sleeperThreads[3] = new SleeperThread(fakeClock, 3000);
|
|
||||||
sleeperThreads[4] = new SleeperThread(fakeClock, 4000);
|
|
||||||
for (SleeperThread thread : sleeperThreads) {
|
|
||||||
thread.start();
|
|
||||||
assertThat(thread.waitUntilAsleep(TIMEOUT_MS)).isTrue();
|
|
||||||
}
|
|
||||||
assertSleepingStates(new boolean[] {true, true, true, true, true}, sleeperThreads);
|
|
||||||
fakeClock.advanceTime(1500);
|
|
||||||
assertThat(sleeperThreads[0].waitUntilAwake(TIMEOUT_MS)).isTrue();
|
|
||||||
assertThat(sleeperThreads[1].waitUntilAwake(TIMEOUT_MS)).isTrue();
|
|
||||||
assertSleepingStates(new boolean[] {false, false, true, true, true}, sleeperThreads);
|
|
||||||
fakeClock.advanceTime(2000);
|
|
||||||
assertThat(sleeperThreads[2].waitUntilAwake(TIMEOUT_MS)).isTrue();
|
|
||||||
assertThat(sleeperThreads[3].waitUntilAwake(TIMEOUT_MS)).isTrue();
|
|
||||||
assertSleepingStates(new boolean[] {false, false, false, false, true}, sleeperThreads);
|
|
||||||
fakeClock.advanceTime(2000);
|
|
||||||
for (SleeperThread thread : sleeperThreads) {
|
|
||||||
thread.join(TIMEOUT_MS);
|
|
||||||
}
|
|
||||||
assertSleepingStates(new boolean[] {false, false, false, false, false}, sleeperThreads);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPostDelayed() {
|
public void testPostDelayed() {
|
||||||
HandlerThread handlerThread = new HandlerThread("FakeClockTest");
|
HandlerThread handlerThread = new HandlerThread("FakeClockTest");
|
||||||
@ -140,12 +93,6 @@ public final class FakeClockTest {
|
|||||||
assertTestRunnableStates(new boolean[] {true, true, true, true, true}, testRunnables);
|
assertTestRunnableStates(new boolean[] {true, true, true, true, true}, testRunnables);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void assertSleepingStates(boolean[] states, SleeperThread[] sleeperThreads) {
|
|
||||||
for (int i = 0; i < sleeperThreads.length; i++) {
|
|
||||||
assertThat(sleeperThreads[i].isSleeping()).isEqualTo(states[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void waitForHandler(HandlerWrapper handler) {
|
private static void waitForHandler(HandlerWrapper handler) {
|
||||||
final ConditionVariable handlerFinished = new ConditionVariable();
|
final ConditionVariable handlerFinished = new ConditionVariable();
|
||||||
handler.post(handlerFinished::open);
|
handler.post(handlerFinished::open);
|
||||||
@ -158,48 +105,6 @@ public final class FakeClockTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class SleeperThread extends Thread {
|
|
||||||
|
|
||||||
private final Clock clock;
|
|
||||||
private final long sleepDurationMs;
|
|
||||||
private final CountDownLatch fallAsleepCountDownLatch;
|
|
||||||
private final CountDownLatch wakeUpCountDownLatch;
|
|
||||||
|
|
||||||
private volatile boolean isSleeping;
|
|
||||||
|
|
||||||
public SleeperThread(Clock clock, long sleepDurationMs) {
|
|
||||||
this.clock = clock;
|
|
||||||
this.sleepDurationMs = sleepDurationMs;
|
|
||||||
this.fallAsleepCountDownLatch = new CountDownLatch(1);
|
|
||||||
this.wakeUpCountDownLatch = new CountDownLatch(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean waitUntilAsleep(long timeoutMs) throws InterruptedException {
|
|
||||||
return fallAsleepCountDownLatch.await(timeoutMs, MILLISECONDS);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean waitUntilAwake(long timeoutMs) throws InterruptedException {
|
|
||||||
return wakeUpCountDownLatch.await(timeoutMs, MILLISECONDS);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSleeping() {
|
|
||||||
return isSleeping;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// This relies on the FakeClock's methods synchronizing on its own monitor to ensure that
|
|
||||||
// any interactions with it occur only after sleep() has called wait() or returned.
|
|
||||||
synchronized (clock) {
|
|
||||||
isSleeping = true;
|
|
||||||
fallAsleepCountDownLatch.countDown();
|
|
||||||
clock.sleep(sleepDurationMs);
|
|
||||||
isSleeping = false;
|
|
||||||
wakeUpCountDownLatch.countDown();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final class TestRunnable implements Runnable {
|
private static final class TestRunnable implements Runnable {
|
||||||
|
|
||||||
public boolean hasRun;
|
public boolean hasRun;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user