github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/usagestats/seed_test.go (about) 1 package usagestats 2 3 import ( 4 "context" 5 "fmt" 6 "os" 7 "testing" 8 "time" 9 10 "github.com/go-kit/log" 11 "github.com/grafana/dskit/flagext" 12 "github.com/grafana/dskit/kv" 13 "github.com/grafana/dskit/kv/codec" 14 "github.com/grafana/dskit/kv/memberlist" 15 "github.com/grafana/dskit/services" 16 "github.com/stretchr/testify/require" 17 18 "github.com/grafana/loki/pkg/storage/chunk/client/local" 19 ) 20 21 type dnsProviderMock struct { 22 resolved []string 23 } 24 25 func (p *dnsProviderMock) Resolve(ctx context.Context, addrs []string) error { 26 p.resolved = addrs 27 return nil 28 } 29 30 func (p dnsProviderMock) Addresses() []string { 31 return p.resolved 32 } 33 34 func createMemberlist(t *testing.T, port, memberID int) *memberlist.KV { 35 t.Helper() 36 var cfg memberlist.KVConfig 37 flagext.DefaultValues(&cfg) 38 cfg.TCPTransport = memberlist.TCPTransportConfig{ 39 BindAddrs: []string{"localhost"}, 40 BindPort: 0, 41 } 42 cfg.GossipInterval = 100 * time.Millisecond 43 cfg.GossipNodes = 3 44 cfg.PushPullInterval = 5 * time.Second 45 cfg.NodeName = fmt.Sprintf("Member-%d", memberID) 46 cfg.Codecs = []codec.Codec{JSONCodec} 47 48 mkv := memberlist.NewKV(cfg, log.NewNopLogger(), &dnsProviderMock{}, nil) 49 require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv)) 50 if port != 0 { 51 _, err := mkv.JoinMembers([]string{fmt.Sprintf("127.0.0.1:%d", port)}) 52 require.NoError(t, err, "%s failed to join the cluster: %v", memberID, err) 53 } 54 t.Cleanup(func() { 55 _ = services.StopAndAwaitTerminated(context.TODO(), mkv) 56 }) 57 return mkv 58 } 59 60 func Test_Memberlist(t *testing.T) { 61 stabilityCheckInterval = time.Second 62 63 objectClient, err := local.NewFSObjectClient(local.FSConfig{ 64 Directory: t.TempDir(), 65 }) 66 require.NoError(t, err) 67 result := make(chan *ClusterSeed, 10) 68 69 // create a first memberlist to get a valid listening port. 70 initMKV := createMemberlist(t, 0, -1) 71 72 for i := 0; i < 10; i++ { 73 go func(i int) { 74 leader, err := NewReporter(Config{ 75 Leader: true, 76 Enabled: true, 77 }, kv.Config{ 78 Store: "memberlist", 79 StoreConfig: kv.StoreConfig{ 80 MemberlistKV: func() (*memberlist.KV, error) { 81 return createMemberlist(t, initMKV.GetListeningPort(), i), nil 82 }, 83 }, 84 }, objectClient, log.NewLogfmtLogger(os.Stdout), nil) 85 require.NoError(t, err) 86 leader.init(context.Background()) 87 result <- leader.cluster 88 }(i) 89 } 90 91 var UID []string 92 for i := 0; i < 10; i++ { 93 cluster := <-result 94 require.NotNil(t, cluster) 95 UID = append(UID, cluster.UID) 96 } 97 first := UID[0] 98 for _, uid := range UID { 99 require.Equal(t, first, uid) 100 } 101 }