summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/meshbay-client/package.json4
-rw-r--r--packages/meshbay-node/tests/test_packaging_win.py87
2 files changed, 90 insertions, 1 deletions
diff --git a/packages/meshbay-client/package.json b/packages/meshbay-client/package.json
index 55b2dcf..6e15807 100644
--- a/packages/meshbay-client/package.json
+++ b/packages/meshbay-client/package.json
@@ -32,7 +32,9 @@
{
"from": "node-runtime",
"to": "node-runtime",
- "filter": ["**/*"]
+ "filter": [
+ "**/*"
+ ]
},
{
"from": "../../packaging/win/firewall.ps1",
diff --git a/packages/meshbay-node/tests/test_packaging_win.py b/packages/meshbay-node/tests/test_packaging_win.py
index 22ce44b..31816d2 100644
--- a/packages/meshbay-node/tests/test_packaging_win.py
+++ b/packages/meshbay-node/tests/test_packaging_win.py
@@ -316,6 +316,29 @@ def test_service_status_reports_state_without_admin():
"calls status/run/end directly, unelevated")
+def test_the_help_smoke_test_joins_multiline_output_before_matching():
+ """
+ `& exe --help 2>&1` is an ARRAY once the output wraps past one line, which
+ it now does with `autostart`/`service` in the verb list. `$array -notmatch
+ X` is a FILTER, not a boolean test -- it returns the *non-matching*
+ elements, and any non-empty array is truthy in `if()` regardless of what
+ is in it. Almost every help line lacks the literal string "meshbay-node",
+ so an unjoined check throws unconditionally the moment --help exceeds one
+ line: found when this specific verb list finally grew past that point,
+ which is exactly the kind of one-off silent breakage a passing build
+ yesterday gives no warning of today.
+ """
+ src = (WIN / "build-node-runtime.ps1").read_text(encoding="utf-8")
+ body = src.split("smoke test: meshbay-node --help", 1)[1]
+ body = body[:800]
+ assert '-join "`n"' in body, (
+ "the captured --help output must be joined to a single string before "
+ "any -match/-notmatch check, or a multi-line result silently always "
+ "fails the smoke test")
+ # And the join has to happen at capture time, not on some other variable.
+ assert '(& $exe --help 2>&1) -join' in body
+
+
def test_main_js_drives_the_service_task_for_all_three_actions():
"""The hard requirement: Start/Stop/Restart from the Node page must
control the Scheduled Task when service mode is active, not just spawn a
@@ -409,3 +432,67 @@ def test_the_bundled_daemon_goes_on_the_user_path_and_comes_back_off():
# PATH points at the real .exe dir, so `where meshbay-node` resolves to the
# binary the client and the W3 launcher use too — not a shim.
assert 'MB_NODE_BIN "$INSTDIR\\resources\\node-runtime"' in nsh
+
+
+# ── ffmpeg: bundled by default (fetch-ffmpeg.ps1) ───────────────────────────
+
+def test_fetch_ffmpeg_and_its_license_notice_exist():
+ assert (WIN / "fetch-ffmpeg.ps1").exists()
+ notice = WIN / "LICENSE-ffmpeg.txt"
+ assert notice.exists()
+ text = notice.read_text(encoding="utf-8")
+ assert "GPL" in text
+ assert "ffmpeg.org" in text or "FFmpeg/FFmpeg" in text, (
+ "the notice must point at where the corresponding source actually is")
+
+
+def test_ffmpeg_is_pinned_to_a_dated_release_not_the_moving_latest_alias():
+ """
+ BtbN repoints the "latest" release on every auto-build (their asset
+ filenames even embed a fresh git-describe each time), so a URL built from
+ that alias silently changes what a build fetches. The dated tag
+ (autobuild-YYYY-MM-DD-HH-MM) is immutable once published -- that is what
+ makes the pinned checksum mean anything.
+ """
+ src = (WIN / "fetch-ffmpeg.ps1").read_text(encoding="utf-8")
+ tag_match = re.search(r'\$FFMPEG_TAG\s*=\s*"([^"]+)"', src)
+ assert tag_match, "no $FFMPEG_TAG pin found"
+ assert re.match(r"autobuild-\d{4}-\d{2}-\d{2}-\d{2}-\d{2}$", tag_match.group(1)), (
+ f"{tag_match.group(1)!r} is not a dated release tag")
+ assert "/releases/latest/" not in src and "/releases/download/latest/" not in src
+
+ sha_match = re.search(r'\$FFMPEG_SHA256\s*=\s*"([0-9a-f]+)"', src)
+ assert sha_match, "no $FFMPEG_SHA256 pin found"
+ assert len(sha_match.group(1)) == 64, "not a full sha256 hex digest"
+
+ assert '$FFMPEG_URL' in src and '$FFMPEG_TAG' in src.split("$FFMPEG_URL", 1)[1][:200], (
+ "the download URL must be built from the pinned tag")
+
+
+def test_ffplay_is_excluded_from_the_bundle():
+ """The vendor zip carries an SDL2 player MeshBay never invokes (~17 MB);
+ bundling it would be the collect_all-everything instinct applied where a
+ fixed allowlist is right instead."""
+ src = (WIN / "fetch-ffmpeg.ps1").read_text(encoding="utf-8")
+ keep_block = src.split("$KEEP_FILES", 1)[1].split(")", 1)[0]
+ assert "ffplay" not in keep_block
+ assert "ffmpeg.exe" in keep_block and "ffprobe.exe" in keep_block
+
+
+def test_ffmpeg_bundling_is_the_default_not_opt_in():
+ """
+ Video streaming needs a real H.264 encoder (libx264, GPL -- no LGPL-only
+ ffmpeg build has one), and asking an end user to separately run
+ `winget install ffmpeg` is not viable for a non-technical install (needs
+ network + winget present at that moment, fails silently). So bundling
+ must be the default, with an explicit opt-out for local iteration --
+ the reverse of the old -FfmpegDir opt-in this replaced.
+ """
+ runtime_src = (WIN / "build-node-runtime.ps1").read_text(encoding="utf-8")
+ assert "SkipFfmpeg" in runtime_src
+ assert "FfmpegDir" not in runtime_src, "the old opt-in mechanism should be gone, not parallel"
+ assert "fetch-ffmpeg.ps1" in runtime_src
+
+ win_src = (WIN / "build-win.ps1").read_text(encoding="utf-8")
+ assert "SkipFfmpeg" in win_src
+ assert "FfmpegDir" not in win_src