p2c_test.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package p2c
  2. import (
  3. "context"
  4. "fmt"
  5. "strconv"
  6. "testing"
  7. "zero/core/logx"
  8. "zero/core/mathx"
  9. "github.com/stretchr/testify/assert"
  10. "google.golang.org/grpc/balancer"
  11. "google.golang.org/grpc/codes"
  12. "google.golang.org/grpc/resolver"
  13. "google.golang.org/grpc/status"
  14. )
  15. func init() {
  16. logx.Disable()
  17. }
  18. func TestP2cPicker_PickNil(t *testing.T) {
  19. builder := new(p2cPickerBuilder)
  20. picker := builder.Build(nil)
  21. _, _, err := picker.Pick(context.Background(), balancer.PickInfo{
  22. FullMethodName: "/",
  23. Ctx: context.Background(),
  24. })
  25. assert.NotNil(t, err)
  26. }
  27. func TestP2cPicker_Pick(t *testing.T) {
  28. tests := []struct {
  29. name string
  30. candidates int
  31. }{
  32. {
  33. name: "single",
  34. candidates: 1,
  35. },
  36. {
  37. name: "multiple",
  38. candidates: 100,
  39. },
  40. }
  41. for _, test := range tests {
  42. t.Run(test.name, func(t *testing.T) {
  43. builder := new(p2cPickerBuilder)
  44. ready := make(map[resolver.Address]balancer.SubConn)
  45. for i := 0; i < test.candidates; i++ {
  46. ready[resolver.Address{
  47. Addr: strconv.Itoa(i),
  48. }] = new(mockClientConn)
  49. }
  50. picker := builder.Build(ready)
  51. for i := 0; i < 10000; i++ {
  52. _, done, err := picker.Pick(context.Background(), balancer.PickInfo{
  53. FullMethodName: "/",
  54. Ctx: context.Background(),
  55. })
  56. assert.Nil(t, err)
  57. if i%100 == 0 {
  58. err = status.Error(codes.DeadlineExceeded, "deadline")
  59. }
  60. done(balancer.DoneInfo{
  61. Err: err,
  62. })
  63. }
  64. dist := make(map[interface{}]int)
  65. conns := picker.(*p2cPicker).conns
  66. for _, conn := range conns {
  67. dist[conn.addr.Addr] = int(conn.requests)
  68. }
  69. entropy := mathx.CalcEntropy(dist)
  70. assert.True(t, entropy > .95, fmt.Sprintf("entropy is %f, less than .95", entropy))
  71. })
  72. }
  73. }
  74. type mockClientConn struct {
  75. }
  76. func (m mockClientConn) UpdateAddresses(addresses []resolver.Address) {
  77. }
  78. func (m mockClientConn) Connect() {
  79. }