const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const os = require('node:os'); const vm = require('node:vm'); const { spawnSync } = require('node:child_process'); const ts = require('typescript'); const root = path.join(__dirname, '..'); const source = fs.readFileSync(path.join(root, 'src/main/index.ts'), 'utf8'); const ast = ts.createSourceFile('index.ts', source, ts.ScriptTarget.Latest, true); const ctx = { exports: {} }; vm.runInNewContext(ts.transpileModule(fs.readFileSync(path.join(root, 'src/main/yahboomRuntime.ts'), 'utf8'), { compilerOptions: { module: ts.ModuleKind.CommonJS }, }).outputText, ctx); Object.assign(ctx, ctx.exports); vm.runInNewContext(ts.transpileModule(fs.readFileSync(path.join(root, 'src/main/cameraRuntime.ts'), 'utf8'), { compilerOptions: { module: ts.ModuleKind.CommonJS }, }).outputText, ctx); const images = [{ image: 'future-nav2-camera-test:humble-jetson_orin' }, { image: 'future-nav2:humble-jetson_orin' }, { image: 'slam-ros-bridge:jetson_orin' }]; assert.deepEqual(ctx.exports.cameraRuntimeArtifacts('[lms-nav2-camera-test]nav2-camera-test_v1.0.0_ws', images), images.slice(0, 1)); assert.deepEqual(ctx.exports.cameraRuntimeArtifacts('[lms-nav2-mkmini]nav2-mkmini_v1.0.0_ws', images), images.slice(1)); assert.equal(ctx.exports.cameraRuntimeArtifacts('anything', undefined), undefined); const names = ['buildNav2DockerRunScript', 'buildNav2DockerBuildScript']; for (const node of ast.statements) { if (ts.isFunctionDeclaration(node) && names.includes(node.name?.text)) { vm.runInNewContext(ts.transpileModule(node.getText(ast), {}).outputText, ctx); } } const run = ctx.buildNav2DockerRunScript(); const build = ctx.buildNav2DockerBuildScript(); for (const script of [run, build]) { const syntax = spawnSync('bash', ['-n'], { input: script, encoding: 'utf8' }); assert.equal(syntax.status, 0, syntax.stderr); } assert.match(run, /lms-nav2-camera-test\*\) PACKAGE=camera_test_pkg; LAUNCH=camera.launch.py/); assert.match(build, /lms-nav2-camera-test\*\) TARGET=camera_test_pkg/); assert.match(run, /--device "\$CAMERA_DEVICE:\$CAMERA_DEVICE"/); assert.match(run, /for capture_device in \/dev\/capture-vi-channel\*/); assert.match(run, /--device "\$capture_device:\$capture_device"/); assert.match(run, /FASTDDS_DEFAULT_PROFILES_FILE/); assert.match(run, /ROS_LOCALHOST_ONLY=\$ROS_LOCALHOST_ONLY_VALUE/); const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'camera-runtime-')); const folder = '[lms-nav2-camera-test]nav2-camera-test_v1.0.0_ws'; try { fs.mkdirSync(path.join(dir, folder, 'install'), { recursive: true }); fs.writeFileSync(path.join(dir, folder, 'install/setup.bash'), ''); for (const device of ['/dev/null', '/dev/video999999', '/tmp/video0']) { const result = spawnSync('bash', ['-s', '--', 'camera-test', dir, folder, 'camera-image', '77', 'false', `video_device:=${device}`], { input: run, encoding: 'utf8' }); assert.notEqual(result.status, 0); assert.match(result.stderr, /Camera device not found/); } } finally { fs.rmSync(dir, { recursive: true, force: true }); } console.log('Camera module routing, shell syntax, DDS settings and device validation passed.');