xref: /aosp_15_r20/external/perfetto/ui/src/test/aggregation.test.ts (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker//
3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker//
7*6dbdd20aSAndroid Build Coastguard Worker//      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker//
9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker
15*6dbdd20aSAndroid Build Coastguard Workerimport {test, Page} from '@playwright/test';
16*6dbdd20aSAndroid Build Coastguard Workerimport {PerfettoTestHelper} from './perfetto_ui_test_helper';
17*6dbdd20aSAndroid Build Coastguard Workerimport {assertExists} from '../base/logging';
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Workertest.describe.configure({mode: 'serial'});
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Workerlet pth: PerfettoTestHelper;
22*6dbdd20aSAndroid Build Coastguard Workerlet page: Page;
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Workertest.beforeAll(async ({browser}, _testInfo) => {
25*6dbdd20aSAndroid Build Coastguard Worker  page = await browser.newPage();
26*6dbdd20aSAndroid Build Coastguard Worker  pth = new PerfettoTestHelper(page);
27*6dbdd20aSAndroid Build Coastguard Worker  await pth.openTraceFile('api34_startup_cold.perfetto-trace');
28*6dbdd20aSAndroid Build Coastguard Worker});
29*6dbdd20aSAndroid Build Coastguard Worker
30*6dbdd20aSAndroid Build Coastguard Workertest('sched', async () => {
31*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(600, 250);
32*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.down();
33*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(800, 350);
34*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.up();
35*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForPerfettoIdle();
36*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('cpu-by-thread.png');
37*6dbdd20aSAndroid Build Coastguard Worker
38*6dbdd20aSAndroid Build Coastguard Worker  await page.click('button[label="CPU by process"]');
39*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('cpu-by-process.png');
40*6dbdd20aSAndroid Build Coastguard Worker
41*6dbdd20aSAndroid Build Coastguard Worker  // Now test sorting.
42*6dbdd20aSAndroid Build Coastguard Worker
43*6dbdd20aSAndroid Build Coastguard Worker  const hdr = page.getByRole('cell', {name: 'Avg Wall duration (ms)'});
44*6dbdd20aSAndroid Build Coastguard Worker  await hdr.click();
45*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('sort-by-wall-duration.png');
46*6dbdd20aSAndroid Build Coastguard Worker
47*6dbdd20aSAndroid Build Coastguard Worker  await hdr.click();
48*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('sort-by-wall-duration-desc.png');
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Worker  await page.getByRole('cell', {name: 'Occurrences'}).click();
51*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('sort-by-occurrences.png');
52*6dbdd20aSAndroid Build Coastguard Worker});
53*6dbdd20aSAndroid Build Coastguard Worker
54*6dbdd20aSAndroid Build Coastguard Workertest('gpu counter', async () => {
55*6dbdd20aSAndroid Build Coastguard Worker  await page.keyboard.press('Escape');
56*6dbdd20aSAndroid Build Coastguard Worker  const gpuTrack = pth.locateTrack('Gpu 0 Frequency');
57*6dbdd20aSAndroid Build Coastguard Worker  const coords = assertExists(await gpuTrack.boundingBox());
58*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(600, coords.y + 10);
59*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.down();
60*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(800, coords.y + 60);
61*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.up();
62*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('gpu-counter-aggregation.png');
63*6dbdd20aSAndroid Build Coastguard Worker});
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Workertest('frametimeline', async () => {
66*6dbdd20aSAndroid Build Coastguard Worker  await page.keyboard.press('Escape');
67*6dbdd20aSAndroid Build Coastguard Worker  const sysui = pth.locateTrackGroup('com.android.systemui 25348');
68*6dbdd20aSAndroid Build Coastguard Worker  await sysui.scrollIntoViewIfNeeded();
69*6dbdd20aSAndroid Build Coastguard Worker  await pth.toggleTrackGroup(sysui);
70*6dbdd20aSAndroid Build Coastguard Worker  const actualTimeline = pth.locateTrack(
71*6dbdd20aSAndroid Build Coastguard Worker    'com.android.systemui 25348/Actual Timeline',
72*6dbdd20aSAndroid Build Coastguard Worker    sysui,
73*6dbdd20aSAndroid Build Coastguard Worker  );
74*6dbdd20aSAndroid Build Coastguard Worker  const coords = assertExists(await actualTimeline.boundingBox());
75*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(600, coords.y + 10);
76*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.down();
77*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(1000, coords.y + 20);
78*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.up();
79*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('frame-timeline-aggregation.png');
80*6dbdd20aSAndroid Build Coastguard Worker});
81*6dbdd20aSAndroid Build Coastguard Worker
82*6dbdd20aSAndroid Build Coastguard Workertest('slices', async () => {
83*6dbdd20aSAndroid Build Coastguard Worker  await page.keyboard.press('Escape');
84*6dbdd20aSAndroid Build Coastguard Worker  const syssrv = pth.locateTrackGroup('system_server 1719');
85*6dbdd20aSAndroid Build Coastguard Worker  await syssrv.scrollIntoViewIfNeeded();
86*6dbdd20aSAndroid Build Coastguard Worker  await pth.toggleTrackGroup(syssrv);
87*6dbdd20aSAndroid Build Coastguard Worker  const animThread = pth
88*6dbdd20aSAndroid Build Coastguard Worker    .locateTrack('system_server 1719/android.anim 1754', syssrv)
89*6dbdd20aSAndroid Build Coastguard Worker    .nth(1);
90*6dbdd20aSAndroid Build Coastguard Worker  await animThread.scrollIntoViewIfNeeded();
91*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForPerfettoIdle();
92*6dbdd20aSAndroid Build Coastguard Worker  const coords = assertExists(await animThread.boundingBox());
93*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(600, coords.y + 10);
94*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.down();
95*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.move(1000, coords.y + 20);
96*6dbdd20aSAndroid Build Coastguard Worker  await page.mouse.up();
97*6dbdd20aSAndroid Build Coastguard Worker  await pth.waitForIdleAndScreenshot('slice-aggregation.png');
98*6dbdd20aSAndroid Build Coastguard Worker});
99