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  }