mirror of
https://github.com/garethgeorge/backrest.git
synced 2026-05-04 03:50:30 +00:00
93becf3e32
Release Please / release-please (push) Has been cancelled
Release Preview / call-reusable-release (push) Has been cancelled
Test / test-nix (push) Has been cancelled
Test / test-win (push) Has been cancelled
Update Restic / update-restic-version (push) Has been cancelled
107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
package syncapi
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/garethgeorge/backrest/gen/go/v1sync"
|
|
"github.com/garethgeorge/backrest/internal/kvstore"
|
|
"github.com/google/go-cmp/cmp"
|
|
"google.golang.org/protobuf/testing/protocmp"
|
|
)
|
|
|
|
func PeerStateManagersForTest(t testing.TB) map[string]PeerStateManager {
|
|
dbpool := kvstore.NewInMemorySqliteDbForKvStore(t)
|
|
t.Cleanup(func() {
|
|
dbpool.Close()
|
|
})
|
|
sqlitepsm, err := NewSqlitePeerStateManager(dbpool)
|
|
if err != nil {
|
|
t.Fatalf("error creating sqlite peer state manager: %s", err)
|
|
}
|
|
return map[string]PeerStateManager{
|
|
"memory": NewInMemoryPeerStateManager(),
|
|
"sqlite": sqlitepsm,
|
|
}
|
|
}
|
|
|
|
func TestPeerStateManager_GetSet(t *testing.T) {
|
|
t.Parallel()
|
|
for name, psm := range PeerStateManagersForTest(t) {
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
keyID := "testKey"
|
|
state := &PeerState{
|
|
InstanceID: "testInstance",
|
|
KeyID: keyID,
|
|
LastHeartbeat: time.Now().Round(time.Millisecond),
|
|
ConnectionState: v1sync.ConnectionState_CONNECTION_STATE_CONNECTED,
|
|
ConnectionStateMessage: "hello world!",
|
|
KnownRepos: map[string]*v1sync.RepoMetadata{
|
|
"repo1": {
|
|
Id: "repo1",
|
|
Guid: "guid1",
|
|
},
|
|
"repo2": {
|
|
Id: "repo2",
|
|
Guid: "guid2",
|
|
},
|
|
},
|
|
KnownPlans: map[string]*v1sync.PlanMetadata{
|
|
"plan1": {
|
|
Id: "plan1",
|
|
},
|
|
},
|
|
}
|
|
psm.SetPeerState(keyID, state)
|
|
gotState := psm.GetPeerState(keyID)
|
|
if diff := cmp.Diff(state, gotState, cmp.AllowUnexported(PeerState{}), protocmp.Transform()); diff != "" {
|
|
t.Errorf("unexpected diff: %v", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPeerStateManager_GetMissing(t *testing.T) {
|
|
t.Parallel()
|
|
for name, psm := range PeerStateManagersForTest(t) {
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
gotState := psm.GetPeerState("missingKey")
|
|
if gotState != nil {
|
|
t.Errorf("expected nil for missing key, got %v", gotState)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPeerStateManager_OnStateChanged(t *testing.T) {
|
|
t.Skip("skipping syncapi tests")
|
|
t.Parallel()
|
|
for name, psm := range PeerStateManagersForTest(t) {
|
|
t.Run(name, func(t *testing.T) {
|
|
t.Parallel()
|
|
keyID := "testKey"
|
|
state := &PeerState{
|
|
LastHeartbeat: time.Now(),
|
|
}
|
|
|
|
ch := psm.OnStateChanged().Subscribe()
|
|
t.Cleanup(func() {
|
|
psm.OnStateChanged().Unsubscribe(ch)
|
|
})
|
|
|
|
psm.SetPeerState(keyID, state)
|
|
|
|
select {
|
|
case changedState := <-ch:
|
|
if diff := cmp.Diff(state, changedState, cmp.AllowUnexported(PeerState{})); diff != "" {
|
|
t.Errorf("unexpected diff: %v", diff)
|
|
}
|
|
case <-time.After(1 * time.Second):
|
|
panic("timeout waiting for state change event")
|
|
}
|
|
})
|
|
}
|
|
}
|