michael@0: // Some unittests (e.g., paste into JS shell) michael@0: var jslib = Cc["@mozilla.org/url-classifier/jslib;1"]. michael@0: getService().wrappedJSObject; michael@0: var _Datenow = jslib.Date.now; michael@0: function setNow(time) { michael@0: jslib.Date.now = function() { michael@0: return time; michael@0: } michael@0: } michael@0: michael@0: function run_test() { michael@0: // 3 errors, 1ms retry period, max 3 requests per ten milliseconds, michael@0: // 5ms backoff interval, 19ms max delay michael@0: var rb = new jslib.RequestBackoff(3, 1, 3, 10, 5, 19); michael@0: setNow(1); michael@0: rb.noteServerResponse(200); michael@0: do_check_true(rb.canMakeRequest()); michael@0: setNow(2); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // First error should trigger a 1ms delay michael@0: rb.noteServerResponse(500); michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 3); michael@0: setNow(3); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // Second error should also trigger a 1ms delay michael@0: rb.noteServerResponse(500); michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 4); michael@0: setNow(4); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // Third error should trigger a 5ms backoff michael@0: rb.noteServerResponse(500); michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 9); michael@0: setNow(9); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // Trigger backoff again michael@0: rb.noteServerResponse(503); michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 19); michael@0: setNow(19); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // Trigger backoff a third time and hit max timeout michael@0: rb.noteServerResponse(302); michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 38); michael@0: setNow(38); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // One more backoff, should still be at the max timeout michael@0: rb.noteServerResponse(400); michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 57); michael@0: setNow(57); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: // Request goes through michael@0: rb.noteServerResponse(200); michael@0: do_check_true(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 0); michael@0: setNow(58); michael@0: rb.noteServerResponse(500); michael@0: michael@0: // Another error, should trigger a 1ms backoff michael@0: do_check_false(rb.canMakeRequest()); michael@0: do_check_eq(rb.nextRequestTime_, 59); michael@0: michael@0: setNow(59); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: setNow(200); michael@0: rb.noteRequest(); michael@0: setNow(201); michael@0: rb.noteRequest(); michael@0: setNow(202); michael@0: do_check_true(rb.canMakeRequest()); michael@0: rb.noteRequest(); michael@0: do_check_false(rb.canMakeRequest()); michael@0: setNow(211); michael@0: do_check_true(rb.canMakeRequest()); michael@0: michael@0: jslib.Date.now = _Datenow; michael@0: }