github.com/DerekStrickland/consul@v1.4.5/agent/consul/client_test.go (about)

     1  package consul
     2  
     3  import (
     4  	"bytes"
     5  	"net"
     6  	"os"
     7  	"sync"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/hashicorp/consul/agent/structs"
    12  	"github.com/hashicorp/consul/lib/freeport"
    13  	"github.com/hashicorp/consul/testrpc"
    14  	"github.com/hashicorp/consul/testutil"
    15  	"github.com/hashicorp/consul/testutil/retry"
    16  	"github.com/hashicorp/net-rpc-msgpackrpc"
    17  	"github.com/hashicorp/serf/serf"
    18  	"github.com/stretchr/testify/require"
    19  	"golang.org/x/time/rate"
    20  )
    21  
    22  func testClientConfig(t *testing.T) (string, *Config) {
    23  	dir := testutil.TempDir(t, "consul")
    24  	config := DefaultConfig()
    25  	config.Datacenter = "dc1"
    26  	config.DataDir = dir
    27  	config.NodeName = uniqueNodeName(t.Name())
    28  	config.RPCAddr = &net.TCPAddr{
    29  		IP:   []byte{127, 0, 0, 1},
    30  		Port: freeport.Get(1)[0],
    31  	}
    32  	config.SerfLANConfig.MemberlistConfig.BindAddr = "127.0.0.1"
    33  	config.SerfLANConfig.MemberlistConfig.BindPort = freeport.Get(1)[0]
    34  	config.SerfLANConfig.MemberlistConfig.ProbeTimeout = 200 * time.Millisecond
    35  	config.SerfLANConfig.MemberlistConfig.ProbeInterval = time.Second
    36  	config.SerfLANConfig.MemberlistConfig.GossipInterval = 100 * time.Millisecond
    37  
    38  	return dir, config
    39  }
    40  
    41  func testClient(t *testing.T) (string, *Client) {
    42  	return testClientWithConfig(t, func(c *Config) {
    43  		c.Datacenter = "dc1"
    44  		c.NodeName = uniqueNodeName(t.Name())
    45  	})
    46  }
    47  
    48  func testClientDC(t *testing.T, dc string) (string, *Client) {
    49  	return testClientWithConfig(t, func(c *Config) {
    50  		c.Datacenter = dc
    51  		c.NodeName = uniqueNodeName(t.Name())
    52  	})
    53  }
    54  
    55  func testClientWithConfig(t *testing.T, cb func(c *Config)) (string, *Client) {
    56  	dir, config := testClientConfig(t)
    57  	if cb != nil {
    58  		cb(config)
    59  	}
    60  	client, err := NewClient(config)
    61  	if err != nil {
    62  		t.Fatalf("err: %v", err)
    63  	}
    64  	return dir, client
    65  }
    66  
    67  func TestClient_StartStop(t *testing.T) {
    68  	t.Parallel()
    69  	dir, client := testClient(t)
    70  	defer os.RemoveAll(dir)
    71  
    72  	if err := client.Shutdown(); err != nil {
    73  		t.Fatalf("err: %v", err)
    74  	}
    75  }
    76  
    77  func TestClient_JoinLAN(t *testing.T) {
    78  	t.Parallel()
    79  	dir1, s1 := testServer(t)
    80  	defer os.RemoveAll(dir1)
    81  	defer s1.Shutdown()
    82  
    83  	dir2, c1 := testClient(t)
    84  	defer os.RemoveAll(dir2)
    85  	defer c1.Shutdown()
    86  
    87  	// Try to join
    88  	joinLAN(t, c1, s1)
    89  	retry.Run(t, func(r *retry.R) {
    90  		if got, want := c1.routers.NumServers(), 1; got != want {
    91  			r.Fatalf("got %d servers want %d", got, want)
    92  		}
    93  		if got, want := len(s1.LANMembers()), 2; got != want {
    94  			r.Fatalf("got %d server LAN members want %d", got, want)
    95  		}
    96  		if got, want := len(c1.LANMembers()), 2; got != want {
    97  			r.Fatalf("got %d client LAN members want %d", got, want)
    98  		}
    99  	})
   100  }
   101  
   102  func TestClient_LANReap(t *testing.T) {
   103  	t.Parallel()
   104  	dir1, s1 := testServer(t)
   105  	defer os.RemoveAll(dir1)
   106  
   107  	dir2, c1 := testClientWithConfig(t, func(c *Config) {
   108  		c.Datacenter = "dc1"
   109  		c.SerfFloodInterval = 100 * time.Millisecond
   110  		c.SerfLANConfig.ReconnectTimeout = 250 * time.Millisecond
   111  		c.SerfLANConfig.TombstoneTimeout = 250 * time.Millisecond
   112  		c.SerfLANConfig.ReapInterval = 500 * time.Millisecond
   113  	})
   114  	defer os.RemoveAll(dir2)
   115  	defer c1.Shutdown()
   116  
   117  	// Try to join
   118  	joinLAN(t, c1, s1)
   119  	testrpc.WaitForLeader(t, c1.RPC, "dc1")
   120  
   121  	retry.Run(t, func(r *retry.R) {
   122  		require.Len(r, s1.LANMembers(), 2)
   123  		require.Len(r, c1.LANMembers(), 2)
   124  	})
   125  
   126  	// Check the router has both
   127  	retry.Run(t, func(r *retry.R) {
   128  		server := c1.routers.FindServer()
   129  		require.NotNil(t, server)
   130  		require.Equal(t, s1.config.NodeName, server.Name)
   131  	})
   132  
   133  	// shutdown the second dc
   134  	s1.Shutdown()
   135  
   136  	retry.Run(t, func(r *retry.R) {
   137  		require.Len(r, c1.LANMembers(), 1)
   138  		server := c1.routers.FindServer()
   139  		require.Nil(t, server)
   140  	})
   141  }
   142  
   143  func TestClient_JoinLAN_Invalid(t *testing.T) {
   144  	t.Parallel()
   145  	dir1, s1 := testServer(t)
   146  	defer os.RemoveAll(dir1)
   147  	defer s1.Shutdown()
   148  
   149  	dir2, c1 := testClientDC(t, "other")
   150  	defer os.RemoveAll(dir2)
   151  	defer c1.Shutdown()
   152  
   153  	// Try to join
   154  	if _, err := c1.JoinLAN([]string{joinAddrLAN(s1)}); err == nil {
   155  		t.Fatal("should error")
   156  	}
   157  
   158  	time.Sleep(50 * time.Millisecond)
   159  	if len(s1.LANMembers()) != 1 {
   160  		t.Fatalf("should not join")
   161  	}
   162  	if len(c1.LANMembers()) != 1 {
   163  		t.Fatalf("should not join")
   164  	}
   165  }
   166  
   167  func TestClient_JoinWAN_Invalid(t *testing.T) {
   168  	t.Parallel()
   169  	dir1, s1 := testServer(t)
   170  	defer os.RemoveAll(dir1)
   171  	defer s1.Shutdown()
   172  
   173  	dir2, c1 := testClientDC(t, "dc2")
   174  	defer os.RemoveAll(dir2)
   175  	defer c1.Shutdown()
   176  
   177  	// Try to join
   178  	if _, err := c1.JoinLAN([]string{joinAddrWAN(s1)}); err == nil {
   179  		t.Fatal("should error")
   180  	}
   181  
   182  	time.Sleep(50 * time.Millisecond)
   183  	if len(s1.WANMembers()) != 1 {
   184  		t.Fatalf("should not join")
   185  	}
   186  	if len(c1.LANMembers()) != 1 {
   187  		t.Fatalf("should not join")
   188  	}
   189  }
   190  
   191  func TestClient_RPC(t *testing.T) {
   192  	t.Parallel()
   193  	dir1, s1 := testServer(t)
   194  	defer os.RemoveAll(dir1)
   195  	defer s1.Shutdown()
   196  
   197  	dir2, c1 := testClient(t)
   198  	defer os.RemoveAll(dir2)
   199  	defer c1.Shutdown()
   200  
   201  	// Try an RPC
   202  	var out struct{}
   203  	if err := c1.RPC("Status.Ping", struct{}{}, &out); err != structs.ErrNoServers {
   204  		t.Fatalf("err: %v", err)
   205  	}
   206  
   207  	// Try to join
   208  	joinLAN(t, c1, s1)
   209  
   210  	// Check the members
   211  	if len(s1.LANMembers()) != 2 {
   212  		t.Fatalf("bad len")
   213  	}
   214  
   215  	if len(c1.LANMembers()) != 2 {
   216  		t.Fatalf("bad len")
   217  	}
   218  
   219  	// RPC should succeed
   220  	retry.Run(t, func(r *retry.R) {
   221  		if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil {
   222  			r.Fatal("ping failed", err)
   223  		}
   224  	})
   225  }
   226  
   227  type leaderFailer struct {
   228  	totalCalls int
   229  	onceCalls  int
   230  }
   231  
   232  func (l *leaderFailer) Always(args struct{}, reply *struct{}) error {
   233  	l.totalCalls++
   234  	return structs.ErrNoLeader
   235  }
   236  
   237  func (l *leaderFailer) Once(args struct{}, reply *struct{}) error {
   238  	l.totalCalls++
   239  	l.onceCalls++
   240  
   241  	switch {
   242  	case l.onceCalls == 1:
   243  		return structs.ErrNoLeader
   244  
   245  	default:
   246  		return nil
   247  	}
   248  }
   249  
   250  func TestClient_RPC_Retry(t *testing.T) {
   251  	t.Parallel()
   252  
   253  	dir1, s1 := testServer(t)
   254  	defer os.RemoveAll(dir1)
   255  	defer s1.Shutdown()
   256  
   257  	dir2, c1 := testClientWithConfig(t, func(c *Config) {
   258  		c.Datacenter = "dc1"
   259  		c.NodeName = uniqueNodeName(t.Name())
   260  		c.RPCHoldTimeout = 2 * time.Second
   261  	})
   262  	defer os.RemoveAll(dir2)
   263  	defer c1.Shutdown()
   264  
   265  	joinLAN(t, c1, s1)
   266  	retry.Run(t, func(r *retry.R) {
   267  		var out struct{}
   268  		if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil {
   269  			r.Fatalf("err: %v", err)
   270  		}
   271  	})
   272  
   273  	failer := &leaderFailer{}
   274  	if err := s1.RegisterEndpoint("Fail", failer); err != nil {
   275  		t.Fatalf("err: %v", err)
   276  	}
   277  
   278  	var out struct{}
   279  	if err := c1.RPC("Fail.Always", struct{}{}, &out); !structs.IsErrNoLeader(err) {
   280  		t.Fatalf("err: %v", err)
   281  	}
   282  	if got, want := failer.totalCalls, 2; got < want {
   283  		t.Fatalf("got %d want >= %d", got, want)
   284  	}
   285  	if err := c1.RPC("Fail.Once", struct{}{}, &out); err != nil {
   286  		t.Fatalf("err: %v", err)
   287  	}
   288  	if got, want := failer.onceCalls, 2; got < want {
   289  		t.Fatalf("got %d want >= %d", got, want)
   290  	}
   291  	if got, want := failer.totalCalls, 4; got < want {
   292  		t.Fatalf("got %d want >= %d", got, want)
   293  	}
   294  }
   295  
   296  func TestClient_RPC_Pool(t *testing.T) {
   297  	t.Parallel()
   298  	dir1, s1 := testServer(t)
   299  	defer os.RemoveAll(dir1)
   300  	defer s1.Shutdown()
   301  
   302  	dir2, c1 := testClient(t)
   303  	defer os.RemoveAll(dir2)
   304  	defer c1.Shutdown()
   305  
   306  	// Try to join.
   307  	joinLAN(t, c1, s1)
   308  
   309  	// Wait for both agents to finish joining
   310  	retry.Run(t, func(r *retry.R) {
   311  		if got, want := len(s1.LANMembers()), 2; got != want {
   312  			r.Fatalf("got %d server LAN members want %d", got, want)
   313  		}
   314  		if got, want := len(c1.LANMembers()), 2; got != want {
   315  			r.Fatalf("got %d client LAN members want %d", got, want)
   316  		}
   317  	})
   318  
   319  	// Blast out a bunch of RPC requests at the same time to try to get
   320  	// contention opening new connections.
   321  	var wg sync.WaitGroup
   322  	for i := 0; i < 150; i++ {
   323  		wg.Add(1)
   324  
   325  		go func() {
   326  			defer wg.Done()
   327  			var out struct{}
   328  			retry.Run(t, func(r *retry.R) {
   329  				if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil {
   330  					r.Fatal("ping failed", err)
   331  				}
   332  			})
   333  		}()
   334  	}
   335  
   336  	wg.Wait()
   337  }
   338  
   339  func TestClient_RPC_ConsulServerPing(t *testing.T) {
   340  	t.Parallel()
   341  	var servers []*Server
   342  	var serverDirs []string
   343  	const numServers = 5
   344  
   345  	for n := 0; n < numServers; n++ {
   346  		bootstrap := n == 0
   347  		dir, s := testServerDCBootstrap(t, "dc1", bootstrap)
   348  		defer os.RemoveAll(dir)
   349  		defer s.Shutdown()
   350  
   351  		servers = append(servers, s)
   352  		serverDirs = append(serverDirs, dir)
   353  	}
   354  
   355  	const numClients = 1
   356  	clientDir, c := testClient(t)
   357  	defer os.RemoveAll(clientDir)
   358  	defer c.Shutdown()
   359  
   360  	// Join all servers.
   361  	for _, s := range servers {
   362  		joinLAN(t, c, s)
   363  	}
   364  
   365  	for _, s := range servers {
   366  		retry.Run(t, func(r *retry.R) { r.Check(wantPeers(s, numServers)) })
   367  	}
   368  
   369  	// Sleep to allow Serf to sync, shuffle, and let the shuffle complete
   370  	c.routers.ResetRebalanceTimer()
   371  	time.Sleep(time.Second)
   372  
   373  	if len(c.LANMembers()) != numServers+numClients {
   374  		t.Errorf("bad len: %d", len(c.LANMembers()))
   375  	}
   376  	for _, s := range servers {
   377  		if len(s.LANMembers()) != numServers+numClients {
   378  			t.Errorf("bad len: %d", len(s.LANMembers()))
   379  		}
   380  	}
   381  
   382  	// Ping each server in the list
   383  	var pingCount int
   384  	for range servers {
   385  		time.Sleep(200 * time.Millisecond)
   386  		s := c.routers.FindServer()
   387  		ok, err := c.connPool.Ping(s.Datacenter, s.Addr, s.Version, s.UseTLS)
   388  		if !ok {
   389  			t.Errorf("Unable to ping server %v: %s", s.String(), err)
   390  		}
   391  		pingCount++
   392  
   393  		// Artificially fail the server in order to rotate the server
   394  		// list
   395  		c.routers.NotifyFailedServer(s)
   396  	}
   397  
   398  	if pingCount != numServers {
   399  		t.Errorf("bad len: %d/%d", pingCount, numServers)
   400  	}
   401  }
   402  
   403  func TestClient_RPC_TLS(t *testing.T) {
   404  	t.Parallel()
   405  	dir1, conf1 := testServerConfig(t)
   406  	conf1.VerifyIncoming = true
   407  	conf1.VerifyOutgoing = true
   408  	configureTLS(conf1)
   409  	s1, err := NewServer(conf1)
   410  	if err != nil {
   411  		t.Fatalf("err: %v", err)
   412  	}
   413  	defer os.RemoveAll(dir1)
   414  	defer s1.Shutdown()
   415  
   416  	dir2, conf2 := testClientConfig(t)
   417  	conf2.VerifyOutgoing = true
   418  	configureTLS(conf2)
   419  	c1, err := NewClient(conf2)
   420  	if err != nil {
   421  		t.Fatalf("err: %v", err)
   422  	}
   423  	defer os.RemoveAll(dir2)
   424  	defer c1.Shutdown()
   425  
   426  	// Try an RPC
   427  	var out struct{}
   428  	if err := c1.RPC("Status.Ping", struct{}{}, &out); err != structs.ErrNoServers {
   429  		t.Fatalf("err: %v", err)
   430  	}
   431  
   432  	// Try to join
   433  	joinLAN(t, c1, s1)
   434  
   435  	// Wait for joins to finish/RPC to succeed
   436  	retry.Run(t, func(r *retry.R) {
   437  		if got, want := len(s1.LANMembers()), 2; got != want {
   438  			r.Fatalf("got %d server LAN members want %d", got, want)
   439  		}
   440  		if got, want := len(c1.LANMembers()), 2; got != want {
   441  			r.Fatalf("got %d client LAN members want %d", got, want)
   442  		}
   443  		if err := c1.RPC("Status.Ping", struct{}{}, &out); err != nil {
   444  			r.Fatal("ping failed", err)
   445  		}
   446  	})
   447  }
   448  
   449  func TestClient_RPC_RateLimit(t *testing.T) {
   450  	t.Parallel()
   451  	dir1, conf1 := testServerConfig(t)
   452  	s1, err := NewServer(conf1)
   453  	if err != nil {
   454  		t.Fatalf("err: %v", err)
   455  	}
   456  	defer os.RemoveAll(dir1)
   457  	defer s1.Shutdown()
   458  	testrpc.WaitForLeader(t, s1.RPC, "dc1")
   459  
   460  	dir2, conf2 := testClientConfig(t)
   461  	conf2.RPCRate = 2
   462  	conf2.RPCMaxBurst = 2
   463  	c1, err := NewClient(conf2)
   464  	if err != nil {
   465  		t.Fatalf("err: %v", err)
   466  	}
   467  	defer os.RemoveAll(dir2)
   468  	defer c1.Shutdown()
   469  
   470  	joinLAN(t, c1, s1)
   471  	retry.Run(t, func(r *retry.R) {
   472  		var out struct{}
   473  		if err := c1.RPC("Status.Ping", struct{}{}, &out); err != structs.ErrRPCRateExceeded {
   474  			r.Fatalf("err: %v", err)
   475  		}
   476  	})
   477  }
   478  
   479  func TestClient_SnapshotRPC(t *testing.T) {
   480  	t.Parallel()
   481  	dir1, s1 := testServer(t)
   482  	defer os.RemoveAll(dir1)
   483  	defer s1.Shutdown()
   484  
   485  	dir2, c1 := testClient(t)
   486  	defer os.RemoveAll(dir2)
   487  	defer c1.Shutdown()
   488  
   489  	// Wait for the leader
   490  	testrpc.WaitForLeader(t, s1.RPC, "dc1")
   491  
   492  	// Try to join.
   493  	joinLAN(t, c1, s1)
   494  	testrpc.WaitForLeader(t, c1.RPC, "dc1")
   495  
   496  	// Wait until we've got a healthy server.
   497  	retry.Run(t, func(r *retry.R) {
   498  		if got, want := c1.routers.NumServers(), 1; got != want {
   499  			r.Fatalf("got %d servers want %d", got, want)
   500  		}
   501  	})
   502  
   503  	// Take a snapshot.
   504  	var snap bytes.Buffer
   505  	args := structs.SnapshotRequest{
   506  		Datacenter: "dc1",
   507  		Op:         structs.SnapshotSave,
   508  	}
   509  	if err := c1.SnapshotRPC(&args, bytes.NewReader([]byte("")), &snap, nil); err != nil {
   510  		t.Fatalf("err: %v", err)
   511  	}
   512  
   513  	// Restore a snapshot.
   514  	args.Op = structs.SnapshotRestore
   515  	if err := c1.SnapshotRPC(&args, &snap, nil, nil); err != nil {
   516  		t.Fatalf("err: %v", err)
   517  	}
   518  }
   519  
   520  func TestClient_SnapshotRPC_RateLimit(t *testing.T) {
   521  	t.Parallel()
   522  	dir1, s1 := testServer(t)
   523  	defer os.RemoveAll(dir1)
   524  	defer s1.Shutdown()
   525  	testrpc.WaitForLeader(t, s1.RPC, "dc1")
   526  
   527  	dir2, conf1 := testClientConfig(t)
   528  	conf1.RPCRate = 2
   529  	conf1.RPCMaxBurst = 2
   530  	c1, err := NewClient(conf1)
   531  	if err != nil {
   532  		t.Fatalf("err: %v", err)
   533  	}
   534  	defer os.RemoveAll(dir2)
   535  	defer c1.Shutdown()
   536  
   537  	joinLAN(t, c1, s1)
   538  	retry.Run(t, func(r *retry.R) {
   539  		if got, want := c1.routers.NumServers(), 1; got != want {
   540  			r.Fatalf("got %d servers want %d", got, want)
   541  		}
   542  	})
   543  
   544  	retry.Run(t, func(r *retry.R) {
   545  		var snap bytes.Buffer
   546  		args := structs.SnapshotRequest{
   547  			Datacenter: "dc1",
   548  			Op:         structs.SnapshotSave,
   549  		}
   550  		if err := c1.SnapshotRPC(&args, bytes.NewReader([]byte("")), &snap, nil); err != structs.ErrRPCRateExceeded {
   551  			r.Fatalf("err: %v", err)
   552  		}
   553  	})
   554  }
   555  
   556  func TestClient_SnapshotRPC_TLS(t *testing.T) {
   557  	t.Parallel()
   558  	dir1, conf1 := testServerConfig(t)
   559  	conf1.VerifyIncoming = true
   560  	conf1.VerifyOutgoing = true
   561  	configureTLS(conf1)
   562  	s1, err := NewServer(conf1)
   563  	if err != nil {
   564  		t.Fatalf("err: %v", err)
   565  	}
   566  	defer os.RemoveAll(dir1)
   567  	defer s1.Shutdown()
   568  
   569  	dir2, conf2 := testClientConfig(t)
   570  	conf2.VerifyOutgoing = true
   571  	configureTLS(conf2)
   572  	c1, err := NewClient(conf2)
   573  	if err != nil {
   574  		t.Fatalf("err: %v", err)
   575  	}
   576  	defer os.RemoveAll(dir2)
   577  	defer c1.Shutdown()
   578  
   579  	// Wait for the leader
   580  	testrpc.WaitForLeader(t, s1.RPC, "dc1")
   581  
   582  	// Try to join.
   583  	joinLAN(t, c1, s1)
   584  	retry.Run(t, func(r *retry.R) {
   585  		if got, want := len(s1.LANMembers()), 2; got != want {
   586  			r.Fatalf("got %d server members want %d", got, want)
   587  		}
   588  		if got, want := len(c1.LANMembers()), 2; got != want {
   589  			r.Fatalf("got %d client members want %d", got, want)
   590  		}
   591  
   592  		// Wait until we've got a healthy server.
   593  		if got, want := c1.routers.NumServers(), 1; got != want {
   594  			r.Fatalf("got %d servers want %d", got, want)
   595  		}
   596  	})
   597  
   598  	// Take a snapshot.
   599  	var snap bytes.Buffer
   600  	args := structs.SnapshotRequest{
   601  		Datacenter: "dc1",
   602  		Op:         structs.SnapshotSave,
   603  	}
   604  	if err := c1.SnapshotRPC(&args, bytes.NewReader([]byte("")), &snap, nil); err != nil {
   605  		t.Fatalf("err: %v", err)
   606  	}
   607  
   608  	// Restore a snapshot.
   609  	args.Op = structs.SnapshotRestore
   610  	if err := c1.SnapshotRPC(&args, &snap, nil, nil); err != nil {
   611  		t.Fatalf("err: %v", err)
   612  	}
   613  }
   614  
   615  func TestClientServer_UserEvent(t *testing.T) {
   616  	t.Parallel()
   617  	clientOut := make(chan serf.UserEvent, 2)
   618  	dir1, c1 := testClientWithConfig(t, func(conf *Config) {
   619  		conf.UserEventHandler = func(e serf.UserEvent) {
   620  			clientOut <- e
   621  		}
   622  	})
   623  	defer os.RemoveAll(dir1)
   624  	defer c1.Shutdown()
   625  
   626  	serverOut := make(chan serf.UserEvent, 2)
   627  	dir2, s1 := testServerWithConfig(t, func(conf *Config) {
   628  		conf.UserEventHandler = func(e serf.UserEvent) {
   629  			serverOut <- e
   630  		}
   631  	})
   632  	defer os.RemoveAll(dir2)
   633  	defer s1.Shutdown()
   634  
   635  	// Try to join
   636  	joinLAN(t, c1, s1)
   637  
   638  	// Wait for the leader
   639  	testrpc.WaitForLeader(t, s1.RPC, "dc1")
   640  
   641  	// Check the members
   642  	retry.Run(t, func(r *retry.R) {
   643  		if got, want := len(s1.LANMembers()), 2; got != want {
   644  			r.Fatalf("got %d server LAN members want %d", got, want)
   645  		}
   646  		if got, want := len(c1.LANMembers()), 2; got != want {
   647  			r.Fatalf("got %d client LAN members want %d", got, want)
   648  		}
   649  	})
   650  
   651  	// Fire the user event
   652  	codec := rpcClient(t, s1)
   653  	event := structs.EventFireRequest{
   654  		Name:       "foo",
   655  		Datacenter: "dc1",
   656  		Payload:    []byte("baz"),
   657  	}
   658  	if err := msgpackrpc.CallWithCodec(codec, "Internal.EventFire", &event, nil); err != nil {
   659  		t.Fatalf("err: %v", err)
   660  	}
   661  
   662  	// Wait for all the events
   663  	var clientReceived, serverReceived bool
   664  	for i := 0; i < 2; i++ {
   665  		select {
   666  		case e := <-clientOut:
   667  			switch e.Name {
   668  			case "foo":
   669  				clientReceived = true
   670  			default:
   671  				t.Fatalf("Bad: %#v", e)
   672  			}
   673  
   674  		case e := <-serverOut:
   675  			switch e.Name {
   676  			case "foo":
   677  				serverReceived = true
   678  			default:
   679  				t.Fatalf("Bad: %#v", e)
   680  			}
   681  
   682  		case <-time.After(10 * time.Second):
   683  			t.Fatalf("timeout")
   684  		}
   685  	}
   686  
   687  	if !serverReceived || !clientReceived {
   688  		t.Fatalf("missing events")
   689  	}
   690  }
   691  
   692  func TestClient_Encrypted(t *testing.T) {
   693  	t.Parallel()
   694  	dir1, c1 := testClient(t)
   695  	defer os.RemoveAll(dir1)
   696  	defer c1.Shutdown()
   697  
   698  	key := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
   699  	dir2, c2 := testClientWithConfig(t, func(c *Config) {
   700  		c.SerfLANConfig.MemberlistConfig.SecretKey = key
   701  	})
   702  	defer os.RemoveAll(dir2)
   703  	defer c2.Shutdown()
   704  
   705  	if c1.Encrypted() {
   706  		t.Fatalf("should not be encrypted")
   707  	}
   708  	if !c2.Encrypted() {
   709  		t.Fatalf("should be encrypted")
   710  	}
   711  }
   712  
   713  func TestClient_Reload(t *testing.T) {
   714  	t.Parallel()
   715  	dir1, c := testClientWithConfig(t, func(c *Config) {
   716  		c.RPCRate = 500
   717  		c.RPCMaxBurst = 5000
   718  	})
   719  	defer os.RemoveAll(dir1)
   720  	defer c.Shutdown()
   721  
   722  	limiter := c.rpcLimiter.Load().(*rate.Limiter)
   723  	require.Equal(t, rate.Limit(500), limiter.Limit())
   724  	require.Equal(t, 5000, limiter.Burst())
   725  
   726  	c.config.RPCRate = 1000
   727  	c.config.RPCMaxBurst = 10000
   728  
   729  	require.NoError(t, c.ReloadConfig(c.config))
   730  	limiter = c.rpcLimiter.Load().(*rate.Limiter)
   731  	require.Equal(t, rate.Limit(1000), limiter.Limit())
   732  	require.Equal(t, 10000, limiter.Burst())
   733  }