summaryrefslogtreecommitdiffstats
path: root/remoting/webapp/unittests/spy_promise.js
diff options
context:
space:
mode:
authorkelvinp <kelvinp@chromium.org>2016-02-01 15:55:53 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-01 23:57:10 +0000
commit09fd68866e3c016bd0f0ffca096039a22e235a60 (patch)
tree1ac04997bd95564cd68895b70a8177abbc1bda54 /remoting/webapp/unittests/spy_promise.js
parent809dc5d993e19b5b3784efed496e4d50c0510c44 (diff)
downloadchromium_src-09fd68866e3c016bd0f0ffca096039a22e235a60.zip
chromium_src-09fd68866e3c016bd0f0ffca096039a22e235a60.tar.gz
chromium_src-09fd68866e3c016bd0f0ffca096039a22e235a60.tar.bz2
Fix broken remoting webapp javascript unittest.
After forcing tests to fail after a 10 seconds timeout, turns out the spy promise tests are the culprit. I have removed them from our tests as they are originally intended to test XHR's and we now have a better API for that. This CL also fixes a bug in our GN dependency declaration. BUG=582005 Review URL: https://codereview.chromium.org/1653443002 Cr-Commit-Position: refs/heads/master@{#372825}
Diffstat (limited to 'remoting/webapp/unittests/spy_promise.js')
-rw-r--r--remoting/webapp/unittests/spy_promise.js294
1 files changed, 0 insertions, 294 deletions
diff --git a/remoting/webapp/unittests/spy_promise.js b/remoting/webapp/unittests/spy_promise.js
deleted file mode 100644
index fb0894a..0000000
--- a/remoting/webapp/unittests/spy_promise.js
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-/** @suppress {duplicate} */
-var base = base || {};
-
-(function() {
-/**
- * A wrapper around a Promise object that keeps track of all
- * outstanding promises. This function is written to serve as a
- * drop-in replacement for the native Promise constructor. To create
- * a SpyPromise from an existing native Promise, use
- * SpyPromise.resolve.
- *
- * Note that this is a pseudo-constructor that actually returns a
- * regular promise with appropriate handlers attached. This detail
- * should be transparent when SpyPromise.activate has been called.
- *
- * The normal way to use this class is within a call to
- * SpyPromise.run, for example:
- *
- * base.SpyPromise.run(function() {
- * myCodeThatUsesPromises();
- * });
- * base.SpyPromise.settleAll().then(function() {
- * console.log('All promises have been settled!');
- * });
- *
- * @constructor
- * @extends {Promise}
- * @param {function(function(?):?, function(*):?):?} func A function
- * of the same type used as an argument to the native Promise
- * constructor, in other words, a function which is called
- * immediately, and whose arguments are a resolve function and a
- * reject function.
- */
-base.SpyPromise = function(func) {
- var unsettled = new RealPromise(func);
- var unsettledId = remember(unsettled);
- return unsettled.then(function(/** * */value) {
- forget(unsettledId);
- return value;
- }, function(error) {
- forget(unsettledId);
- throw error;
- });
-};
-
-/**
- * The real promise constructor. Needed because it is normally hidden
- * by SpyPromise.activate or SpyPromise.run.
- * @const
- */
-var RealPromise = Promise;
-
-/**
- * The real window.setTimeout method. Needed because some test
- * frameworks like to replace this method with a fake implementation.
- * @const
- */
-var realSetTimeout = window.setTimeout.bind(window);
-
-/**
- * The number of unsettled promises.
- * @type {number}
- */
-base.SpyPromise.unsettledCount; // initialized by reset()
-
-/**
- * A collection of all unsettled promises.
- * @type {!Object<number,!Promise>}
- */
-var unsettled; // initialized by reset()
-
-/**
- * A counter used to assign ID numbers to new SpyPromise objects.
- * @type {number}
- */
-var nextPromiseId; // initialized by reset()
-
-/**
- * A promise returned by SpyPromise.settleAll.
- * @type {Promise<null>}
- */
-var settleAllPromise; // initialized by reset()
-
-/**
- * Records an unsettled promise.
- *
- * @param {!Promise} unsettledPromise
- * @return {number} The ID number to be passed to forget_.
- */
-function remember(unsettledPromise) {
- var id = nextPromiseId++;
- if (unsettled[id] != null) {
- throw Error('Duplicate ID: ' + id);
- }
- base.SpyPromise.unsettledCount++;
- unsettled[id] = unsettledPromise;
- return id;
-};
-
-/**
- * Forgets a promise. Called after the promise has been settled.
- *
- * @param {number} id
- * @private
- */
-function forget(id) {
- console.assert(unsettled[id] != null, 'No such Promise: ' + id + '.');
- base.SpyPromise.unsettledCount--;
- delete unsettled[id];
-};
-
-/**
- * Forgets about all unsettled promises.
- */
-base.SpyPromise.reset = function() {
- base.SpyPromise.unsettledCount = 0;
- unsettled = {};
- nextPromiseId = 0;
- settleAllPromise = null;
-};
-
-// Initialize static variables.
-base.SpyPromise.reset();
-
-/**
- * Tries to wait until all promises has been settled.
- *
- * @param {number=} opt_maxTimeMs The maximum number of milliseconds
- * (approximately) to wait (default: 1000).
- * @return {!Promise<null>} A real promise that is resolved when all
- * SpyPromises have been settled, or rejected after opt_maxTimeMs
- * milliseconds have elapsed.
- */
-base.SpyPromise.settleAll = function(opt_maxTimeMs) {
- if (settleAllPromise) {
- return settleAllPromise;
- }
-
- var maxDelay = opt_maxTimeMs == null ? 1000 : opt_maxTimeMs;
-
- /**
- * @param {number} count
- * @param {number} totalDelay
- * @return {!Promise<null>}
- */
- function loop(count, totalDelay) {
- return new RealPromise(function(resolve, reject) {
- if (base.SpyPromise.unsettledCount == 0) {
- settleAllPromise = null;
- resolve(null);
- } else if (totalDelay > maxDelay) {
- settleAllPromise = null;
- base.SpyPromise.reset();
- reject(new Error('base.SpyPromise.settleAll timed out'));
- } else {
- // This implements quadratic backoff according to Euler's
- // triangular number formula.
- var delay = count;
-
- // Must jump through crazy hoops to get a real timer in a unit test.
- realSetTimeout(function() {
- resolve(loop(
- count + 1,
- delay + totalDelay));
- }, delay);
- }
- });
- };
-
- // An extra promise needed here to prevent the loop function from
- // finishing before settleAllPromise is set. If that happens,
- // settleAllPromise will never be reset to null.
- settleAllPromise = RealPromise.resolve().then(function() {
- return loop(0, 0);
- });
- return settleAllPromise;
-};
-
-/**
- * Only for testing this class. Do not use.
- * @returns {boolean} True if settleAll is executing.
- */
-base.SpyPromise.isSettleAllRunning = function() {
- return settleAllPromise != null;
-};
-
-/**
- * Wrapper for Promise.resolve.
- *
- * @param {*} value
- * @return {!base.SpyPromise}
- */
-base.SpyPromise.resolve = function(value) {
- return new base.SpyPromise(function(resolve, reject) {
- resolve(value);
- });
-};
-
-/**
- * Wrapper for Promise.reject.
- *
- * @param {*} value
- * @return {!base.SpyPromise}
- */
-base.SpyPromise.reject = function(value) {
- return new base.SpyPromise(function(resolve, reject) {
- reject(value);
- });
-};
-
-/**
- * Wrapper for Promise.all.
- *
- * @param {!Array<Promise>} promises
- * @return {!base.SpyPromise}
- */
-base.SpyPromise.all = function(promises) {
- return base.SpyPromise.resolve(RealPromise.all(promises));
-};
-
-/**
- * Wrapper for Promise.race.
- *
- * @param {!Array<Promise>} promises
- * @return {!base.SpyPromise}
- */
-base.SpyPromise.race = function(promises) {
- return base.SpyPromise.resolve(RealPromise.race(promises));
-};
-
-/**
- * Sets Promise = base.SpyPromise. Must not be called more than once
- * without an intervening call to restore().
- */
-base.SpyPromise.activate = function() {
- if (settleAllPromise) {
- throw Error('called base.SpyPromise.activate while settleAll is running');
- }
- if (Promise === base.SpyPromise) {
- throw Error('base.SpyPromise is already active');
- }
- Promise = /** @type {function(new:Promise)} */(base.SpyPromise);
-};
-
-/**
- * Restores the original value of Promise.
- */
-base.SpyPromise.restore = function() {
- if (settleAllPromise) {
- throw Error('called base.SpyPromise.restore while settleAll is running');
- }
- if (Promise === base.SpyPromise) {
- Promise = RealPromise;
- } else if (Promise === RealPromise) {
- throw new Error('base.SpyPromise is not active.');
- } else {
- throw new Error('Something fishy is going on.');
- }
-};
-
-/**
- * Calls func with Promise equal to base.SpyPromise.
- *
- * @param {function():void} func A function which is expected to
- * create one or more promises.
- * @param {number=} opt_timeoutMs An optional timeout specifying how
- * long to wait for promise chains started in func to be settled.
- * (default: 1000 ms)
- * @return {!Promise<null>} A promise that is resolved after every
- * promise chain started in func is fully settled, or rejected
- * after a opt_timeoutMs. In any case, the original value of the
- * Promise constructor is restored before this promise is settled.
- */
-base.SpyPromise.run = function(func, opt_timeoutMs) {
- base.SpyPromise.activate();
- try {
- func();
- } finally {
- return base.SpyPromise.settleAll(opt_timeoutMs).then(function() {
- base.SpyPromise.restore();
- return null;
- }, function(error) {
- base.SpyPromise.restore();
- throw error;
- });
- }
-};
-})();