vote_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package cluster
  2. import (
  3. "fmt"
  4. "sync"
  5. "testing"
  6. "time"
  7. "github.com/gin-gonic/gin"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/network"
  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. port, err := network.GetRandomPort()
  17. if err != nil {
  18. return 0, err
  19. }
  20. go func() {
  21. router.Run(fmt.Sprintf(":%d", port))
  22. }()
  23. return uint16(port), nil
  24. }
  25. func TestVoteIps(t *testing.T) {
  26. // create a health check server
  27. port, err := createSimulationHealthCheckSever()
  28. if err != nil {
  29. t.Errorf("create simulation health check server failed: %v", err)
  30. return
  31. }
  32. cluster, err := createSimulationCluster(2)
  33. if err != nil {
  34. t.Errorf("create simulation cluster failed: %v", err)
  35. return
  36. }
  37. for _, node := range cluster {
  38. node.port = port
  39. }
  40. wg := sync.WaitGroup{}
  41. wg.Add(2)
  42. // wait for all voting processes complete
  43. for _, node := range cluster {
  44. node := node
  45. go func() {
  46. defer wg.Done()
  47. <-node.NotifyVotingCompleted()
  48. }()
  49. }
  50. launchSimulationCluster(cluster, t)
  51. defer closeSimulationCluster(cluster, t)
  52. // wait for all nodes to be ready
  53. wg.Wait()
  54. // wait for all ips to be voted
  55. time.Sleep(time.Second)
  56. for _, node := range cluster {
  57. nodes, err := node.GetNodes()
  58. if err != nil {
  59. t.Errorf("get nodes failed: %v", err)
  60. return
  61. }
  62. for _, node := range nodes {
  63. for _, ip := range node.Ips {
  64. if len(ip.Votes) == 0 {
  65. t.Errorf("vote for ip %s failed", ip.Address)
  66. return
  67. }
  68. }
  69. }
  70. }
  71. }