Skip to content

Commit 129c036

Browse files
Liviu RauDevtools-frontend LUCI CQ
authored andcommitted
Migrate test/e2e/console/console-insight_test.ts
e2e target remains practically empty after this change; however we will clean up together with moving the remaining helpers and resources to the new location in a subsequent CL Fixed: 416404924 Change-Id: I258d631eb40a9bee33c2d039a6547c76f86b4e8b Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6714632 Reviewed-by: Alex Rudenko <[email protected]> Commit-Queue: Liviu Rau <[email protected]>
1 parent bf6fbbb commit 129c036

File tree

10 files changed

+136
-124
lines changed

10 files changed

+136
-124
lines changed

front_end/entrypoints/main/MainImpl.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
127127
let loadedPanelCommonModule: typeof PanelCommon|undefined;
128128
export class MainImpl {
129129
#readyForTestPromise = Promise.withResolvers<void>();
130+
#veStartPromise!: Promise<void>;
130131

131132
constructor() {
132133
MainImpl.instanceForTest = this;
@@ -184,11 +185,12 @@ export class MainImpl {
184185
clickLogThrottler: new Common.Throttler.Throttler(10),
185186
resizeLogThrottler: new Common.Throttler.Throttler(10),
186187
};
187-
void VisualLogging.startLogging(options);
188+
this.#veStartPromise = VisualLogging.startLogging(options);
188189
} else {
189-
void VisualLogging.startLogging();
190+
this.#veStartPromise = VisualLogging.startLogging();
190191
}
191192
}
193+
192194
void this.#createAppUI();
193195
}
194196

@@ -584,6 +586,7 @@ export class MainImpl {
584586
for (const runnableInstanceFunction of Common.Runnable.earlyInitializationRunnables()) {
585587
await runnableInstanceFunction().run();
586588
}
589+
await this.#veStartPromise;
587590
// Used for browser tests.
588591
Host.InspectorFrontendHost.InspectorFrontendHostInstance.readyForTest();
589592
this.#readyForTestPromise.resolve();

front_end/panels/console/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ devtools_entrypoint("bundle") {
7575
visibility = [
7676
":*",
7777
"../../../test/e2e/console/*",
78+
"../../../test/e2e_non_hosted/console/*",
7879
"../../entrypoints/*",
7980
"../../panels/explain/*",
8081
]

test/conductor/screenshot-error.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export class ScreenshotError extends Error {
7474
*/
7575
static fromBase64Images(
7676
error: Error, inspectedPageScreenshot?: string, devToolsPageScreenshot?: string,
77-
collectedScreenshots?: string[]) {
77+
collectedScreenshots?: Record<string, string>): Error {
7878
if (!inspectedPageScreenshot || !devToolsPageScreenshot) {
7979
console.error('No artifacts to save.');
8080
return error;
@@ -83,13 +83,8 @@ export class ScreenshotError extends Error {
8383
inspectedPage: {filePath: this.saveArtifact(inspectedPageScreenshot)},
8484
devToolsPage: {filePath: this.saveArtifact(devToolsPageScreenshot)},
8585
};
86-
if (collectedScreenshots) {
87-
for (let i = 0; i <= collectedScreenshots.length; i++) {
88-
if (!collectedScreenshots[i]) {
89-
continue;
90-
}
91-
screenshots[`screenshot${i + 1}`] = {filePath: this.saveArtifact(collectedScreenshots[i])};
92-
}
86+
for (const name in collectedScreenshots) {
87+
screenshots[name] = {filePath: this.saveArtifact(collectedScreenshots[name])};
9388
}
9489
return new ScreenshotError(screenshots, undefined, error);
9590
}

test/e2e/BUILD.gn

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,12 @@ import("../../scripts/build/typescript/typescript.gni")
88
group("e2e") {
99
deps = [
1010
":test_inputs",
11-
":tests",
1211
"resources",
1312
]
1413
}
1514

16-
node_ts_library("tests") {
17-
deps = [ "console" ]
18-
sources = [ "mocharc.ts" ]
19-
}
20-
2115
generated_file("test_inputs") {
2216
outputs = [ "$target_gen_dir/tests.txt" ]
2317
data_keys = [ "tests" ]
2418
rebase = target_gen_dir
25-
26-
deps = [ ":tests" ]
2719
}

test/e2e/console/BUILD.gn

Lines changed: 0 additions & 15 deletions
This file was deleted.

test/e2e/console/DIR_METADATA

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/e2e_non_hosted/console/BUILD.gn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ts_e2e_library("console") {
2121
"console-fetch-logging_test.ts",
2222
"console-filter_test.ts",
2323
"console-ignore-list_test.ts",
24+
"console-insight_test.ts",
2425
"console-last-result_test.ts",
2526
"console-live-expressions_test.ts",
2627
"console-log_test.ts",
@@ -38,6 +39,7 @@ ts_e2e_library("console") {
3839
]
3940

4041
deps = [
42+
"../../../front_end/panels/console:bundle",
4143
"../../e2e/helpers",
4244
"../shared",
4345
]

test/e2e/console/console-insight_test.ts renamed to test/e2e_non_hosted/console/console-insight_test.ts

Lines changed: 110 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2023 The Chromium Authors
1+
// Copyright 2025 The Chromium Authors
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

@@ -7,8 +7,11 @@ import type * as puppeteer from 'puppeteer-core';
77

88
import type * as Root from '../../../front_end/core/root/root.js';
99
import type * as Console from '../../../front_end/panels/console/console.js';
10-
import {click, getBrowserAndPages, hover, setDevToolsSettings, waitFor, waitForNone} from '../../shared/helper.js';
11-
import {clickOnContextMenu, CONSOLE_TAB_SELECTOR} from '../helpers/console-helpers.js';
10+
import {
11+
clickOnContextMenu,
12+
CONSOLE_TAB_SELECTOR,
13+
} from '../../e2e/helpers/console-helpers.js';
14+
import type {DevToolsPage} from '../shared/frontend-helper.js';
1215

1316
describe('ConsoleInsight', function() {
1417
const CLICK_TARGET_SELECTOR = '.console-message-text';
@@ -17,108 +20,135 @@ describe('ConsoleInsight', function() {
1720

1821
async function setupMocks(
1922
aidaAvailability: Partial<Root.Runtime.AidaAvailability>,
20-
devToolsConsoleInsights: Partial<Root.Runtime.HostConfigConsoleInsights>) {
21-
const {frontend} = getBrowserAndPages();
22-
await frontend.bringToFront();
23-
await frontend.evaluateOnNewDocument(
24-
`globalThis.hostConfigForTesting = {...globalThis.hostConfigForTesting, devToolsConsoleInsights: ${
25-
JSON.stringify(devToolsConsoleInsights)}, aidaAvailability: ${JSON.stringify(aidaAvailability)}
26-
};`);
27-
await frontend.reload({
23+
devToolsConsoleInsights: Partial<Root.Runtime.HostConfigConsoleInsights>,
24+
devToolsPage: DevToolsPage,
25+
) {
26+
const syncInformation = {
27+
accountEmail: 'some-email',
28+
isSyncActive: true,
29+
arePreferencesSynced: false,
30+
};
31+
const hostConfig = {
32+
devToolsConsoleInsights: {...devToolsConsoleInsights},
33+
aidaAvailability: {...aidaAvailability},
34+
};
35+
await devToolsPage.evaluateOnNewDocument(`
36+
Object.defineProperty(window, 'InspectorFrontendHost', {
37+
configurable: true,
38+
enumerable: true,
39+
get() {
40+
return this._InspectorFrontendHost;
41+
},
42+
set(value) {
43+
value.getHostConfig = (cb) => {
44+
cb({
45+
...globalThis.hostConfigForTesting ?? {},
46+
...JSON.parse('${JSON.stringify(hostConfig)}'),
47+
});
48+
}
49+
50+
value.getSyncInformation = (cb) => {
51+
cb(JSON.parse('${JSON.stringify(syncInformation)}'));
52+
};
53+
54+
this._InspectorFrontendHost = value;
55+
}
56+
});
57+
`);
58+
59+
await devToolsPage.reload({
2860
waitUntil: 'networkidle0',
2961
});
62+
await devToolsPage.useSoftMenu();
3063
}
31-
it('shows an insight for a console message via the context menu', async () => {
32-
const {target} = getBrowserAndPages();
33-
await setupMocks({enabled: true}, {enabled: true});
34-
await click(CONSOLE_TAB_SELECTOR);
35-
await target.evaluate(() => {
64+
65+
it('shows an insight for a console message via the context menu', async ({devToolsPage, inspectedPage}) => {
66+
await setupMocks({enabled: true}, {enabled: true}, devToolsPage);
67+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
68+
await inspectedPage.evaluate(() => {
3669
console.error(new Error('Unexpected error'));
3770
});
38-
await clickOnContextMenu(CLICK_TARGET_SELECTOR, EXPLAIN_ACTION_ID);
39-
await waitFor('devtools-console-insight', undefined, undefined, 'pierce');
71+
await clickOnContextMenu(CLICK_TARGET_SELECTOR, EXPLAIN_ACTION_ID, devToolsPage);
72+
73+
await devToolsPage.waitFor('devtools-console-insight');
4074
});
4175

42-
it('shows an insight for a console message via the hover button', async () => {
43-
const {target} = getBrowserAndPages();
44-
await setupMocks({enabled: true}, {enabled: true});
45-
await click(CONSOLE_TAB_SELECTOR);
46-
await target.evaluate(() => {
76+
it('shows an insight for a console message via the hover button', async ({devToolsPage, inspectedPage}) => {
77+
await setupMocks({enabled: true}, {enabled: true}, devToolsPage);
78+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
79+
await inspectedPage.evaluate(() => {
4780
console.error(new Error('Unexpected error'));
4881
});
49-
await waitFor('.console-message', undefined, undefined, 'pierce');
50-
await waitFor('.hover-button', undefined, undefined, 'pierce');
51-
await hover('.console-message');
52-
await click('.hover-button');
53-
await waitFor('devtools-console-insight', undefined, undefined, 'pierce');
82+
await devToolsPage.waitFor('.console-message');
83+
await devToolsPage.waitFor('.hover-button');
84+
await devToolsPage.hover('.console-message');
85+
await devToolsPage.click('.hover-button');
86+
await devToolsPage.waitFor('devtools-console-insight');
5487
});
5588

56-
it('does not show context menu if AIDA is not available', async () => {
57-
const {target} = getBrowserAndPages();
58-
await setupMocks({enabled: false}, {enabled: true});
59-
await click(CONSOLE_TAB_SELECTOR);
60-
await target.evaluate(() => {
89+
it('does not show context menu if AIDA is not available', async ({devToolsPage, inspectedPage}) => {
90+
await setupMocks({enabled: false}, {enabled: true}, devToolsPage);
91+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
92+
await inspectedPage.evaluate(() => {
6193
console.error(new Error('Unexpected error'));
6294
});
63-
await click(CLICK_TARGET_SELECTOR, {clickOptions: {button: 'right'}});
64-
const menu = await waitFor('.soft-context-menu', undefined, undefined, 'pierce');
95+
await devToolsPage.click(CLICK_TARGET_SELECTOR, {clickOptions: {button: 'right'}});
96+
const menu = await devToolsPage.waitFor('.soft-context-menu');
6597
const items = await menu.$$('.soft-context-menu-item');
6698
const texts = await Promise.all(items.map(item => item.evaluate(e => (e as HTMLElement).innerText)));
6799
assert.isNotOk(
68-
texts.some(item => item.toLowerCase().startsWith(EXPLAIN_LABEL.toLowerCase())),
100+
texts.some(item => (item as string).toLowerCase().startsWith(EXPLAIN_LABEL.toLowerCase())),
69101
'Context menu shows the explain option');
70-
await waitFor('.console-message', undefined, undefined, 'pierce');
71-
await waitForNone('.hover-button');
102+
await devToolsPage.waitFor('.console-message');
103+
await devToolsPage.waitForNone('.hover-button');
72104
});
73105

74-
it('shows the hover button even if locale is not supported', async () => {
75-
const {target} = getBrowserAndPages();
76-
await setDevToolsSettings({language: 'zh'});
77-
await setupMocks({enabled: true}, {enabled: true});
78-
await click(CONSOLE_TAB_SELECTOR);
79-
await target.evaluate(() => {
80-
console.error(new Error('Unexpected error'));
106+
describe('if locale is not supported', () => {
107+
setup({devToolsSettings: {language: 'zh'}});
108+
109+
it('still shows the hover button', async ({devToolsPage, inspectedPage}) => {
110+
await setupMocks({enabled: true}, {enabled: true}, devToolsPage);
111+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
112+
await inspectedPage.evaluate(() => {
113+
console.error(new Error('Unexpected error'));
114+
});
115+
await devToolsPage.waitFor('.console-message');
116+
await devToolsPage.waitFor('.hover-button');
81117
});
82-
await waitFor('.console-message', undefined, undefined, 'pierce');
83-
await waitFor('.hover-button', undefined, undefined, 'pierce');
84118
});
85119

86-
it('shows the hover button even if age check is not passing', async () => {
87-
const {target} = getBrowserAndPages();
88-
await setupMocks({blockedByAge: true, enabled: true}, {enabled: true});
89-
await click(CONSOLE_TAB_SELECTOR);
90-
await target.evaluate(() => {
120+
it('shows the hover button even if age check is not passing', async ({devToolsPage, inspectedPage}) => {
121+
await setupMocks({blockedByAge: true, enabled: true}, {enabled: true}, devToolsPage);
122+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
123+
await inspectedPage.evaluate(() => {
91124
console.error(new Error('Unexpected error'));
92125
});
93-
await waitFor('.console-message', undefined, undefined, 'pierce');
94-
await waitFor('.hover-button', undefined, undefined, 'pierce');
126+
await devToolsPage.waitFor('.console-message');
127+
await devToolsPage.waitFor('.hover-button');
95128
});
96129

97-
it('does not show the hover button if policy does not allow it', async () => {
98-
const {target} = getBrowserAndPages();
99-
await setupMocks({blockedByEnterprisePolicy: true, enabled: true}, {enabled: true});
100-
await click(CONSOLE_TAB_SELECTOR);
101-
await target.evaluate(() => {
130+
it('does not show the hover button if policy does not allow it', async ({devToolsPage, inspectedPage}) => {
131+
await setupMocks({blockedByEnterprisePolicy: true, enabled: true}, {enabled: true}, devToolsPage);
132+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
133+
await inspectedPage.evaluate(() => {
102134
console.error(new Error('Unexpected error'));
103135
});
104-
await waitFor('.console-message', undefined, undefined, 'pierce');
105-
await waitForNone('.hover-button', undefined, undefined, 'pierce');
136+
await devToolsPage.waitFor('.console-message');
137+
await devToolsPage.waitForNone('.hover-button');
106138
});
107139

108-
it('does not show the hover button if it is restriced by geography', async () => {
109-
const {target} = getBrowserAndPages();
110-
await setupMocks({blockedByGeo: true, enabled: true}, {enabled: true});
111-
await click(CONSOLE_TAB_SELECTOR);
112-
await target.evaluate(() => {
140+
it('does not show the hover button if it is restriced by geography', async ({devToolsPage, inspectedPage}) => {
141+
await setupMocks({blockedByGeo: true, enabled: true}, {enabled: true}, devToolsPage);
142+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
143+
await inspectedPage.evaluate(() => {
113144
console.error(new Error('Unexpected error'));
114145
});
115-
await waitFor('.console-message', undefined, undefined, 'pierce');
116-
await waitForNone('.hover-button', undefined, undefined, 'pierce');
146+
await devToolsPage.waitFor('.console-message');
147+
await devToolsPage.waitForNone('.hover-button');
117148
});
118149

119-
it('gets console message texts', async () => {
120-
const {frontend, target} = getBrowserAndPages();
121-
await click(CONSOLE_TAB_SELECTOR);
150+
it('gets console message texts', async ({devToolsPage, inspectedPage}) => {
151+
await devToolsPage.click(CONSOLE_TAB_SELECTOR);
122152
const tests = [
123153
{
124154
script: 'console.warn(\'Text warning\');',
@@ -150,7 +180,7 @@ describe('ConsoleInsight', function() {
150180
expectedWithStackTrace: 'Warning with style',
151181
},
152182
{
153-
script: 'console.warn(\'\x1B[41;93;4mHello ANSI escape seq\x1B[m\');',
183+
script: 'console.warn(\'\\x1B[41;93;4mHello ANSI escape seq\\x1B[m\');',
154184
expectedWithStackTrace: 'Hello ANSI escape seq',
155185
},
156186
{
@@ -187,7 +217,7 @@ describe('ConsoleInsight', function() {
187217
expectedWithStackTrace: 'Error with style',
188218
},
189219
{
190-
script: 'console.error(\'\x1B[41;93;4mHello ANSI escape seq\x1B[m\');',
220+
script: 'console.error(\'\\x1B[41;93;4mHello ANSI escape seq\\x1B[m\');',
191221
expectedWithStackTrace: 'Hello ANSI escape seq',
192222
},
193223
{
@@ -200,17 +230,18 @@ describe('ConsoleInsight', function() {
200230
},
201231
];
202232

203-
await target.setContent(`
233+
await inspectedPage.page.setContent(`
204234
<script>
205235
${tests.map(test => test.script).join('\n')}
206236
</script>
207237
`);
208238

209239
let messages: puppeteer.ElementHandle[] = [];
210240

211-
while (messages.length !== tests.length) {
212-
messages = await frontend.$$('pierce/.console-message-wrapper');
213-
}
241+
await devToolsPage.waitForFunction(async () => {
242+
messages = await devToolsPage.$$('.console-message-wrapper');
243+
return messages.length === tests.length;
244+
});
214245

215246
const messageGetter = async (consoleModule: typeof Console, consoleElement: Element) => {
216247
const consoleViewMessage = consoleModule.ConsoleViewMessage.getMessageForElement(consoleElement);
@@ -220,11 +251,11 @@ describe('ConsoleInsight', function() {
220251
return message.replace(/:\d+:\d+/gi, ':1:1')
221252
.replaceAll(/\n at pptr:;CdpFrame\.%3Canjs%3A\d+%3A\d+\):1:1/gi, '');
222253
};
223-
const consoleModule = (await frontend.evaluateHandle('import(\'./panels/console/console.js\')')) as
254+
const consoleModule = (await devToolsPage.page.evaluateHandle('import(\'./panels/console/console.js\')')) as
224255
puppeteer.JSHandle<typeof Console>;
225256

226257
for (let testIdx = 0; testIdx < messages.length; testIdx++) {
227-
const messageWithStacktrace = await frontend.evaluate(messageGetter, consoleModule, messages[testIdx], true);
258+
const messageWithStacktrace = await devToolsPage.evaluate(messageGetter, consoleModule, messages[testIdx], true);
228259
assert.deepEqual(messageWithStacktrace, tests[testIdx].expectedWithStackTrace);
229260
}
230261
});

0 commit comments

Comments
 (0)