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