Files
go-sip/cmd/sip-go-agent/agent_recovery_test.go
T

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")
}
}