summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/test/installation
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/test/installation')
-rw-r--r--remote/test/puppeteer/test/installation/.mocharc.cjs21
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer-core/imports.js19
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer-core/launch.js32
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer-core/requires.cjs19
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer/basic.js25
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer/configuration/.puppeteerrc.cjs8
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer/imports.js20
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer/requires.cjs20
-rw-r--r--remote/test/puppeteer/test/installation/assets/puppeteer/webpack/webpack.config.js25
-rw-r--r--remote/test/puppeteer/test/installation/package.json54
-rw-r--r--remote/test/puppeteer/test/installation/src/browsers.spec.ts39
-rw-r--r--remote/test/puppeteer/test/installation/src/constants.ts35
-rw-r--r--remote/test/puppeteer/test/installation/src/puppeteer-configuration.spec.ts48
-rw-r--r--remote/test/puppeteer/test/installation/src/puppeteer-core.spec.ts44
-rw-r--r--remote/test/puppeteer/test/installation/src/puppeteer-firefox.spec.ts47
-rw-r--r--remote/test/puppeteer/test/installation/src/puppeteer-webpack.spec.ts57
-rw-r--r--remote/test/puppeteer/test/installation/src/puppeteer.spec.ts46
-rw-r--r--remote/test/puppeteer/test/installation/src/sandbox.ts137
-rw-r--r--remote/test/puppeteer/test/installation/src/util.ts27
-rw-r--r--remote/test/puppeteer/test/installation/tsconfig.json10
20 files changed, 733 insertions, 0 deletions
diff --git a/remote/test/puppeteer/test/installation/.mocharc.cjs b/remote/test/puppeteer/test/installation/.mocharc.cjs
new file mode 100644
index 0000000000..f84e852fd8
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/.mocharc.cjs
@@ -0,0 +1,21 @@
+// Copyright 2022 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/**
+ * @type {import('mocha').MochaOptions}
+ */
+module.exports = {
+ spec: ['build/**/*.spec.js'],
+ timeout: '240000ms',
+};
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer-core/imports.js b/remote/test/puppeteer/test/installation/assets/puppeteer-core/imports.js
new file mode 100644
index 0000000000..0446da820a
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer-core/imports.js
@@ -0,0 +1,19 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import 'puppeteer-core';
+import 'puppeteer-core/internal/revisions.js';
+import 'puppeteer-core/lib/esm/puppeteer/revisions.js';
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer-core/launch.js b/remote/test/puppeteer/test/installation/assets/puppeteer-core/launch.js
new file mode 100644
index 0000000000..c635de59c4
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer-core/launch.js
@@ -0,0 +1,32 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import puppeteer from 'puppeteer-core';
+
+(async () => {
+ try {
+ await puppeteer.launch({
+ product: '${product}',
+ executablePath: 'node',
+ });
+ } catch (error) {
+ if (error.message.includes('Failed to launch the browser process')) {
+ process.exit(0);
+ }
+ console.error(error);
+ process.exit(1);
+ }
+})();
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer-core/requires.cjs b/remote/test/puppeteer/test/installation/assets/puppeteer-core/requires.cjs
new file mode 100644
index 0000000000..a82551b8d1
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer-core/requires.cjs
@@ -0,0 +1,19 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+require('puppeteer-core');
+require('puppeteer-core/internal/revisions.js');
+require('puppeteer-core/lib/cjs/puppeteer/revisions.js');
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer/basic.js b/remote/test/puppeteer/test/installation/assets/puppeteer/basic.js
new file mode 100644
index 0000000000..475adc5248
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer/basic.js
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import puppeteer from 'puppeteer';
+(async () => {
+ const browser = await puppeteer.launch();
+ const page = await browser.newPage();
+ await page.goto('http://example.com');
+ await page.$('aria/example');
+ await page.screenshot({path: 'example.png'});
+ await browser.close();
+})();
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer/configuration/.puppeteerrc.cjs b/remote/test/puppeteer/test/installation/assets/puppeteer/configuration/.puppeteerrc.cjs
new file mode 100644
index 0000000000..8be5af0037
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer/configuration/.puppeteerrc.cjs
@@ -0,0 +1,8 @@
+const {join} = require('path');
+
+/**
+ * @type {import("puppeteer").PuppeteerConfiguration}
+ */
+module.exports = {
+ cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
+};
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer/imports.js b/remote/test/puppeteer/test/installation/assets/puppeteer/imports.js
new file mode 100644
index 0000000000..7416522ba3
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer/imports.js
@@ -0,0 +1,20 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import 'puppeteer';
+
+// Should still be reachable.
+import 'puppeteer-core/internal/revisions.js';
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer/requires.cjs b/remote/test/puppeteer/test/installation/assets/puppeteer/requires.cjs
new file mode 100644
index 0000000000..e44f5aeabd
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer/requires.cjs
@@ -0,0 +1,20 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+require('puppeteer');
+
+// Should still be reachable.
+require('puppeteer-core/internal/revisions.js');
diff --git a/remote/test/puppeteer/test/installation/assets/puppeteer/webpack/webpack.config.js b/remote/test/puppeteer/test/installation/assets/puppeteer/webpack/webpack.config.js
new file mode 100644
index 0000000000..63ab015ef8
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/assets/puppeteer/webpack/webpack.config.js
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export default {
+ mode: 'production',
+ entry: './index.js',
+ target: 'node',
+ output: {
+ path: process.cwd(),
+ filename: 'bundle.js',
+ },
+};
diff --git a/remote/test/puppeteer/test/installation/package.json b/remote/test/puppeteer/test/installation/package.json
new file mode 100644
index 0000000000..3176dd7053
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "@puppeteer-test/installation",
+ "version": "latest",
+ "type": "module",
+ "private": true,
+ "scripts": {
+ "build": "wireit",
+ "build:packages": "wireit",
+ "clean": "tsc -b --clean && rm -rf build",
+ "test": "mocha"
+ },
+ "wireit": {
+ "build": {
+ "command": "tsc -b",
+ "clean": "if-file-deleted",
+ "dependencies": [
+ "build:packages"
+ ],
+ "files": [
+ "tsconfig.json",
+ "src/**"
+ ],
+ "output": [
+ "build/**",
+ "tsconfig.tsbuildinfo"
+ ]
+ },
+ "build:packages": {
+ "command": "npm pack --quiet --workspace puppeteer --workspace puppeteer-core --workspace @puppeteer/browsers",
+ "dependencies": [
+ "../../packages/puppeteer:build",
+ "../../packages/puppeteer-core:build",
+ "../../packages/browsers:build"
+ ],
+ "files": [],
+ "output": [
+ "puppeteer-*.tgz"
+ ]
+ }
+ },
+ "files": [
+ ".mocharc.cjs",
+ "puppeteer-*.tgz",
+ "build",
+ "assets"
+ ],
+ "dependencies": {
+ "glob": "8.1.0",
+ "mocha": "10.2.0"
+ },
+ "devDependencies": {
+ "@types/glob": "8.1.0"
+ }
+}
diff --git a/remote/test/puppeteer/test/installation/src/browsers.spec.ts b/remote/test/puppeteer/test/installation/src/browsers.spec.ts
new file mode 100644
index 0000000000..83111f3ad3
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/browsers.spec.ts
@@ -0,0 +1,39 @@
+/**
+ * Copyright 2023 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import assert from 'assert';
+import {spawnSync} from 'child_process';
+
+import {configureSandbox} from './sandbox.js';
+
+describe('`@puppeteer/browsers`', () => {
+ configureSandbox({
+ dependencies: ['@puppeteer/browsers'],
+ });
+
+ it('can launch CLI', async function () {
+ const result = spawnSync('npx', ['@puppeteer/browsers', '--help'], {
+ // npx is not found without the shell flag on Windows.
+ shell: process.platform === 'win32',
+ });
+ assert.strictEqual(result.status, 0);
+ assert.ok(
+ result.stdout
+ .toString('utf-8')
+ .startsWith('@puppeteer/browsers <command>')
+ );
+ });
+});
diff --git a/remote/test/puppeteer/test/installation/src/constants.ts b/remote/test/puppeteer/test/installation/src/constants.ts
new file mode 100644
index 0000000000..e78c93b159
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/constants.ts
@@ -0,0 +1,35 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {dirname, join, resolve} from 'path';
+import {fileURLToPath} from 'url';
+
+import glob from 'glob';
+
+export const PUPPETEER_CORE_PACKAGE_PATH = resolve(
+ glob.sync('puppeteer-core-*.tgz')[0]!
+);
+export const PUPPETEER_BROWSERS_PACKAGE_PATH = resolve(
+ glob.sync('puppeteer-browsers-[0-9]*.tgz')[0]!
+);
+export const PUPPETEER_PACKAGE_PATH = resolve(
+ glob.sync('puppeteer-[0-9]*.tgz')[0]!
+);
+export const ASSETS_DIR = join(
+ dirname(fileURLToPath(import.meta.url)),
+ '..',
+ 'assets'
+);
diff --git a/remote/test/puppeteer/test/installation/src/puppeteer-configuration.spec.ts b/remote/test/puppeteer/test/installation/src/puppeteer-configuration.spec.ts
new file mode 100644
index 0000000000..f74922844d
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/puppeteer-configuration.spec.ts
@@ -0,0 +1,48 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import assert from 'assert';
+import {readdir, writeFile} from 'fs/promises';
+import {join} from 'path';
+
+import {configureSandbox} from './sandbox.js';
+import {readAsset} from './util.js';
+
+describe('`puppeteer` with configuration', () => {
+ configureSandbox({
+ dependencies: ['@puppeteer/browsers', 'puppeteer-core', 'puppeteer'],
+ env: cwd => {
+ return {
+ PUPPETEER_CACHE_DIR: join(cwd, '.cache', 'puppeteer'),
+ };
+ },
+ before: async cwd => {
+ await writeFile(
+ join(cwd, '.puppeteerrc.cjs'),
+ await readAsset('puppeteer', 'configuration', '.puppeteerrc.cjs')
+ );
+ },
+ });
+
+ it('evaluates', async function () {
+ const files = await readdir(join(this.sandbox, '.cache', 'puppeteer'));
+ assert.equal(files.length, 1);
+ assert.equal(files[0], 'chrome');
+
+ const script = await readAsset('puppeteer', 'basic.js');
+ await this.runScript(script, 'mjs');
+ });
+});
diff --git a/remote/test/puppeteer/test/installation/src/puppeteer-core.spec.ts b/remote/test/puppeteer/test/installation/src/puppeteer-core.spec.ts
new file mode 100644
index 0000000000..03a57d5437
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/puppeteer-core.spec.ts
@@ -0,0 +1,44 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {configureSandbox} from './sandbox.js';
+import {readAsset} from './util.js';
+
+describe('`puppeteer-core`', () => {
+ configureSandbox({
+ dependencies: ['@puppeteer/browsers', 'puppeteer-core'],
+ });
+
+ it('evaluates CommonJS', async function () {
+ const script = await readAsset('puppeteer-core', 'requires.cjs');
+ await this.runScript(script, 'cjs');
+ });
+
+ it('evaluates ES modules', async function () {
+ const script = await readAsset('puppeteer-core', 'imports.js');
+ await this.runScript(script, 'mjs');
+ });
+
+ for (const product of ['firefox', 'chrome']) {
+ it(`\`launch\` for \`${product}\` with a bad \`executablePath\``, async function () {
+ const script = (await readAsset('puppeteer-core', 'launch.js')).replace(
+ '${product}',
+ product
+ );
+ await this.runScript(script, 'mjs');
+ });
+ }
+});
diff --git a/remote/test/puppeteer/test/installation/src/puppeteer-firefox.spec.ts b/remote/test/puppeteer/test/installation/src/puppeteer-firefox.spec.ts
new file mode 100644
index 0000000000..edefbd3afe
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/puppeteer-firefox.spec.ts
@@ -0,0 +1,47 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import assert from 'assert';
+import {readdir} from 'fs/promises';
+import {join} from 'path';
+
+import {configureSandbox} from './sandbox.js';
+import {readAsset} from './util.js';
+
+describe('`puppeteer` with Firefox', () => {
+ configureSandbox({
+ dependencies: ['@puppeteer/browsers', 'puppeteer-core', 'puppeteer'],
+ env: cwd => {
+ return {
+ PUPPETEER_CACHE_DIR: join(cwd, '.cache', 'puppeteer'),
+ PUPPETEER_PRODUCT: 'firefox',
+ };
+ },
+ });
+
+ it('evaluates CommonJS', async function () {
+ const files = await readdir(join(this.sandbox, '.cache', 'puppeteer'));
+ assert.equal(files.length, 1);
+ assert.equal(files[0], 'firefox');
+ const script = await readAsset('puppeteer-core', 'requires.cjs');
+ await this.runScript(script, 'cjs');
+ });
+
+ it('evaluates ES modules', async function () {
+ const script = await readAsset('puppeteer-core', 'imports.js');
+ await this.runScript(script, 'mjs');
+ });
+});
diff --git a/remote/test/puppeteer/test/installation/src/puppeteer-webpack.spec.ts b/remote/test/puppeteer/test/installation/src/puppeteer-webpack.spec.ts
new file mode 100644
index 0000000000..d0b97bf75f
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/puppeteer-webpack.spec.ts
@@ -0,0 +1,57 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {readFile, rm, writeFile} from 'fs/promises';
+import {join} from 'path';
+
+import {configureSandbox} from './sandbox.js';
+import {execFile, readAsset} from './util.js';
+
+describe('`puppeteer` with Webpack', () => {
+ configureSandbox({
+ dependencies: ['@puppeteer/browsers', 'puppeteer-core', 'puppeteer'],
+ devDependencies: ['webpack', 'webpack-cli'],
+ env: cwd => {
+ return {
+ PUPPETEER_CACHE_DIR: join(cwd, '.cache', 'puppeteer'),
+ };
+ },
+ });
+
+ it('evaluates WebPack Bundles', async function () {
+ // Write a Webpack configuration.
+ await writeFile(
+ join(this.sandbox, 'webpack.config.mjs'),
+ await readAsset('puppeteer', 'webpack', 'webpack.config.js')
+ );
+
+ // Write the source code.
+ await writeFile(
+ join(this.sandbox, 'index.js'),
+ await readAsset('puppeteer', 'basic.js')
+ );
+
+ // Bundle.
+ await execFile('npx', ['webpack'], {cwd: this.sandbox, shell: true});
+
+ // Remove `node_modules` to test independence.
+ await rm('node_modules', {recursive: true, force: true});
+
+ const script = await readFile(join(this.sandbox, 'bundle.js'), 'utf-8');
+
+ await this.runScript(script, 'cjs');
+ });
+});
diff --git a/remote/test/puppeteer/test/installation/src/puppeteer.spec.ts b/remote/test/puppeteer/test/installation/src/puppeteer.spec.ts
new file mode 100644
index 0000000000..6633bdb2e2
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/puppeteer.spec.ts
@@ -0,0 +1,46 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import assert from 'assert';
+import {readdir} from 'fs/promises';
+import {join} from 'path';
+
+import {configureSandbox} from './sandbox.js';
+import {readAsset} from './util.js';
+
+describe('`puppeteer`', () => {
+ configureSandbox({
+ dependencies: ['@puppeteer/browsers', 'puppeteer-core', 'puppeteer'],
+ env: cwd => {
+ return {
+ PUPPETEER_CACHE_DIR: join(cwd, '.cache', 'puppeteer'),
+ };
+ },
+ });
+
+ it('evaluates CommonJS', async function () {
+ const files = await readdir(join(this.sandbox, '.cache', 'puppeteer'));
+ assert.equal(files.length, 1);
+ assert.equal(files[0], 'chrome');
+ const script = await readAsset('puppeteer-core', 'requires.cjs');
+ await this.runScript(script, 'cjs');
+ });
+
+ it('evaluates ES modules', async function () {
+ const script = await readAsset('puppeteer-core', 'imports.js');
+ await this.runScript(script, 'mjs');
+ });
+});
diff --git a/remote/test/puppeteer/test/installation/src/sandbox.ts b/remote/test/puppeteer/test/installation/src/sandbox.ts
new file mode 100644
index 0000000000..7bb9dda194
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/sandbox.ts
@@ -0,0 +1,137 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import crypto from 'crypto';
+import {mkdtemp, rm, writeFile} from 'fs/promises';
+import {tmpdir} from 'os';
+import {join} from 'path';
+
+import {
+ PUPPETEER_CORE_PACKAGE_PATH,
+ PUPPETEER_PACKAGE_PATH,
+ PUPPETEER_BROWSERS_PACKAGE_PATH,
+} from './constants.js';
+import {execFile} from './util.js';
+
+const PKG_MANAGER = process.env['PKG_MANAGER'] || 'npm';
+
+let ADD_PKG_SUBCOMMAND = 'install';
+if (PKG_MANAGER !== 'npm') {
+ ADD_PKG_SUBCOMMAND = 'add';
+}
+
+export interface ItEvaluatesOptions {
+ commonjs?: boolean;
+}
+
+export interface ItEvaluatesFn {
+ (
+ title: string,
+ options: ItEvaluatesOptions,
+ getScriptContent: (cwd: string) => Promise<string>
+ ): void;
+ (title: string, getScriptContent: (cwd: string) => Promise<string>): void;
+}
+
+export interface SandboxOptions {
+ dependencies?: string[];
+ devDependencies?: string[];
+ /**
+ * This should be idempotent.
+ */
+ env?: ((cwd: string) => NodeJS.ProcessEnv) | NodeJS.ProcessEnv;
+ before?: (cwd: string) => Promise<void>;
+}
+
+declare module 'mocha' {
+ export interface Context {
+ /**
+ * The path to the root of the sandbox folder.
+ */
+ sandbox: string;
+ env: NodeJS.ProcessEnv | undefined;
+ runScript: (content: string, type: 'cjs' | 'mjs') => Promise<void>;
+ }
+}
+
+/**
+ * Configures mocha before/after hooks to create a temp folder and install
+ * specified dependencies.
+ */
+export const configureSandbox = (options: SandboxOptions): void => {
+ before(async function (): Promise<void> {
+ const sandbox = await mkdtemp(join(tmpdir(), 'puppeteer-'));
+ const dependencies = (options.dependencies ?? []).map(module => {
+ switch (module) {
+ case 'puppeteer':
+ return PUPPETEER_PACKAGE_PATH;
+ case 'puppeteer-core':
+ return PUPPETEER_CORE_PACKAGE_PATH;
+ case '@puppeteer/browsers':
+ return PUPPETEER_BROWSERS_PACKAGE_PATH;
+ default:
+ return module;
+ }
+ });
+ const devDependencies = options.devDependencies ?? [];
+
+ let getEnv: (cwd: string) => NodeJS.ProcessEnv | undefined;
+ if (typeof options.env === 'function') {
+ getEnv = options.env;
+ } else {
+ const env = options.env;
+ getEnv = () => {
+ return env;
+ };
+ }
+ const env = {...process.env, ...getEnv(sandbox)};
+
+ await options.before?.(sandbox);
+ if (dependencies.length > 0) {
+ await execFile(PKG_MANAGER, [ADD_PKG_SUBCOMMAND, ...dependencies], {
+ cwd: sandbox,
+ env,
+ shell: true,
+ });
+ }
+ if (devDependencies.length > 0) {
+ await execFile(
+ PKG_MANAGER,
+ [ADD_PKG_SUBCOMMAND, '-D', ...devDependencies],
+ {
+ cwd: sandbox,
+ env,
+ shell: true,
+ }
+ );
+ }
+
+ this.sandbox = sandbox;
+ this.env = env;
+ this.runScript = async (content: string, type: 'cjs' | 'mjs') => {
+ const script = join(sandbox, `script-${crypto.randomUUID()}.${type}`);
+ await writeFile(script, content);
+ await execFile('node', [script], {cwd: sandbox, env});
+ };
+ });
+
+ after(async function () {
+ if (!process.env['KEEP_SANDBOX']) {
+ await rm(this.sandbox, {recursive: true, force: true, maxRetries: 5});
+ } else {
+ console.log('sandbox saved in', this.sandbox);
+ }
+ });
+};
diff --git a/remote/test/puppeteer/test/installation/src/util.ts b/remote/test/puppeteer/test/installation/src/util.ts
new file mode 100644
index 0000000000..404691840a
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/src/util.ts
@@ -0,0 +1,27 @@
+/**
+ * Copyright 2022 Google Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {execFile as execFileAsync} from 'child_process';
+import {readFile} from 'fs/promises';
+import {join} from 'path';
+import {promisify} from 'util';
+
+import {ASSETS_DIR} from './constants.js';
+
+export const execFile = promisify(execFileAsync);
+export const readAsset = (...components: string[]): Promise<string> => {
+ return readFile(join(ASSETS_DIR, ...components), 'utf8');
+};
diff --git a/remote/test/puppeteer/test/installation/tsconfig.json b/remote/test/puppeteer/test/installation/tsconfig.json
new file mode 100644
index 0000000000..f749dd8a07
--- /dev/null
+++ b/remote/test/puppeteer/test/installation/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "outDir": "build",
+ "rootDir": "src"
+ },
+ "include": ["src"]
+}