/
mock.go
107 lines (88 loc) · 2.28 KB
/
mock.go
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
package etcd
import (
"fmt"
"github.com/coreos/etcd/embed"
"github.com/stretchr/testify/require"
"io/ioutil"
"math/rand"
"net/url"
"os"
"testing"
"time"
"zircon/apis"
"path"
)
const TestingLeaseTimeout = time.Second
func newConfig(dirname string, serverURL string, advertiseURL string) (*embed.Config, error) {
ec := embed.NewConfig()
ec.Logger = "zap"
ec.LogOutputs = []string { path.Join(dirname, "mock.log") }
listenURL, err := url.Parse(serverURL)
if err != nil {
return nil, err
}
clientURL, err := url.Parse(advertiseURL)
if err != nil {
return nil, err
}
ec.TickMs = 1
ec.ElectionMs = 10
ec.LPUrls = []url.URL{*listenURL}
ec.APUrls = []url.URL{*listenURL}
ec.LCUrls = []url.URL{*clientURL}
ec.ACUrls = []url.URL{*clientURL}
ec.Dir = dirname
ec.InitialCluster = ec.InitialClusterFromName(ec.Name)
return ec, ec.Validate()
}
func LaunchTestingEtcdServer() (string, func() error, error) {
dirname, err := ioutil.TempDir("", "etcd.datadir.")
if err != nil {
return "", nil, err
}
defer os.RemoveAll(dirname)
rport := 32768 + rand.Intn(32767)
clientURL := fmt.Sprintf("http://127.0.0.3:%d", rport)
cfg, err := newConfig(dirname, fmt.Sprintf("http://127.0.0.2:%d", rport), clientURL)
if err != nil {
return "", nil, err
}
e, err := embed.StartEtcd(cfg)
if err != nil {
return "", nil, err
}
select {
case <-e.Server.ReadyNotify(): // wait for e.Server to join the cluster
case <-e.Server.StopNotify(): // publish aborted from 'ErrStopped'
}
stopped, errc, err := e.Server.StopNotify(), e.Err(), nil
if err != nil {
return "", nil, err
}
abort := func() error {
e.Close()
select {
case lerr := <-errc:
return lerr
case <-stopped:
return nil
}
}
return clientURL, abort, nil
}
func PrepareSubscribeForTesting(t *testing.T) (subscribe func(local apis.ServerName) (apis.EtcdInterface, func()), teardown func()) {
server, abort, err := LaunchTestingEtcdServer()
require.NoError(t, err)
servers := []apis.ServerAddress{apis.ServerAddress(server)}
return func(local apis.ServerName) (apis.EtcdInterface, func()) {
iface, err := SubscribeEtcd(local, servers)
require.NoError(t, err)
return iface, func() {
err := iface.Close()
require.NoError(t, err)
}
}, func() {
err := abort()
require.NoError(t, err)
}
}