46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
package session
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestSessionSnapshotsDoNotRaceActivityUpdates(t *testing.T) {
|
|
m := NewManager(time.Minute)
|
|
defer m.Stop()
|
|
proxy := NewProxy(m, "source")
|
|
stored := proxy.CreateSession("remote", map[string]any{"label": "original"})
|
|
readers := []func() []*Session{
|
|
m.GetActiveSessions,
|
|
func() []*Session { return m.GetSessionsBySource("source") },
|
|
func() []*Session { return m.GetActiveSessionsBySource("source") },
|
|
}
|
|
var wg sync.WaitGroup
|
|
wg.Go(func() {
|
|
for range 1000 {
|
|
proxy.UpdateActivity(stored.ID)
|
|
}
|
|
})
|
|
for _, read := range readers {
|
|
for range 100 {
|
|
snapshots := read()
|
|
if len(snapshots) != 1 || snapshots[0] == stored || snapshots[0].InstanceID != "source" {
|
|
t.Errorf("invalid snapshot: %+v", snapshots)
|
|
break
|
|
}
|
|
snapshot := snapshots[0]
|
|
before := snapshot.LastActivity
|
|
proxy.UpdateActivity(stored.ID)
|
|
if !snapshot.LastActivity.Equal(before) {
|
|
t.Error("activity update changed an earlier snapshot")
|
|
}
|
|
snapshot.Metadata["label"] = "changed"
|
|
}
|
|
}
|
|
wg.Wait()
|
|
if stored.Metadata["label"] != "original" {
|
|
t.Fatal("snapshot metadata aliases the stored map")
|
|
}
|
|
}
|