Software /
code /
prosody
Comparison
spec/util_throttle_spec.lua @ 8245:9499db96c032
util.throttle: Fix initial time setting (double accounting the first time) and fractional balance updates (0.1*10 was not the same as 1*1)
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sun, 17 Sep 2017 13:29:14 -0400 |
parent | 8236:4878e4159e12 |
child | 8246:ea2667fc6781 |
comparison
equal
deleted
inserted
replaced
8244:6a27e5f276f7 | 8245:9499db96c032 |
---|---|
10 } | 10 } |
11 | 11 |
12 | 12 |
13 local throttle = require "util.throttle"; | 13 local throttle = require "util.throttle"; |
14 | 14 |
15 describe("util.sasl.scram", function() | 15 describe("util.throttle", function() |
16 describe("#Hi()", function() | 16 describe("#create", function() |
17 it("should work", function() | 17 it("should be created with correct values", function() |
18 now = 5; | |
18 local a = throttle.create(3, 10); | 19 local a = throttle.create(3, 10); |
20 assert.same(a, { balance = 3, max = 3, rate = 0.3, t = 5 }); | |
19 | 21 |
20 assert.are.equal(a:poll(1), true); -- 3 -> 2 | 22 local a = throttle.create(3, 5); |
21 assert.are.equal(a:poll(1), true); -- 2 -> 1 | 23 assert.same(a, { balance = 3, max = 3, rate = 0.6, t = 5 }); |
22 assert.are.equal(a:poll(1), true); -- 1 -> 0 | 24 |
23 assert.are.equal(a:poll(1), false); -- MEEP, out of credits! | 25 local a = throttle.create(1, 1); |
24 later(1); -- ... what about | 26 assert.same(a, { balance = 1, max = 1, rate = 1, t = 5 }); |
25 assert.are.equal(a:poll(1), false); -- now? - Still no! | 27 |
26 later(9); -- Later that day | 28 local a = throttle.create(10, 10); |
27 assert.are.equal(a:poll(1), true); -- Should be back at 3 credits ... 2 | 29 assert.same(a, { balance = 10, max = 10, rate = 1, t = 5 }); |
30 | |
31 local a = throttle.create(10, 1); | |
32 assert.same(a, { balance = 10, max = 10, rate = 10, t = 5 }); | |
33 end); | |
34 end); | |
35 | |
36 describe("#update", function() | |
37 it("does nothing when no time hase passed, even if balance is not full", function() | |
38 now = 5; | |
39 local a = throttle.create(10, 10); | |
40 for i=1,5 do | |
41 a:update(); | |
42 assert.same(a, { balance = 10, max = 10, rate = 1, t = 5 }); | |
43 end | |
44 a.balance = 0; | |
45 for i=1,5 do | |
46 a:update(); | |
47 assert.same(a, { balance = 0, max = 10, rate = 1, t = 5 }); | |
48 end | |
49 end); | |
50 it("updates only time when time passes but balance is full", function() | |
51 now = 5; | |
52 local a = throttle.create(10, 10); | |
53 for i=1,5 do | |
54 later(5); | |
55 a:update(); | |
56 assert.same(a, { balance = 10, max = 10, rate = 1, t = 5 + i*5 }); | |
57 end | |
58 end); | |
59 it("updates balance when balance has room to grow as time passes", function() | |
60 now = 5; | |
61 local a = throttle.create(10, 10); | |
62 a.balance = 0; | |
63 assert.same(a, { balance = 0, max = 10, rate = 1, t = 5 }); | |
64 | |
65 later(1); | |
66 a:update(); | |
67 assert.same(a, { balance = 1, max = 10, rate = 1, t = 6 }); | |
68 | |
69 later(3); | |
70 a:update(); | |
71 assert.same(a, { balance = 4, max = 10, rate = 1, t = 9 }); | |
72 | |
73 later(10); | |
74 a:update(); | |
75 assert.same(a, { balance = 10, max = 10, rate = 1, t = 19 }); | |
76 end); | |
77 it("handles 10 x 0.1s updates the same as 1 x 1s update ", function() | |
78 now = 5; | |
79 local a = throttle.create(1, 1); | |
80 | |
81 a.balance = 0; | |
82 later(1); | |
83 a:update(); | |
84 assert.same(a, { balance = 1, max = 1, rate = 1, t = now }); | |
85 | |
86 a.balance = 0; | |
87 for i=1,10 do | |
88 later(0.1); | |
89 a:update(); | |
90 end | |
91 assert(math.abs(a.balance - 1) < 0.0001); -- incremental updates cause rouding errors | |
92 end); | |
93 end); | |
94 | |
95 -- describe("po") | |
96 | |
97 describe("#poll()", function() | |
98 it("should only allow successful polls until cost is hit", function() | |
99 now = 5; | |
100 | |
101 local a = throttle.create(3, 10); | |
102 assert.same(a, { balance = 3, max = 3, rate = 0.3, t = 5 }); | |
103 | |
104 assert.is_true(a:poll(1)); -- 3 -> 2 | |
105 assert.same(a, { balance = 2, max = 3, rate = 0.3, t = 5 }); | |
106 | |
107 assert.is_true(a:poll(2)); -- 2 -> 1 | |
108 assert.same(a, { balance = 0, max = 3, rate = 0.3, t = 5 }); | |
109 | |
110 assert.is_false(a:poll(1)); -- MEEP, out of credits! | |
111 assert.is_false(a:poll(1)); -- MEEP, out of credits! | |
112 assert.same(a, { balance = 0, max = 3, rate = 0.3, t = 5 }); | |
113 end); | |
114 | |
115 it("should not allow polls more than the cost", function() | |
116 now = 0; | |
117 | |
118 local a = throttle.create(10, 10); | |
119 assert.same(a, { balance = 10, max = 10, rate = 1, t = 0 }); | |
120 | |
121 assert.is_false(a:poll(11)); | |
122 assert.same(a, { balance = 10, max = 10, rate = 1, t = 0 }); | |
123 | |
124 assert.is_true(a:poll(6)); | |
125 assert.same(a, { balance = 4, max = 10, rate = 1, t = 0 }); | |
126 | |
127 assert.is_false(a:poll(5)); | |
128 assert.same(a, { balance = 4, max = 10, rate = 1, t = 0 }); | |
129 | |
130 -- fractional | |
131 assert.is_true(a:poll(3.5)); | |
132 assert.same(a, { balance = 0.5, max = 10, rate = 1, t = 0 }); | |
133 | |
134 assert.is_true(a:poll(0.25)); | |
135 assert.same(a, { balance = 0.25, max = 10, rate = 1, t = 0 }); | |
136 | |
137 assert.is_false(a:poll(0.3)); | |
138 assert.same(a, { balance = 0.25, max = 10, rate = 1, t = 0 }); | |
139 | |
140 assert.is_true(a:poll(0.25)); | |
141 assert.same(a, { balance = 0, max = 10, rate = 1, t = 0 }); | |
142 | |
143 assert.is_false(a:poll(0.1)); | |
144 assert.same(a, { balance = 0, max = 10, rate = 1, t = 0 }); | |
145 | |
146 assert.is_true(a:poll(0)); | |
147 assert.same(a, { balance = 0, max = 10, rate = 1, t = 0 }); | |
28 end); | 148 end); |
29 end); | 149 end); |
30 end); | 150 end); |