owpengram-server/internal/loadharness/mutate_test.go
2026-09-01 12:06:31 +03:00

123 lines
3.9 KiB
Go

package loadharness
import (
"os"
"path/filepath"
"testing"
"github.com/iamxvbaba/td/tg"
)
func TestPlanOfflineMutationDefaultTopology(t *testing.T) {
dataset, err := PlanDataset(DefaultDatasetConfig(1000))
if err != nil {
t.Fatal(err)
}
plan := planOfflineMutation(dataset)
if got, want := len(plan), 40; got != want {
t.Fatalf("dirty channels = %d, want %d", got, want)
}
total := 0
for _, channel := range plan {
total += channel.Messages
}
if got, want := total, 304; got != want {
t.Fatalf("channel mutations = %d, want %d", got, want)
}
if plan[0].Messages != 120 || dataset.Groups[plan[0].GroupPosition].Tier != "hot" {
t.Fatalf("multi-page channel plan = %+v", plan[0])
}
if plan[1].Messages != 100 {
t.Fatalf("full-page boundary channel plan = %+v", plan[1])
}
group := dataset.Groups[plan[0].GroupPosition]
for message := 0; message < 3; message++ {
if got := offlineMutationSender(group, message); got != group.CreatorAccount {
t.Fatalf("action message %d sender = %d, want creator %d", message, got, group.CreatorAccount)
}
}
}
func TestSentMessageObservation(t *testing.T) {
peer := clientPeerKey{typ: "channel", id: 22}
marker := "marker"
observation, err := sentMessageObservation(&tg.Updates{Updates: []tg.UpdateClass{
&tg.UpdateNewChannelMessage{
Message: &tg.Message{ID: 7, PeerID: &tg.PeerChannel{ChannelID: 22}, Message: marker},
Pts: 12, PtsCount: 1,
},
}}, peer, marker)
if err != nil {
t.Fatal(err)
}
if observation.ID != 7 || observation.Pts != 12 {
t.Fatalf("observation = %+v", observation)
}
short, err := sentMessageObservation(&tg.UpdateShortSentMessage{ID: 8, Pts: 13}, clientPeerKey{typ: "user", id: 1}, "private")
if err != nil || short.ID != 8 || short.Pts != 13 {
t.Fatalf("short observation = %+v err=%v", short, err)
}
if _, err := sentMessageObservation(&tg.Updates{}, peer, marker); err == nil {
t.Fatal("updates without marker passed validation")
}
}
func TestOfflineMutationJournalPersistsMessagesAndActions(t *testing.T) {
dataset, seedState, _ := snapshotFixture(t)
seedIdentity, err := seedIdentitySHA256(seedState)
if err != nil {
t.Fatal(err)
}
plan := planOfflineMutation(dataset)
path := filepath.Join(t.TempDir(), "mutation-state.json")
state, err := loadOrCreateOfflineMutationState(path, dataset, seedIdentity, "baseline", plan)
if err != nil {
t.Fatal(err)
}
journal := &mutationJournal{path: path, dataset: dataset, plan: plan, state: state}
if err := journal.persist(); err != nil {
t.Fatal(err)
}
if err := journal.commitPrivate(0, 10, 20); err != nil {
t.Fatal(err)
}
if err := journal.commitChannelMessage(0, 0, 30, 40); err != nil {
t.Fatal(err)
}
if err := journal.beginAction(0, "edit"); err != nil {
t.Fatal(err)
}
if err := journal.commitAction(0, "edit", 41); err != nil {
t.Fatal(err)
}
loaded, err := loadOrCreateOfflineMutationState(path, dataset, seedIdentity, "baseline", plan)
if err != nil {
t.Fatal(err)
}
if loaded.PrivateMessageIDs[0] != 10 || loaded.AccountObservedPts[0] != 20 || loaded.Channels[0].MessageIDs[0] != 30 || loaded.Channels[0].LatestPts != 41 || !loaded.Channels[0].EditDone || loaded.Channels[0].EditPending {
t.Fatalf("persisted mutation state = %+v", loaded)
}
info, err := os.Stat(path)
if err != nil {
t.Fatal(err)
}
if info.Mode().Perm() != 0o600 {
t.Fatalf("mutation state mode = %o, want 600", info.Mode().Perm())
}
}
func TestOfflineMutationStateRejectsDifferentBaseline(t *testing.T) {
dataset, seedState, _ := snapshotFixture(t)
seedIdentity, err := seedIdentitySHA256(seedState)
if err != nil {
t.Fatal(err)
}
plan := planOfflineMutation(dataset)
state, err := loadOrCreateOfflineMutationState(filepath.Join(t.TempDir(), "missing.json"), dataset, seedIdentity, "baseline-a", plan)
if err != nil {
t.Fatal(err)
}
if err := state.Validate(dataset, seedIdentity, "baseline-b", plan); err == nil {
t.Fatal("mutation state accepted different baseline snapshot")
}
}