--- /dev/null
+package keepclient
+
+import (
+ "fmt"
+ . "gopkg.in/check.v1"
+ "strconv"
+ "strings"
+)
+
+type RootSorterSuite struct{}
+var _ = Suite(&RootSorterSuite{})
+
+func FakeSvcRoot(i uint64) (string) {
+ return fmt.Sprintf("https://%x.svc/", i)
+}
+
+func FakeSvcUuid(i uint64) (string) {
+ return fmt.Sprintf("zzzzz-bi6l4-%015x", i)
+}
+
+func FakeServiceRoots(n uint64) (map[string]string) {
+ sr := map[string]string{}
+ for i := uint64(0); i < n; i ++ {
+ sr[FakeSvcUuid(i)] = FakeSvcRoot(i)
+ }
+ return sr
+}
+
+func (*RootSorterSuite) EmptyRoots(c *C) {
+ rs := NewRootSorter(map[string]string{}, Md5String("foo"))
+ c.Check(rs.GetSortedRoots(), Equals, []string{})
+}
+
+func (*RootSorterSuite) JustOneRoot(c *C) {
+ rs := NewRootSorter(FakeServiceRoots(1), Md5String("foo"))
+ c.Check(rs.GetSortedRoots(), Equals, []string{FakeSvcRoot(0)})
+}
+
+func (*RootSorterSuite) ReferenceSet(c *C) {
+ fakeroots := FakeServiceRoots(16)
+ // These reference probe orders are explained further in
+ // ../../python/tests/test_keep_client.py:
+ expected_orders := []string{
+ "3eab2d5fc9681074",
+ "097dba52e648f1c3",
+ "c5b4e023f8a7d691",
+ "9d81c02e76a3bf54",
+ }
+ for h, expected_order := range expected_orders {
+ hash := Md5String(fmt.Sprintf("%064x", h))
+ roots := NewRootSorter(fakeroots, hash).GetSortedRoots()
+ for i, svc_id_s := range strings.Split(expected_order, "") {
+ svc_id, err := strconv.ParseUint(svc_id_s, 16, 64)
+ c.Assert(err, Equals, nil)
+ c.Check(roots[i], Equals, FakeSvcRoot(svc_id))
+ }
+ }
+}