| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {assert} from 'chai'; |
| |
| import { |
| findModuleConfiguration, |
| resolveSourcePathToURL, |
| } from '../src/ModuleConfiguration.js'; |
| |
| describe('findModuleConfiguration', () => { |
| const CONFIGA = {name: 'projectA.wasm', pathSubstitutions: []}; |
| const CONFIGB = {name: 'projectB.wasm', pathSubstitutions: []}; |
| const DEFAULT = {pathSubstitutions: [{from: '/foo', to: '/bar'}]}; |
| const URLA = new URL('http://localhost/projectA.wasm'); |
| const URLB = new URL('file:/C:/Users/Admin/Projects/projectB.wasm'); |
| const URLC = new URL('https://web.dev/projectC.wasm'); |
| |
| it('correctly yields named configuration', () => { |
| assert.strictEqual(findModuleConfiguration([CONFIGA], URLA), CONFIGA); |
| assert.strictEqual( |
| findModuleConfiguration([CONFIGA, CONFIGB], URLA), |
| CONFIGA, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([CONFIGB, CONFIGA], URLA), |
| CONFIGA, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([DEFAULT, CONFIGB, CONFIGA], URLB), |
| CONFIGB, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([CONFIGB, CONFIGA, DEFAULT], URLB), |
| CONFIGB, |
| ); |
| }); |
| |
| it('correctly yields default configuration', () => { |
| assert.deepEqual(findModuleConfiguration([CONFIGA], URLB), { |
| pathSubstitutions: [], |
| }); |
| assert.deepEqual(findModuleConfiguration([CONFIGA, CONFIGB], URLC), { |
| pathSubstitutions: [], |
| }); |
| assert.deepEqual(findModuleConfiguration([CONFIGB, CONFIGA], URLC), { |
| pathSubstitutions: [], |
| }); |
| assert.strictEqual( |
| findModuleConfiguration([DEFAULT, CONFIGB, CONFIGA], URLC), |
| DEFAULT, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([CONFIGB, CONFIGA, DEFAULT], URLC), |
| DEFAULT, |
| ); |
| }); |
| |
| it('correctly matches basename *-patterns', () => { |
| const STAR_WASM = {name: '*.wasm', pathSubstitutions: []}; |
| const PROJECTA_STAR = {name: 'projectA.*', pathSubstitutions: []}; |
| const PROJECT_STAR_WASM = {name: 'project*.wasm', pathSubstitutions: []}; |
| assert.strictEqual( |
| findModuleConfiguration([PROJECTA_STAR], URLA), |
| PROJECTA_STAR, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([STAR_WASM, PROJECTA_STAR], URLA), |
| STAR_WASM, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration( |
| [STAR_WASM, PROJECTA_STAR], |
| new URL('http://example.com/projectA.foo'), |
| ), |
| PROJECTA_STAR, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([PROJECT_STAR_WASM], URLA), |
| PROJECT_STAR_WASM, |
| ); |
| assert.strictEqual( |
| findModuleConfiguration([PROJECT_STAR_WASM], URLB), |
| PROJECT_STAR_WASM, |
| ); |
| }); |
| |
| it('corectly matches **-patterns', () => { |
| const PROJECT = { |
| name: 'http://localhost/**/*.wasm', |
| pathSubstitutions: [], |
| }; |
| assert.strictEqual( |
| findModuleConfiguration([PROJECT], new URL('http://localhost/file.wasm')), |
| PROJECT, |
| ); |
| }); |
| }); |
| |
| describe('resolveSourcePathToURL', () => { |
| it('correctly resolves absolute paths', () => { |
| const BASE_URL = new URL('http://localhost/file.wasm'); |
| assert.strictEqual( |
| resolveSourcePathToURL([], '/', BASE_URL).href, |
| 'file:///', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL([], '/usr/local', BASE_URL).href, |
| 'file:///usr/local', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL([], '/Users/Administrator', BASE_URL).href, |
| 'file:///Users/Administrator', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL([], 'A:/', BASE_URL).href, |
| 'file:///A:/', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL([], 'c:\\', BASE_URL).href, |
| 'file:///c:/', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL([], 'c:\\Users\\Clippy\\Source', BASE_URL).href, |
| 'file:///c:/Users/Clippy/Source', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL([], '\\\\network\\Server\\Source', BASE_URL).href, |
| 'file://network/Server/Source', |
| ); |
| }); |
| |
| it('correctly resolves relative paths', () => { |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| 'stdint.h', |
| new URL('http://localhost/file.wasm'), |
| ) |
| .href, |
| 'http://localhost/stdint.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| 'emscripten/include/iostream', |
| new URL('http://localhost/dist/module.wasm'), |
| ) |
| .href, |
| 'http://localhost/dist/emscripten/include/iostream', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| './src/main.cc', |
| new URL('https://www.example.com/fast.wasm'), |
| ) |
| .href, |
| 'https://www.example.com/src/main.cc', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| '.\\Mein Projekt\\Datei.cpp', |
| new URL('https://www.example.com/fast.wasm'), |
| ) |
| .href, |
| 'https://www.example.com/Mein%20Projekt/Datei.cpp', |
| ); |
| }); |
| |
| it('correctly applies source path substitutions', () => { |
| const BASE_URL = new URL('http://localhost/file.wasm'); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '/usr/src', to: '/mnt/src'}], |
| '/usr/include/stdio.h', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///usr/include/stdio.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '/usr/src', to: '/mnt/src'}], |
| '/usr/src/include/stdio.h', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///mnt/src/include/stdio.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [ |
| {from: '/usr/src', to: '/mnt/src'}, |
| {from: '/mnt/src', to: '/foo'}, |
| ], |
| '/usr/src/include/stdio.h', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///mnt/src/include/stdio.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [ |
| {from: '/usr/src/include', to: '/mnt/include'}, |
| {from: '/usr/src', to: '/mnt/src'}, |
| ], |
| '/usr/src/include/stdio.h', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///mnt/include/stdio.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/srv/central/src'}], |
| './include/string', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///srv/central/src/include/string', |
| ); |
| }); |
| |
| it('correctly resolves the sidecar Wasm module path', () => { |
| // We use resolveSourcePathToURL() with an empty source |
| // map to locate the debugging sidecar Wasm module. |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| 'file.wasm.debug.wasm', |
| new URL('http://localhost:8000/wasm/file.wasm'), |
| ) |
| .href, |
| 'http://localhost:8000/wasm/file.wasm.debug.wasm', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| '/usr/local/file.wasm.debug.wasm', |
| new URL('http://localhost:8000/wasm/file.wasm'), |
| ) |
| .href, |
| 'file:///usr/local/file.wasm.debug.wasm', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [], |
| 'f:\\netdrive\\file.wasm.debug.wasm', |
| new URL('http://localhost:8000/wasm/file.wasm'), |
| ) |
| .href, |
| 'file:///f:/netdrive/file.wasm.debug.wasm', |
| ); |
| }); |
| |
| it('correctly deals with dot patterns', () => { |
| // Test that we match LLDB's behavior as implemented for `settings set target.source-map`: |
| // http://cs/github/llvm/llvm-project/lldb/source/Target/PathMappingList.cpp?l=157-185 |
| const BASE_URL = new URL('http://web.dev/file.wasm'); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/foo/bar'}], |
| 'include/header.h', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///foo/bar/include/header.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: 'c:\\foo\\bar'}], |
| 'include/header.h', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///c:/foo/bar/include/header.h', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/foo'}], |
| '/mnt/main.c', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///mnt/main.c', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: 'c:\\foo'}], |
| '/mnt/main.c', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///mnt/main.c', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/foo'}], |
| 'c:\\mnt\\main.c', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///c:/mnt/main.c', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: 'c:\\foo'}], |
| 'c:\\mnt\\main.c', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///c:/mnt/main.c', |
| ); |
| }); |
| |
| it('correctly deals with dot patterns when the source path is a URL', () => { |
| const BASE_URL = new URL('http://web.dev/file.wasm'); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/bar'}], |
| 'file:///main.cpp', |
| BASE_URL, |
| ) |
| .href, |
| 'file:///main.cpp', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/bar'}], |
| 'http://localhost/main.cpp', |
| BASE_URL, |
| ) |
| .href, |
| 'http://localhost/main.cpp', |
| ); |
| assert.strictEqual( |
| resolveSourcePathToURL( |
| [{from: '.', to: '/bar'}], |
| 'https://localhost/main.cpp', |
| BASE_URL, |
| ) |
| .href, |
| 'https://localhost/main.cpp', |
| ); |
| }); |
| }); |