owpengram-server/internal/store/authkey_test.go

72 lines
2.8 KiB
Go

package store
import (
"errors"
"testing"
"time"
)
func TestMergeAuthKeyLayerObservations(t *testing.T) {
tests := []struct {
name string
tempLayer int
tempID int64
permLayer int
permID int64
wantLayer int
wantID int64
wantErr error
}{
{name: "temporary newer", tempLayer: 227, tempID: 20, permLayer: 220, permID: 10, wantLayer: 227, wantID: 20},
{name: "permanent newer", tempLayer: 220, tempID: 10, permLayer: 227, permID: 20, wantLayer: 227, wantID: 20},
{name: "equal ordered observation", tempLayer: 225, tempID: 30, permLayer: 225, permID: 30, wantLayer: 225, wantID: 30},
{name: "equal ordered conflict", tempLayer: 220, tempID: 30, permLayer: 227, permID: 30, wantErr: ErrAuthKeySessionLayerConflict},
{name: "legacy permanent wins", tempLayer: 220, permLayer: 227, wantLayer: 227},
{name: "legacy permanent zero wins", tempLayer: 220, wantLayer: 0},
{name: "negative observation", tempLayer: 220, tempID: -1, permLayer: 227, wantErr: ErrAuthKeySessionLayerInvalid},
{name: "ordered zero layer", tempLayer: 0, tempID: 1, permLayer: 227, wantErr: ErrAuthKeySessionLayerInvalid},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gotLayer, gotID, err := MergeAuthKeyLayerObservations(tt.tempLayer, tt.tempID, tt.permLayer, tt.permID)
if tt.wantErr != nil {
if !errors.Is(err, tt.wantErr) {
t.Fatalf("merge error = %v, want %v", err, tt.wantErr)
}
return
}
if err != nil || gotLayer != tt.wantLayer || gotID != tt.wantID {
t.Fatalf("merge = (%d,%d,%v), want (%d,%d,nil)", gotLayer, gotID, err, tt.wantLayer, tt.wantID)
}
})
}
}
func TestAuthKeySessionLayerExpiryIsOwnedByClientMessageID(t *testing.T) {
const (
seconds = int64(2_000_000_000)
fractional = int64(123_456_788) // non-zero and client-owned (mod 4 == 0)
)
msgID := (seconds << 32) | fractional
got, ok := AuthKeySessionLayerExpiry(msgID)
want := time.Unix(seconds, int64(int32(msgID))).UTC().Add(301 * time.Second)
if !ok || !got.Equal(want) {
t.Fatalf("expiry = (%v,%v), want (%v,true)", got, ok, want)
}
for _, invalid := range []int64{0, -4, seconds << 32, msgID + 1, msgID + 3} {
if expiry, ok := AuthKeySessionLayerExpiry(invalid); ok || !expiry.IsZero() {
t.Fatalf("invalid msg_id %d expiry = (%v,%v)", invalid, expiry, ok)
}
}
now := time.Unix(seconds, 0).UTC()
if expiry, ok := AuthKeySessionLayerEvidenceFresh(now, msgID); !ok || !expiry.Equal(want) {
t.Fatalf("fresh evidence = (%v,%v), want (%v,true)", expiry, ok, want)
}
stale := (now.Add(-302*time.Second).Unix() << 32) | 4
tooFuture := (now.Add(31*time.Second).Unix() << 32) | 4
for _, invalid := range []int64{stale, tooFuture} {
if expiry, ok := AuthKeySessionLayerEvidenceFresh(now, invalid); ok || !expiry.IsZero() {
t.Fatalf("out-of-window msg_id %d evidence = (%v,%v)", invalid, expiry, ok)
}
}
}