1b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase/* 2b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * Copyright (C) 2017 The Android Open Source Project 3b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * 4b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * you may not use this file except in compliance with the License. 6b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * You may obtain a copy of the License at 7b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * 8b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * http://www.apache.org/licenses/LICENSE-2.0 9b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * 10b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * Unless required by applicable law or agreed to in writing, software 11b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * See the License for the specific language governing permissions and 14b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase * limitations under the License. 15b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase */ 16b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 17b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haasepackage android.support.v4.app; 18b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 19b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 20b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport static org.junit.Assert.assertNotNull; 21b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport static org.junit.Assert.assertNull; 22b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport static org.junit.Assert.assertTrue; 23b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 24b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.content.Intent; 25b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.os.Build; 26b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.support.test.InstrumentationRegistry; 27b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.support.test.filters.MediumTest; 28b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.support.test.filters.SmallTest; 29b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.support.test.rule.ActivityTestRule; 30b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.support.test.runner.AndroidJUnit4; 31b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport android.util.SparseIntArray; 32b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 33b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport org.junit.Rule; 34b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport org.junit.Test; 35b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haaseimport org.junit.runner.RunWith; 36b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 37b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase@RunWith(AndroidJUnit4.class) 38b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase@SmallTest 39b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haasepublic class FrameMetricsAggregatorTest { 40b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 41b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase @Rule 42b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase public final ActivityTestRule<FrameMetricsActivity> mActivityTestRule; 43b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase private FrameMetricsSubActivity mSecondActivity = null; 44b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 45b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 46b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase public FrameMetricsAggregatorTest() { 47b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase mActivityTestRule = new ActivityTestRule<>(FrameMetricsActivity.class); 48b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 49b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 50b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase @Test 51b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase @MediumTest 52b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase public void testFrameMetrics() throws Throwable { 53b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase FrameMetricsAggregator metrics = new FrameMetricsAggregator(); 54b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 55b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase // Check that getMetrics() returns empty results 56b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase SparseIntArray[] durations = metrics.getMetrics(); 57b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 58b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 59b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 60b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 61b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 62b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(sparseArray); 63b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 64b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 65b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 66b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase final FrameMetricsActivity activity = mActivityTestRule.getActivity(); 67b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase metrics.add(activity); 68b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 69b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase // Check that getMetrics() returns results only for TOTAL_DURATION 70b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.getMetrics(); 71b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 72b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 73b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 74b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 75b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (int i = 0; i < durations.length; ++i) { 76b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (i == FrameMetricsAggregator.TOTAL_INDEX) { 77b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations[i]); 78b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 79b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations[i]); 80b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 81b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 82b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 83b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 84b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase // Start tracking all durations 85b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase metrics = new FrameMetricsAggregator(FrameMetricsAggregator.EVERY_DURATION); 86b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase metrics.add(activity); 87b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 88b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase // Check that getMetrics() returns results for all durations 89b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.getMetrics(); 90b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 91b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 92b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 93b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 94b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 95b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(sparseArray); 96b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 97b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 98b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 99b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase long startTime = System.currentTimeMillis(); 100b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase while (System.currentTimeMillis() - startTime < 1000) { 101b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (mSecondActivity == null && System.currentTimeMillis() - startTime > 400) { 102b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase Intent intent = new Intent(activity, FrameMetricsSubActivity.class) 103b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 104b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase mSecondActivity = (FrameMetricsSubActivity) 105b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase InstrumentationRegistry.getInstrumentation().startActivitySync(intent); 106b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase metrics.add(mSecondActivity); 107b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 108b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase mActivityTestRule.runOnUiThread(new Runnable() { 109b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase @Override 110b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase public void run() { 111b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase activity.invalidate(); 112b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 113b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase }); 114b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase try { 115b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase Thread.sleep(10); 116b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } catch (Exception e) { 117b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 118b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 119b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 120b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.getMetrics(); 121b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 122b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 123b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 124b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 125b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 126b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(sparseArray); 127b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertTrue(sparseArray.size() > 0); 128b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 129b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 130b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.remove(mSecondActivity); 131b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 132b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 133b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 134b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 135b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 136b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(sparseArray); 137b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertTrue(sparseArray.size() > 0); 138b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 139b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 140b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.stop(); 141b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 142b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 143b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 144b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 145b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 146b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(sparseArray); 147b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertTrue(sparseArray.size() > 0); 148b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 149b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 150b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.reset(); 151b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 152b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 153b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 154b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 155b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 156b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(sparseArray); 157b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertTrue(sparseArray.size() > 0); 158b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 159b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 160b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase durations = metrics.getMetrics(); 161b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase if (Build.VERSION.SDK_INT < 24) { 162b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(durations); 163b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } else { 164b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNotNull(durations); 165b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase for (SparseIntArray sparseArray : durations) { 166b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase assertNull(sparseArray); 167b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 168b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 169b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 170b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase } 171b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase 172b56412b5318f17367d1e93ed3f6c0e196036bbadChet Haase} 173