Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion adapters/sendspin-cpp/client/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ struct SessionState {
static bool is_player_scenario(const std::string& id) {
return id == "client-initiated-pcm" || id == "server-initiated-pcm" ||
id == "server-initiated-flac" || id == "server-initiated-opus" ||
id == "server-initiated-pcm-24bit";
id == "server-initiated-pcm-24bit" || id == "server-initiated-legacy-unencrypted";
}

static bool is_metadata_scenario(const std::string& id) {
Expand Down
3 changes: 2 additions & 1 deletion adapters/sendspin-go/internal/conformance/scenarios.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ func SupportsScenario(scenarioID string) bool {
func IsPlayerScenario(scenarioID string) bool {
return scenarioID == "client-initiated-pcm" ||
scenarioID == "server-initiated-pcm" ||
scenarioID == "server-initiated-flac"
scenarioID == "server-initiated-flac" ||
scenarioID == "server-initiated-legacy-unencrypted"
}

func IsMetadataScenario(scenarioID string) bool {
Expand Down
1 change: 1 addition & 0 deletions adapters/sendspin-js/client.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const IMPLEMENTATION = "sendspin-js";
const PLAYER_SCENARIOS = new Set([
"client-initiated-pcm",
"server-initiated-pcm",
"server-initiated-legacy-unencrypted",
]);
const METADATA_SCENARIOS = new Set(["server-initiated-metadata"]);
const CONTROLLER_SCENARIOS = new Set(["server-initiated-controller"]);
Expand Down
31 changes: 21 additions & 10 deletions src/conformance/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -539,15 +539,22 @@ def _compare_audio_summaries(
if client_summary.get("status") != "ok":
return False, f"Client summary status is {client_summary.get('status')!r}"

source_hash = server_summary["audio"]["source_pcm_sha256"]
received_hash = client_summary["audio"]["received_pcm_sha256"]
if not client_summary["audio"]["audio_chunk_count"]:
server_audio = server_summary.get("audio")
if not isinstance(server_audio, dict):
return False, "Server summary is missing an 'audio' section"
client_audio = client_summary.get("audio")
if not isinstance(client_audio, dict):
return False, "Client summary is missing an 'audio' section"

source_hash = server_audio["source_pcm_sha256"]
received_hash = client_audio["received_pcm_sha256"]
if not client_audio["audio_chunk_count"]:
return False, "Client summary shows zero audio chunks"
if source_hash == received_hash:
return True, "PCM hashes match exactly"

audio = server_summary["audio"]
received_sample_count = int(client_summary["audio"]["received_sample_count"])
audio = server_audio
received_sample_count = int(client_audio["received_sample_count"])
fixture = decode_fixture(
Path(audio["fixture"]),
max_duration_seconds=float(audio.get("clip_seconds") or 5.0),
Expand Down Expand Up @@ -1157,11 +1164,15 @@ async def run_case(

server_payload = read_json(context.summary_path("server"))
client_payload = read_json(context.summary_path("client"))
matches, comparison_reason = _compare_summaries(
scenario,
server_payload,
client_payload,
)
try:
matches, comparison_reason = _compare_summaries(
scenario,
server_payload,
client_payload,
)
except Exception as err: # noqa: BLE001 - never let one bad case crash the whole matrix run
matches = False
comparison_reason = f"Comparison raised {err.__class__.__name__}: {err}"
if not matches:
status = "failed"
reason = comparison_reason
Expand Down
Loading