// 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() {}