|
1 // Some unittests (e.g., paste into JS shell) |
|
2 var jslib = Cc["@mozilla.org/url-classifier/jslib;1"]. |
|
3 getService().wrappedJSObject; |
|
4 var _Datenow = jslib.Date.now; |
|
5 function setNow(time) { |
|
6 jslib.Date.now = function() { |
|
7 return time; |
|
8 } |
|
9 } |
|
10 |
|
11 function run_test() { |
|
12 // 3 errors, 1ms retry period, max 3 requests per ten milliseconds, |
|
13 // 5ms backoff interval, 19ms max delay |
|
14 var rb = new jslib.RequestBackoff(3, 1, 3, 10, 5, 19); |
|
15 setNow(1); |
|
16 rb.noteServerResponse(200); |
|
17 do_check_true(rb.canMakeRequest()); |
|
18 setNow(2); |
|
19 do_check_true(rb.canMakeRequest()); |
|
20 |
|
21 // First error should trigger a 1ms delay |
|
22 rb.noteServerResponse(500); |
|
23 do_check_false(rb.canMakeRequest()); |
|
24 do_check_eq(rb.nextRequestTime_, 3); |
|
25 setNow(3); |
|
26 do_check_true(rb.canMakeRequest()); |
|
27 |
|
28 // Second error should also trigger a 1ms delay |
|
29 rb.noteServerResponse(500); |
|
30 do_check_false(rb.canMakeRequest()); |
|
31 do_check_eq(rb.nextRequestTime_, 4); |
|
32 setNow(4); |
|
33 do_check_true(rb.canMakeRequest()); |
|
34 |
|
35 // Third error should trigger a 5ms backoff |
|
36 rb.noteServerResponse(500); |
|
37 do_check_false(rb.canMakeRequest()); |
|
38 do_check_eq(rb.nextRequestTime_, 9); |
|
39 setNow(9); |
|
40 do_check_true(rb.canMakeRequest()); |
|
41 |
|
42 // Trigger backoff again |
|
43 rb.noteServerResponse(503); |
|
44 do_check_false(rb.canMakeRequest()); |
|
45 do_check_eq(rb.nextRequestTime_, 19); |
|
46 setNow(19); |
|
47 do_check_true(rb.canMakeRequest()); |
|
48 |
|
49 // Trigger backoff a third time and hit max timeout |
|
50 rb.noteServerResponse(302); |
|
51 do_check_false(rb.canMakeRequest()); |
|
52 do_check_eq(rb.nextRequestTime_, 38); |
|
53 setNow(38); |
|
54 do_check_true(rb.canMakeRequest()); |
|
55 |
|
56 // One more backoff, should still be at the max timeout |
|
57 rb.noteServerResponse(400); |
|
58 do_check_false(rb.canMakeRequest()); |
|
59 do_check_eq(rb.nextRequestTime_, 57); |
|
60 setNow(57); |
|
61 do_check_true(rb.canMakeRequest()); |
|
62 |
|
63 // Request goes through |
|
64 rb.noteServerResponse(200); |
|
65 do_check_true(rb.canMakeRequest()); |
|
66 do_check_eq(rb.nextRequestTime_, 0); |
|
67 setNow(58); |
|
68 rb.noteServerResponse(500); |
|
69 |
|
70 // Another error, should trigger a 1ms backoff |
|
71 do_check_false(rb.canMakeRequest()); |
|
72 do_check_eq(rb.nextRequestTime_, 59); |
|
73 |
|
74 setNow(59); |
|
75 do_check_true(rb.canMakeRequest()); |
|
76 |
|
77 setNow(200); |
|
78 rb.noteRequest(); |
|
79 setNow(201); |
|
80 rb.noteRequest(); |
|
81 setNow(202); |
|
82 do_check_true(rb.canMakeRequest()); |
|
83 rb.noteRequest(); |
|
84 do_check_false(rb.canMakeRequest()); |
|
85 setNow(211); |
|
86 do_check_true(rb.canMakeRequest()); |
|
87 |
|
88 jslib.Date.now = _Datenow; |
|
89 } |