-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdiscovery_test.go
More file actions
108 lines (95 loc) · 2.3 KB
/
discovery_test.go
File metadata and controls
108 lines (95 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package discovery
import (
"fmt"
"log"
"testing"
"time"
"github.com/juju/testing/checkers"
"github.com/kr/pretty"
"google.golang.org/grpc/naming"
)
const (
registryDir = "/elasticell"
serviceName = "query"
etcdURL = "http://127.0.0.1:2379"
)
var backends = make(map[string]int)
var want = make(map[string]int)
func TestWatcher(t *testing.T) {
var isEqual bool
var err error
var w *EtcdWatcher
if w, err = NewEtcdWatcher(registryDir, serviceName, []string{etcdURL}); err != nil {
t.Fatalf("%+v", err)
}
go watchLoop(t, w)
regs := make(map[int]*EtcdRegistry)
for i := 0; i < 5; i++ {
want[getKeyF(i)] = 0
reg := newRegistry(t, i)
regs[i] = reg
go reg.RegisterLoop()
}
time.Sleep(10 * time.Second)
isEqual, err = checkers.DeepEqual(backends, want)
if !isEqual {
log.Printf("backends %# v\n, want %# v\n", pretty.Formatter(backends), pretty.Formatter(want))
t.Fatalf("backends and want %+v", err)
}
unregister(regs, 2)
time.Sleep(15 * time.Second)
isEqual, err = checkers.DeepEqual(backends, want)
if !isEqual {
log.Printf("backends %# v\n, want %# v\n", pretty.Formatter(backends), pretty.Formatter(want))
t.Fatalf("backends and want %+v", err)
}
//w.Close()
//time.Sleep(10 * time.Second)
}
func newRegistry(t *testing.T, seq int) (reg *EtcdRegistry) {
var err error
opt := Option{
Endpoints: []string{etcdURL},
RegistryDir: registryDir,
ServiceName: serviceName,
NodeID: getKeyF(seq),
NData: NodeData{
"foo": "bar",
},
TTL: int64(10),
}
if reg, err = NewEtcdRegistry(opt); err != nil {
t.Fatalf("%+v", err)
}
return
}
func watchLoop(t *testing.T, w *EtcdWatcher) {
var err error
var updates []*naming.Update
for {
if updates, err = w.Next(); err != nil {
t.Fatalf("%+v", err)
}
log.Printf("updates: %# v", pretty.Formatter(updates))
for _, u := range updates {
switch u.Op {
case naming.Add:
backends[u.Addr] = 0
case naming.Delete:
delete(backends, u.Addr)
default:
t.Fatalf("unrecognized update op: %v", u.Op)
}
}
}
}
func unregister(regs map[int]*EtcdRegistry, seq int) {
regs[seq].Close()
delete(want, getKeyF(seq))
}
func getKey(seq int) string {
return fmt.Sprintf("%s/%s/127.0.0.1:%d", registryDir, serviceName, 8000+seq)
}
func getKeyF(seq int) string {
return fmt.Sprintf("127.0.0.1:%d", 8000+seq)
}