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