Files
im_server/loadtest/im-pressure/recorder_test.go
T

56 lines
2.5 KiB
Go

package main
import (
"encoding/json"
"testing"
"time"
)
func TestDeliveryRecorderSummarizesPeerGroupAndDuplicates(t *testing.T) {
recorder := newDeliveryRecorder("run1", "a", 2)
peer := AcceptedMessage{RunID: "run1", Kind: "p2p", ClientMid: "run1-p-b-0001-01", Topic: "p2p-one", Seq: 10,
SenderMachine: "b", SenderIndex: 1, PeerMachine: "a", PeerIndex: 1}
group := AcceptedMessage{RunID: "run1", Kind: "group", ClientMid: "run1-g-b-0001-01", Topic: "grp-one", Seq: 20,
SenderMachine: "b", SenderIndex: 1}
recorder.onData(AccountRecord{Index: 1}, testData(peer, time.Now()))
recorder.onData(AccountRecord{Index: 1}, testData(peer, time.Now()))
recorder.onData(AccountRecord{Index: 1}, testData(group, time.Now()))
summary := recorder.summarize(AgentSummary{}, []AcceptedMessage{peer, group})
if summary.ExpectedPeer != 1 || summary.ReceivedPeer != 1 {
t.Fatalf("peer expected/received = %d/%d", summary.ExpectedPeer, summary.ReceivedPeer)
}
if summary.ExpectedGroup != 2 || summary.ReceivedGroup != 1 || summary.RealtimeLost != 1 {
t.Fatalf("group expected/received/lost = %d/%d/%d", summary.ExpectedGroup, summary.ReceivedGroup, summary.RealtimeLost)
}
if summary.Duplicates != 1 || len(summary.Missing) != 1 || summary.Missing[0].ReceiverIndex != 2 {
t.Fatalf("duplicates=%d missing=%+v", summary.Duplicates, summary.Missing)
}
}
func TestDeliveryRecorderSeparatesHistoryFromRealtime(t *testing.T) {
recorder := newDeliveryRecorder("run1", "a", 1)
message := AcceptedMessage{RunID: "run1", Kind: "p2p", ClientMid: "run1-p-b-0001-01", Topic: "p2p-one", Seq: 10,
SenderMachine: "b", SenderIndex: 1, PeerMachine: "a", PeerIndex: 1}
recorder.beginHistory()
recorder.onData(AccountRecord{Index: 1}, testData(message, time.Now()))
summary := recorder.summarize(AgentSummary{}, []AcceptedMessage{message})
if summary.ReceivedPeer != 0 || summary.RealtimeLost != 1 {
t.Fatalf("history response polluted realtime result: %+v", summary)
}
if !recorder.historyFound(message.ClientMid) {
t.Fatal("history message was not recorded")
}
if got := recorder.countRealtimeLostStored([]AcceptedMessage{message}); got != 1 {
t.Fatalf("realtime lost but persisted=%d", got)
}
}
func testData(message AcceptedMessage, sentAt time.Time) dataPacket {
content, _ := json.Marshal(map[string]any{"run_id": message.RunID, "sent_at_unix_nano": sentAt.UnixNano()})
return dataPacket{Topic: message.Topic, Seq: message.Seq,
Head: map[string]any{"x-im-client-mid": message.ClientMid}, Content: content}
}