You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
2.9 KiB
Go
128 lines
2.9 KiB
Go
package cluster
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/rqlite/rqlite/rtls"
|
|
"github.com/rqlite/rqlite/tcp"
|
|
"github.com/rqlite/rqlite/testdata/x509"
|
|
)
|
|
|
|
func Test_NewServiceSetGetNodeAPIAddrMuxed(t *testing.T) {
|
|
ln, mux := mustNewMux()
|
|
go mux.Serve()
|
|
tn := mux.Listen(1) // Could be any byte value.
|
|
|
|
s := New(tn, mustNewMockDatabase(), mustNewMockManager(), mustNewMockCredentialStore())
|
|
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")
|
|
|
|
c := NewClient(mustNewDialer(1, false, false), 30*time.Second)
|
|
|
|
addr, err := c.GetNodeAPIAddr(s.Addr(), 5*time.Second)
|
|
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")
|
|
}
|
|
|
|
if err := ln.Close(); err != nil {
|
|
t.Fatalf("failed to close Mux's listener: %s", err)
|
|
}
|
|
if err := s.Close(); err != nil {
|
|
t.Fatalf("failed to close cluster service")
|
|
}
|
|
}
|
|
|
|
func Test_NewServiceSetGetNodeAPIAddrMuxedTLS(t *testing.T) {
|
|
ln, mux := mustNewTLSMux()
|
|
go mux.Serve()
|
|
tn := mux.Listen(1) // Could be any byte value.
|
|
|
|
s := New(tn, mustNewMockDatabase(), mustNewMockManager(), mustNewMockCredentialStore())
|
|
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")
|
|
|
|
c := NewClient(mustNewDialer(1, true, true), 30*time.Second)
|
|
|
|
addr, err := c.GetNodeAPIAddr(s.Addr(), 5*time.Second)
|
|
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")
|
|
}
|
|
|
|
if err := ln.Close(); err != nil {
|
|
t.Fatalf("failed to close Mux's listener: %s", err)
|
|
}
|
|
if err := s.Close(); err != nil {
|
|
t.Fatalf("failed to close cluster service")
|
|
}
|
|
}
|
|
|
|
func mustNewMux() (net.Listener, *tcp.Mux) {
|
|
ln, err := net.Listen("tcp", "localhost:0")
|
|
if err != nil {
|
|
panic("failed to create mock listener")
|
|
}
|
|
|
|
mux, err := tcp.NewMux(ln, nil)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to create mux: %s", err))
|
|
}
|
|
|
|
return ln, mux
|
|
}
|
|
|
|
func mustNewTLSMux() (net.Listener, *tcp.Mux) {
|
|
ln, err := net.Listen("tcp", "localhost:0")
|
|
if err != nil {
|
|
panic("failed to create mock listener")
|
|
}
|
|
|
|
cert := x509.CertFile("")
|
|
defer os.Remove(cert)
|
|
key := x509.KeyFile("")
|
|
defer os.Remove(key)
|
|
|
|
mux, err := tcp.NewTLSMux(ln, nil, cert, key, "", true, false)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to create TLS mux: %s", err))
|
|
}
|
|
|
|
return ln, mux
|
|
}
|
|
|
|
func mustNewDialer(header byte, remoteEncrypted, skipVerify bool) *tcp.Dialer {
|
|
var tlsConfig *tls.Config
|
|
var err error
|
|
if remoteEncrypted {
|
|
tlsConfig, err = rtls.CreateClientConfig("", "", "", skipVerify)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to create client TLS config: %s", err))
|
|
}
|
|
}
|
|
return tcp.NewDialer(header, tlsConfig)
|
|
}
|