github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/memberlist/integ_test.go (about) 1 package memberlist 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "testing" 8 "time" 9 ) 10 11 // CheckInteg will skip a test if integration testing is not enabled. 12 func CheckInteg(t *testing.T) { 13 if !IsInteg() { 14 t.SkipNow() 15 } 16 } 17 18 // IsInteg returns a boolean telling you if we're in integ testing mode. 19 func IsInteg() bool { 20 return os.Getenv("INTEG_TESTS") != "" 21 } 22 23 // Tests the memberlist by creating a cluster of 100 nodes 24 // and checking that we get strong convergence of changes. 25 func TestMemberlist_Integ(t *testing.T) { 26 CheckInteg(t) 27 28 num := 16 29 var members []*Memberlist 30 31 secret := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} 32 eventCh := make(chan NodeEvent, num) 33 34 addr := "127.0.0.1" 35 for i := 0; i < num; i++ { 36 c := DefaultLANConfig() 37 c.Name = fmt.Sprintf("%s:%d", addr, 12345+i) 38 c.BindAddr = addr 39 c.BindPort = 12345 + i 40 c.ProbeInterval = 20 * time.Millisecond 41 c.ProbeTimeout = 100 * time.Millisecond 42 c.GossipInterval = 20 * time.Millisecond 43 c.PushPullInterval = 200 * time.Millisecond 44 c.SecretKey = secret 45 c.Logger = log.New(os.Stderr, c.Name, log.LstdFlags) 46 47 if i == 0 { 48 c.Events = &ChannelEventDelegate{eventCh} 49 } 50 51 m, err := Create(c) 52 if err != nil { 53 t.Fatalf("unexpected err: %s", err) 54 } 55 defer m.Shutdown() 56 57 members = append(members, m) 58 59 if i > 0 { 60 last := members[i-1] 61 num, err := m.Join([]string{last.config.Name + "/" + last.config.Name}) 62 if num == 0 || err != nil { 63 t.Fatalf("unexpected err: %s", err) 64 } 65 } 66 } 67 68 // Wait and print debug info 69 breakTimer := time.After(250 * time.Millisecond) 70 WAIT: 71 for { 72 select { 73 case e := <-eventCh: 74 if e.Event == NodeJoin { 75 t.Logf("[DEBUG] Node join: %v (%d)", *e.Node, members[0].NumMembers()) 76 } else { 77 t.Logf("[DEBUG] Node leave: %v (%d)", *e.Node, members[0].NumMembers()) 78 } 79 case <-breakTimer: 80 break WAIT 81 } 82 } 83 84 for idx, m := range members { 85 got := m.NumMembers() 86 if got != num { 87 t.Errorf("bad num members at idx %d. Expected %d. Got %d.", 88 idx, num, got) 89 } 90 } 91 }