mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-02 03:38:42 -07:00
Clients that will be at the ClientProtoInfo protocol level (or above) will now receive an asynchronous INFO protocol when the server they connect to adds a *new* route. This means that when the cluster adds a new server, all clients in the cluster should now be notified of this new addition.
174 lines
4.4 KiB
Go
174 lines
4.4 KiB
Go
// Copyright 2015-2016 Apcera Inc. All rights reserved.
|
|
|
|
package server
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var DefaultOptions = Options{
|
|
Host: "localhost",
|
|
Port: 11222,
|
|
HTTPPort: 11333,
|
|
ClusterPort: 11444,
|
|
ProfPort: 11280,
|
|
NoLog: true,
|
|
NoSigs: true,
|
|
}
|
|
|
|
// New Go Routine based server
|
|
func RunServer(opts *Options) *Server {
|
|
if opts == nil {
|
|
opts = &DefaultOptions
|
|
}
|
|
s := New(opts)
|
|
if s == nil {
|
|
panic("No NATS Server object returned.")
|
|
}
|
|
|
|
// Run server in Go routine.
|
|
go s.Start()
|
|
|
|
end := time.Now().Add(10 * time.Second)
|
|
for time.Now().Before(end) {
|
|
addr := s.GetListenEndpoint()
|
|
if addr == "" {
|
|
time.Sleep(10 * time.Millisecond)
|
|
// Retry. We might take a little while to open a connection.
|
|
continue
|
|
}
|
|
conn, err := net.Dial("tcp", addr)
|
|
if err != nil {
|
|
// Retry after 50ms
|
|
time.Sleep(50 * time.Millisecond)
|
|
continue
|
|
}
|
|
conn.Close()
|
|
// Wait a bit to give a chance to the server to remove this
|
|
// "client" from its state, which may otherwise interfere with
|
|
// some tests.
|
|
time.Sleep(25 * time.Millisecond)
|
|
|
|
return s
|
|
}
|
|
panic("Unable to start NATS Server in Go Routine")
|
|
|
|
}
|
|
|
|
func TestStartupAndShutdown(t *testing.T) {
|
|
s := RunServer(&DefaultOptions)
|
|
defer s.Shutdown()
|
|
|
|
if !s.isRunning() {
|
|
t.Fatal("Could not run server")
|
|
}
|
|
|
|
// Debug stuff.
|
|
numRoutes := s.NumRoutes()
|
|
if numRoutes != 0 {
|
|
t.Fatalf("Expected numRoutes to be 0 vs %d\n", numRoutes)
|
|
}
|
|
|
|
numRemotes := s.NumRemotes()
|
|
if numRemotes != 0 {
|
|
t.Fatalf("Expected numRemotes to be 0 vs %d\n", numRemotes)
|
|
}
|
|
|
|
numClients := s.NumClients()
|
|
if numClients != 0 && numClients != 1 {
|
|
t.Fatalf("Expected numClients to be 1 or 0 vs %d\n", numClients)
|
|
}
|
|
|
|
numSubscriptions := s.NumSubscriptions()
|
|
if numSubscriptions != 0 {
|
|
t.Fatalf("Expected numSubscriptions to be 0 vs %d\n", numSubscriptions)
|
|
}
|
|
}
|
|
|
|
func TestTlsCipher(t *testing.T) {
|
|
if strings.Compare(tlsCipher(0x0005), "TLS_RSA_WITH_RC4_128_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0x000a), "TLS_RSA_WITH_3DES_EDE_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0x002f), "TLS_RSA_WITH_AES_128_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0x0035), "TLS_RSA_WITH_AES_256_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc007), "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc009), "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc00a), "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc011), "TLS_ECDHE_RSA_WITH_RC4_128_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc012), "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc013), "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc014), "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA") != 0 {
|
|
t.Fatalf("IUnknownnvalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc02f), "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc02b), "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc030), "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if strings.Compare(tlsCipher(0xc02c), "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384") != 0 {
|
|
t.Fatalf("Invalid tls cipher")
|
|
}
|
|
if !strings.Contains(tlsCipher(0x9999), "Unknown") {
|
|
t.Fatalf("Expected an unknown cipher.")
|
|
}
|
|
}
|
|
|
|
func TestGetConnectURLs(t *testing.T) {
|
|
opts := DefaultOptions
|
|
opts.Host = "0.0.0.0"
|
|
opts.Port = 4222
|
|
s := New(&opts)
|
|
defer s.Shutdown()
|
|
|
|
urls := s.getClientConnectURLs()
|
|
if len(urls) == 0 {
|
|
t.Fatal("Expected to get a list of urls, got none")
|
|
}
|
|
for _, u := range urls {
|
|
if strings.HasPrefix(u, opts.Host) {
|
|
t.Fatalf("This URL looks wrong: %v", u)
|
|
}
|
|
}
|
|
s.Shutdown()
|
|
|
|
opts.Host = "localhost"
|
|
opts.Port = 4222
|
|
s = New(&opts)
|
|
defer s.Shutdown()
|
|
|
|
expectedURL := "localhost:4222"
|
|
urls = s.getClientConnectURLs()
|
|
if len(urls) == 0 {
|
|
t.Fatal("Expected to get a list of urls, got none")
|
|
}
|
|
if urls[0] != expectedURL {
|
|
t.Fatalf("Expected to get %v, got %v", expectedURL, urls[0])
|
|
}
|
|
}
|