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