package cluster import ( "net" "testing" "time" ) func Test_NewServiceOpenClose(t *testing.T) { ml := mustNewMockTransport() s := NewService(ml) if s == nil { t.Fatalf("failed to create cluster service") } if err := s.Open(); err != nil { t.Fatalf("failed to open cluster service") } if ml.Addr().String() != s.Addr() { t.Fatalf("service returned incorrect address") } if err := s.Close(); err != nil { t.Fatalf("failed to close cluster service") } } func Test_NewServiceSetGetAPIAddr(t *testing.T) { ml := mustNewMockTransport() s := NewService(ml) if s == nil { t.Fatalf("failed to create cluster service") } if err := s.Open(); err != nil { t.Fatalf("failed to open cluster service") } s.SetAPIAddr("foo") if exp, got := "foo", s.GetAPIAddr(); exp != got { t.Fatalf("got incorrect API address, exp %s, got %s", exp, got) } if err := s.Close(); err != nil { t.Fatalf("failed to close cluster service") } } func Test_NewServiceSetGetNodeAPIAddr(t *testing.T) { ml := mustNewMockTransport() s := NewService(ml) if s == nil { t.Fatalf("failed to create cluster service") } if err := s.Open(); err != nil { t.Fatalf("failed to open cluster service") } s.SetAPIAddr("foo") addr, err := s.GetNodeAPIAddr(s.Addr()) if err != nil { t.Fatalf("failed to get node API address: %s", err) } if addr != "http://foo" { t.Fatalf("failed to get correct node API address, exp %s, got %s", "http://foo", addr) } s.EnableHTTPS(true) addr, err = s.GetNodeAPIAddr(s.Addr()) if err != nil { t.Fatalf("failed to get node API address: %s", err) } if addr != "https://foo" { t.Fatalf("failed to get correct node API address, exp %s, got %s", "https://foo", addr) } if err := s.Close(); err != nil { t.Fatalf("failed to close cluster service") } } type mockTransport struct { tn net.Listener } func mustNewMockTransport() *mockTransport { tn, err := net.Listen("tcp", "localhost:0") if err != nil { panic("failed to create mock listener") } return &mockTransport{ tn: tn, } } func (ml *mockTransport) Accept() (c net.Conn, err error) { return ml.tn.Accept() } func (ml *mockTransport) Addr() net.Addr { return ml.tn.Addr() } func (ml *mockTransport) Close() (err error) { return ml.tn.Close() } func (ml *mockTransport) Dial(addr string, t time.Duration) (net.Conn, error) { return net.DialTimeout("tcp", addr, 5*time.Second) }