github.imxd.top/hashicorp/consul@v1.4.5/agent/consul/stats_fetcher_test.go (about) 1 package consul 2 3 import ( 4 "context" 5 "os" 6 "testing" 7 "time" 8 9 "github.com/hashicorp/consul/agent/metadata" 10 "github.com/hashicorp/consul/testrpc" 11 "github.com/hashicorp/consul/types" 12 ) 13 14 func TestStatsFetcher(t *testing.T) { 15 t.Parallel() 16 dir1, s1 := testServerDCExpect(t, "dc1", 3) 17 defer os.RemoveAll(dir1) 18 defer s1.Shutdown() 19 20 dir2, s2 := testServerDCExpect(t, "dc1", 3) 21 defer os.RemoveAll(dir2) 22 defer s2.Shutdown() 23 24 dir3, s3 := testServerDCExpect(t, "dc1", 3) 25 defer os.RemoveAll(dir3) 26 defer s3.Shutdown() 27 28 joinLAN(t, s2, s1) 29 joinLAN(t, s3, s1) 30 testrpc.WaitForTestAgent(t, s1.RPC, "dc1") 31 testrpc.WaitForTestAgent(t, s2.RPC, "dc1") 32 testrpc.WaitForTestAgent(t, s3.RPC, "dc1") 33 34 members := s1.serfLAN.Members() 35 if len(members) != 3 { 36 t.Fatalf("bad len: %d", len(members)) 37 } 38 39 var servers []*metadata.Server 40 for _, member := range members { 41 ok, server := metadata.IsConsulServer(member) 42 if !ok { 43 t.Fatalf("bad: %#v", member) 44 } 45 servers = append(servers, server) 46 } 47 48 // Do a normal fetch and make sure we get three responses. 49 func() { 50 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 51 defer cancel() 52 stats := s1.statsFetcher.Fetch(ctx, s1.LANMembers()) 53 if len(stats) != 3 { 54 t.Fatalf("bad: %#v", stats) 55 } 56 for id, stat := range stats { 57 switch types.NodeID(id) { 58 case s1.config.NodeID, s2.config.NodeID, s3.config.NodeID: 59 // OK 60 default: 61 t.Fatalf("bad: %s", id) 62 } 63 64 if stat == nil || stat.LastTerm == 0 { 65 t.Fatalf("bad: %#v", stat) 66 } 67 } 68 }() 69 70 // Fake an in-flight request to server 3 and make sure we don't fetch 71 // from it. 72 func() { 73 s1.statsFetcher.inflight[string(s3.config.NodeID)] = struct{}{} 74 defer delete(s1.statsFetcher.inflight, string(s3.config.NodeID)) 75 76 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 77 defer cancel() 78 stats := s1.statsFetcher.Fetch(ctx, s1.LANMembers()) 79 if len(stats) != 2 { 80 t.Fatalf("bad: %#v", stats) 81 } 82 for id, stat := range stats { 83 switch types.NodeID(id) { 84 case s1.config.NodeID, s2.config.NodeID: 85 // OK 86 case s3.config.NodeID: 87 t.Fatalf("bad") 88 default: 89 t.Fatalf("bad: %s", id) 90 } 91 92 if stat == nil || stat.LastTerm == 0 { 93 t.Fatalf("bad: %#v", stat) 94 } 95 } 96 }() 97 }