mirror of
https://github.com/block/buzz.git
synced 2026-11-10 11:21:05 +00:00
Merge remote-tracking branch 'origin/main' into am-blockUI-proto-chief
Signed-off-by: Arjun Mahanti <arjun@squareup.com>
This commit is contained in:
140
scripts/ci-selection.test.mjs
Normal file
140
scripts/ci-selection.test.mjs
Normal file
@@ -0,0 +1,140 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { execFileSync, spawnSync } from "node:child_process";
|
||||
import {
|
||||
existsSync,
|
||||
mkdtempSync,
|
||||
mkdirSync,
|
||||
readFileSync,
|
||||
rmSync,
|
||||
writeFileSync,
|
||||
} from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { dirname, join } from "node:path";
|
||||
import { after, test } from "node:test";
|
||||
|
||||
const workflow = readFileSync(
|
||||
new URL("../.github/workflows/ci.yml", import.meta.url),
|
||||
"utf8",
|
||||
);
|
||||
const scratch = mkdtempSync(join(tmpdir(), "buzz-ci-selection-"));
|
||||
after(() => rmSync(scratch, { recursive: true, force: true }));
|
||||
const actionSha = workflow.match(/uses: dorny\/paths-filter@([a-f0-9]{40})/)[1];
|
||||
const filters = workflow
|
||||
.match(/ {10}filters: \|\n([\s\S]*?)(?= {6}- name:)/)[1]
|
||||
.split("\n")
|
||||
.map((line) => line.slice(12))
|
||||
.join("\n");
|
||||
// GitHub-hosted runners prepare pinned actions beside RUNNER_TEMP before any
|
||||
// steps run. Reuse that bundle, without another download in the selection gate.
|
||||
// Locally, point PATHS_FILTER_ACTION at dist/index.js from the pinned action.
|
||||
const actionPath =
|
||||
process.env.PATHS_FILTER_ACTION ||
|
||||
(process.env.RUNNER_TEMP &&
|
||||
join(
|
||||
process.env.RUNNER_TEMP,
|
||||
"..",
|
||||
"_actions",
|
||||
"dorny",
|
||||
"paths-filter",
|
||||
actionSha,
|
||||
"dist",
|
||||
"index.js",
|
||||
));
|
||||
assert.ok(
|
||||
actionPath && existsSync(actionPath),
|
||||
`Set PATHS_FILTER_ACTION to the local dist/index.js from dorny/paths-filter@${actionSha}`,
|
||||
);
|
||||
function select(paths) {
|
||||
const repo = mkdtempSync(join(scratch, "repo-"));
|
||||
const git = (...args) =>
|
||||
execFileSync("git", args, { cwd: repo, stdio: "pipe", timeout: 10000 });
|
||||
git("init", "-q");
|
||||
// Fixture repositories must not inherit developer machine hooks.
|
||||
mkdirSync(join(repo, "empty-hooks"));
|
||||
git("config", "core.hooksPath", join(repo, "empty-hooks"));
|
||||
git(
|
||||
"-c",
|
||||
"user.name=CI fixture",
|
||||
"-c",
|
||||
"user.email=ci@example.com",
|
||||
"-c",
|
||||
"commit.gpgsign=false",
|
||||
"commit",
|
||||
"-q",
|
||||
"--allow-empty",
|
||||
"-m",
|
||||
"fixture",
|
||||
"-s",
|
||||
);
|
||||
for (const path of paths) {
|
||||
mkdirSync(dirname(join(repo, path)), { recursive: true });
|
||||
writeFileSync(join(repo, path), "fixture\n");
|
||||
}
|
||||
git("add", ".");
|
||||
const output = join(repo, "action-output");
|
||||
writeFileSync(output, "");
|
||||
const child = spawnSync(process.execPath, [actionPath], {
|
||||
cwd: repo,
|
||||
encoding: "utf8",
|
||||
timeout: 30000,
|
||||
env: {
|
||||
...process.env,
|
||||
INPUT_BASE: "HEAD",
|
||||
INPUT_FILTERS: filters,
|
||||
INPUT_TOKEN: "",
|
||||
INPUT_REF: "",
|
||||
GITHUB_OUTPUT: output,
|
||||
"INPUT_PREDICATE-QUANTIFIER":
|
||||
workflow.match(/predicate-quantifier: ['"]?([\w-]+)/)?.[1] ?? "some",
|
||||
},
|
||||
});
|
||||
assert.equal(child.status, 0, child.stdout + child.stderr);
|
||||
return Object.fromEntries(
|
||||
[
|
||||
...readFileSync(output, "utf8").matchAll(
|
||||
/^(rust|desktop|desktop-rust|web|mobile)<<([^\n]+)\n(true|false)\n\2/gm,
|
||||
),
|
||||
].map(([, key, , value]) => [key, value]),
|
||||
);
|
||||
}
|
||||
const scenarios = [
|
||||
[
|
||||
"mobile source and tests",
|
||||
[
|
||||
"mobile/lib/features/age_gate/age_signal_provider.dart",
|
||||
"mobile/test/features/age_gate/age_signal_provider_test.dart",
|
||||
],
|
||||
["mobile"],
|
||||
],
|
||||
["mobile lockfile", ["mobile/pubspec.lock"], ["mobile"]],
|
||||
["mobile release script", ["scripts/mobile-release.sh"], ["mobile"]],
|
||||
["desktop", ["desktop/src/main.tsx"], ["desktop"]],
|
||||
["Tauri", ["desktop/src-tauri/src/main.rs"], ["desktop", "desktop-rust"]],
|
||||
["relay", ["crates/buzz-relay/src/main.rs"], ["rust"]],
|
||||
["migration", ["migrations/123.sql"], ["rust"]],
|
||||
["shared workflow", [".github/workflows/ci.yml"], ["rust", "mobile"]],
|
||||
[
|
||||
"mixed mobile and relay",
|
||||
["mobile/lib/main.dart", "crates/buzz-core/src/lib.rs"],
|
||||
["rust", "mobile"],
|
||||
],
|
||||
[
|
||||
"mixed mobile and desktop",
|
||||
["mobile/lib/main.dart", "desktop/src/main.tsx"],
|
||||
["desktop", "mobile"],
|
||||
],
|
||||
["web", ["web/src/main.tsx"], ["web"]],
|
||||
["documentation", ["README.md"], []],
|
||||
];
|
||||
for (const [name, paths, expected] of scenarios) {
|
||||
test(`real paths-filter: ${name}`, () => {
|
||||
const outputs = select(paths);
|
||||
assert.equal(Object.keys(outputs).length, 5);
|
||||
assert.deepEqual(
|
||||
Object.keys(outputs)
|
||||
.filter((key) => outputs[key] === "true")
|
||||
.sort(),
|
||||
expected.sort(),
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -104,6 +104,12 @@ run_unit_tests() {
|
||||
run_test_step "buzz-db unit tests" \
|
||||
cargo test -p buzz-db --lib -- --nocapture
|
||||
|
||||
run_test_step "buzz-media storage snapshot serialization test" \
|
||||
cargo test -p buzz-media --lib bucket_index::tests::bucket_snapshot_json_round_trip_preserves_community_keys -- --exact --nocapture
|
||||
|
||||
run_test_step "buzz-admin completed snapshot persistence test" \
|
||||
cargo test -p buzz-admin storage_snapshot_tests::failed_fold_never_invokes_snapshot_persistence -- --exact --nocapture
|
||||
|
||||
# Multi-tenant conformance gate: independent replay checker + golden
|
||||
# fixtures (buzz-conformance). Pure in-process trace replay, no infra.
|
||||
run_test_step "buzz-conformance tests" \
|
||||
@@ -142,6 +148,9 @@ run_unit_tests() {
|
||||
|
||||
run_test_step "buzz-relay side-effects helper tests" \
|
||||
cargo test -p buzz-relay --lib handlers::side_effects::tests:: -- --nocapture
|
||||
|
||||
run_test_step "buzz-relay storage snapshot tests" \
|
||||
cargo test -p buzz-relay --lib storage_sweep::tests:: -- --nocapture
|
||||
}
|
||||
|
||||
# ---- DB / integration tests (infra required) --------------------------------
|
||||
|
||||
58
scripts/test-mobile-gateway-recipes.sh
Normal file
58
scripts/test-mobile-gateway-recipes.sh
Normal file
@@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
# Exercise the production recipes with macOS's system Bash, not a rewritten copy.
|
||||
set -euo pipefail
|
||||
repo_root=$(cd "$(dirname "$0")/.." && pwd)
|
||||
fixture=$(mktemp -d)
|
||||
trap 'rm -rf "$fixture"' EXIT
|
||||
mkdir -p "$fixture/bin" "$fixture/scripts" "$fixture/mobile/ios/Flutter"
|
||||
for recipe in mobile-dev mobile-build-android; do
|
||||
# Render with the real task runner before installing stubs: a Hermit just
|
||||
# shim can otherwise prepend the real Flutter to PATH ahead of our stub.
|
||||
just --justfile "$repo_root/Justfile" --dry-run "$recipe" > "$fixture/$recipe" 2>&1
|
||||
done
|
||||
cat > "$fixture/bin/flutter" <<'STUB'
|
||||
#!/bin/bash
|
||||
set -eu
|
||||
printf '%s\n' "$@" > "$CALL_LOG"
|
||||
STUB
|
||||
cat > "$fixture/bin/pgrep" <<'STUB'
|
||||
#!/bin/bash
|
||||
exit 0
|
||||
STUB
|
||||
cat > "$fixture/scripts/mobile-worktree-overrides.sh" <<'STUB'
|
||||
#!/bin/bash
|
||||
exit 0
|
||||
STUB
|
||||
chmod +x "$fixture/bin/flutter" "$fixture/bin/pgrep" "$fixture/scripts/mobile-worktree-overrides.sh"
|
||||
export PATH="$fixture/bin:$PATH"
|
||||
export CALL_LOG="$fixture/arguments"
|
||||
unset BUZZ_PUSH_GATEWAY_URL
|
||||
|
||||
for recipe in mobile-dev mobile-build-android; do
|
||||
for mode in omitted supplied; do
|
||||
unset BUZZ_PUSH_GATEWAY_URL
|
||||
if [[ "$mode" == supplied ]]; then
|
||||
# A space catches accidental splitting. The build gate validates URLs;
|
||||
# this test checks exact argument forwarding.
|
||||
export BUZZ_PUSH_GATEWAY_URL='https://push.example/value with space'
|
||||
fi
|
||||
(cd "$fixture" && /bin/bash "$fixture/$recipe")
|
||||
if [[ "$recipe" == mobile-dev ]]; then
|
||||
printf '%s\n' run > "$fixture/expected"
|
||||
else
|
||||
printf '%s\n' build apk --debug --no-pub > "$fixture/expected"
|
||||
fi
|
||||
if [[ "$mode" == supplied ]]; then
|
||||
printf '%s\n' "--dart-define=BUZZ_PUSH_GATEWAY_URL=$BUZZ_PUSH_GATEWAY_URL" >> "$fixture/expected"
|
||||
fi
|
||||
diff -u "$fixture/expected" "$CALL_LOG"
|
||||
printf 'PASS %s %s\n' "$recipe" "$mode"
|
||||
done
|
||||
done
|
||||
|
||||
unset BUZZ_PUSH_GATEWAY_URL
|
||||
printf '%s\n' 'BUZZ_PUSH_GATEWAY_URL = https:/$()/push.example' > "$fixture/mobile/ios/Flutter/AppOverrides.xcconfig"
|
||||
(cd "$fixture" && /bin/bash "$fixture/mobile-dev")
|
||||
printf '%s\n' run '--dart-define=BUZZ_PUSH_GATEWAY_URL=https://push.example' > "$fixture/expected"
|
||||
diff -u "$fixture/expected" "$CALL_LOG"
|
||||
printf 'PASS mobile-dev Xcode override\n'
|
||||
Reference in New Issue
Block a user