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