Allow running e2e test suite against a locally built httpd

This allows us to easily test httpd changes without doing a release
first and then updating the radicle-httpd-release file.
This commit is contained in:
Rūdolfs Ošiņš
2026-02-26 16:36:07 -06:00
parent 8022f607de
commit 4eae95ab44
5 changed files with 74 additions and 10 deletions
+10
View File
@@ -47,6 +47,16 @@ remove the `SKIP_SETUP` flag to ensure tests run against the latest build.
* Subsequent runs (no code changes): `SKIP_SETUP=true npm run test:e2e -- --project chromium`
* Single test by line number: `SKIP_SETUP=true npm run test:e2e -- tests/e2e/repo/commits.spec.ts:90 --project chromium`
**Testing with local radicle-httpd build:**
If you're developing radicle-httpd and want to test changes locally:
npm run test:e2e:local
This will:
1. Compile radicle-httpd from the `radicle-httpd/` directory
2. Run the full test suite against the locally compiled binary
Proposing changes
-----------------
When proposing changes via a patch:
+1
View File
@@ -12,6 +12,7 @@
"format": "npx prettier '**/*.@(ts|js|svelte|json|css|html|yml)' --write",
"test:unit": "TZ='UTC' vitest run",
"test:e2e": "NODE_CONFIG_ENV='test' TZ='UTC' playwright test",
"test:e2e:local": "scripts/compile-local-httpd && USE_LOCAL_HTTPD=true NODE_CONFIG_ENV='test' TZ='UTC' playwright test",
"test:http-client:unit": "NODE_CONFIG_ENV='test' TZ='UTC' vitest run --config http-client/vite.config.ts --reporter verbose",
"test:radicle-httpd": "cd radicle-httpd && cargo test --all-features",
"deploy": "rimraf build && npm clean-install && npm run build && scripts/inject-plausible && npx wrangler deploy"
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -e
echo "🔨 Compiling local radicle-httpd..."
# Ensure radicle-httpd directory exists
if [ ! -d "radicle-httpd" ]; then
echo "❌ radicle-httpd directory not found"
exit 1
fi
# Compile radicle-httpd (debug build for faster compilation)
cd radicle-httpd
cargo build
cd ..
# Verify binary was created
if [ ! -f "radicle-httpd/target/debug/radicle-httpd" ]; then
echo "❌ Compilation failed - binary not found"
exit 1
fi
# Create target directory
mkdir -p tests/tmp/bin/httpd/local
# Copy binary to test location
cp radicle-httpd/target/debug/radicle-httpd tests/tmp/bin/httpd/local/radicle-httpd
echo "✅ Local radicle-httpd compiled and ready at tests/tmp/bin/httpd/local/radicle-httpd"
+32 -10
View File
@@ -6,6 +6,7 @@ import {
radicleHttpdRelease,
removeWorkspace,
tmpDir,
useLocalHttpd,
} from "@tests/support/support.js";
import {
defaultConfig,
@@ -24,12 +25,9 @@ const heartwoodBinaryPath = Path.join(
"heartwood",
heartwoodRelease,
).trim();
const httpdBinaryPath = Path.join(
tmpDir,
"bin",
"httpd",
radicleHttpdRelease,
).trim();
const httpdBinaryPath = useLocalHttpd
? Path.join(tmpDir, "bin", "httpd", "local").trim()
: Path.join(tmpDir, "bin", "httpd", radicleHttpdRelease).trim();
process.env.PATH = [
heartwoodBinaryPath,
@@ -42,14 +40,19 @@ export default async function globalSetup(): Promise<() => void> {
await assertBinariesInstalled("rad", heartwoodRelease, heartwoodBinaryPath);
await assertBinariesInstalled(
"radicle-httpd",
radicleHttpdRelease,
useLocalHttpd ? "pre-release" : radicleHttpdRelease,
httpdBinaryPath,
);
} catch (error) {
console.error(error);
console.log("");
console.log("To download the required test binaries, run:");
console.log(" 👉 ./scripts/install-binaries");
if (useLocalHttpd) {
console.log("To compile local radicle-httpd binary, run:");
console.log(" 👉 ./scripts/compile-local-httpd");
} else {
console.log("To download the required test binaries, run:");
console.log(" 👉 ./scripts/install-binaries");
}
console.log("");
process.exit(1);
}
@@ -62,7 +65,7 @@ export default async function globalSetup(): Promise<() => void> {
if (shouldSetup) {
console.log("⚡ Starting parallel setup...");
} else {
console.log("⏭️ Skipping setup (SKIP_SETUP is set)");
console.log("⏭️ Skipping setup (SKIP_SETUP is set)");
}
// Run build and fixture setup in parallel
@@ -162,6 +165,25 @@ export default async function globalSetup(): Promise<() => void> {
console.log("🚀 Setup complete, ready to run tests");
}
// Print binary versions
const { execa: exec } = await import("execa");
const { stdout: radVersion } = await exec("rad", ["--version"]);
const { stdout: gitRemoteRadVersion } = await exec("git-remote-rad", [
"--version",
]);
const { stdout: httpdVersion } = await exec("radicle-httpd", ["--version"]);
// radicle-httpd outputs logging lines, extract just the version line (last line)
const httpdVersionClean =
httpdVersion.trim().split("\n").pop() || httpdVersion;
console.log("");
console.log("Binary versions:");
console.log(` rad: ${radVersion.trim()}`);
console.log(` git-remote-rad: ${gitRemoteRadVersion.trim()}`);
console.log(
` radicle-httpd: ${httpdVersionClean}${useLocalHttpd ? " (local)" : ""}`,
);
console.log("");
return async () => {
await peerManager.shutdown();
};
+2
View File
@@ -33,6 +33,8 @@ export const radicleHttpdRelease = (
await Fs.readFile(`${supportDir}/radicle-httpd-release`, "utf8")
).trim();
export const useLocalHttpd = process.env.USE_LOCAL_HTTPD === "true";
// Assert that binaries are installed and are the correct version.
export async function assertBinariesInstalled(
binary: string,