59 lines
3.3 KiB
JavaScript
59 lines
3.3 KiB
JavaScript
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, /CAMERA_DEVICE" = \/dev/);
|
|
assert.match(run, /mapfile -t CAMERA_DEVICES/);
|
|
assert.doesNotMatch(run, /-v \/dev:\/dev/);
|
|
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.');
|