Add Week 10 Plugin System and Week 11 Control API
Week 10 - Plugin System (FR-19): - Plugin traits: Plugin, OriginPlugin, MetadataPlugin, FormatPlugin - NativePluginHost with libloading for dynamic loading - WasmPluginHost (feature-gated) with wasmtime runtime - PluginManager coordinating both hosts with version checks - OriginInstance::watch() with WatchHandle, WatchEvent for live updates - FormatPlugin::synthesize_header() for metadata overlay Week 11 - Control API & Production (FR-17, FR-18, NFR-6, NFR-10): - gRPC server with full MusicFS service (status, cache, origins, events) - Proto extended: MountState enum, TierStats, full StatusResponse/CacheStats - WebhookHandler with HMAC-SHA256 signing and exponential retry - Metrics with latency histograms (p50/p95/p99) and origin health gauges - CLI with mount, status, cache, search, origin, events, shutdown commands - E2E player compatibility tests (mpv, VLC, file manager) - systemd service, PKGBUILD, RPM spec for packaging Plans added for Weeks 10-14 covering P1 features. All 154 tests passing.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
use std::process::Command;
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_mpv_playback() {
|
||||
let mountpoint = setup_test_mount();
|
||||
|
||||
let output = Command::new("mpv")
|
||||
.args([
|
||||
"--no-video",
|
||||
"--no-audio",
|
||||
"--length=2",
|
||||
"--msg-level=all=debug",
|
||||
&format!("{}/Artist/Album/01 - Track.flac", mountpoint),
|
||||
])
|
||||
.output()
|
||||
.expect("mpv must be installed");
|
||||
|
||||
assert!(
|
||||
output.status.success(),
|
||||
"mpv playback failed: {:?}",
|
||||
output
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_vlc_playback() {
|
||||
let mountpoint = setup_test_mount();
|
||||
|
||||
let output = Command::new("cvlc")
|
||||
.args([
|
||||
"--play-and-exit",
|
||||
"--run-time=2",
|
||||
&format!("{}/Artist/Album/", mountpoint),
|
||||
])
|
||||
.output()
|
||||
.expect("vlc must be installed");
|
||||
|
||||
assert!(output.status.success(), "VLC playback failed");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_file_manager_operations() {
|
||||
let mountpoint = setup_test_mount();
|
||||
|
||||
let entries: Vec<_> = std::fs::read_dir(&mountpoint)
|
||||
.expect("read_dir failed")
|
||||
.collect();
|
||||
|
||||
assert!(!entries.is_empty(), "mountpoint should have entries");
|
||||
|
||||
for entry in entries {
|
||||
let entry = entry.expect("entry should be valid");
|
||||
let metadata = entry.metadata().expect("metadata should work");
|
||||
assert!(metadata.is_dir() || metadata.is_file());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
fn test_concurrent_player_access() {
|
||||
let mountpoint = setup_test_mount();
|
||||
|
||||
let handles: Vec<_> = (0..3)
|
||||
.map(|i| {
|
||||
let mp = mountpoint.clone();
|
||||
std::thread::spawn(move || {
|
||||
Command::new("mpv")
|
||||
.args([
|
||||
"--no-video",
|
||||
"--no-audio",
|
||||
"--length=1",
|
||||
&format!("{}/Artist/Album/0{} - Track.flac", mp, i + 1),
|
||||
])
|
||||
.output()
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
|
||||
for handle in handles {
|
||||
let output = handle.join().unwrap().expect("mpv should run");
|
||||
assert!(output.status.success());
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_test_mount() -> String {
|
||||
std::env::var("MUSICFS_TEST_MOUNT").unwrap_or_else(|_| "/tmp/musicfs-test".to_string())
|
||||
}
|
||||
Reference in New Issue
Block a user