healthping_result_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package burst_test
  2. import (
  3. "math"
  4. reflect "reflect"
  5. "testing"
  6. "time"
  7. "github.com/v2fly/v2ray-core/v5/app/observatory/burst"
  8. )
  9. func TestHealthPingResults(t *testing.T) {
  10. rtts := []int64{60, 140, 60, 140, 60, 60, 140, 60, 140}
  11. hr := burst.NewHealthPingResult(4, time.Hour)
  12. for _, rtt := range rtts {
  13. hr.Put(time.Duration(rtt))
  14. }
  15. rttFailed := time.Duration(math.MaxInt64)
  16. expected := &burst.HealthPingStats{
  17. All: 4,
  18. Fail: 0,
  19. Deviation: 40,
  20. Average: 100,
  21. Max: 140,
  22. Min: 60,
  23. }
  24. actual := hr.Get()
  25. if !reflect.DeepEqual(expected, actual) {
  26. t.Errorf("expected: %v, actual: %v", expected, actual)
  27. }
  28. hr.Put(rttFailed)
  29. hr.Put(rttFailed)
  30. expected.Fail = 2
  31. actual = hr.Get()
  32. if !reflect.DeepEqual(expected, actual) {
  33. t.Errorf("failed half-failures test, expected: %v, actual: %v", expected, actual)
  34. }
  35. hr.Put(rttFailed)
  36. hr.Put(rttFailed)
  37. expected = &burst.HealthPingStats{
  38. All: 4,
  39. Fail: 4,
  40. Deviation: 0,
  41. Average: 0,
  42. Max: 0,
  43. Min: 0,
  44. }
  45. actual = hr.Get()
  46. if !reflect.DeepEqual(expected, actual) {
  47. t.Errorf("failed all-failures test, expected: %v, actual: %v", expected, actual)
  48. }
  49. }
  50. func TestHealthPingResultsIgnoreOutdated(t *testing.T) {
  51. rtts := []int64{60, 140, 60, 140}
  52. hr := burst.NewHealthPingResult(4, time.Duration(10)*time.Millisecond)
  53. for i, rtt := range rtts {
  54. if i == 2 {
  55. // wait for previous 2 outdated
  56. time.Sleep(time.Duration(10) * time.Millisecond)
  57. }
  58. hr.Put(time.Duration(rtt))
  59. }
  60. hr.Get()
  61. expected := &burst.HealthPingStats{
  62. All: 2,
  63. Fail: 0,
  64. Deviation: 40,
  65. Average: 100,
  66. Max: 140,
  67. Min: 60,
  68. }
  69. actual := hr.Get()
  70. if !reflect.DeepEqual(expected, actual) {
  71. t.Errorf("failed 'half-outdated' test, expected: %v, actual: %v", expected, actual)
  72. }
  73. // wait for all outdated
  74. time.Sleep(time.Duration(10) * time.Millisecond)
  75. expected = &burst.HealthPingStats{
  76. All: 0,
  77. Fail: 0,
  78. Deviation: 0,
  79. Average: 0,
  80. Max: 0,
  81. Min: 0,
  82. }
  83. actual = hr.Get()
  84. if !reflect.DeepEqual(expected, actual) {
  85. t.Errorf("failed 'outdated / not-tested' test, expected: %v, actual: %v", expected, actual)
  86. }
  87. hr.Put(time.Duration(60))
  88. expected = &burst.HealthPingStats{
  89. All: 1,
  90. Fail: 0,
  91. // 1 sample, std=0.5rtt
  92. Deviation: 30,
  93. Average: 60,
  94. Max: 60,
  95. Min: 60,
  96. }
  97. actual = hr.Get()
  98. if !reflect.DeepEqual(expected, actual) {
  99. t.Errorf("expected: %v, actual: %v", expected, actual)
  100. }
  101. }