| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package android.view.cts; |
| |
| import static org.junit.Assert.assertTrue; |
| |
| import android.content.Context; |
| import android.os.SystemClock; |
| import android.util.Log; |
| import android.view.Display; |
| import android.view.WindowManager; |
| |
| import androidx.test.filters.LargeTest; |
| import androidx.test.rule.ActivityTestRule; |
| import androidx.test.runner.AndroidJUnit4; |
| |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| /** |
| * Test that the screen refresh rate claimed by |
| * android.view.Display.getRefreshRate() matches the steady-state framerate |
| * achieved by vsync-limited eglSwapBuffers(). The primary goal is to test |
| * Display.getRefreshRate() -- using GL is just an easy and hopefully reliable |
| * way of measuring the actual refresh rate. |
| */ |
| @LargeTest |
| @RunWith(AndroidJUnit4.class) |
| public class DisplayRefreshRateTest { |
| // The test passes if |
| // abs(measured_fps - Display.getRefreshRate()) <= FPS_TOLERANCE. |
| // A smaller tolerance requires a more accurate measured_fps in order |
| // to avoid false negatives. |
| private static final float FPS_TOLERANCE = 2.0f; |
| |
| private static final String TAG = "DisplayRefreshRateTest"; |
| |
| @Rule |
| public ActivityTestRule<DisplayRefreshRateCtsActivity> mActivityRule = |
| new ActivityTestRule<>(DisplayRefreshRateCtsActivity.class); |
| |
| private DisplayRefreshRateCtsActivity mActivity; |
| private DisplayRefreshRateCtsActivity.FpsResult mFpsResult; |
| |
| @Before |
| public void setup() { |
| mActivity = mActivityRule.getActivity(); |
| mFpsResult = mActivity.getFpsResult(); |
| } |
| |
| @Test |
| public void testRefreshRate() { |
| boolean fpsOk = false; |
| // This tests the fps of the default display. |
| // In consideration of multi-display devices we use getApplicationContext() |
| // to get the default display. |
| Context context = mActivity.getApplicationContext(); |
| WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); |
| |
| Display dpy = wm.getDefaultDisplay(); |
| float claimedFps = dpy.getRefreshRate(); |
| |
| for (int i = 0; i < 3; i++) { |
| float achievedFps = mFpsResult.waitResult(); |
| Log.d(TAG, "claimed " + claimedFps + " fps, " + |
| "achieved " + achievedFps + " fps"); |
| fpsOk = Math.abs(claimedFps - achievedFps) <= FPS_TOLERANCE; |
| if (fpsOk) { |
| break; |
| } else { |
| // it could be other activity like bug report capturing for other failures |
| // sleep for a while and re-try |
| SystemClock.sleep(10000); |
| mFpsResult.restart(); |
| } |
| } |
| mActivity.finish(); |
| assertTrue(fpsOk); |
| } |
| } |