github.com/ryanslade/nomad@v0.2.4-0.20160128061903-fc95782f2089/nomad/server_test.go (about) 1 package nomad 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net" 7 "sync/atomic" 8 "testing" 9 "time" 10 11 "github.com/hashicorp/nomad/testutil" 12 ) 13 14 var nextPort uint32 = 15000 15 16 func getPort() int { 17 return int(atomic.AddUint32(&nextPort, 1)) 18 } 19 20 func tmpDir(t *testing.T) string { 21 dir, err := ioutil.TempDir("", "nomad") 22 if err != nil { 23 t.Fatalf("err: %v", err) 24 } 25 return dir 26 } 27 28 func testServer(t *testing.T, cb func(*Config)) *Server { 29 // Setup the default settings 30 config := DefaultConfig() 31 config.Build = "unittest" 32 config.DevMode = true 33 config.RPCAddr = &net.TCPAddr{ 34 IP: []byte{127, 0, 0, 1}, 35 Port: getPort(), 36 } 37 config.NodeName = fmt.Sprintf("Node %d", config.RPCAddr.Port) 38 39 // Tighten the Serf timing 40 config.SerfConfig.MemberlistConfig.BindAddr = "127.0.0.1" 41 config.SerfConfig.MemberlistConfig.BindPort = getPort() 42 config.SerfConfig.MemberlistConfig.SuspicionMult = 2 43 config.SerfConfig.MemberlistConfig.RetransmitMult = 2 44 config.SerfConfig.MemberlistConfig.ProbeTimeout = 50 * time.Millisecond 45 config.SerfConfig.MemberlistConfig.ProbeInterval = 100 * time.Millisecond 46 config.SerfConfig.MemberlistConfig.GossipInterval = 100 * time.Millisecond 47 48 // Tighten the Raft timing 49 config.RaftConfig.LeaderLeaseTimeout = 50 * time.Millisecond 50 config.RaftConfig.HeartbeatTimeout = 50 * time.Millisecond 51 config.RaftConfig.ElectionTimeout = 50 * time.Millisecond 52 config.RaftTimeout = 500 * time.Millisecond 53 54 // Invoke the callback if any 55 if cb != nil { 56 cb(config) 57 } 58 59 // Enable raft as leader if we have bootstrap on 60 config.RaftConfig.StartAsLeader = !config.DevDisableBootstrap 61 62 // Create server 63 server, err := NewServer(config) 64 if err != nil { 65 t.Fatalf("err: %v", err) 66 } 67 return server 68 } 69 70 func testJoin(t *testing.T, s1 *Server, other ...*Server) { 71 addr := fmt.Sprintf("127.0.0.1:%d", 72 s1.config.SerfConfig.MemberlistConfig.BindPort) 73 for _, s2 := range other { 74 if num, err := s2.Join([]string{addr}); err != nil { 75 t.Fatalf("err: %v", err) 76 } else if num != 1 { 77 t.Fatalf("bad: %d", num) 78 } 79 } 80 } 81 82 func TestServer_RPC(t *testing.T) { 83 s1 := testServer(t, nil) 84 defer s1.Shutdown() 85 86 var out struct{} 87 if err := s1.RPC("Status.Ping", struct{}{}, &out); err != nil { 88 t.Fatalf("err: %v", err) 89 } 90 } 91 92 func TestServer_Regions(t *testing.T) { 93 // Make the servers 94 s1 := testServer(t, func(c *Config) { 95 c.Region = "region1" 96 }) 97 defer s1.Shutdown() 98 99 s2 := testServer(t, func(c *Config) { 100 c.Region = "region2" 101 }) 102 defer s2.Shutdown() 103 104 // Join them together 105 s2Addr := fmt.Sprintf("127.0.0.1:%d", 106 s2.config.SerfConfig.MemberlistConfig.BindPort) 107 if n, err := s1.Join([]string{s2Addr}); err != nil || n != 1 { 108 t.Fatalf("Failed joining: %v (%d joined)", err, n) 109 } 110 111 // Try listing the regions 112 testutil.WaitForResult(func() (bool, error) { 113 out := s1.Regions() 114 if len(out) != 2 || out[0] != "region1" || out[1] != "region2" { 115 return false, fmt.Errorf("unexpected regions: %v", out) 116 } 117 return true, nil 118 }, func(err error) { 119 t.Fatalf("err: %v", err) 120 }) 121 }