豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit 0ef5b06

Browse files
Lightning00BladeDevtools-frontend LUCI CQ
authored andcommitted
[e2e] Fix flaky user-metrics test
The flake is not reproducible locally This is an attempt to fix the the observed issue, with a new approach to how we load a panel. Bug: 444182703 No-Try: True Change-Id: I74df16aae8fae86349e5425c9b9067314a575217 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6983466 Auto-Submit: Nikolay Vitkov <nvitkov@chromium.org> Commit-Queue: Nikolay Vitkov <nvitkov@chromium.org> Reviewed-by: Alex Rudenko <alexrudenko@chromium.org>
1 parent b4e88d8 commit 0ef5b06

File tree

3 files changed

+52
-19
lines changed

3 files changed

+52
-19
lines changed

test/e2e_non_hosted/conductor/state-provider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,6 @@ export function mergeSettings(s1: E2E.SuiteSettings, s2: E2E.HarnessSettings): E
137137
disabledDevToolsExperiments: mergeAsSet(s1.disabledDevToolsExperiments, s2.disabledDevToolsExperiments),
138138
devToolsSettings: {...(s2.devToolsSettings ?? {}), ...(s1.devToolsSettings ?? {})},
139139
dockingMode: s1.dockingMode ?? s2.dockingMode,
140+
panel: s1.panel ?? s2.panel,
140141
};
141142
}

test/e2e_non_hosted/host/user-metrics_test.ts

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,22 @@ async function setupInspectorFrontendHostStub(devToolsPage: DevToolsPage) {
7979
await devToolsPage.reload();
8080
}
8181

82-
function retrieveRecordedHistogramEvents(page: puppeteer.Page): Promise<EnumHistogramEvent[]> {
82+
async function retrieveRecordedHistogramEvents(devToolsPage: DevToolsPage): Promise<EnumHistogramEvent[]> {
8383
// @ts-expect-error
84-
return page.evaluate(() => window.InspectorFrontendHost.recordedEnumeratedHistograms);
84+
return await devToolsPage.page.evaluate(() => window.InspectorFrontendHost.recordedEnumeratedHistograms);
8585
}
8686

87-
function retrieveRecordedPerformanceHistogramEvents(page: puppeteer.Page): Promise<PerformanceHistogramEvent[]> {
87+
async function retrieveRecordedPerformanceHistogramEvents(devToolsPage: DevToolsPage):
88+
Promise<PerformanceHistogramEvent[]> {
89+
// The reporting happens in a raf
90+
await devToolsPage.drainTaskQueue();
8891
// @ts-expect-error
89-
return page.evaluate(() => window.InspectorFrontendHost.recordedPerformanceHistograms);
92+
return await devToolsPage.page.evaluate(() => window.InspectorFrontendHost.recordedPerformanceHistograms);
9093
}
9194

9295
async function assertHistogramEventsInclude(expected: EnumHistogramEvent[], devToolsPage: DevToolsPage) {
9396
await devToolsPage.waitForFunction(async () => {
94-
const events = await retrieveRecordedHistogramEvents(devToolsPage.page);
97+
const events = await retrieveRecordedHistogramEvents(devToolsPage);
9598
try {
9699
assert.includeDeepMembers(events, expected);
97100
return true;
@@ -101,10 +104,24 @@ async function assertHistogramEventsInclude(expected: EnumHistogramEvent[], devT
101104
});
102105
}
103106

107+
async function assertHistogramPerformanceEventsInclude(expected: string[], devToolsPage: DevToolsPage) {
108+
await devToolsPage.waitForFunction(async () => {
109+
const events = await retrieveRecordedPerformanceHistogramEvents(devToolsPage);
110+
try {
111+
for (const expect of expected) {
112+
assert.include(events.map(e => e.histogramName), expect);
113+
}
114+
return true;
115+
} catch {
116+
return false;
117+
}
118+
});
119+
}
120+
104121
async function waitForHistogramEvent(
105122
expected: EnumHistogramEventWithOptionalCode, expectedCount = 1, devToolsPage: DevToolsPage) {
106123
await devToolsPage.waitForFunction(async () => {
107-
const events = await retrieveRecordedHistogramEvents(devToolsPage.page);
124+
const events = await retrieveRecordedHistogramEvents(devToolsPage);
108125
const matchedEvents = events.filter(
109126
e => e.actionName === expected.actionName &&
110127
(!('actionCode' in expected) || e.actionCode === expected.actionCode));
@@ -400,11 +417,7 @@ describe('User Metrics', () => {
400417
});
401418

402419
describe('User Metric with deferent initial panel', () => {
403-
setup({
404-
devToolsSettings: {
405-
'panel-selected-tab': 'network',
406-
},
407-
});
420+
setup({panel: 'network'});
408421

409422
it('dispatches events for view shown at launch', async ({devToolsPage}) => {
410423
await setupInspectorFrontendHostStub(devToolsPage);
@@ -424,11 +437,9 @@ describe('User Metric with deferent initial panel', () => {
424437
// request that the resetPages helper sets the network as the target panel, and
425438
// we wait for the network in the test. This means, in turn, we get the PanelLoaded
426439
// event.
427-
await devToolsPage.waitFor('.network');
428-
429-
const events = await retrieveRecordedPerformanceHistogramEvents(devToolsPage.page);
440+
await devToolsPage.waitFor('.network .network-toolbar-container');
430441

431-
assert.include(events.map(e => e.histogramName), 'DevTools.Launch.Network');
442+
await assertHistogramPerformanceEventsInclude(['DevTools.Launch.Network'], devToolsPage);
432443
});
433444
});
434445

test/e2e_non_hosted/shared/frontend-helper.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,15 @@ export class DevToolsPage extends PageWrapper {
123123
* @param panel Mocks DevTools URL search params to make it open a specific panel on load.
124124
* @param canDock Mocks DevTools URL search params to make it think whether it can dock or not.
125125
* This does not control whether or not the panel can actually dock or not.
126+
* @param persistReloads If this is true running {@link DevToolsPage.reload} will reloading with
127+
* the provided options
126128
*/
127-
async reloadWithParams({panel, canDock}: DevToolsReloadParams) {
129+
async reloadWithParams({panel, canDock}: DevToolsReloadParams, persistReloads = false) {
130+
if (!panel && !canDock) {
131+
await this.reload();
132+
return;
133+
}
134+
128135
// evaluateOnNewDocument is ran before all other JS is loaded
129136
// ES Modules are only resolved once and always resolved asynchronously
130137
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#other_differences_between_modules_and_classic_scripts
@@ -141,7 +148,9 @@ export class DevToolsPage extends PageWrapper {
141148
}, panel, canDock);
142149

143150
await this.reload();
144-
await this.page.removeScriptToEvaluateOnNewDocument(token.identifier);
151+
if (!persistReloads) {
152+
await this.page.removeScriptToEvaluateOnNewDocument(token.identifier);
153+
}
145154
if (panel) {
146155
await this.waitFor(`.panel.${panel}`);
147156
}
@@ -758,8 +767,18 @@ export interface DevtoolsSettings {
758767
enabledDevToolsExperiments: string[];
759768
disabledDevToolsExperiments: string[];
760769
devToolsSettings: Record<string, unknown>;
761-
// front_end/ui/legacy/DockController.ts DockState
770+
/**
771+
* Defined in front_end/ui/legacy/DockController.ts DockState
772+
*/
762773
dockingMode: 'bottom'|'right'|'left'|'undocked';
774+
// DevTools panel to open on load
775+
/**
776+
* The name of the panel to be loaded initially
777+
* This persist after {@link DevToolsPage.reload}
778+
*
779+
* To reload into a panel use {@link DevToolsPage.reloadWithParams}
780+
*/
781+
panel: string|undefined;
763782
}
764783

765784
export const DEFAULT_DEVTOOLS_SETTINGS: DevtoolsSettings = {
@@ -769,6 +788,7 @@ export const DEFAULT_DEVTOOLS_SETTINGS: DevtoolsSettings = {
769788
veLogsTestMode: true,
770789
},
771790
dockingMode: 'right',
791+
panel: undefined
772792
};
773793

774794
/**
@@ -871,7 +891,8 @@ export async function setupDevToolsPage(
871891
setDevToolsExperiments(devToolsPage, settings.enabledDevToolsExperiments),
872892
setDisabledDevToolsExperiments(devToolsPage, settings.disabledDevToolsExperiments),
873893
]);
874-
await devToolsPage.reload();
894+
895+
await devToolsPage.reloadWithParams({panel: settings.panel}, true);
875896

876897
await Promise.all([
877898
devToolsPage.throttleCPUIfRequired(),

0 commit comments

Comments
 (0)