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