vote_test.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package cluster
  2. import (
  3. "fmt"
  4. "net"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/gin-gonic/gin"
  9. )
  10. func createSimulationHealthCheckSever() (uint16, error) {
  11. gin.SetMode(gin.ReleaseMode)
  12. router := gin.Default()
  13. router.GET("/health/check", func(c *gin.Context) {
  14. c.JSON(200, gin.H{"status": "ok"})
  15. })
  16. listener, err := net.Listen("tcp", ":0")
  17. if err != nil {
  18. return 0, fmt.Errorf("failed to get a random port: %s", err.Error())
  19. }
  20. listener.Close()
  21. port := listener.Addr().(*net.TCPAddr).Port
  22. go func() {
  23. router.Run(fmt.Sprintf(":%d", port))
  24. }()
  25. return uint16(port), nil
  26. }
  27. func TestVoteIps(t *testing.T) {
  28. // create a health check server
  29. port, err := createSimulationHealthCheckSever()
  30. if err != nil {
  31. t.Errorf("create simulation health check server failed: %v", err)
  32. return
  33. }
  34. cluster, err := createSimulationCluster(2)
  35. if err != nil {
  36. t.Errorf("create simulation cluster failed: %v", err)
  37. return
  38. }
  39. for _, node := range cluster {
  40. node.port = port
  41. }
  42. wg := sync.WaitGroup{}
  43. wg.Add(2)
  44. // wait for all voting processes complete
  45. for _, node := range cluster {
  46. node := node
  47. go func() {
  48. defer wg.Done()
  49. <-node.NotifyVotingCompleted()
  50. }()
  51. }
  52. launchSimulationCluster(cluster, t)
  53. defer closeSimulationCluster(cluster, t)
  54. // wait for all nodes to be ready
  55. wg.Wait()
  56. // wait for all ips to be voted
  57. time.Sleep(time.Second)
  58. for _, node := range cluster {
  59. nodes, err := node.GetNodes()
  60. if err != nil {
  61. t.Errorf("get nodes failed: %v", err)
  62. return
  63. }
  64. for _, node := range nodes {
  65. for _, ip := range node.Ips {
  66. if len(ip.Votes) == 0 {
  67. t.Errorf("vote for ip %s failed", ip.Address)
  68. return
  69. }
  70. }
  71. }
  72. }
  73. }