blob: d13626883ee895fdd12cd5422f64ede364198b1f [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vsync
import (
"fmt"
"reflect"
"testing"
"time"
"v.io/v23/discovery"
wire "v.io/v23/services/syncbase"
_ "v.io/x/ref/runtime/factories/generic"
)
func TestPeerDiscovery(t *testing.T) {
// Set a large value to prevent the syncer and the peer manager from
// running because this test adds fake neighborhood information.
peerSyncInterval = 1 * time.Hour
peerManagementInterval = 1 * time.Hour
svc := createService(t)
defer destroyService(t, svc)
s := svc.sync
checkPeers := func(peers map[string]uint32, want map[string]*discovery.Advertisement) {
got := s.filterDiscoveryPeers(peers)
if !reflect.DeepEqual(got, want) {
t.Errorf("filterDiscoveryPeers: wrong data: got %v, want %v", got, want)
}
}
peers := map[string]uint32{"a": 0, "b": 1, "c": 2}
checkPeers(peers, nil)
// Add peer neighbors.
svcA := &discovery.Advertisement{
Attributes: discovery.Attributes{wire.DiscoveryAttrPeer: "a"},
Addresses: []string{"aa", "aaa"},
}
svcB := &discovery.Advertisement{
Attributes: discovery.Attributes{wire.DiscoveryAttrPeer: "b"},
Addresses: []string{"bb", "bbb"},
}
s.updateDiscoveryInfo("a", svcA)
s.updateDiscoveryInfo("b", svcB)
checkPeers(peers, map[string]*discovery.Advertisement{"a": svcA, "b": svcB})
checkPeers(map[string]uint32{"x": 0, "y": 1, "z": 2}, map[string]*discovery.Advertisement{})
// Remove a neighbor.
s.updateDiscoveryInfo("a", nil)
checkPeers(peers, map[string]*discovery.Advertisement{"b": svcB})
// Remove the other neighbor.
s.updateDiscoveryInfo("b", nil)
checkPeers(peers, map[string]*discovery.Advertisement{})
}
func TestSyncgroupDiscovery(t *testing.T) {
// Set a large value to prevent the syncer and the peer manager from
// running because this test adds fake neighborhood information.
peerSyncInterval = 1 * time.Hour
peerManagementInterval = 1 * time.Hour
svc := createService(t)
defer destroyService(t, svc)
s := svc.sync
checkSyncgroupAdmins := func(sgName string, want []*discovery.Advertisement) {
dbId := wire.Id{Name: fmt.Sprintf("d%s", sgName), Blessing: "dblessing"}
sgId := wire.Id{Name: sgName, Blessing: "blessing"}
got := s.filterSyncgroupAdmins(dbId, sgId)
g := make(map[*discovery.Advertisement]bool)
for _, e := range got {
g[e] = true
}
w := make(map[*discovery.Advertisement]bool)
for _, e := range want {
w[e] = true
}
if !reflect.DeepEqual(g, w) {
t.Errorf("checkSyncgroupAdmins: wrong data: got %v, want %v", got, want)
}
}
checkSyncgroupAdmins("foo", nil)
// Add syncgroup admin neighbors.
svcA := &discovery.Advertisement{
Attributes: discovery.Attributes{
wire.DiscoveryAttrDatabaseName: "dfoo",
wire.DiscoveryAttrDatabaseBlessing: "dblessing",
wire.DiscoveryAttrSyncgroupName: "foo",
wire.DiscoveryAttrSyncgroupBlessing: "blessing"},
Addresses: []string{"aa", "aaa"},
}
svcB := &discovery.Advertisement{
Attributes: discovery.Attributes{
wire.DiscoveryAttrDatabaseName: "dfoo",
wire.DiscoveryAttrDatabaseBlessing: "dblessing",
wire.DiscoveryAttrSyncgroupName: "foo",
wire.DiscoveryAttrSyncgroupBlessing: "blessing"},
Addresses: []string{"bb", "bbb"},
}
svcC := &discovery.Advertisement{
Attributes: discovery.Attributes{
wire.DiscoveryAttrDatabaseName: "dbar",
wire.DiscoveryAttrDatabaseBlessing: "dblessing",
wire.DiscoveryAttrSyncgroupName: "bar",
wire.DiscoveryAttrSyncgroupBlessing: "blessing"},
Addresses: []string{"cc", "ccc"},
}
s.updateDiscoveryInfo("foo_a", svcA)
s.updateDiscoveryInfo("foo_b", svcB)
s.updateDiscoveryInfo("bar_c", svcC)
checkSyncgroupAdmins("foo", []*discovery.Advertisement{svcA, svcB})
checkSyncgroupAdmins("bar", []*discovery.Advertisement{svcC})
checkSyncgroupAdmins("haha", nil)
// Remove an admin from the "foo" syncgroup.
s.updateDiscoveryInfo("foo_a", nil)
checkSyncgroupAdmins("foo", []*discovery.Advertisement{svcB})
checkSyncgroupAdmins("bar", []*discovery.Advertisement{svcC})
// Remove the other "foo" admin.
s.updateDiscoveryInfo("foo_b", nil)
checkSyncgroupAdmins("foo", nil)
checkSyncgroupAdmins("bar", []*discovery.Advertisement{svcC})
// Remove the other "bar" admin.
s.updateDiscoveryInfo("bar_c", nil)
checkSyncgroupAdmins("bar", nil)
}