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  }