| Index: content/public/android/javatests/src/org/chromium/content/browser/VSyncMonitorTest.java
|
| diff --git a/content/public/android/javatests/src/org/chromium/content/browser/VSyncMonitorTest.java b/content/public/android/javatests/src/org/chromium/content/browser/VSyncMonitorTest.java
|
| index 730a874046071cccfc7248ae1109af439dc2c3e4..935d1eb607b17c768339224fe6db29d82b1e7ff1 100644
|
| --- a/content/public/android/javatests/src/org/chromium/content/browser/VSyncMonitorTest.java
|
| +++ b/content/public/android/javatests/src/org/chromium/content/browser/VSyncMonitorTest.java
|
| @@ -7,86 +7,93 @@ package org.chromium.content.browser;
|
| import android.content.Context;
|
| import android.test.InstrumentationTestCase;
|
| import android.test.suitebuilder.annotation.MediumTest;
|
| -import android.view.View;
|
| -
|
| import java.util.Arrays;
|
| import java.util.concurrent.Callable;
|
|
|
| import org.chromium.base.ThreadUtils;
|
| -import org.chromium.content.browser.VSyncMonitor;
|
|
|
| public class VSyncMonitorTest extends InstrumentationTestCase {
|
| - private class VSyncDataCollector implements VSyncMonitor.Listener {
|
| - public long framePeriods[];
|
| - public int frameCount;
|
| + private static class VSyncDataCollector implements VSyncMonitor.Listener {
|
| + public long mFramePeriods[];
|
| + public int mFrameCount;
|
|
|
| - private long previousVSyncTimeMicros;
|
| + private boolean mDone;
|
| + private long mPreviousVSyncTimeMicros;
|
| + private Object mSyncRoot = new Object();
|
|
|
| VSyncDataCollector(int frames) {
|
| - framePeriods = new long[frames];
|
| + mFramePeriods = new long[frames];
|
| + }
|
| +
|
| + public boolean isDone() {
|
| + synchronized (mSyncRoot) {
|
| + return mDone;
|
| + }
|
| }
|
|
|
| @Override
|
| public void onVSync(VSyncMonitor monitor, long vsyncTimeMicros) {
|
| - if (previousVSyncTimeMicros == 0) {
|
| - previousVSyncTimeMicros = vsyncTimeMicros;
|
| + if (mPreviousVSyncTimeMicros == 0) {
|
| + mPreviousVSyncTimeMicros = vsyncTimeMicros;
|
| return;
|
| }
|
| - if (frameCount >= framePeriods.length) {
|
| - synchronized (this) {
|
| - notify();
|
| + if (mFrameCount >= mFramePeriods.length) {
|
| + synchronized (mSyncRoot) {
|
| + mDone = true;
|
| + mSyncRoot.notify();
|
| }
|
| return;
|
| }
|
| - framePeriods[frameCount++] = vsyncTimeMicros - previousVSyncTimeMicros;
|
| - previousVSyncTimeMicros = vsyncTimeMicros;
|
| + mFramePeriods[mFrameCount++] = vsyncTimeMicros - mPreviousVSyncTimeMicros;
|
| + mPreviousVSyncTimeMicros = vsyncTimeMicros;
|
| monitor.requestUpdate();
|
| }
|
| - };
|
| +
|
| + public void waitTillDone() throws InterruptedException {
|
| + synchronized (mSyncRoot) {
|
| + while (!isDone()) {
|
| + mSyncRoot.wait();
|
| + }
|
| + }
|
| + }
|
| + }
|
|
|
| // The vsync monitor must be created on the UI thread to avoid associating the underlying
|
| // Choreographer with the Looper from the test runner thread.
|
| - private VSyncMonitor createVSyncMonitor(final VSyncMonitor.Listener listener) {
|
| + private VSyncMonitor createVSyncMonitor(
|
| + final VSyncMonitor.Listener listener, final boolean enableJBVSync) {
|
| return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<VSyncMonitor>() {
|
| @Override
|
| public VSyncMonitor call() {
|
| Context context = getInstrumentation().getContext();
|
| - View dummyView = new View(context);
|
| - return new VSyncMonitor(context, dummyView, listener);
|
| + return new VSyncMonitor(context, listener, enableJBVSync);
|
| }
|
| });
|
| }
|
|
|
| // Check that the vsync period roughly matches the timestamps that the monitor generates.
|
| - @MediumTest
|
| - public void testVSyncPeriod() throws InterruptedException {
|
| - // Collect roughly two seconds of data on a 60 fps display.
|
| - VSyncDataCollector collector = new VSyncDataCollector(60 * 2);
|
| - VSyncMonitor monitor = createVSyncMonitor(collector);
|
| + private void performVSyncPeriodTest(boolean enableJBVSync) throws InterruptedException {
|
| + // Collect roughly one second of data on a 60 fps display.
|
| + final int framesPerSecond = 60;
|
| + final int secondsToRun = 1;
|
| + final int totalFrames = secondsToRun * framesPerSecond;
|
| + VSyncDataCollector collector = new VSyncDataCollector(totalFrames);
|
| + VSyncMonitor monitor = createVSyncMonitor(collector, enableJBVSync);
|
|
|
| long reportedFramePeriod = monitor.getVSyncPeriodInMicroseconds();
|
| assertTrue(reportedFramePeriod > 0);
|
|
|
| - if (!monitor.isVSyncSignalAvailable()) {
|
| - // Cannot do timing test without real vsync signal. We can still verify that the monitor
|
| - // throws if we try to use it.
|
| - try {
|
| - monitor.requestUpdate();
|
| - fail("IllegalStateException not thrown.");
|
| - } catch (IllegalStateException e) {
|
| - }
|
| - return;
|
| - }
|
| + assertFalse(collector.isDone());
|
|
|
| monitor.requestUpdate();
|
| - synchronized (collector) {
|
| - collector.wait();
|
| - }
|
| + collector.waitTillDone();
|
| + assertTrue(collector.isDone());
|
| monitor.stop();
|
|
|
| // Check that the median frame rate is within 10% of the reported frame period.
|
| - Arrays.sort(collector.framePeriods, 0, collector.framePeriods.length);
|
| - long medianFramePeriod = collector.framePeriods[collector.framePeriods.length / 2];
|
| + assertTrue(collector.mFrameCount == totalFrames);
|
| + Arrays.sort(collector.mFramePeriods, 0, collector.mFramePeriods.length);
|
| + long medianFramePeriod = collector.mFramePeriods[collector.mFramePeriods.length / 2];
|
| if (Math.abs(medianFramePeriod - reportedFramePeriod) > reportedFramePeriod * .1) {
|
| fail("Measured median frame period " + medianFramePeriod +
|
| " differs by more than 10% from the reported frame period " +
|
| @@ -94,75 +101,15 @@ public class VSyncMonitorTest extends InstrumentationTestCase {
|
| }
|
| }
|
|
|
| - private class TestView extends View {
|
| - private Runnable mPendingAction;
|
| -
|
| - public TestView(Context context) {
|
| - super(context);
|
| - }
|
| -
|
| - @Override
|
| - public boolean postDelayed(Runnable action, long delayMillis) {
|
| - mPendingAction = action;
|
| - return true;
|
| - }
|
| -
|
| - public void runPendingAction() {
|
| - assertNotNull(mPendingAction);
|
| - mPendingAction.run();
|
| - }
|
| - };
|
| -
|
| - private class TestTimeSource implements VSyncMonitor.TestTimeSource {
|
| - long mCurrentTimeMillis;
|
| -
|
| - @Override
|
| - public long currentTimeMillis() {
|
| - return mCurrentTimeMillis;
|
| - }
|
| -
|
| - void setCurrentTimeMillis(long currentTimeMillis) {
|
| - mCurrentTimeMillis = currentTimeMillis;
|
| - }
|
| - };
|
| -
|
| - // Check the the vsync monitor terminates after we have stopped requesting updates for some
|
| - // time.
|
| + // Check that the vsync period roughly matches the timestamps that the monitor generates.
|
| @MediumTest
|
| - public void testVSyncTimeout() throws InterruptedException {
|
| - VSyncMonitor.Listener listener = new VSyncMonitor.Listener() {
|
| - @Override
|
| - public void onVSync(VSyncMonitor monitor, long vsyncTimeMicros) {
|
| - // No-op vsync listener.
|
| - }
|
| - };
|
| - VSyncMonitor monitor = createVSyncMonitor(listener);
|
| - if (!monitor.isVSyncSignalAvailable()) {
|
| - // Cannot do timeout test without real vsync signal.
|
| - return;
|
| - }
|
| -
|
| - TestTimeSource testTimeSource = new TestTimeSource();
|
| - TestView testView = new TestView(getInstrumentation().getContext());
|
| - monitor.setTestDependencies(testView, testTimeSource);
|
| -
|
| - // Requesting an update should make the monitor active.
|
| - testTimeSource.setCurrentTimeMillis(0);
|
| - monitor.requestUpdate();
|
| - assertTrue(monitor.isActive());
|
| -
|
| - // Running the timeout callback should have no effect when no time has passed.
|
| - testView.runPendingAction();
|
| - assertTrue(monitor.isActive());
|
| -
|
| - // Ditto after half the timeout interval.
|
| - testTimeSource.setCurrentTimeMillis(VSyncMonitor.VSYNC_TIMEOUT_MILLISECONDS / 2);
|
| - testView.runPendingAction();
|
| - assertTrue(monitor.isActive());
|
| + public void testVSyncPeriodAllowJBVSync() throws InterruptedException {
|
| + performVSyncPeriodTest(true);
|
| + }
|
|
|
| - // The monitor should be stopped after the timeout interval has passed.
|
| - testTimeSource.setCurrentTimeMillis(VSyncMonitor.VSYNC_TIMEOUT_MILLISECONDS + 1);
|
| - testView.runPendingAction();
|
| - assertFalse(monitor.isActive());
|
| + // Check that the vsync period roughly matches the timestamps that the monitor generates.
|
| + @MediumTest
|
| + public void testVSyncPeriodDisallowJBVSync() throws InterruptedException {
|
| + performVSyncPeriodTest(false);
|
| }
|
| }
|
|
|