From 3ee5d2dce2b32cbd2d8481a60d3a4729d5e05ec0 Mon Sep 17 00:00:00 2001 From: Armon Dadgar Date: Thu, 4 Jun 2015 13:26:16 +0200 Subject: [PATCH] nomad: testing status endpoint --- nomad/status_endpoint_test.go | 69 +++++++++++++++++++++++++++++++++++ testutil/wait.go | 18 ++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 nomad/status_endpoint_test.go diff --git a/nomad/status_endpoint_test.go b/nomad/status_endpoint_test.go new file mode 100644 index 000000000..657023162 --- /dev/null +++ b/nomad/status_endpoint_test.go @@ -0,0 +1,69 @@ +package nomad + +import ( + "net" + "net/rpc" + "testing" + "time" + + "github.com/hashicorp/net-rpc-msgpackrpc" + "github.com/hashicorp/nomad/testutil" +) + +func rpcClient(t *testing.T, s *Server) rpc.ClientCodec { + addr := s.config.RPCAddr + conn, err := net.DialTimeout("tcp", addr.String(), time.Second) + if err != nil { + t.Fatalf("err: %v", err) + } + // Write the Consul RPC byte to set the mode + conn.Write([]byte{byte(rpcNomad)}) + return msgpackrpc.NewClientCodec(conn) +} + +func TestStatusPing(t *testing.T) { + s1 := testServer(t, nil) + defer s1.Shutdown() + codec := rpcClient(t, s1) + + arg := struct{}{} + var out struct{} + if err := msgpackrpc.CallWithCodec(codec, "Status.Ping", arg, &out); err != nil { + t.Fatalf("err: %v", err) + } +} + +func TestStatusLeader(t *testing.T) { + s1 := testServer(t, nil) + defer s1.Shutdown() + codec := rpcClient(t, s1) + + rpcFn := func(method string, arg, resp interface{}) error { + return msgpackrpc.CallWithCodec(codec, method, arg, resp) + } + testutil.WaitForLeader(t, rpcFn) + + arg := struct{}{} + var leader string + if err := msgpackrpc.CallWithCodec(codec, "Status.Leader", arg, &leader); err != nil { + t.Fatalf("err: %v", err) + } + if leader == "" { + t.Fatalf("unexpected leader: %v", leader) + } +} + +func TestStatusPeers(t *testing.T) { + s1 := testServer(t, nil) + defer s1.Shutdown() + codec := rpcClient(t, s1) + + arg := struct{}{} + var peers []string + if err := msgpackrpc.CallWithCodec(codec, "Status.Peers", arg, &peers); err != nil { + t.Fatalf("err: %v", err) + } + if len(peers) != 1 { + t.Fatalf("no peers: %v", peers) + } +} diff --git a/testutil/wait.go b/testutil/wait.go index bc3991fca..ef6142c1c 100644 --- a/testutil/wait.go +++ b/testutil/wait.go @@ -1,6 +1,9 @@ package testutil -import "time" +import ( + "testing" + "time" +) type testFn func() (bool, error) type errorFn func(error) @@ -22,3 +25,16 @@ func WaitForResult(test testFn, error errorFn) { } } } + +type rpcFn func(string, interface{}, interface{}) error + +func WaitForLeader(t *testing.T, rpc rpcFn) { + WaitForResult(func() (bool, error) { + args := struct{}{} + var leader string + err := rpc("Status.Leader", args, &leader) + return leader != "", err + }, func(err error) { + t.Fatalf("failed to find leader: %v", err) + }) +}