From 13cb390e8b43e5f7c73de3616e62cf190f3172b0 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Wed, 12 Oct 2022 17:04:56 -0700 Subject: [PATCH 01/19] chore: tmp testing to see if changes in #517 break CI workflows, or if they're already broken --- No-real-changes.tmp | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 No-real-changes.tmp diff --git a/No-real-changes.tmp b/No-real-changes.tmp new file mode 100644 index 00000000..e69de29b From 0e3d4ffbf1e4963a2085b042fd9fcbadb859cf19 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:16:27 -0700 Subject: [PATCH 02/19] chore: attempt to fix ci runs see https://playwright.dev/docs/cli\#install-system-dependencies --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 098bcdc0..ba86c2cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,9 @@ name: CI on: + workflow_dispatch: push: - branches: [master] + branches: [master, test-pr-workflows] pull_request: branches: [master] @@ -53,7 +54,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: lts/* - - run: npm install + - run: npm install && && npx -y playwright install-deps - uses: GabrielBB/xvfb-action@v1 name: Run tests with: @@ -69,7 +70,7 @@ jobs: with: node-version: lts/* - name: Install dependencies - run: npm install + run: npm install && npx -y playwright install-deps - uses: GabrielBB/xvfb-action@v1 name: Run test:examples with: From fa6966a7480eebe12d60ddaf7dbe75285f8262f8 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:18:56 -0700 Subject: [PATCH 03/19] fix: github workflow syntax --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ba86c2cb..66f453d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: lts/* - - run: npm install && && npx -y playwright install-deps + - run: npm install && npx -y playwright install-deps - uses: GabrielBB/xvfb-action@v1 name: Run tests with: From 04aa2a32b5d439cc714833de04fbe016aff40a7a Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:24:41 -0700 Subject: [PATCH 04/19] chore: ensure concurrency on branch name --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66f453d5..23c86e96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,10 @@ on: pull_request: branches: [master] +concurrency: + group: ${{ github.head_ref || github.ref_name }} + cancel-in-progress: true + jobs: examples: runs-on: ubuntu-latest From f74edb846fec6b6f4194125257d612b3ef10dda7 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:24:52 -0700 Subject: [PATCH 05/19] chore: update actions --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 23c86e96..c925679e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,12 +54,12 @@ jobs: run: working-directory: examples/${{ matrix.project }} steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: lts/* - run: npm install && npx -y playwright install-deps - - uses: GabrielBB/xvfb-action@v1 + - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 name: Run tests with: run: npm test @@ -69,13 +69,13 @@ jobs: runs-on: ubuntu-latest name: Test monorepo steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: lts/* - name: Install dependencies run: npm install && npx -y playwright install-deps - - uses: GabrielBB/xvfb-action@v1 + - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 name: Run test:examples with: run: npm run test:examples From 48be6dc8b06d7418aa8afa9efbad5e996a973e92 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:36:51 -0700 Subject: [PATCH 06/19] fix: don't fail-fast for matrix failures --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c925679e..b2c4cf9f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ jobs: runs-on: ubuntu-latest name: Test ${{ matrix.project }} strategy: + fail-fast: false matrix: project: - browser-add-readable-stream From a63e42bf0677ae03fb13e217f04377c7d0206962 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:38:03 -0700 Subject: [PATCH 07/19] chore: attempt to remove GabrielBB/xvfb-action some steps are showing the following failure on github: Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: GabrielBB/xvfb-action see https://github.com/SgtPooki/js-ipfs-examples/actions/runs/3245100955 --- .github/workflows/ci.yml | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b2c4cf9f..67c38aab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,12 +59,19 @@ jobs: - uses: actions/setup-node@v3 with: node-version: lts/* - - run: npm install && npx -y playwright install-deps - - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 - name: Run tests - with: - run: npm test - working-directory: examples/${{ matrix.project }} + - name: Install dependencies + run: npm install + - name: Install Playwright + run: npx -y playwright install --with-deps + - name: Run tests + run: npm run test + env: + CI: true + # - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 + # name: Run tests + # with: + # run: npm test + # working-directory: examples/${{ matrix.project }} monorepo: runs-on: ubuntu-latest @@ -75,8 +82,14 @@ jobs: with: node-version: lts/* - name: Install dependencies - run: npm install && npx -y playwright install-deps - - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 - name: Run test:examples - with: - run: npm run test:examples + run: npm install + - name: Install Playwright + run: npx -y playwright install --with-deps + - name: Run test:examples + run: npm run test:examples + env: + CI: true + # - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 + # name: Run test:examples + # with: + # run: npm run test:examples From 5afb73dd2f6d3518d831aadd279715ea8a1706a2 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:50:00 -0700 Subject: [PATCH 08/19] chore: remove gabriel/xvfb-action for good --- .github/workflows/ci.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67c38aab..6c785d62 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,11 +67,6 @@ jobs: run: npm run test env: CI: true - # - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 - # name: Run tests - # with: - # run: npm test - # working-directory: examples/${{ matrix.project }} monorepo: runs-on: ubuntu-latest @@ -89,7 +84,3 @@ jobs: run: npm run test:examples env: CI: true - # - uses: GabrielBB/xvfb-action@86d97bde4a65fe9b290c0b3fb92c2c4ed0e5302d # https://github.com/GabrielBB/xvfb-action/releases/tag/v1.6 - # name: Run test:examples - # with: - # run: npm run test:examples From a7f6c97204164c04cd83f834abd953ebeed6e1d5 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 12:54:58 -0700 Subject: [PATCH 09/19] chore: add xvfb-maybe to run-in-electron --- examples/run-in-electron/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/run-in-electron/package.json b/examples/run-in-electron/package.json index a44be929..ea0348b4 100644 --- a/examples/run-in-electron/package.json +++ b/examples/run-in-electron/package.json @@ -15,10 +15,11 @@ "clean": "echo 'Nothing to clean...'", "start": "electron .", "serve": "npm run start", - "test": "node test.mjs" + "test": "xvfb-maybe node test.mjs" }, "dependencies": { - "ipfs-core": "^0.16.0" + "ipfs-core": "^0.16.0", + "xvfb-maybe": "^0.2.1" }, "devDependencies": { "electron": "^20.1.1", From d83082f5b05d5f25c4bff04b5a9d0f9e1ee9e1f8 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 13:02:53 -0700 Subject: [PATCH 10/19] chore: move xvfb-maybe to devDeps --- examples/run-in-electron/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/run-in-electron/package.json b/examples/run-in-electron/package.json index ea0348b4..e56aca9f 100644 --- a/examples/run-in-electron/package.json +++ b/examples/run-in-electron/package.json @@ -18,13 +18,13 @@ "test": "xvfb-maybe node test.mjs" }, "dependencies": { - "ipfs-core": "^0.16.0", - "xvfb-maybe": "^0.2.1" + "ipfs-core": "^0.16.0" }, "devDependencies": { "electron": "^20.1.1", "electron-rebuild": "^3.1.1", - "test-util-ipfs-example": "^1.0.2" + "test-util-ipfs-example": "^1.0.2", + "xvfb-maybe": "^0.2.1" }, "greenkeeper": { "ignore": [ From 2c99e77cc00240b7e313326cca427359f8ac8c33 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 13:46:47 -0700 Subject: [PATCH 11/19] fix: don't overwrite promises that are being awaited --- lib/test-util-ipfs-example/playwright/servers.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/test-util-ipfs-example/playwright/servers.js b/lib/test-util-ipfs-example/playwright/servers.js index 55e89c9f..a73fca7e 100644 --- a/lib/test-util-ipfs-example/playwright/servers.js +++ b/lib/test-util-ipfs-example/playwright/servers.js @@ -32,7 +32,7 @@ const servers = (serverConfiguration = []) => { const app = polka(); - promiseServers.push(new Promise((resolve, reject) => { + promiseServers.push(/** @type {Promise} */(new Promise((resolve, reject) => { app .use(staticFiles) .listen(port, err => { @@ -46,20 +46,18 @@ const servers = (serverConfiguration = []) => { resolve(); }); - })) + }))) } await Promise.all(promiseServers) // Use the server in the tests. - await use(servers); - + await use(servers) // Cleanup. console.log('Stopping servers...'); - promiseServers = servers.map(m => new Promise(f => m.server.close(f))); - await Promise.all(promiseServers) + await Promise.all(servers.map(m => new Promise(f => m.server.close(f)))) console.log('Servers stopped'); }, { scope: 'worker', auto: true } ], } From 76a94cccc775e4ab6ac44c0303290701c423b79e Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 13:47:10 -0700 Subject: [PATCH 12/19] chore(tmp): disable all but browser-service-worker tests --- .github/workflows/ci.yml | 95 ++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c785d62..84be64ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,38 +19,38 @@ jobs: fail-fast: false matrix: project: - - browser-add-readable-stream - - browser-angular - - browser-create-react-app - - browser-esbuild - - browser-exchange-files - - browser-ipns-publish - - browser-lit - - browser-mfs - - browser-nextjs - - browser-readablestream - - browser-script-tag + # - browser-add-readable-stream + # - browser-angular + # - browser-create-react-app + # - browser-esbuild + # - browser-exchange-files + # - browser-ipns-publish + # - browser-lit + # - browser-mfs + # - browser-nextjs + # - browser-readablestream + # - browser-script-tag - browser-service-worker - - browser-sharing-node-across-tabs - - browser-video-streaming - - browser-vite - - browser-vue - - browser-webpack - - circuit-relaying - - custom-ipfs-repo - - custom-ipld-formats - - custom-libp2p - - http-client-browser-pubsub - - http-client-bundle-webpack - - http-client-name-api - - http-client-upload-file - - ipfs-101 - #- ipfs-client-add-files - - run-in-electron - - running-multiple-nodes - - traverse-ipld-graphs - - types-use-ipfs-from-ts - - types-use-ipfs-from-typed-js + # - browser-sharing-node-across-tabs + # - browser-video-streaming + # - browser-vite + # - browser-vue + # - browser-webpack + # - circuit-relaying + # - custom-ipfs-repo + # - custom-ipld-formats + # - custom-libp2p + # - http-client-browser-pubsub + # - http-client-bundle-webpack + # - http-client-name-api + # - http-client-upload-file + # - ipfs-101 + # #- ipfs-client-add-files + # - run-in-electron + # - running-multiple-nodes + # - traverse-ipld-graphs + # - types-use-ipfs-from-ts + # - types-use-ipfs-from-typed-js defaults: run: working-directory: examples/${{ matrix.project }} @@ -68,19 +68,20 @@ jobs: env: CI: true - monorepo: - runs-on: ubuntu-latest - name: Test monorepo - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: lts/* - - name: Install dependencies - run: npm install - - name: Install Playwright - run: npx -y playwright install --with-deps - - name: Run test:examples - run: npm run test:examples - env: - CI: true + # temporarily disable this while we address failures in `browser-service-worker` + # monorepo: + # runs-on: ubuntu-latest + # name: Test monorepo + # steps: + # - uses: actions/checkout@v3 + # - uses: actions/setup-node@v3 + # with: + # node-version: lts/* + # - name: Install dependencies + # run: npm install + # - name: Install Playwright + # run: npx -y playwright install --with-deps + # - name: Run test:examples + # run: npm run test:examples + # env: + # CI: true From 7af9d738bf2bc4e7091602a53ce1b41ecd74b8b5 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 13:55:40 -0700 Subject: [PATCH 13/19] fix(browser-service-worker): move initial page.goto inside test --- examples/browser-service-worker/tests/test.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/examples/browser-service-worker/tests/test.js b/examples/browser-service-worker/tests/test.js index 805a865a..9f4ec5c6 100644 --- a/examples/browser-service-worker/tests/test.js +++ b/examples/browser-service-worker/tests/test.js @@ -12,11 +12,13 @@ play.describe('browser service worker:', () => { const textDOM = "body" const debugDOM = "#debug" - play.beforeEach(async ({servers, page}) => { - await page.goto(`http://localhost:${servers[0].port}/`); - }) + // play.beforeEach(async ({servers, page}) => { + // await page.goto(`http://localhost:${servers[0].port}/`); + // }) - play('should properly load the content of an IPFS hash', async ({ page }) => { + play('should properly load the content of an IPFS hash', async ({ servers, page }) => { + const currentURL = `http://localhost:${servers[0].port}/` + await page.goto(currentURL); await page.waitForSelector(textDOM) await page.waitForSelector(linkDOM) @@ -27,7 +29,7 @@ play.describe('browser service worker:', () => { state: 'attached' }) - const currentURL = await page.url(); + // const currentURL = await page.url(); await page.goto(`${currentURL}ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD`); await page.waitForSelector(textDOM) From e32cb45e95f4e2a17eecf5c671c5fe5a390963c4 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 15:12:01 -0700 Subject: [PATCH 14/19] fix(browser-service-worker): increase test timeout --- examples/browser-service-worker/tests/test.js | 2 ++ lib/test-util-ipfs-example/playwright/servers.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/browser-service-worker/tests/test.js b/examples/browser-service-worker/tests/test.js index 9f4ec5c6..291510be 100644 --- a/examples/browser-service-worker/tests/test.js +++ b/examples/browser-service-worker/tests/test.js @@ -6,6 +6,8 @@ const play = test.extend({ ...playwright.servers(), }); +play.setTimeout(60 * 1000) + play.describe('browser service worker:', () => { // DOM const linkDOM = "a" diff --git a/lib/test-util-ipfs-example/playwright/servers.js b/lib/test-util-ipfs-example/playwright/servers.js index a73fca7e..79bb4e64 100644 --- a/lib/test-util-ipfs-example/playwright/servers.js +++ b/lib/test-util-ipfs-example/playwright/servers.js @@ -7,7 +7,7 @@ const servers = (serverConfiguration = []) => { // We pass a tuple to specify fixtures options. // In this case, we mark this fixture as worker-scoped. servers: [ async ({}, use, workerInfo) => { - let promiseServers = []; + const promiseServers = []; const servers = []; const configurations = [...serverConfiguration] From 8958d50cb845bf4384029f3cdec3807252e98d1d Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 16:03:46 -0700 Subject: [PATCH 15/19] fix(test-util-ipfs-example.servers): stop instead of close --- lib/test-util-ipfs-example/playwright/servers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/test-util-ipfs-example/playwright/servers.js b/lib/test-util-ipfs-example/playwright/servers.js index 79bb4e64..68eef4d5 100644 --- a/lib/test-util-ipfs-example/playwright/servers.js +++ b/lib/test-util-ipfs-example/playwright/servers.js @@ -57,7 +57,7 @@ const servers = (serverConfiguration = []) => { // Cleanup. console.log('Stopping servers...'); - await Promise.all(servers.map(m => new Promise(f => m.server.close(f)))) + await Promise.all(servers.map(m => new Promise(f => m.server.stop(f)))) console.log('Servers stopped'); }, { scope: 'worker', auto: true } ], } From bcbc1d89eccdc58f760e681dd18d5c86f68bf66f Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Thu, 13 Oct 2022 16:12:10 -0700 Subject: [PATCH 16/19] fix(test-util-ipfs-example.servers): allow server stop from tests remove waitForSelectors and ensure service worker response is done before checking for text debugging: query /view directly this removes the need for playwright navigating iframes and still utilizes the serviceWorker in the test --- examples/browser-service-worker/tests/test.js | 118 +++++++++++++++--- .../playwright/servers.js | 29 +++-- 2 files changed, 123 insertions(+), 24 deletions(-) diff --git a/examples/browser-service-worker/tests/test.js b/examples/browser-service-worker/tests/test.js index 291510be..20bbd17a 100644 --- a/examples/browser-service-worker/tests/test.js +++ b/examples/browser-service-worker/tests/test.js @@ -1,12 +1,16 @@ +// @ts-check import { test, expect } from '@playwright/test'; import { playwright } from 'test-util-ipfs-example'; // Setup const play = test.extend({ - ...playwright.servers(), + ...playwright.servers([], true), }); -play.setTimeout(60 * 1000) +/** + * attempt to prevent net::ERR_ABORTED error + */ +play.setTimeout(120 * 1000) play.describe('browser service worker:', () => { // DOM @@ -14,30 +18,110 @@ play.describe('browser service worker:', () => { const textDOM = "body" const debugDOM = "#debug" - // play.beforeEach(async ({servers, page}) => { - // await page.goto(`http://localhost:${servers[0].port}/`); - // }) + play.beforeEach(async ({servers, page}) => { + await page.goto(`http://localhost:${servers[0].port}/`); + }) - play('should properly load the content of an IPFS hash', async ({ servers, page }) => { - const currentURL = `http://localhost:${servers[0].port}/` - await page.goto(currentURL); - await page.waitForSelector(textDOM) - await page.waitForSelector(linkDOM) + play('should properly load the content of an IPFS hash', async ({ servers, page, context }) => { + page.on('console', msg => console.log('PAGE LOG:', msg.text())); + page.on("pageerror", (err) => { + console.trace(`pageerror: ${err.message}`) + }) + // await page.waitForSelector(textDOM) + // await page.waitForSelector(linkDOM) expect(await page.textContent(textDOM)).toContain("Load content by adding IPFS path to the URL") expect(await page.textContent(linkDOM)).toContain("/ipfs/bafy") - await page.waitForSelector(`${debugDOM}:has-text("SW is ready")`, { - state: 'attached' + const ipfsRequestUrl = `http://localhost:${servers[0].port}/view/ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD` + + /** + * Wait for the service worker to be ready + * @see https://playwright.dev/docs/service-workers-experimental#accessing-service-workers-and-waiting-for-activation + */ + await page.evaluate(async () => { + const registration = await window.navigator.serviceWorker.getRegistration(); + if (registration?.active?.state === 'activated') { + console.log('Service worker is already activated') + return; + } + await /** @type {Promise} */(new Promise(res => { + window.navigator.serviceWorker.addEventListener('controllerchange', () => { + console.log('Service worker is activated') + res() + }) + })); + }); + // await page.waitForSelector(`${debugDOM}:has-text("SW is ready")`, { + // state: 'attached' + // }) + + context.on('request', (request) => { + console.log(`request.url(): ${request.url()}`) + }) + context.on('requestfailed', (request) => { + console.log(`context.requestfailed: ${request.url()}`) + console.log(`context.requestfailed request?.failure()?.errorText: `, request?.failure()?.errorText); + }) + page.on('requestfailed', (request) => { + console.log(`page.requestfailed: ${request.url()}`) + console.log(`page.requestfailed request?.failure()?.errorText: `, request?.failure()?.errorText); + }) + const serviceWorkerResponsePromise = new Promise((resolve, reject) => { + context.on('response', async (response) => { + console.log(`context.response response.url(): ${response.url()}`) + if (response.url() === ipfsRequestUrl && response.fromServiceWorker()) { + resolve(response); + } + }) }) // const currentURL = await page.url(); - await page.goto(`${currentURL}ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD`); - await page.waitForSelector(textDOM) + await page.goto(ipfsRequestUrl, {waitUntil: 'commit'}); + const serviceWorkerResponse = await serviceWorkerResponsePromise + page.on('request', async (request) => { + try { + console.log(`page.request request.url(): ${request.url()}`) + console.log(`page.request (await request.response())?.status(): ${(await request.response())?.status()}`) + console.log(`page.request await (await request.response())?.text(): ${await (await request.response())?.text()}`) + console.log(`request.serviceWorker(): `, request.serviceWorker()); + } catch {} + }); - const elementFrame = await page.waitForSelector("iframe") - const frame = await elementFrame.contentFrame() + expect(await serviceWorkerResponse.status()).toBe(200) + expect(await serviceWorkerResponse.text()).toContain("hello world") + // await page.waitForSelector('#viewer', {state: 'visible'}) - expect(await frame.textContent('pre')).toContain("hello world") + // const frameText2 = page.frameLocator('#viewer').locator(textDOM) + // // await frameText2.waitFor({state: 'visible'}) + + // // loop over all of the frames and log their content + // const frames = await page.frames(); + // for (const frame of frames) { + // console.log('page.frames textContent: ', await frame.textContent(textDOM)); + // console.log('page.frames innerText: ', await frame.innerText(textDOM)); + // } + + // expect(await frameText2.textContent()).toContain("hello world") + + // const elementFrame = await page.waitForSelector("iframe") + // /** + // * @type {import('playwright').Frame} + // */ + // // @ts-ignore + // const frame = await elementFrame.contentFrame() + // if (frame == null) { + // throw new Error('frame is null') + // } + // const frameText = await frame.textContent(textDOM) + + // expect(frameText).toContain("hello world") }); + + play.afterAll(async ({servers}) => { + // now stop all servers + for (const server of servers) { + await server.stop() + } + }) }); diff --git a/lib/test-util-ipfs-example/playwright/servers.js b/lib/test-util-ipfs-example/playwright/servers.js index 68eef4d5..b31c5936 100644 --- a/lib/test-util-ipfs-example/playwright/servers.js +++ b/lib/test-util-ipfs-example/playwright/servers.js @@ -2,7 +2,14 @@ import sirv from 'sirv' import polka from 'polka' import stoppable from 'stoppable' -const servers = (serverConfiguration = []) => { +/** + * @template T + * @template W + * @template PT + * @template PW + * @return {import('@playwright/test').Fixtures} + */ +const servers = (serverConfiguration = [], explicitStop = false) => { return { // We pass a tuple to specify fixtures options. // In this case, we mark this fixture as worker-scoped. @@ -38,9 +45,15 @@ const servers = (serverConfiguration = []) => { .listen(port, err => { if (err) throw err; + const server = stoppable(app.server) servers.push({ - server: stoppable(app.server), - port: port + server, + port: port, + stop: async () => { + console.log(`Stopping server on port ${port}...`) + await new Promise(r => server.stop(r)) + console.log(`Server on port ${port} stopped`) + } }) console.log(`> Ready on localhost:${port}!`); @@ -54,11 +67,13 @@ const servers = (serverConfiguration = []) => { // Use the server in the tests. await use(servers) - // Cleanup. - console.log('Stopping servers...'); + if (!explicitStop) { + // Cleanup. + console.log('Stopping servers...'); - await Promise.all(servers.map(m => new Promise(f => m.server.stop(f)))) - console.log('Servers stopped'); + await Promise.all(servers.map(s => s.stop())) + console.log('Servers stopped'); + } }, { scope: 'worker', auto: true } ], } } From be687b9c23dfe27e76e78201067fef8c3b8fdcfe Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:59:36 -0700 Subject: [PATCH 17/19] chore: cleanup browser-service-worker test --- examples/browser-service-worker/tests/test.js | 74 ++----------------- 1 file changed, 7 insertions(+), 67 deletions(-) diff --git a/examples/browser-service-worker/tests/test.js b/examples/browser-service-worker/tests/test.js index 20bbd17a..aeff782f 100644 --- a/examples/browser-service-worker/tests/test.js +++ b/examples/browser-service-worker/tests/test.js @@ -4,19 +4,13 @@ import { playwright } from 'test-util-ipfs-example'; // Setup const play = test.extend({ - ...playwright.servers([], true), + ...playwright.servers(), }); -/** - * attempt to prevent net::ERR_ABORTED error - */ -play.setTimeout(120 * 1000) - play.describe('browser service worker:', () => { // DOM const linkDOM = "a" const textDOM = "body" - const debugDOM = "#debug" play.beforeEach(async ({servers, page}) => { await page.goto(`http://localhost:${servers[0].port}/`); @@ -27,12 +21,15 @@ play.describe('browser service worker:', () => { page.on("pageerror", (err) => { console.trace(`pageerror: ${err.message}`) }) - // await page.waitForSelector(textDOM) - // await page.waitForSelector(linkDOM) expect(await page.textContent(textDOM)).toContain("Load content by adding IPFS path to the URL") expect(await page.textContent(linkDOM)).toContain("/ipfs/bafy") + /** + * Request /view path directly, as this is still handled by the service worker but doesn't break tests in github CI. + * @see https://github.com/ipfs-examples/js-ipfs-examples/blob/master/examples/browser-service-worker/src/service.js#L48-L52 + * @see https://github.com/ipfs-examples/js-ipfs-examples/pull/527 + */ const ipfsRequestUrl = `http://localhost:${servers[0].port}/view/ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD` /** @@ -52,76 +49,19 @@ play.describe('browser service worker:', () => { }) })); }); - // await page.waitForSelector(`${debugDOM}:has-text("SW is ready")`, { - // state: 'attached' - // }) - context.on('request', (request) => { - console.log(`request.url(): ${request.url()}`) - }) - context.on('requestfailed', (request) => { - console.log(`context.requestfailed: ${request.url()}`) - console.log(`context.requestfailed request?.failure()?.errorText: `, request?.failure()?.errorText); - }) - page.on('requestfailed', (request) => { - console.log(`page.requestfailed: ${request.url()}`) - console.log(`page.requestfailed request?.failure()?.errorText: `, request?.failure()?.errorText); - }) - const serviceWorkerResponsePromise = new Promise((resolve, reject) => { + const serviceWorkerResponsePromise = new Promise((resolve) => { context.on('response', async (response) => { - console.log(`context.response response.url(): ${response.url()}`) if (response.url() === ipfsRequestUrl && response.fromServiceWorker()) { resolve(response); } }) }) - // const currentURL = await page.url(); await page.goto(ipfsRequestUrl, {waitUntil: 'commit'}); const serviceWorkerResponse = await serviceWorkerResponsePromise - page.on('request', async (request) => { - try { - console.log(`page.request request.url(): ${request.url()}`) - console.log(`page.request (await request.response())?.status(): ${(await request.response())?.status()}`) - console.log(`page.request await (await request.response())?.text(): ${await (await request.response())?.text()}`) - console.log(`request.serviceWorker(): `, request.serviceWorker()); - } catch {} - }); expect(await serviceWorkerResponse.status()).toBe(200) expect(await serviceWorkerResponse.text()).toContain("hello world") - // await page.waitForSelector('#viewer', {state: 'visible'}) - - // const frameText2 = page.frameLocator('#viewer').locator(textDOM) - // // await frameText2.waitFor({state: 'visible'}) - - // // loop over all of the frames and log their content - // const frames = await page.frames(); - // for (const frame of frames) { - // console.log('page.frames textContent: ', await frame.textContent(textDOM)); - // console.log('page.frames innerText: ', await frame.innerText(textDOM)); - // } - - // expect(await frameText2.textContent()).toContain("hello world") - - // const elementFrame = await page.waitForSelector("iframe") - // /** - // * @type {import('playwright').Frame} - // */ - // // @ts-ignore - // const frame = await elementFrame.contentFrame() - // if (frame == null) { - // throw new Error('frame is null') - // } - // const frameText = await frame.textContent(textDOM) - - // expect(frameText).toContain("hello world") }); - - play.afterAll(async ({servers}) => { - // now stop all servers - for (const server of servers) { - await server.stop() - } - }) }); From dd0067e806bab6cde1a09e4572e1d8135c0e16e9 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Fri, 14 Oct 2022 09:59:41 -0700 Subject: [PATCH 18/19] Revert "chore(tmp): disable all but browser-service-worker tests" This reverts commit 76a94cccc775e4ab6ac44c0303290701c423b79e. --- .github/workflows/ci.yml | 95 ++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84be64ad..6c785d62 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,38 +19,38 @@ jobs: fail-fast: false matrix: project: - # - browser-add-readable-stream - # - browser-angular - # - browser-create-react-app - # - browser-esbuild - # - browser-exchange-files - # - browser-ipns-publish - # - browser-lit - # - browser-mfs - # - browser-nextjs - # - browser-readablestream - # - browser-script-tag + - browser-add-readable-stream + - browser-angular + - browser-create-react-app + - browser-esbuild + - browser-exchange-files + - browser-ipns-publish + - browser-lit + - browser-mfs + - browser-nextjs + - browser-readablestream + - browser-script-tag - browser-service-worker - # - browser-sharing-node-across-tabs - # - browser-video-streaming - # - browser-vite - # - browser-vue - # - browser-webpack - # - circuit-relaying - # - custom-ipfs-repo - # - custom-ipld-formats - # - custom-libp2p - # - http-client-browser-pubsub - # - http-client-bundle-webpack - # - http-client-name-api - # - http-client-upload-file - # - ipfs-101 - # #- ipfs-client-add-files - # - run-in-electron - # - running-multiple-nodes - # - traverse-ipld-graphs - # - types-use-ipfs-from-ts - # - types-use-ipfs-from-typed-js + - browser-sharing-node-across-tabs + - browser-video-streaming + - browser-vite + - browser-vue + - browser-webpack + - circuit-relaying + - custom-ipfs-repo + - custom-ipld-formats + - custom-libp2p + - http-client-browser-pubsub + - http-client-bundle-webpack + - http-client-name-api + - http-client-upload-file + - ipfs-101 + #- ipfs-client-add-files + - run-in-electron + - running-multiple-nodes + - traverse-ipld-graphs + - types-use-ipfs-from-ts + - types-use-ipfs-from-typed-js defaults: run: working-directory: examples/${{ matrix.project }} @@ -68,20 +68,19 @@ jobs: env: CI: true - # temporarily disable this while we address failures in `browser-service-worker` - # monorepo: - # runs-on: ubuntu-latest - # name: Test monorepo - # steps: - # - uses: actions/checkout@v3 - # - uses: actions/setup-node@v3 - # with: - # node-version: lts/* - # - name: Install dependencies - # run: npm install - # - name: Install Playwright - # run: npx -y playwright install --with-deps - # - name: Run test:examples - # run: npm run test:examples - # env: - # CI: true + monorepo: + runs-on: ubuntu-latest + name: Test monorepo + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: lts/* + - name: Install dependencies + run: npm install + - name: Install Playwright + run: npx -y playwright install --with-deps + - name: Run test:examples + run: npm run test:examples + env: + CI: true From 27177a7e29a134511e5535f073689139047c1e31 Mon Sep 17 00:00:00 2001 From: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> Date: Fri, 14 Oct 2022 10:26:02 -0700 Subject: [PATCH 19/19] chore: remove test-pr-workflows from push target --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c785d62..a592ab49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,7 +3,7 @@ name: CI on: workflow_dispatch: push: - branches: [master, test-pr-workflows] + branches: [master] pull_request: branches: [master]