Files
lms-fe/tests/camera-module-runtime.cjs
T

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.');