55 lines
2.4 KiB
Go
55 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"git.ipao.vip/rogee/go-sip/internal/agent"
|
|
"git.ipao.vip/rogee/go-sip/internal/config"
|
|
"git.ipao.vip/rogee/go-sip/internal/rpc"
|
|
)
|
|
|
|
func TestRealAgentRecoveryKeepsResultUntilSessionAndDispatcherConfirm(t *testing.T) {
|
|
root := t.TempDir()
|
|
if err := os.Chmod(root, 0700); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
const dispatcherID = "11111111-1111-4111-8111-111111111111"
|
|
settings := config.AgentEnvironment{DispatcherID: dispatcherID, RecoveryRoot: root, OSSAllowedHost: "oss.example.invalid"}
|
|
journal := agent.ResultJournal{Root: root}
|
|
if err := journal.SaveReady(agent.ResultEntry{SourceEventID: "call-original", DispatcherID: dispatcherID, TenantID: 1, Payload: []byte(`{"recording":{}}`)}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := recoverRealAgentOnce(context.Background(), settings, &isolatedAgentRecordingClient{}, rpc.NewServer(rpc.ServerOptions{})); err == nil {
|
|
t.Fatal("result without an active approved session was incorrectly confirmed")
|
|
}
|
|
files, err := os.ReadDir(filepath.Join(root, ".results"))
|
|
if err != nil || len(files) != 1 {
|
|
t.Fatalf("unconfirmed original result was lost: files=%v err=%v", files, err)
|
|
}
|
|
}
|
|
|
|
func TestRestoredAssetUsesOnlyOriginalRecordingMetadata(t *testing.T) {
|
|
entry := agent.RecordingRecoveryEntry{SourceEventID: "call-original", RecordingID: "recording-original", Bucket: "bucket", ObjectKey: "tenant/original.wav", SizeBytes: 123, SHA256: "digest", ResultPayload: []byte(`{"recording":{"status":"uploaded","bucket":"bucket","object_key":"tenant/original.wav","duration_ms":500,"size_bytes":123,"checksum_sha256":"digest"}}`)}
|
|
asset, err := restoredAsset(entry)
|
|
if err != nil || asset.GetAssetId() != entry.RecordingID || asset.GetDurationMs() != 500 || asset.GetChecksumSha256() != entry.SHA256 {
|
|
t.Fatalf("original recording metadata was changed: asset=%+v err=%v", asset, err)
|
|
}
|
|
entry.ObjectKey = "tenant/different.wav"
|
|
if _, err := restoredAsset(entry); err == nil {
|
|
t.Fatal("a regrant for a different OSS object was accepted")
|
|
}
|
|
}
|
|
|
|
func TestRestoredResultRejectsUnconfirmedOrMismatchedUploads(t *testing.T) {
|
|
payload := []byte(`{"recording":{"status":"uploaded","size_bytes":123,"checksum_sha256":"digest"}}`)
|
|
if validateRestoredResult(payload, nil) == nil {
|
|
t.Fatal("upload without an observed success was accepted")
|
|
}
|
|
if validateRestoredResult([]byte(`{"recording":{}}`), nil) != nil {
|
|
t.Fatal("a genuine no-recording result was rejected")
|
|
}
|
|
}
|