@@ -76,3 +76,57 @@ func TestRateControllerRun(t *testing.T) {
7676 })
7777 }
7878}
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 {DelayStats {Usage : usageOver }, DelayStats {Usage : usageNormal }},
89+ wantStates : []state {stateDecrease , stateHold },
90+ },
91+ {
92+ name : "overuse-underuse" ,
93+ delayStats : []DelayStats {DelayStats {Usage : usageOver }, DelayStats {Usage : usageUnder }},
94+ wantStates : []state {stateDecrease , stateHold },
95+ },
96+ {
97+ name : "normal" ,
98+ delayStats : []DelayStats {DelayStats {Usage : usageNormal }},
99+ wantStates : []state {stateIncrease },
100+ },
101+ {
102+ name : "under-over" ,
103+ delayStats : []DelayStats {DelayStats {Usage : usageUnder }, DelayStats {Usage : usageOver }},
104+ wantStates : []state {stateHold , stateDecrease },
105+ },
106+ {
107+ name : "under-normal" ,
108+ delayStats : []DelayStats {DelayStats {Usage : usageUnder }, DelayStats {Usage : usageNormal }},
109+ wantStates : []state {stateHold , stateIncrease },
110+ },
111+ {
112+ name : "under-under" ,
113+ delayStats : []DelayStats {DelayStats {Usage : usageUnder }, DelayStats {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