func TestNatsLeaderElection(t *testing.T) { s := test.RunServer(&test.DefaultTestOptions) defer s.Shutdown() toStart := 5 nodes := createNatsNodes(t, "nats_test", toStart) // Do cleanup for _, n := range nodes { defer n.Close() } // Wait for Election expectedClusterState(t, nodes, 1, toStart-1, 0) // Make sure he stays the leader (heartbeat functionality) leader := findLeader(nodes) // Wait for Election timout time.Sleep(MAX_ELECTION_TIMEOUT) if newLeader := findLeader(nodes); newLeader != leader { t.Fatalf("Expected leader to keep power, was %q, now %q\n", leader.Id(), newLeader.Id()) } // Now close the leader, make sure someone else gets elected leader.Close() // Wait for Election expectedClusterState(t, nodes, 1, toStart-2, 0) }
func runMonitorServer(monitorPort int) *server.Server { resetPreviousHTTPConnections() opts := gnatsd.DefaultTestOptions opts.Host = "127.0.0.1" opts.Port = GNATSD_PORT opts.HTTPPort = monitorPort return gnatsd.RunServer(&opts) }
func TestNatsLeaderElection(t *testing.T) { test.RunServer(&test.DefaultTestOptions) toStart := 5 nodes := createNatsNodes(t, "nats_test", toStart) // Do cleanup for _, n := range nodes { defer n.Close() } // Wait for Election time.Sleep(MAX_ELECTION_TIMEOUT) leaders, followers, candidates := countTypes(nodes) if leaders != 1 { t.Fatalf("Expected 1 Leader, got %d\n", leaders) } if followers != toStart-1 { t.Fatalf("Expected %d Followers, got %d\n", toStart-1, followers) } if candidates != 0 { t.Fatalf("Expected 0 Candidates, got %d\n", candidates) } // Make sure he stays the leader (heartbeat functionality) leader := findLeader(nodes) // Wait for Election timout time.Sleep(MAX_ELECTION_TIMEOUT) if newLeader := findLeader(nodes); newLeader != leader { t.Fatalf("Expected leader to keep power, was %q, now %q\n", leader.Id(), newLeader.Id()) } // Now close the leader, make sure someone else gets elected leader.Close() // Wait for Election time.Sleep(MAX_ELECTION_TIMEOUT) leaders, followers, candidates = countTypes(nodes) if leaders != 1 { t.Fatalf("Expected 1 Leader, got %d\n", leaders) } if followers != toStart-2 { t.Fatalf("Expected %d Followers, got %d\n", toStart-2, followers) } if candidates != 0 { t.Fatalf("Expected 0 Candidates, got %d\n", candidates) } }
func (s *gnatsdService) Start() (int, error) { // perform default check opts := gnatsdtest.DefaultTestOptions opts.Port = gnatsd.RANDOM_PORT s.gnatsd = gnatsdtest.RunServer(&opts) addr := s.gnatsd.Addr() _, port, _ := net.SplitHostPort(addr.String()) gnatsdPort, _ := strconv.Atoi(port) return gnatsdPort, nil }
func TestMain(m *testing.M) { var err error gnatsd := test.RunServer(&TestOptions) defer gnatsd.Shutdown() options := DefaultOptions options.Servers = []string{DefaultURL} if gnatsd != nil { bq, err = NewBasicQueue(&options, DefaultEncoder) if err != nil { panic(err) } } else { panic("Could not start NATS queue") } ret := m.Run() os.Exit(ret) }
func RunServerWithOptions(opts server.Options) *server.Server { return gnatsd.RunServer(&opts) }
func Test003ArchiverAcknowledgesStorage(t *testing.T) { cv.Convey("given a running gnatsd, the archiver should store messages to disk and acknowledge their storage on the 'servicename.storage-ack.(hostname)' subject.", t, func() { user := "******" pw := "password" host := "127.0.0.1" port := 4444 serverList := fmt.Sprintf("nats://%v:%v@%v:%v", user, pw, host, port) // start yourself an embedded gnatsd server opts := server.Options{ Host: host, Port: port, Username: user, Password: pw, Trace: true, Debug: true, //NoLog: true, //NoSigs: true, } gnats := gnatsd.RunServer(&opts) gnats.SetLogger(&Logger{}, true, true) //logger := log.New(os.Stderr, "gnatsd: ", log.LUTC|log.Ldate|log.Ltime|log.Lmicroseconds|log.Llongfile) defer func() { p("calling gnats.Shutdown()") gnats.Shutdown() // when done }() addr := fmt.Sprintf("%v:%v", host, port) if !PortIsBound(addr) { panic("port not bound " + addr) } // start client asyncHandler := nats.ErrorHandler(func(c *nats.Conn, s *nats.Subscription, e error) { fmt.Printf("\n *** async error handler sees error: '%s'\n", e) panic(e) }) p("about to connect with client") nc, err := nats.Connect(serverList, asyncHandler) panicOn(err) defer nc.Close() // prep data p("prepping data") streamName := "test" data1 := []byte("data1") tm1, err := time.Parse(time.RFC3339, "2016-01-01T00:00:00Z") panicOn(err) frame1, err := ts.NewFrame(tm1, ts.EvUtf8, 0, 0, data1) panicOn(err) framed, err := frame1.Marshal(nil) panicOn(err) // subscribe to reply in advance of publishing archive request gotAck := make(chan *nats.Msg) nc.Subscribe(ServiceName+".storage-ack.>", func(msgNats *nats.Msg) { p(ServiceName+".storage-ack received msg: '%#v'", msgNats) select { case <-gotAck: // already closed; don't do it again p(ServiceName + ".storage-ack already closed, skipping this time") default: p(ServiceName + ".storage-ack closing gotAck") close(gotAck) } }) // start an archiver to catch our request tmp, err := ioutil.TempDir("", "test-archiver-filemgr") panicOn(err) defer os.RemoveAll(tmp) fm := NewFileMgr(&ArchiverConfig{WriteDir: tmp, ServerList: serverList}) go func() { err := fm.Run() panicOn(err) }() <-fm.Ready p("archiver_test: fm.Ready received") defer fm.Stop() // make the achiving request: write data to server subj := ServiceName + ".archive." + streamName err = nc.Publish(subj, framed) if err != nil { panic(fmt.Errorf("Got an error on nc.Publish(): %+v\n", err)) } nc.Flush() p("Published to subject '%s' %v bytes", subj, len(framed)) reply, err := nc.Request(subj, framed, 1000*time.Millisecond) if err != nil { p("\n ----------->>>>>>> Request got err back: '%s'\n", err) panic(fmt.Errorf("Error in Request: %v\n", err)) } p("003ArchiverAck test sent request, got reply: '%#v' with Data '%s'", reply, string(reply.Data)) cv.So(strings.HasPrefix(reply.Subject, "_INBOX."), cv.ShouldBeTrue) // verify reply or panic after timeout timeout := 2 * time.Second select { case <-gotAck: // cool p("successfully got ack!") case <-time.After(timeout): panic(fmt.Errorf("timeout after %v waiting for reply", timeout)) } }) }