@@ -76,3 +76,57 @@ func TestRateControllerRun(t *testing.T) {
76
76
})
77
77
}
78
78
}
79
+
80
+ func TestRateController_StateTransition (t * testing.T ) {
81
+ tcs := []struct {
82
+ name string
83
+ delayStats []DelayStats
84
+ wantStates []state
85
+ }{
86
+ {
87
+ name : "overuse-normal" ,
88
+ delayStats : []DelayStats {{Usage : usageOver }, {Usage : usageNormal }},
89
+ wantStates : []state {stateDecrease , stateHold },
90
+ },
91
+ {
92
+ name : "overuse-underuse" ,
93
+ delayStats : []DelayStats {{Usage : usageOver }, {Usage : usageUnder }},
94
+ wantStates : []state {stateDecrease , stateHold },
95
+ },
96
+ {
97
+ name : "normal" ,
98
+ delayStats : []DelayStats {{Usage : usageNormal }},
99
+ wantStates : []state {stateIncrease },
100
+ },
101
+ {
102
+ name : "under-over" ,
103
+ delayStats : []DelayStats {{Usage : usageUnder }, {Usage : usageOver }},
104
+ wantStates : []state {stateHold , stateDecrease },
105
+ },
106
+ {
107
+ name : "under-normal" ,
108
+ delayStats : []DelayStats {{Usage : usageUnder }, {Usage : usageNormal }},
109
+ wantStates : []state {stateHold , stateIncrease },
110
+ },
111
+ {
112
+ name : "under-under" ,
113
+ delayStats : []DelayStats {{Usage : usageUnder }, {Usage : usageUnder }},
114
+ wantStates : []state {stateHold , stateHold },
115
+ },
116
+ }
117
+
118
+ for _ , tc := range tcs {
119
+ t .Run (tc .name , func (t * testing.T ) {
120
+ rc := newRateController (time .Now , 500_000 , 100_000 , 1_000_000 , func (DelayStats ) {})
121
+ // Call it once to initialize the rate controller
122
+ rc .onDelayStats (DelayStats {})
123
+
124
+ for i , ds := range tc .delayStats {
125
+ rc .onDelayStats (ds )
126
+ if rc .lastState != tc .wantStates [i ] {
127
+ t .Errorf ("expected lastState to be %v but got %v" , tc .wantStates [i ], rc .lastState )
128
+ }
129
+ }
130
+ })
131
+ }
132
+ }
0 commit comments