blob: 85a3c5d087e1425082ea69dbfd4996815b244415 [file] [log] [blame]
// Copyright 2006 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
goog.provide('goog.net.NetworkTesterTest');
goog.setTestOnly('goog.net.NetworkTesterTest');
goog.require('goog.Uri');
goog.require('goog.net.NetworkTester');
goog.require('goog.testing.MockClock');
goog.require('goog.testing.jsunit');
var clock;
function setUp() {
clock = new goog.testing.MockClock(true);
}
function tearDown() {
clock.dispose();
}
function testSuccess() {
// set up the tster
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// simulate the image load and verify
var image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onload.call(null);
assertTrue(handler.dequeue());
assertFalse(tester.isRunning());
}
function testFailure() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// simulate the image failure and verify
var image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onerror.call(null);
assertFalse(handler.dequeue());
assertFalse(tester.isRunning());
}
function testAbort() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// simulate the image abort and verify
var image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onabort.call(null);
assertFalse(handler.dequeue());
assertFalse(tester.isRunning());
}
function testTimeout() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// simulate the image timeout and verify
var image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
clock.tick(10000);
assertFalse(handler.dequeue());
assertFalse(tester.isRunning());
}
function testRetries() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
tester.setNumRetries(1);
assertEquals(tester.getAttemptCount(), 0);
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
assertEquals(tester.getAttemptCount(), 1);
// try number 1 fails
var image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onerror.call(null);
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
assertEquals(tester.getAttemptCount(), 2);
// try number 2 succeeds
image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onload.call(null);
assertTrue(handler.dequeue());
assertFalse(tester.isRunning());
assertEquals(tester.getAttemptCount(), 2);
}
function testPauseBetweenRetries() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
tester.setNumRetries(1);
tester.setPauseBetweenRetries(1000);
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// try number 1 fails
var image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onerror.call(null);
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// need to pause 1000 ms for the second attempt
assertNull(tester.image_);
clock.tick(1000);
// try number 2 succeeds
image = tester.image_;
assertEquals(String(tester.getUri()), image.src);
assertTrue(handler.isEmpty());
image.onload.call(null);
assertTrue(handler.dequeue());
assertFalse(tester.isRunning());
}
function testNonDefaultUri() {
var handler = new Handler();
var newUri = new goog.Uri('//www.google.com/images/cleardot2.gif');
var tester = new goog.net.NetworkTester(handler.callback, handler, newUri);
var testerUri = tester.getUri();
assertTrue(testerUri.toString().indexOf('cleardot2') > -1);
}
function testOffline() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
var orgGetNavigatorOffline = goog.net.NetworkTester.getNavigatorOffline_;
goog.net.NetworkTester.getNavigatorOffline_ = function() {
return true;
};
try {
assertFalse(tester.isRunning());
tester.start();
assertTrue(handler.isEmpty());
assertTrue(tester.isRunning());
// the call is done async
clock.tick(1);
assertFalse(handler.dequeue());
assertFalse(tester.isRunning());
} finally {
// Clean up!
goog.net.NetworkTester.getNavigatorOffline_ = orgGetNavigatorOffline;
}
}
// Handler object for verifying callback
function Handler() {
this.events_ = [];
}
function testGetAttemptCount() {
// set up the tester
var handler = new Handler();
var tester = new goog.net.NetworkTester(handler.callback, handler);
assertEquals(tester.getAttemptCount(), 0);
assertTrue(tester.attempt_ === tester.getAttemptCount());
assertFalse(tester.isRunning());
tester.start();
assertTrue(tester.isRunning());
assertTrue(tester.attempt_ === tester.getAttemptCount());
}
Handler.prototype.callback = function(result) {
this.events_.push(result);
};
Handler.prototype.isEmpty = function() {
return this.events_.length == 0;
};
Handler.prototype.dequeue = function() {
if (this.isEmpty()) {
throw Error('Handler is empty');
}
return this.events_.shift();
};
// override image constructor for test - can't use a real image due to
// async load of images - have to simulate it
function Image() {
}