1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.jank_tracker; 6 7 import static org.mockito.Mockito.never; 8 import static org.mockito.Mockito.verify; 9 10 import org.junit.Before; 11 import org.junit.Rule; 12 import org.junit.Test; 13 import org.junit.runner.RunWith; 14 import org.mockito.ArgumentMatchers; 15 import org.mockito.Mock; 16 import org.mockito.MockitoAnnotations; 17 import org.robolectric.annotation.Config; 18 19 import org.chromium.base.test.BaseRobolectricTestRunner; 20 import org.chromium.base.test.util.JniMocker; 21 22 /** Tests for JankMetricUMARecorder. */ 23 @RunWith(BaseRobolectricTestRunner.class) 24 @Config(manifest = Config.NONE) 25 public class JankMetricUMARecorderTest { 26 @Rule public JniMocker mocker = new JniMocker(); 27 28 @Mock JankMetricUMARecorder.Natives mNativeMock; 29 30 @Before setUp()31 public void setUp() { 32 MockitoAnnotations.initMocks(this); 33 mocker.mock(JankMetricUMARecorderJni.TEST_HOOKS, mNativeMock); 34 } 35 36 @Test testRecordMetricsToNative()37 public void testRecordMetricsToNative() { 38 long[] timestampsNs = new long[] {5L, 8L, 3L}; 39 long[] durationsNs = new long[] {5_000_000L, 8_000_000L, 30_000_000L}; 40 int[] missedVsyncs = new int[] {0, 0, 1}; 41 42 JankMetrics metric = new JankMetrics(timestampsNs, durationsNs, missedVsyncs); 43 44 JankMetricUMARecorder.recordJankMetricsToUMA(metric, 0, 1000, 1); 45 46 // Ensure that the relevant fields are sent down to native. 47 verify(mNativeMock).recordJankMetrics(durationsNs, missedVsyncs, 0, 1000, 1); 48 } 49 50 @Test testRecordNullMetrics()51 public void testRecordNullMetrics() { 52 JankMetricUMARecorder.recordJankMetricsToUMA(null, 0, 0, 1); 53 verify(mNativeMock, never()) 54 .recordJankMetrics( 55 ArgumentMatchers.any(), 56 ArgumentMatchers.any(), 57 ArgumentMatchers.anyLong(), 58 ArgumentMatchers.anyLong(), 59 ArgumentMatchers.anyInt()); 60 } 61 } 62