diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3abca8796..b171a5db2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,19 +16,19 @@ jobs: include: - name: macOS os: macos-latest - node_version: '18' + node_version: '24' only_minspec: false - name: Linux os: ubuntu-22.04 - node_version: '18' + node_version: '24' only_minspec: false - name: LinuxMinspec os: ubuntu-22.04 - node_version: '18' + node_version: '24' only_minspec: true - name: Windows os: windows-latest - node_version: '18' + node_version: '24' only_minspec: false name: ${{ matrix.name }} runs-on: ${{ matrix.os }} @@ -65,6 +65,9 @@ jobs: - name: Type checking run: npm run test:types + - name: Unit tests + run: npm run test:unit + - name: Lint checking if: ${{ env.DISABLE_LINT_FOR_NOW != 'true' && !matrix.only_minspec }} run: npm run test:lint diff --git a/package-lock.json b/package-lock.json index d99176b1d..59fd79ecc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "eslint-visitor-keys": "^3.4.3", "execa": "^5.1.1", "glob-stream": "^8.0.0", - "got": "^15.0.5", + "got": "^16.0.0", "inversify": "^6.0.2", "js-xxhash": "^3.0.1", "jsonc-parser": "^3.3.1", @@ -4729,15 +4729,6 @@ "node": ">=0.10.0" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, "node_modules/cacheable-request": { "version": "13.0.19", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.19.tgz", @@ -8230,18 +8221,16 @@ } }, "node_modules/got": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/got/-/got-15.0.5.tgz", - "integrity": "sha512-PMIMaZuYUCK43+Z9JWEXea4kkX2b3301m81D5TS6QpfG4PmNyirzEdO/Oa2OHAN4GsjnPfvWCWsshKN2rq4/gQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-16.0.0.tgz", + "integrity": "sha512-UtzSUebtRHHAUaNB/X37X1LQgHvdSrgXUIWGUBDhLu05CYtUr9svjeN6wmG333nzdJASFUjXMOuRBjZLf8oF1w==", "license": "MIT", "dependencies": { "@sindresorhus/is": "^8.0.0", "byte-counter": "^0.1.0", - "cacheable-lookup": "^7.0.0", "cacheable-request": "^13.0.18", "chunk-data": "^0.1.0", "decompress-response": "^10.0.0", - "http2-wrapper": "^2.2.1", "keyv": "^5.6.0", "lowercase-keys": "^4.0.1", "responselike": "^4.0.2", @@ -8593,19 +8582,6 @@ "node": ">= 14" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -13346,18 +13322,6 @@ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -13822,12 +13786,6 @@ "path-parse": "^1.0.6" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -20492,11 +20450,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==" - }, "cacheable-request": { "version": "13.0.19", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.19.tgz", @@ -23119,17 +23072,15 @@ "dev": true }, "got": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/got/-/got-15.0.5.tgz", - "integrity": "sha512-PMIMaZuYUCK43+Z9JWEXea4kkX2b3301m81D5TS6QpfG4PmNyirzEdO/Oa2OHAN4GsjnPfvWCWsshKN2rq4/gQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-16.0.0.tgz", + "integrity": "sha512-UtzSUebtRHHAUaNB/X37X1LQgHvdSrgXUIWGUBDhLu05CYtUr9svjeN6wmG333nzdJASFUjXMOuRBjZLf8oF1w==", "requires": { "@sindresorhus/is": "^8.0.0", "byte-counter": "^0.1.0", - "cacheable-lookup": "^7.0.0", "cacheable-request": "^13.0.18", "chunk-data": "^0.1.0", "decompress-response": "^10.0.0", - "http2-wrapper": "^2.2.1", "keyv": "^5.6.0", "lowercase-keys": "^4.0.1", "responselike": "^4.0.2", @@ -23382,15 +23333,6 @@ "debug": "^4.3.4" } }, - "http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, "https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -26807,11 +26749,6 @@ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -27175,11 +27112,6 @@ "path-parse": "^1.0.6" } }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", diff --git a/package.json b/package.json index 9b25195af..ee034238c 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "eslint-visitor-keys": "^3.4.3", "execa": "^5.1.1", "glob-stream": "^8.0.0", - "got": "^15.0.5", + "got": "^16.0.0", "inversify": "^6.0.2", "js-xxhash": "^3.0.1", "jsonc-parser": "^3.3.1", @@ -163,5 +163,13 @@ ], "overrides": { "serialize-javascript": ">=7.0.5" + }, + "allowScripts": { + "fsevents@2.3.2": true, + "fsevents@1.2.13": true, + "fsevents@2.3.3": true, + "@vscode/vsce-sign@2.0.9": true, + "keytar@7.7.0": true, + "microtime@3.0.0": true } } diff --git a/src/common/urlUtils.test.ts b/src/common/urlUtils.test.ts index 058cd85e7..424fcf1f0 100644 --- a/src/common/urlUtils.test.ts +++ b/src/common/urlUtils.test.ts @@ -287,6 +287,7 @@ describe('urlUtils', () => { beforeEach(() => { lookupStub = stub(dns, 'lookup'); lookupStub.callThrough(); + lookupStub.withArgs('totes invalid').rejects(); lookupStub.withArgs('contoso.com').resolves({ address: '1.1.1.1' }); lookupStub.withArgs('local.contoso.com').resolves({ address: '127.0.0.1' }); }); diff --git a/src/targets/browser/spawn/endpoints.test.ts b/src/targets/browser/spawn/endpoints.test.ts new file mode 100644 index 000000000..838952ceb --- /dev/null +++ b/src/targets/browser/spawn/endpoints.test.ts @@ -0,0 +1,51 @@ +/*--------------------------------------------------------- + * Copyright (C) Microsoft Corporation. All rights reserved. + *--------------------------------------------------------*/ + +import { expect } from 'chai'; +import { createServer } from 'http'; +import { AddressInfo } from 'net'; +import { NeverCancelled } from '../../../common/cancellation'; +import { Logger } from '../../../common/logging/logger'; +import { delay } from '../../../common/promiseUtil'; +import { getWSEndpoint } from './endpoints'; + +describe('endpoint discovery', () => { + it('discovers an IPv4 only target through localhost without request errors', async function() { + this.timeout(5000); + + const server = createServer((request, response) => { + response.setHeader('content-type', 'application/json'); + response.end( + request.url === '/json/list' + ? JSON.stringify([{ webSocketDebuggerUrl: `ws://127.0.0.1:${port}/target` }]) + : JSON.stringify({}), + ); + }); + + await new Promise((resolve, reject) => { + server.once('error', reject); + server.listen(0, '127.0.0.1', resolve); + }); + + const port = (server.address() as AddressInfo).port; + try { + expect( + await getWSEndpoint( + `http://localhost:${port}`, + NeverCancelled, + Logger.null, + true, + ), + ).to.equal(`ws://127.0.0.1:${port}/target`); + + // A cancelled failed probe used to surface a retry error after discovery succeeded. + await delay(1500); + } finally { + server.closeAllConnections(); + await new Promise((resolve, reject) => { + server.close(error => (error ? reject(error) : resolve())); + }); + } + }); +});