| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import assert from "node:assert/strict";
- import { execFileSync, spawnSync } from "node:child_process";
- import { chmod, mkdtemp, mkdir, rm, writeFile } from "node:fs/promises";
- import { tmpdir } from "node:os";
- import { join } from "node:path";
- import { pathToFileURL } from "node:url";
- import test from "node:test";
- const verifier = new URL("../scripts/verify-git-package.mjs", import.meta.url);
- function isolatedGitEnvironment() {
- const environment = { ...process.env };
- delete environment.GIT_INDEX_FILE;
- return environment;
- }
- function runVerifier(args: string[], cache?: string) {
- const environment = isolatedGitEnvironment();
- if (cache !== undefined) environment.CODEX_APP_SERVER_BRIDGE_NPM_CACHE = cache;
- return spawnSync(process.execPath, [verifier.pathname, ...args], {
- encoding: "utf8",
- env: environment,
- timeout: 60_000,
- });
- }
- test("Git-package verifier requires exactly one immutable package spec without leaking credentials", () => {
- const secret = "credential-must-not-appear";
- const invalid = [
- [],
- ["git+https://git.example.invalid/team/codex-app-server-bridge.git#main"],
- [`git+https://user:${secret}@git.example.invalid/team/codex-app-server-bridge.git#main`],
- ["git+https://git.example.invalid/team/codex-app-server-bridge.git#abc123"],
- [
- "git+https://git.example.invalid/team/codex-app-server-bridge.git#v0.1.1",
- "git+https://git.example.invalid/team/codex-app-server-bridge.git#v0.1.0",
- ],
- ];
- for (const args of invalid) {
- const result = runVerifier(args);
- assert.notEqual(result.status, 0);
- assert.equal(result.stderr.includes(secret), false);
- assert.match(result.stderr, /Git-package verification failed:/);
- }
- });
- test("Git-package verifier installs and launches a disposable prebuilt Git revision", async () => {
- const root = await mkdtemp(join(tmpdir(), "codex-app-server-bridge-git-test-"));
- const repository = join(root, "codex-app-server-bridge.git");
- const cache = join(root, "npm-cache");
- try {
- await Promise.all([
- mkdir(join(repository, "bin"), { recursive: true }),
- mkdir(join(repository, "dist"), { recursive: true }),
- ]);
- await writeFile(join(repository, "package.json"), `${JSON.stringify({
- name: "codex-app-server-bridge",
- version: "9.9.9",
- private: true,
- type: "module",
- bin: { "codex-app-server-bridge": "bin/codex-app-server-bridge.js" },
- files: ["bin/", "dist/cli.js", "dist/config.js"],
- engines: { node: ">=24" },
- }, null, 2)}\n`);
- const launcher = `#!/usr/bin/env node
- if (process.argv.slice(2).join(" ") !== "app-server") {
- process.stderr.write("codex-app-server-bridge: Usage: codex-app-server-bridge app-server\\n");
- process.exitCode = 1;
- }
- `;
- const executable = join(repository, "bin", "codex-app-server-bridge.js");
- await writeFile(executable, launcher);
- await chmod(executable, 0o755);
- await writeFile(join(repository, "dist", "cli.js"), "export async function runBridge() { return 1; }\n");
- await writeFile(join(repository, "dist", "config.js"), "export const USAGE = 'fixture';\n");
- const gitEnvironment = isolatedGitEnvironment();
- execFileSync("git", ["init", "--quiet"], { cwd: repository, env: gitEnvironment });
- execFileSync("git", ["config", "user.name", "Codex Test"], { cwd: repository, env: gitEnvironment });
- execFileSync("git", ["config", "user.email", "codex-test@example.invalid"], { cwd: repository, env: gitEnvironment });
- execFileSync("git", ["add", "."], { cwd: repository, env: gitEnvironment });
- execFileSync("git", ["commit", "--quiet", "-m", "prebuilt fixture"], { cwd: repository, env: gitEnvironment });
- const revision = execFileSync("git", ["rev-parse", "HEAD"], {
- cwd: repository,
- encoding: "utf8",
- env: gitEnvironment,
- }).trim();
- const packageSpec = `git+${pathToFileURL(repository).href}#${revision}`;
- const result = runVerifier([packageSpec], cache);
- assert.equal(result.status, 0, result.stderr);
- const report = JSON.parse(result.stdout) as {
- ok: boolean;
- revision: string;
- storage: string;
- invocation: string;
- };
- assert.equal(report.ok, true);
- assert.equal(report.revision, revision);
- assert.equal(report.storage, "isolated-prefix");
- assert.equal(report.invocation, "verified");
- } finally {
- await rm(root, { recursive: true, force: true });
- }
- });
|