72 lines
2.8 KiB
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)
|
|
}
|
|
}
|
|
}
|