merged from gramsrv upstream

This commit is contained in:
onysd 2026-09-01 12:06:31 +03:00
parent 79c64ee916
commit 21a0856587
651 changed files with 54774 additions and 4590 deletions

View file

@ -41,7 +41,7 @@ func TestDurableSessionLayerSurvivesRestartAndRejectsOldSelectorRollback(t *test
t.Fatalf("restart restore = (%d,%d,%v,%v)", layer, msgID, found, err)
}
layer, msgID, publish, err := restarted.AdvanceNegotiatedSessionLayerEvidence(ctx, authKeyID, 10, 225, olderID)
if err != nil || layer != 227 || msgID != newerID || !publish {
if err != nil || layer != 227 || msgID != newerID || publish {
t.Fatalf("old selector after restart = (%d,%d,%v,%v)", layer, msgID, publish, err)
}
key, found, err := keys.Get(ctx, authKeyID)
@ -50,6 +50,34 @@ func TestDurableSessionLayerSurvivesRestartAndRejectsOldSelectorRollback(t *test
}
}
func TestDurableSessionLayerSameGenerationSkipsSharedPublication(t *testing.T) {
ctx := context.Background()
keys := memory.NewAuthKeyStore()
authKeyID := [8]byte{1, 0xb3}
if err := keys.Save(ctx, store.AuthKeyData{ID: authKeyID}); err != nil {
t.Fatal(err)
}
now := time.Now().UTC()
msgIDs := proto.NewMessageIDGen(func() time.Time { return now })
firstID := int64(msgIDs.New(proto.MessageFromClient))
secondID := int64(msgIDs.New(proto.MessageFromClient))
r := New(Config{}, Deps{AuthKeySessionLayers: keys}, zaptest.NewLogger(t), clock.System)
if layer, msgID, publish, err := r.AdvanceNegotiatedSessionLayerEvidence(ctx, authKeyID, 11, 227, firstID); err != nil || layer != 227 || msgID != firstID || !publish {
t.Fatalf("first generation = (%d,%d,%v,%v)", layer, msgID, publish, err)
}
first, found, err := keys.GetSessionLayer(ctx, authKeyID, 11)
if err != nil || !found {
t.Fatalf("first row = (%+v,%v,%v)", first, found, err)
}
if layer, msgID, publish, err := r.AdvanceNegotiatedSessionLayerEvidence(ctx, authKeyID, 11, 227, secondID); err != nil || layer != 227 || msgID != secondID || publish {
t.Fatalf("same generation = (%d,%d,%v,%v)", layer, msgID, publish, err)
}
second, found, err := keys.GetSessionLayer(ctx, authKeyID, 11)
if err != nil || !found || second.ObservationID != first.ObservationID {
t.Fatalf("same-generation row = (%+v,%v,%v), first observation %d", second, found, err, first.ObservationID)
}
}
func TestDurableSessionLayerResolveRefreshesStaleRouterFromSharedStore(t *testing.T) {
ctx := context.Background()
keys := memory.NewAuthKeyStore()
@ -94,12 +122,12 @@ func TestDurableSessionLayerFutureProfileCanBeCorrectedByGreaterSelector(t *test
now := time.Now().UTC()
futureID := int64(proto.NewMessageIDGen(func() time.Time { return now }).New(proto.MessageFromClient))
correctID := int64(proto.NewMessageIDGen(func() time.Time { return now.Add(time.Second) }).New(proto.MessageFromClient))
if _, applied, err := keys.AdvanceSessionLayer(ctx, authKeyID, 20, 229, futureID); err != nil || !applied {
if _, applied, err := keys.AdvanceSessionLayer(ctx, authKeyID, 20, 230, futureID); err != nil || !applied {
t.Fatalf("seed future evidence = applied %v err %v", applied, err)
}
r := New(Config{}, Deps{AuthKeySessionLayers: keys}, zaptest.NewLogger(t), clock.System)
layer, msgID, found, err := r.ResolveNegotiatedSessionLayerEvidence(ctx, authKeyID, 20)
if err != nil || !found || layer != 229 || msgID != futureID {
if err != nil || !found || layer != 230 || msgID != futureID {
t.Fatalf("future restore = (%d,%d,%v,%v)", layer, msgID, found, err)
}
if _, _, cached := r.NegotiatedSessionLayerEvidence(authKeyID, 20); cached {
@ -177,6 +205,36 @@ func TestDurableSessionLayerCacheOrdersRebuiltRowsByObservationID(t *testing.T)
}
}
func TestDurableSessionLayerCacheAdvancesHighWaterWithinObservation(t *testing.T) {
now := time.Now().UTC()
r := New(Config{}, Deps{}, zaptest.NewLogger(t), clock.System)
authKeyID := [8]byte{3, 0xc6}
const sessionID = int64(306)
first := store.AuthKeySessionLayer{
Layer: 227, MessageID: 10_000, ObservationID: 10, ExpiresAt: now.Add(time.Minute),
}
if err := r.cacheResolvedDurableSessionLayer(authKeyID, sessionID, first); err != nil {
t.Fatal(err)
}
advanced := first
advanced.MessageID = 20_000
advanced.ExpiresAt = now.Add(2 * time.Minute)
if err := r.cacheResolvedDurableSessionLayer(authKeyID, sessionID, advanced); err != nil {
t.Fatal(err)
}
if layer, msgID, found := r.NegotiatedSessionLayerEvidence(authKeyID, sessionID); !found || layer != 227 || msgID != 20_000 {
t.Fatalf("same-observation advance = (%d,%d,%v)", layer, msgID, found)
}
stale := first
stale.MessageID = 15_000
if err := r.cacheResolvedDurableSessionLayer(authKeyID, sessionID, stale); err != nil {
t.Fatal(err)
}
if layer, msgID, found := r.NegotiatedSessionLayerEvidence(authKeyID, sessionID); !found || layer != 227 || msgID != 20_000 {
t.Fatalf("stale same-observation read rolled cache back = (%d,%d,%v)", layer, msgID, found)
}
}
func TestDurableSessionLayerAvailabilityErrorCarriesStructuralMarker(t *testing.T) {
boom := errors.New("database unavailable")
r := New(Config{}, Deps{AuthKeySessionLayers: unavailableSessionLayerStore{err: boom}}, zaptest.NewLogger(t), clock.System)
@ -201,7 +259,7 @@ func TestDurableInheritedLayerRevalidatesEachNewSession(t *testing.T) {
if layer, found, err := r.ResolveInheritedAuthKeyLayer(ctx, authKeyID); err != nil || !found || layer != 225 {
t.Fatalf("initial default = (%d,%v,%v)", layer, found, err)
}
auth.authKeyClientInfos[authKeyID] = domain.AuthKeyClientInfo{Layer: 229, LayerObservationID: 2}
auth.authKeyClientInfos[authKeyID] = domain.AuthKeyClientInfo{Layer: 230, LayerObservationID: 2}
if layer, found, err := r.ResolveInheritedAuthKeyLayer(ctx, authKeyID); err != nil || !found || layer != 0 {
t.Fatalf("future authoritative default = (%d,%v,%v)", layer, found, err)
}