|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
package cluster
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"net"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
@ -22,6 +23,58 @@ func Test_NewServiceOpenClose(t *testing.T) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_SetAPIPeer(t *testing.T) {
|
|
|
|
|
raftAddr, apiAddr := "localhost:4002", "localhost:4001"
|
|
|
|
|
|
|
|
|
|
s, _, ms := mustNewOpenService()
|
|
|
|
|
defer s.Close()
|
|
|
|
|
if err := s.SetPeer(raftAddr, apiAddr); err != nil {
|
|
|
|
|
t.Fatalf("failed to set peer: %s", err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ms.peers[raftAddr] != apiAddr {
|
|
|
|
|
t.Fatalf("peer not set correctly, exp %s, got %s", apiAddr, ms.peers[raftAddr])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_SerAPIPeerNetwork(t *testing.T) {
|
|
|
|
|
t.Skip("service not responding correctly")
|
|
|
|
|
|
|
|
|
|
raftAddr, apiAddr := "localhost:4002", "localhost:4001"
|
|
|
|
|
|
|
|
|
|
s, _, ms := mustNewOpenService()
|
|
|
|
|
defer s.Close()
|
|
|
|
|
|
|
|
|
|
raddr, err := net.ResolveTCPAddr("tcp", s.Addr())
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to resolve remote uster ervice address: %s", err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
conn, err := net.DialTCP("tcp4", nil, raddr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to connect to remote cluster service: %s", err.Error())
|
|
|
|
|
}
|
|
|
|
|
conn.Write([]byte(fmt.Sprintf(`{"%s": "%d"}`, raftAddr, apiAddr)))
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failed to write to remote cluster service: %s", err.Error())
|
|
|
|
|
}
|
|
|
|
|
// XXX Check response
|
|
|
|
|
|
|
|
|
|
if ms.peers[raftAddr] != apiAddr {
|
|
|
|
|
t.Fatalf("peer not set correctly, exp %s, got %s", apiAddr, ms.peers[raftAddr])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func mustNewOpenService() (*Service, *mockListener, *mockStore) {
|
|
|
|
|
ml := mustNewMockListener()
|
|
|
|
|
ms := newMockStore()
|
|
|
|
|
s := NewService(ml, ms)
|
|
|
|
|
if err := s.Open(); err != nil {
|
|
|
|
|
panic("failed to open new service")
|
|
|
|
|
}
|
|
|
|
|
return s, ml, ms
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type mockListener struct {
|
|
|
|
|
ln net.Listener
|
|
|
|
|
}
|
|
|
|
@ -54,6 +107,13 @@ func (ml *mockListener) Dial(addr string, t time.Duration) (net.Conn, error) {
|
|
|
|
|
|
|
|
|
|
type mockStore struct {
|
|
|
|
|
leader string
|
|
|
|
|
peers map[string]string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newMockStore() *mockStore {
|
|
|
|
|
return &mockStore{
|
|
|
|
|
peers: make(map[string]string),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ms *mockStore) Leader() string {
|
|
|
|
@ -61,5 +121,8 @@ func (ms *mockStore) Leader() string {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ms *mockStore) UpdateAPIPeers(peers map[string]string) error {
|
|
|
|
|
for k, v := range peers {
|
|
|
|
|
ms.peers[k] = v
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|