blob: 9afeb9c5deebb9061a0cc0bc8f3889807c5a1f8b [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.view;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.annotation.TargetApi;
import android.hardware.display.DisplayManager;
import android.os.Looper;
import android.view.Display;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import io.flutter.embedding.engine.FlutterJNI;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.annotation.Config;
@Config(manifest = Config.NONE)
@RunWith(AndroidJUnit4.class)
public class VsyncWaiterTest {
@Before
public void setUp() {
VsyncWaiter.reset();
}
@Test
public void itSetsFpsBelowApi17() {
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
VsyncWaiter waiter = VsyncWaiter.getInstance(10.0f, mockFlutterJNI);
verify(mockFlutterJNI, times(1)).setRefreshRateFPS(10.0f);
waiter.init();
ArgumentCaptor<FlutterJNI.AsyncWaitForVsyncDelegate> delegateCaptor =
ArgumentCaptor.forClass(FlutterJNI.AsyncWaitForVsyncDelegate.class);
verify(mockFlutterJNI, times(1)).setAsyncWaitForVsyncDelegate(delegateCaptor.capture());
delegateCaptor.getValue().asyncWaitForVsync(1);
shadowOf(Looper.getMainLooper()).idle();
verify(mockFlutterJNI, times(1)).onVsync(anyLong(), eq(1000000000l / 10l), eq(1l));
}
@TargetApi(17)
@Test
public void itSetsFpsWhenDisplayManagerUpdates() {
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
DisplayManager mockDisplayManager = mock(DisplayManager.class);
Display mockDisplay = mock(Display.class);
ArgumentCaptor<VsyncWaiter.DisplayListener> displayListenerCaptor =
ArgumentCaptor.forClass(VsyncWaiter.DisplayListener.class);
when(mockDisplayManager.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mockDisplay);
VsyncWaiter waiter = VsyncWaiter.getInstance(mockDisplayManager, mockFlutterJNI);
verify(mockDisplayManager, times(1))
.registerDisplayListener(displayListenerCaptor.capture(), isNull());
when(mockDisplay.getRefreshRate()).thenReturn(90.0f);
displayListenerCaptor.getValue().onDisplayChanged(Display.DEFAULT_DISPLAY);
verify(mockFlutterJNI, times(1)).setRefreshRateFPS(90.0f);
waiter.init();
ArgumentCaptor<FlutterJNI.AsyncWaitForVsyncDelegate> delegateCaptor =
ArgumentCaptor.forClass(FlutterJNI.AsyncWaitForVsyncDelegate.class);
verify(mockFlutterJNI, times(1)).setAsyncWaitForVsyncDelegate(delegateCaptor.capture());
delegateCaptor.getValue().asyncWaitForVsync(1);
shadowOf(Looper.getMainLooper()).idle();
verify(mockFlutterJNI, times(1)).onVsync(anyLong(), eq(1000000000l / 90l), eq(1l));
when(mockDisplay.getRefreshRate()).thenReturn(60.0f);
displayListenerCaptor.getValue().onDisplayChanged(Display.DEFAULT_DISPLAY);
verify(mockFlutterJNI, times(1)).setRefreshRateFPS(60.0f);
delegateCaptor.getValue().asyncWaitForVsync(1);
shadowOf(Looper.getMainLooper()).idle();
verify(mockFlutterJNI, times(1)).onVsync(anyLong(), eq(1000000000l / 60l), eq(1l));
}
@TargetApi(17)
@Test
public void itSetsFpsWhenDisplayManagerDoesNotUpdate() {
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
DisplayManager mockDisplayManager = mock(DisplayManager.class);
Display mockDisplay = mock(Display.class);
when(mockDisplayManager.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mockDisplay);
when(mockDisplay.getRefreshRate()).thenReturn(90.0f);
VsyncWaiter waiter = VsyncWaiter.getInstance(mockDisplayManager, mockFlutterJNI);
verify(mockDisplayManager, times(1)).registerDisplayListener(any(), isNull());
verify(mockFlutterJNI, times(1)).setRefreshRateFPS(90.0f);
}
}