Ctrl K
ComunidadGuías…

internal/store/authkey_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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)
		}
	}
}