github.com/maier/nomad@v0.4.1-0.20161110003312-a9e3d0b8549d/client/serverlist_test.go (about) 1 package client 2 3 import ( 4 "log" 5 "os" 6 "strings" 7 "testing" 8 ) 9 10 func TestServerList(t *testing.T) { 11 s := newServerList() 12 13 // New lists should be empty 14 if e := s.all(); len(e) != 0 { 15 t.Fatalf("expected empty list to return an empty list, but received: %+q", e) 16 } 17 18 mklist := func() endpoints { 19 return endpoints{ 20 &endpoint{"b", nil, 1}, 21 &endpoint{"c", nil, 1}, 22 &endpoint{"g", nil, 2}, 23 &endpoint{"d", nil, 1}, 24 &endpoint{"e", nil, 1}, 25 &endpoint{"f", nil, 1}, 26 &endpoint{"h", nil, 2}, 27 &endpoint{"a", nil, 0}, 28 } 29 } 30 s.set(mklist()) 31 32 orig := mklist() 33 all := s.all() 34 if len(all) != len(orig) { 35 t.Fatalf("expected %d endpoints but only have %d", len(orig), len(all)) 36 } 37 38 // Assert list is properly randomized+sorted 39 for i, pri := range []int{0, 1, 1, 1, 1, 1, 2, 2} { 40 if all[i].priority != pri { 41 t.Errorf("expected endpoint %d (%+q) to be priority %d", i, all[i], pri) 42 } 43 } 44 45 // Subsequent sets should reshuffle (try multiple times as they may 46 // shuffle in the same order) 47 tries := 0 48 max := 3 49 for ; tries < max; tries++ { 50 if s.all().String() == s.all().String() { 51 // eek, matched; try again in case we just got unlucky 52 continue 53 } 54 break 55 } 56 if tries == max { 57 t.Fatalf("after %d attempts servers were still not random reshuffled", tries) 58 } 59 60 // Mark an endpoint as failed enough that it should be at the end of the list 61 sa := &endpoint{"a", nil, 0} 62 s.failed(sa) 63 s.failed(sa) 64 s.failed(sa) 65 all2 := s.all() 66 if len(all2) != len(orig) { 67 t.Fatalf("marking should not have changed list length") 68 } 69 if all2[len(all)-1].name != sa.name { 70 t.Fatalf("failed endpoint should be at end of list: %+q", all2) 71 } 72 73 // But if the bad endpoint succeeds even once it should be bumped to the top group 74 s.good(sa) 75 found := false 76 for _, e := range s.all() { 77 if e.name == sa.name { 78 if e.priority != 0 { 79 t.Fatalf("server newly marked good should have highest priority") 80 } 81 found = true 82 } 83 } 84 if !found { 85 t.Fatalf("what happened to endpoint A?!") 86 } 87 } 88 89 // TestClient_ServerList tests client methods that interact with the internal 90 // nomad server list. 91 func TestClient_ServerList(t *testing.T) { 92 // manually create a mostly empty client to avoid spinning up a ton of 93 // goroutines that complicate testing 94 client := Client{servers: newServerList(), logger: log.New(os.Stderr, "", log.Ltime|log.Lshortfile)} 95 96 if s := client.GetServers(); len(s) != 0 { 97 t.Fatalf("expected server lit to be empty but found: %+q", s) 98 } 99 if err := client.SetServers(nil); err != noServersErr { 100 t.Fatalf("expected setting an empty list to return a 'no servers' error but received %v", err) 101 } 102 if err := client.SetServers([]string{"not-a-real-domain.fake"}); err == nil { 103 t.Fatalf("expected setting a bad server to return an error") 104 } 105 if err := client.SetServers([]string{"bad.fake", "127.0.0.1:1234", "127.0.0.1"}); err != nil { 106 t.Fatalf("expected setting at least one good server to succeed but received: %v", err) 107 } 108 s := client.GetServers() 109 if len(s) != 2 { 110 t.Fatalf("expected 2 servers but received: %+q", s) 111 } 112 for _, host := range s { 113 if !strings.HasPrefix(host, "127.0.0.1:") { 114 t.Errorf("expected both servers to be localhost and include port but found: %s", host) 115 } 116 } 117 }