aboutsummaryrefslogtreecommitdiff
path: root/node_modules/selenium-webdriver/test
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/selenium-webdriver/test')
-rw-r--r--node_modules/selenium-webdriver/test/actions_test.js52
-rw-r--r--node_modules/selenium-webdriver/test/chrome/options_test.js227
-rw-r--r--node_modules/selenium-webdriver/test/chrome/service_test.js45
-rw-r--r--node_modules/selenium-webdriver/test/cookie_test.js214
-rw-r--r--node_modules/selenium-webdriver/test/element_finding_test.js426
-rw-r--r--node_modules/selenium-webdriver/test/execute_script_test.js350
-rw-r--r--node_modules/selenium-webdriver/test/fingerprint_test.js62
-rw-r--r--node_modules/selenium-webdriver/test/firefox/extension_test.js96
-rw-r--r--node_modules/selenium-webdriver/test/firefox/firefox_test.js226
-rw-r--r--node_modules/selenium-webdriver/test/firefox/profile_test.js185
-rw-r--r--node_modules/selenium-webdriver/test/http/http_test.js205
-rw-r--r--node_modules/selenium-webdriver/test/http/util_test.js178
-rw-r--r--node_modules/selenium-webdriver/test/io_test.js321
-rw-r--r--node_modules/selenium-webdriver/test/lib/by_test.js160
-rw-r--r--node_modules/selenium-webdriver/test/lib/capabilities_test.js111
-rw-r--r--node_modules/selenium-webdriver/test/lib/error_test.js286
-rw-r--r--node_modules/selenium-webdriver/test/lib/events_test.js177
-rw-r--r--node_modules/selenium-webdriver/test/lib/http_test.js696
-rw-r--r--node_modules/selenium-webdriver/test/lib/logging_test.js272
-rw-r--r--node_modules/selenium-webdriver/test/lib/promise_aplus_test.js78
-rw-r--r--node_modules/selenium-webdriver/test/lib/promise_error_test.js884
-rw-r--r--node_modules/selenium-webdriver/test/lib/promise_flow_test.js2288
-rw-r--r--node_modules/selenium-webdriver/test/lib/promise_generator_test.js310
-rw-r--r--node_modules/selenium-webdriver/test/lib/promise_test.js1109
-rw-r--r--node_modules/selenium-webdriver/test/lib/testutil.js90
-rw-r--r--node_modules/selenium-webdriver/test/lib/until_test.js478
-rw-r--r--node_modules/selenium-webdriver/test/lib/webdriver_test.js2309
-rw-r--r--node_modules/selenium-webdriver/test/logging_test.js167
-rw-r--r--node_modules/selenium-webdriver/test/net/index_test.js60
-rw-r--r--node_modules/selenium-webdriver/test/net/portprober_test.js128
-rw-r--r--node_modules/selenium-webdriver/test/page_loading_test.js172
-rw-r--r--node_modules/selenium-webdriver/test/phantomjs/execute_phantomjs_test.js59
-rw-r--r--node_modules/selenium-webdriver/test/proxy_test.js180
-rw-r--r--node_modules/selenium-webdriver/test/rect_test.js60
-rw-r--r--node_modules/selenium-webdriver/test/remote_test.js117
-rw-r--r--node_modules/selenium-webdriver/test/safari_test.js108
-rw-r--r--node_modules/selenium-webdriver/test/session_test.js54
-rw-r--r--node_modules/selenium-webdriver/test/stale_element_test.js63
-rw-r--r--node_modules/selenium-webdriver/test/tag_name_test.js36
-rw-r--r--node_modules/selenium-webdriver/test/testing/assert_test.js373
-rw-r--r--node_modules/selenium-webdriver/test/testing/index_test.js224
-rw-r--r--node_modules/selenium-webdriver/test/upload_test.js86
-rw-r--r--node_modules/selenium-webdriver/test/window_test.js161
43 files changed, 0 insertions, 13883 deletions
diff --git a/node_modules/selenium-webdriver/test/actions_test.js b/node_modules/selenium-webdriver/test/actions_test.js
deleted file mode 100644
index ef218f7d7..000000000
--- a/node_modules/selenium-webdriver/test/actions_test.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var Browser = require('..').Browser,
- By = require('..').By,
- until = require('..').until,
- test = require('../lib/test'),
- fileServer = require('../lib/test/fileserver');
-
-
-test.suite(function(env) {
- var driver;
- test.beforeEach(function*() { driver = yield env.builder().build(); });
- test.afterEach(function() { return driver.quit(); });
-
- test.ignore(
- env.browsers(Browser.FIREFOX, Browser.PHANTOM_JS, Browser.SAFARI)).
- describe('WebDriver.actions()', function() {
-
- test.it('can move to and click element in an iframe', function*() {
- yield driver.get(fileServer.whereIs('click_tests/click_in_iframe.html'));
-
- yield driver.wait(until.elementLocated(By.id('ifr')), 5000)
- .then(frame => driver.switchTo().frame(frame));
-
- let link = yield driver.findElement(By.id('link'));
- yield driver.actions()
- .mouseMove(link)
- .click()
- .perform();
-
- return driver.wait(until.titleIs('Submitted Successfully!'), 5000);
- });
-
- });
-});
diff --git a/node_modules/selenium-webdriver/test/chrome/options_test.js b/node_modules/selenium-webdriver/test/chrome/options_test.js
deleted file mode 100644
index d36a044e4..000000000
--- a/node_modules/selenium-webdriver/test/chrome/options_test.js
+++ /dev/null
@@ -1,227 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var fs = require('fs');
-
-var webdriver = require('../..'),
- chrome = require('../../chrome'),
- symbols = require('../../lib/symbols'),
- proxy = require('../../proxy'),
- assert = require('../../testing/assert');
-
-var test = require('../../lib/test');
-
-
-describe('chrome.Options', function() {
- describe('fromCapabilities', function() {
-
- it('should return a new Options instance if none were defined',
- function() {
- var options = chrome.Options.fromCapabilities(
- new webdriver.Capabilities());
- assert(options).instanceOf(chrome.Options);
- });
-
- it('should return options instance if present', function() {
- var options = new chrome.Options();
- var caps = options.toCapabilities();
- assert(caps).instanceOf(webdriver.Capabilities);
- assert(chrome.Options.fromCapabilities(caps)).equalTo(options);
- });
-
- it('should rebuild options from wire representation', function() {
- var expectedExtension = fs.readFileSync(__filename, 'base64');
- var caps = webdriver.Capabilities.chrome().set('chromeOptions', {
- args: ['a', 'b'],
- extensions: [__filename],
- binary: 'binaryPath',
- logPath: 'logFilePath',
- detach: true,
- localState: 'localStateValue',
- prefs: 'prefsValue'
- });
-
- var options = chrome.Options.fromCapabilities(caps);
- var json = options[symbols.serialize]();
-
- assert(json.args.length).equalTo(2);
- assert(json.args[0]).equalTo('a');
- assert(json.args[1]).equalTo('b');
- assert(json.extensions.length).equalTo(1);
- assert(json.extensions[0]).equalTo(expectedExtension);
- assert(json.binary).equalTo('binaryPath');
- assert(json.logPath).equalTo('logFilePath');
- assert(json.detach).equalTo(true);
- assert(json.localState).equalTo('localStateValue');
- assert(json.prefs).equalTo('prefsValue');
- });
-
- it('should rebuild options from incomplete wire representation',
- function() {
- var caps = webdriver.Capabilities.chrome().set('chromeOptions', {
- logPath: 'logFilePath'
- });
-
- var options = chrome.Options.fromCapabilities(caps);
- var json = options[symbols.serialize]();
- assert(json.args).isUndefined();
- assert(json.binary).isUndefined();
- assert(json.detach).isUndefined();
- assert(json.excludeSwitches).isUndefined();
- assert(json.extensions).isUndefined();
- assert(json.localState).isUndefined();
- assert(json.logPath).equalTo('logFilePath');
- assert(json.prefs).isUndefined();
- assert(json.minidumpPath).isUndefined();
- assert(json.mobileEmulation).isUndefined();
- assert(json.perfLoggingPrefs).isUndefined();
- });
-
- it('should extract supported WebDriver capabilities', function() {
- var proxyPrefs = proxy.direct();
- var logPrefs = {};
- var caps = webdriver.Capabilities.chrome().
- set(webdriver.Capability.PROXY, proxyPrefs).
- set(webdriver.Capability.LOGGING_PREFS, logPrefs);
-
- var options = chrome.Options.fromCapabilities(caps);
- assert(options.proxy_).equalTo(proxyPrefs);
- assert(options.logPrefs_).equalTo(logPrefs);
- });
- });
-
- describe('addArguments', function() {
- it('takes var_args', function() {
- var options = new chrome.Options();
- assert(options[symbols.serialize]().args).isUndefined();
-
- options.addArguments('a', 'b');
- var json = options[symbols.serialize]();
- assert(json.args.length).equalTo(2);
- assert(json.args[0]).equalTo('a');
- assert(json.args[1]).equalTo('b');
- });
-
- it('flattens input arrays', function() {
- var options = new chrome.Options();
- assert(options[symbols.serialize]().args).isUndefined();
-
- options.addArguments(['a', 'b'], 'c', [1, 2], 3);
- var json = options[symbols.serialize]();
- assert(json.args.length).equalTo(6);
- assert(json.args[0]).equalTo('a');
- assert(json.args[1]).equalTo('b');
- assert(json.args[2]).equalTo('c');
- assert(json.args[3]).equalTo(1);
- assert(json.args[4]).equalTo(2);
- assert(json.args[5]).equalTo(3);
- });
- });
-
- describe('addExtensions', function() {
- it('takes var_args', function() {
- var options = new chrome.Options();
- assert(options.extensions_.length).equalTo(0);
-
- options.addExtensions('a', 'b');
- assert(options.extensions_.length).equalTo(2);
- assert(options.extensions_[0]).equalTo('a');
- assert(options.extensions_[1]).equalTo('b');
- });
-
- it('flattens input arrays', function() {
- var options = new chrome.Options();
- assert(options.extensions_.length).equalTo(0);
-
- options.addExtensions(['a', 'b'], 'c', [1, 2], 3);
- assert(options.extensions_.length).equalTo(6);
- assert(options.extensions_[0]).equalTo('a');
- assert(options.extensions_[1]).equalTo('b');
- assert(options.extensions_[2]).equalTo('c');
- assert(options.extensions_[3]).equalTo(1);
- assert(options.extensions_[4]).equalTo(2);
- assert(options.extensions_[5]).equalTo(3);
- });
- });
-
- describe('serialize', function() {
- it('base64 encodes extensions', function() {
- var expected = fs.readFileSync(__filename, 'base64');
- var wire = new chrome.Options()
- .addExtensions(__filename)
- [symbols.serialize]();
- assert(wire.extensions.length).equalTo(1);
- assert(wire.extensions[0]).equalTo(expected);
- });
- });
-
- describe('toCapabilities', function() {
- it('returns a new capabilities object if one is not provided', function() {
- var options = new chrome.Options();
- var caps = options.toCapabilities();
- assert(caps.get('browserName')).equalTo('chrome');
- assert(caps.get('chromeOptions')).equalTo(options);
- });
-
- it('adds to input capabilities object', function() {
- var caps = webdriver.Capabilities.firefox();
- var options = new chrome.Options();
- assert(options.toCapabilities(caps)).equalTo(caps);
- assert(caps.get('browserName')).equalTo('firefox');
- assert(caps.get('chromeOptions')).equalTo(options);
- });
-
- it('sets generic driver capabilities', function() {
- var proxyPrefs = {};
- var loggingPrefs = {};
- var options = new chrome.Options().
- setLoggingPrefs(loggingPrefs).
- setProxy(proxyPrefs);
-
- var caps = options.toCapabilities();
- assert(caps.get('proxy')).equalTo(proxyPrefs);
- assert(caps.get('loggingPrefs')).equalTo(loggingPrefs);
- });
- });
-});
-
-test.suite(function(env) {
- var driver;
-
- test.afterEach(function() {
- return driver.quit();
- });
-
- describe('Chrome options', function() {
- test.it('can start Chrome with custom args', function*() {
- var options = new chrome.Options().
- addArguments('user-agent=foo;bar');
-
- driver = yield env.builder()
- .setChromeOptions(options)
- .build();
-
- yield driver.get(test.Pages.ajaxyPage);
-
- var userAgent =
- yield driver.executeScript('return window.navigator.userAgent');
- assert(userAgent).equalTo('foo;bar');
- });
- });
-}, {browsers: ['chrome']});
diff --git a/node_modules/selenium-webdriver/test/chrome/service_test.js b/node_modules/selenium-webdriver/test/chrome/service_test.js
deleted file mode 100644
index 0ccc93b5a..000000000
--- a/node_modules/selenium-webdriver/test/chrome/service_test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var webdriver = require('../..'),
- chrome = require('../../chrome'),
- assert = require('../../testing/assert');
-
-var test = require('../../lib/test');
-
-
-test.suite(function(env) {
- describe('chromedriver', function() {
- var service;
- test.afterEach(function() {
- if (service) {
- return service.kill();
- }
- });
-
- test.it('can be started on a custom path', function() {
- service = new chrome.ServiceBuilder()
- .setPath('/foo/bar/baz')
- .build();
- return service.start().then(function(url) {
- assert(url).endsWith('/foo/bar/baz');
- });
- });
- });
-}, {browsers: ['chrome']});
diff --git a/node_modules/selenium-webdriver/test/cookie_test.js b/node_modules/selenium-webdriver/test/cookie_test.js
deleted file mode 100644
index 40f7d9b57..000000000
--- a/node_modules/selenium-webdriver/test/cookie_test.js
+++ /dev/null
@@ -1,214 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert'),
- url = require('url');
-
-var test = require('../lib/test'),
- fileserver = require('../lib/test/fileserver'),
- Browser = require('..').Browser,
- Pages = test.Pages;
-
-
-test.suite(function(env) {
- var driver;
-
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- test.after(function() {
- return driver.quit();
- });
-
- // Cookie handling is broken.
- test.ignore(env.browsers(Browser.PHANTOM_JS, Browser.SAFARI)).
- describe('Cookie Management;', function() {
-
- test.beforeEach(function*() {
- yield driver.get(fileserver.Pages.ajaxyPage);
- yield driver.manage().deleteAllCookies();
- return assertHasCookies();
- });
-
- test.it('can add new cookies', function*() {
- var cookie = createCookieSpec();
-
- yield driver.manage().addCookie(cookie);
- yield driver.manage().getCookie(cookie.name).then(function(actual) {
- assert.equal(actual.value, cookie.value);
- });
- });
-
- test.it('can get all cookies', function*() {
- var cookie1 = createCookieSpec();
- var cookie2 = createCookieSpec();
-
- yield driver.manage().addCookie(cookie1);
- yield driver.manage().addCookie(cookie2);
-
- return assertHasCookies(cookie1, cookie2);
- });
-
- test.ignore(env.browsers(Browser.IE)).
- it('only returns cookies visible to the current page', function*() {
- var cookie1 = createCookieSpec();
-
- yield driver.manage().addCookie(cookie1);
-
- var pageUrl = fileserver.whereIs('page/1');
- var cookie2 = createCookieSpec({
- path: url.parse(pageUrl).pathname
- });
- yield driver.get(pageUrl);
- yield driver.manage().addCookie(cookie2);
- yield assertHasCookies(cookie1, cookie2);
-
- yield driver.get(fileserver.Pages.ajaxyPage);
- yield assertHasCookies(cookie1);
-
- yield driver.get(pageUrl);
- yield assertHasCookies(cookie1, cookie2);
- });
-
- test.it('can delete all cookies', function*() {
- var cookie1 = createCookieSpec();
- var cookie2 = createCookieSpec();
-
- yield driver.executeScript(
- 'document.cookie = arguments[0] + "=" + arguments[1];' +
- 'document.cookie = arguments[2] + "=" + arguments[3];',
- cookie1.name, cookie1.value, cookie2.name, cookie2.value);
- yield assertHasCookies(cookie1, cookie2);
-
- yield driver.manage().deleteAllCookies();
- yield assertHasCookies();
- });
-
- test.it('can delete cookies by name', function*() {
- var cookie1 = createCookieSpec();
- var cookie2 = createCookieSpec();
-
- yield driver.executeScript(
- 'document.cookie = arguments[0] + "=" + arguments[1];' +
- 'document.cookie = arguments[2] + "=" + arguments[3];',
- cookie1.name, cookie1.value, cookie2.name, cookie2.value);
- yield assertHasCookies(cookie1, cookie2);
-
- yield driver.manage().deleteCookie(cookie1.name);
- yield assertHasCookies(cookie2);
- });
-
- test.it('should only delete cookie with exact name', function*() {
- var cookie1 = createCookieSpec();
- var cookie2 = createCookieSpec();
- var cookie3 = {name: cookie1.name + 'xx', value: cookie1.value};
-
- yield driver.executeScript(
- 'document.cookie = arguments[0] + "=" + arguments[1];' +
- 'document.cookie = arguments[2] + "=" + arguments[3];' +
- 'document.cookie = arguments[4] + "=" + arguments[5];',
- cookie1.name, cookie1.value, cookie2.name, cookie2.value,
- cookie3.name, cookie3.value);
- yield assertHasCookies(cookie1, cookie2, cookie3);
-
- yield driver.manage().deleteCookie(cookie1.name);
- yield assertHasCookies(cookie2, cookie3);
- });
-
- test.it('can delete cookies set higher in the path', function*() {
- var cookie = createCookieSpec();
- var childUrl = fileserver.whereIs('child/childPage.html');
- var grandchildUrl = fileserver.whereIs(
- 'child/grandchild/grandchildPage.html');
-
- yield driver.get(childUrl);
- yield driver.manage().addCookie(cookie);
- yield assertHasCookies(cookie);
-
- yield driver.get(grandchildUrl);
- yield assertHasCookies(cookie);
-
- yield driver.manage().deleteCookie(cookie.name);
- yield assertHasCookies();
-
- yield driver.get(childUrl);
- yield assertHasCookies();
- });
-
- test.ignore(env.browsers(
- Browser.ANDROID,
- Browser.FIREFOX,
- 'legacy-' + Browser.FIREFOX,
- Browser.IE)).
- it('should retain cookie expiry', function*() {
- let expirationDelay = 5 * 1000;
- let expiry = new Date(Date.now() + expirationDelay);
- let cookie = createCookieSpec({expiry});
-
- yield driver.manage().addCookie(cookie);
- yield driver.manage().getCookie(cookie.name).then(function(actual) {
- assert.equal(actual.value, cookie.value);
- // expiry times are exchanged in seconds since January 1, 1970 UTC.
- assert.equal(actual.expiry, Math.floor(expiry.getTime() / 1000));
- });
-
- yield driver.sleep(expirationDelay);
- yield assertHasCookies();
- });
- });
-
- function createCookieSpec(opt_options) {
- let spec = {
- name: getRandomString(),
- value: getRandomString()
- };
- if (opt_options) {
- spec = Object.assign(spec, opt_options);
- }
- return spec;
- }
-
- function buildCookieMap(cookies) {
- var map = {};
- cookies.forEach(function(cookie) {
- map[cookie.name] = cookie;
- });
- return map;
- }
-
- function assertHasCookies(...expected) {
- return driver.manage().getCookies().then(function(cookies) {
- assert.equal(cookies.length, expected.length,
- 'Wrong # of cookies.' +
- '\n Expected: ' + JSON.stringify(expected) +
- '\n Was : ' + JSON.stringify(cookies));
-
- var map = buildCookieMap(cookies);
- for (var i = 0; i < expected.length; ++i) {
- assert.equal(expected[i].value, map[expected[i].name].value);
- }
- });
- }
-
- function getRandomString() {
- var x = 1234567890;
- return Math.floor(Math.random() * x).toString(36);
- }
-});
diff --git a/node_modules/selenium-webdriver/test/element_finding_test.js b/node_modules/selenium-webdriver/test/element_finding_test.js
deleted file mode 100644
index 9f4568b8b..000000000
--- a/node_modules/selenium-webdriver/test/element_finding_test.js
+++ /dev/null
@@ -1,426 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var fail = require('assert').fail;
-
-var Browser = require('..').Browser,
- By = require('..').By,
- error = require('..').error,
- until = require('..').until,
- promise = require('../lib/promise'),
- test = require('../lib/test'),
- assert = require('../testing/assert'),
- Pages = test.Pages;
-
-
-test.suite(function(env) {
- var browsers = env.browsers;
-
- var driver;
-
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- after(function() {
- return driver.quit();
- });
-
- describe('finding elements', function() {
- test.it(
- 'should work after loading multiple pages in a row',
- function*() {
- yield driver.get(Pages.formPage);
- yield driver.get(Pages.xhtmlTestPage);
- yield driver.findElement(By.linkText('click me')).click();
- yield driver.wait(until.titleIs('We Arrive Here'), 5000);
- });
-
- describe('By.id()', function() {
- test.it('should work', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- yield driver.findElement(By.id('linkId')).click();
- yield driver.wait(until.titleIs('We Arrive Here'), 5000);
- });
-
- test.it('should fail if ID not present on page', function*() {
- yield driver.get(Pages.formPage);
- return driver.findElement(By.id('nonExistantButton')).
- then(fail, function(e) {
- assert(e).instanceOf(error.NoSuchElementError);
- });
- });
-
- test.it(
- 'should find multiple elements by ID even though that is ' +
- 'malformed HTML',
- function*() {
- yield driver.get(Pages.nestedPage);
-
- let elements = yield driver.findElements(By.id('2'));
- assert(elements.length).equalTo(8);
- });
- });
-
- describe('By.linkText()', function() {
- test.it('should be able to click on link identified by text', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- yield driver.findElement(By.linkText('click me')).click();
- yield driver.wait(until.titleIs('We Arrive Here'), 5000);
- });
-
- test.it(
- 'should be able to find elements by partial link text',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- yield driver.findElement(By.partialLinkText('ick me')).click();
- yield driver.wait(until.titleIs('We Arrive Here'), 5000);
- });
-
- test.it('should work when link text contains equals sign', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let el = yield driver.findElement(By.linkText('Link=equalssign'));
-
- let id = yield el.getAttribute('id');
- assert(id).equalTo('linkWithEqualsSign');
- });
-
- test.it('matches by partial text when containing equals sign',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let link = yield driver.findElement(By.partialLinkText('Link='));
-
- let id = yield link.getAttribute('id');
- assert(id).equalTo('linkWithEqualsSign');
- });
-
- test.it('works when searching for multiple and text contains =',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let elements =
- yield driver.findElements(By.linkText('Link=equalssign'));
-
- assert(elements.length).equalTo(1);
-
- let id = yield elements[0].getAttribute('id');
- assert(id).equalTo('linkWithEqualsSign');
- });
-
- test.it(
- 'works when searching for multiple with partial text containing =',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let elements =
- yield driver.findElements(By.partialLinkText('Link='));
-
- assert(elements.length).equalTo(1);
-
- let id = yield elements[0].getAttribute('id');
- assert(id).equalTo('linkWithEqualsSign');
- });
-
- test.it('should be able to find multiple exact matches',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let elements = yield driver.findElements(By.linkText('click me'));
- assert(elements.length).equalTo(2);
- });
-
- test.it('should be able to find multiple partial matches',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let elements =
- yield driver.findElements(By.partialLinkText('ick me'));
- assert(elements.length).equalTo(2);
- });
-
- test.ignore(browsers(Browser.SAFARI)).
- it('works on XHTML pages', function*() {
- yield driver.get(test.whereIs('actualXhtmlPage.xhtml'));
-
- let el = yield driver.findElement(By.linkText('Foo'));
- return assert(el.getText()).equalTo('Foo');
- });
- });
-
- describe('By.name()', function() {
- test.it('should work', function*() {
- yield driver.get(Pages.formPage);
-
- let el = yield driver.findElement(By.name('checky'));
- yield assert(el.getAttribute('value')).equalTo('furrfu');
- });
-
- test.it('should find multiple elements with same name', function*() {
- yield driver.get(Pages.nestedPage);
-
- let elements = yield driver.findElements(By.name('checky'));
- assert(elements.length).greaterThan(1);
- });
-
- test.it(
- 'should be able to find elements that do not support name property',
- function*() {
- yield driver.get(Pages.nestedPage);
- yield driver.findElement(By.name('div1'));
- // Pass if this does not return an error.
- });
-
- test.it('shoudl be able to find hidden elements by name', function*() {
- yield driver.get(Pages.formPage);
- yield driver.findElement(By.name('hidden'));
- // Pass if this does not return an error.
- });
- });
-
- describe('By.className()', function() {
- test.it('should work', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let el = yield driver.findElement(By.className('extraDiv'));
- yield assert(el.getText()).startsWith('Another div starts here.');
- });
-
- test.it('should work when name is first name among many', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let el = yield driver.findElement(By.className('nameA'));
- yield assert(el.getText()).equalTo('An H2 title');
- });
-
- test.it('should work when name is last name among many', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let el = yield driver.findElement(By.className('nameC'));
- yield assert(el.getText()).equalTo('An H2 title');
- });
-
- test.it('should work when name is middle of many', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let el = yield driver.findElement(By.className('nameBnoise'));
- yield assert(el.getText()).equalTo('An H2 title');
- });
-
- test.it('should work when name surrounded by whitespace', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let el = yield driver.findElement(By.className('spaceAround'));
- yield assert(el.getText()).equalTo('Spaced out');
- });
-
- test.it('should fail if queried name only partially matches', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- return driver.findElement(By.className('nameB')).
- then(fail, function(e) {
- assert(e).instanceOf(error.NoSuchElementError);
- });
- });
-
- test.it('should implicitly wait', function*() {
- var TIMEOUT_IN_MS = 1000;
- var EPSILON = TIMEOUT_IN_MS / 2;
-
- yield driver.manage().timeouts().implicitlyWait(TIMEOUT_IN_MS);
- yield driver.get(Pages.formPage);
-
- var start = new Date();
- return driver.findElement(By.id('nonExistantButton')).
- then(fail, function(e) {
- var end = new Date();
- assert(e).instanceOf(error.NoSuchElementError);
- assert(end - start).closeTo(TIMEOUT_IN_MS, EPSILON);
- });
- });
-
- test.it('should be able to find multiple matches', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let elements = yield driver.findElements(By.className('nameC'));
- assert(elements.length).greaterThan(1);
- });
-
- test.it('permits compound class names', function() {
- return driver.get(Pages.xhtmlTestPage)
- .then(() => driver.findElement(By.className('nameA nameC')))
- .then(el => el.getText())
- .then(text => assert(text).equalTo('An H2 title'));
- });
- });
-
- describe('By.xpath()', function() {
- test.it('should work with multiple matches', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let elements = yield driver.findElements(By.xpath('//div'));
- assert(elements.length).greaterThan(1);
- });
-
- test.it('should work for selectors using contains keyword', function*() {
- yield driver.get(Pages.nestedPage);
- yield driver.findElement(By.xpath('//a[contains(., "hello world")]'));
- // Pass if no error.
- });
- });
-
- describe('By.tagName()', function() {
- test.it('works', function*() {
- yield driver.get(Pages.formPage);
-
- let el = yield driver.findElement(By.tagName('input'));
- yield assert(el.getTagName()).equalTo('input');
- });
-
- test.it('can find multiple elements', function*() {
- yield driver.get(Pages.formPage);
-
- let elements = yield driver.findElements(By.tagName('input'));
- assert(elements.length).greaterThan(1);
- });
- });
-
- describe('By.css()', function() {
- test.it('works', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- yield driver.findElement(By.css('div.content'));
- // Pass if no error.
- });
-
- test.it('can find multiple elements', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let elements = yield driver.findElements(By.css('p'));
- assert(elements.length).greaterThan(1);
- // Pass if no error.
- });
-
- test.it(
- 'should find first matching element when searching by ' +
- 'compound CSS selector',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- let el =
- yield driver.findElement(By.css('div.extraDiv, div.content'));
- yield assert(el.getAttribute('class')).equalTo('content');
- });
-
- test.it('should be able to find multiple elements by compound selector',
- function*() {
- yield driver.get(Pages.xhtmlTestPage);
- let elements =
- yield driver.findElements(By.css('div.extraDiv, div.content'));
-
- return Promise.all([
- assertClassIs(elements[0], 'content'),
- assertClassIs(elements[1], 'extraDiv')
- ]);
-
- function assertClassIs(el, expected) {
- return assert(el.getAttribute('class')).equalTo(expected);
- }
- });
-
- // IE only supports short version option[selected].
- test.ignore(browsers(Browser.IE)).
- it('should be able to find element by boolean attribute', function*() {
- yield driver.get(test.whereIs(
- 'locators_tests/boolean_attribute_selected.html'));
-
- let el = yield driver.findElement(By.css('option[selected="selected"]'));
- yield assert(el.getAttribute('value')).equalTo('two');
- });
-
- test.it(
- 'should be able to find element with short ' +
- 'boolean attribute selector',
- function*() {
- yield driver.get(test.whereIs(
- 'locators_tests/boolean_attribute_selected.html'));
-
- let el = yield driver.findElement(By.css('option[selected]'));
- yield assert(el.getAttribute('value')).equalTo('two');
- });
-
- test.it(
- 'should be able to find element with short boolean attribute ' +
- 'selector on HTML4 page',
- function*() {
- yield driver.get(test.whereIs(
- 'locators_tests/boolean_attribute_selected_html4.html'));
-
- let el = yield driver.findElement(By.css('option[selected]'));
- yield assert(el.getAttribute('value')).equalTo('two');
- });
- });
-
- describe('by custom locator', function() {
- test.it('handles single element result', function*() {
- yield driver.get(Pages.javascriptPage);
-
- let link = yield driver.findElement(function(driver) {
- let links = driver.findElements(By.tagName('a'));
- return promise.filter(links, function(link) {
- return link.getAttribute('id').then(id => id === 'updatediv');
- }).then(links => links[0]);
- });
-
- yield assert(link.getText()).matches(/Update\s+a\s+div/);
- });
-
- test.it('uses first element if locator resolves to list', function*() {
- yield driver.get(Pages.javascriptPage);
-
- let link = yield driver.findElement(function() {
- return driver.findElements(By.tagName('a'));
- });
-
- yield assert(link.getText()).isEqualTo('Change the page title!');
- });
-
- test.it('fails if locator returns non-webelement value', function*() {
- yield driver.get(Pages.javascriptPage);
-
- let link = driver.findElement(function() {
- return driver.getTitle();
- });
-
- return link.then(
- () => fail('Should have failed'),
- (e) => assert(e).instanceOf(TypeError));
- });
- });
-
- describe('switchTo().activeElement()', function() {
- // SAFARI's new session response does not identify it as a W3C browser,
- // so the command is sent in the unsupported wire protocol format.
- test.ignore(browsers(Browser.SAFARI)).
- it('returns document.activeElement', function*() {
- yield driver.get(Pages.formPage);
-
- let email = yield driver.findElement(By.css('#email'));
- yield driver.executeScript('arguments[0].focus()', email);
-
- let ae = yield driver.switchTo().activeElement();
- let equal = yield driver.executeScript(
- 'return arguments[0] === arguments[1]', email, ae);
- assert(equal).isTrue();
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/execute_script_test.js b/node_modules/selenium-webdriver/test/execute_script_test.js
deleted file mode 100644
index 97eaa1ed1..000000000
--- a/node_modules/selenium-webdriver/test/execute_script_test.js
+++ /dev/null
@@ -1,350 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var fail = require('assert').fail;
-
-var webdriver = require('..'),
- Browser = webdriver.Browser,
- By = webdriver.By,
- assert = require('../testing/assert'),
- test = require('../lib/test');
-
-
-test.suite(function(env) {
- var driver;
-
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- test.after(function() {
- return driver.quit();
- });
-
- test.beforeEach(function() {
- return driver.get(test.Pages.echoPage);
- });
-
- describe('executeScript;', function() {
- var shouldHaveFailed = new Error('Should have failed');
-
- test.it('fails if script throws', function() {
- return execute('throw new Error("boom")')
- .then(function() { throw shouldHaveFailed; })
- .catch(function(e) {
- // The java WebDriver server adds a bunch of crap to error messages.
- // Error message will just be "JavaScript error" for IE.
- assert(e.message).matches(/.*(JavaScript error|boom).*/);
- });
- });
-
- test.it('fails if script does not parse', function() {
- return execute('throw function\\*')
- .then(function() { throw shouldHaveFailed; })
- .catch(function(e) {
- assert(e).notEqualTo(shouldHaveFailed);
- });
- });
-
- describe('scripts;', function() {
- test.it('do not pollute the global scope', function*() {
- yield execute('var x = 1;');
- yield assert(execute('return typeof x;')).equalTo('undefined');
- });
-
- test.it('can set global variables', function*() {
- yield execute('window.x = 1234;');
- yield assert(execute('return x;')).equalTo(1234);
- });
-
- test.it('may be defined as a function expression', function*() {
- let result = yield execute(function() {
- return 1234 + 'abc';
- });
- assert(result).equalTo('1234abc');
- });
- });
-
- describe('return values;', function() {
-
- test.it('returns undefined as null', function() {
- return assert(execute('var x; return x;')).isNull();
- });
-
- test.it('can return null', function() {
- return assert(execute('return null;')).isNull();
- });
-
- test.it('can return numbers', function*() {
- yield assert(execute('return 1234')).equalTo(1234);
- yield assert(execute('return 3.1456')).equalTo(3.1456);
- });
-
- test.it('can return strings', function() {
- return assert(execute('return "hello"')).equalTo('hello');
- });
-
- test.it('can return booleans', function*() {
- yield assert(execute('return true')).equalTo(true);
- yield assert(execute('return false')).equalTo(false);
- });
-
- test.it('can return an array of primitives', function() {
- return execute('var x; return [1, false, null, 3.14, x]')
- .then(verifyJson([1, false, null, 3.14, null]));
- });
-
- test.it('can return nested arrays', function() {
- return execute('return [[1, 2, [3]]]').then(verifyJson([[1, 2, [3]]]));
- });
-
- test.ignore(env.browsers(Browser.IE)).
- it('can return empty object literal', function() {
- return execute('return {}').then(verifyJson({}));
- });
-
- test.it('can return object literals', function() {
- return execute('return {a: 1, b: false, c: null}').then(result => {
- verifyJson(['a', 'b', 'c'])(Object.keys(result).sort());
- assert(result.a).equalTo(1);
- assert(result.b).equalTo(false);
- assert(result.c).isNull();
- });
- });
-
- test.it('can return complex object literals', function() {
- return execute('return {a:{b: "hello"}}')
- .then(verifyJson({a:{b: 'hello'}}));
- });
-
- test.it('can return dom elements as web elements', function*() {
- let result =
- yield execute('return document.querySelector(".header.host")');
- assert(result).instanceOf(webdriver.WebElement);
-
- return assert(result.getText()).startsWith('host: ');
- });
-
- test.it('can return array of dom elements', function*() {
- let result = yield execute(
- 'var nodes = document.querySelectorAll(".request,.host");' +
- 'return [nodes[0], nodes[1]];');
- assert(result.length).equalTo(2);
-
- assert(result[0]).instanceOf(webdriver.WebElement);
- yield assert(result[0].getText()).startsWith('GET ');
-
- assert(result[1]).instanceOf(webdriver.WebElement);
- yield assert(result[1].getText()).startsWith('host: ');
- });
-
- test.it('can return a NodeList as an array of web elements', function*() {
- let result =
- yield execute('return document.querySelectorAll(".request,.host");')
-
- assert(result.length).equalTo(2);
-
- assert(result[0]).instanceOf(webdriver.WebElement);
- yield assert(result[0].getText()).startsWith('GET ');
-
- assert(result[1]).instanceOf(webdriver.WebElement);
- yield assert(result[1].getText()).startsWith('host: ');
- });
-
- test.it('can return object literal with element property', function*() {
- let result = yield execute('return {a: document.body}');
-
- assert(result.a).instanceOf(webdriver.WebElement);
- yield assert(result.a.getTagName()).equalTo('body');
- });
- });
-
- describe('parameters;', function() {
- test.it('can pass numeric arguments', function*() {
- yield assert(execute('return arguments[0]', 12)).equalTo(12);
- yield assert(execute('return arguments[0]', 3.14)).equalTo(3.14);
- });
-
- test.it('can pass boolean arguments', function*() {
- yield assert(execute('return arguments[0]', true)).equalTo(true);
- yield assert(execute('return arguments[0]', false)).equalTo(false);
- });
-
- test.it('can pass string arguments', function*() {
- yield assert(execute('return arguments[0]', 'hi')).equalTo('hi');
- });
-
- test.it('can pass null arguments', function*() {
- yield assert(execute('return arguments[0] === null', null)).equalTo(true);
- yield assert(execute('return arguments[0]', null)).equalTo(null);
- });
-
- test.it('passes undefined as a null argument', function*() {
- var x;
- yield assert(execute('return arguments[0] === null', x)).equalTo(true);
- yield assert(execute('return arguments[0]', x)).equalTo(null);
- });
-
- test.it('can pass multiple arguments', function*() {
- yield assert(execute('return arguments.length')).equalTo(0);
- yield assert(execute('return arguments.length', 1, 'a', false)).equalTo(3);
- });
-
- test.ignore(env.browsers(Browser.FIREFOX, Browser.SAFARI)).
- it('can return arguments object as array', function*() {
- let val = yield execute('return arguments', 1, 'a', false);
-
- assert(val.length).equalTo(3);
- assert(val[0]).equalTo(1);
- assert(val[1]).equalTo('a');
- assert(val[2]).equalTo(false);
- });
-
- test.it('can pass object literal', function*() {
- let result = yield execute(
- 'return [typeof arguments[0], arguments[0].a]', {a: 'hello'})
- assert(result[0]).equalTo('object');
- assert(result[1]).equalTo('hello');
- });
-
- test.it('WebElement arguments are passed as DOM elements', function*() {
- let el = yield driver.findElement(By.tagName('div'));
- let result =
- yield execute('return arguments[0].tagName.toLowerCase();', el);
- assert(result).equalTo('div');
- });
-
- test.it('can pass array containing object literals', function*() {
- let result = yield execute('return arguments[0]', [{color: "red"}]);
- assert(result.length).equalTo(1);
- assert(result[0].color).equalTo('red');
- });
-
- test.it('does not modify object literal parameters', function() {
- var input = {color: 'red'};
- return execute('return arguments[0];', input).then(verifyJson(input));
- });
- });
-
- // See https://code.google.com/p/selenium/issues/detail?id=8223.
- describe('issue 8223;', function() {
- describe('using for..in loops;', function() {
- test.it('can return array built from for-loop index', function() {
- return execute(function() {
- var ret = [];
- for (var i = 0; i < 3; i++) {
- ret.push(i);
- }
- return ret;
- }).then(verifyJson[0, 1, 2]);
- });
-
- test.it('can copy input array contents', function() {
- return execute(function(input) {
- var ret = [];
- for (var i in input) {
- ret.push(input[i]);
- }
- return ret;
- }, ['fa', 'fe', 'fi']).then(verifyJson(['fa', 'fe', 'fi']));
- });
-
- test.it('can iterate over input object keys', function() {
- return execute(function(thing) {
- var ret = [];
- for (var w in thing.words) {
- ret.push(thing.words[w].word);
- }
- return ret;
- }, {words: [{word: 'fa'}, {word: 'fe'}, {word: 'fi'}]})
- .then(verifyJson(['fa', 'fe', 'fi']));
- });
-
- describe('recursive functions;', function() {
- test.it('can build array from input', function() {
- var input = ['fa', 'fe', 'fi'];
- return execute(function(thearray) {
- var ret = [];
- function build_response(thearray, ret) {
- ret.push(thearray.shift());
- return (!thearray.length && ret
- || build_response(thearray, ret));
- }
- return build_response(thearray, ret);
- }, input).then(verifyJson(input));
- });
-
- test.it('can build array from elements in object', function() {
- var input = {words: [{word: 'fa'}, {word: 'fe'}, {word: 'fi'}]};
- return execute(function(thing) {
- var ret = [];
- function build_response(thing, ret) {
- var item = thing.words.shift();
- ret.push(item.word);
- return (!thing.words.length && ret
- || build_response(thing, ret));
- }
- return build_response(thing, ret);
- }, input).then(verifyJson(['fa', 'fe', 'fi']));
- });
- });
- });
- });
-
- describe('async timeouts', function() {
- var TIMEOUT_IN_MS = 200;
- var ACCEPTABLE_WAIT = TIMEOUT_IN_MS / 10;
- var TOO_LONG_WAIT = TIMEOUT_IN_MS * 10;
-
- before(function() {
- return driver.manage().timeouts().setScriptTimeout(TIMEOUT_IN_MS)
- });
-
- test.it('does not fail if script execute in time', function() {
- return executeTimeOutScript(ACCEPTABLE_WAIT);
- });
-
- test.it('fails if script took too long', function() {
- return executeTimeOutScript(TOO_LONG_WAIT)
- .then(function() {
- fail('it should have timed out');
- }).catch(function(e) {
- assert(e.name).equalTo('ScriptTimeoutError');
- });
- });
-
- function executeTimeOutScript(sleepTime) {
- return driver.executeAsyncScript(function(sleepTime) {
- var callback = arguments[arguments.length - 1];
- setTimeout(callback, sleepTime)
- }, sleepTime);
- }
- })
- });
-
- function verifyJson(expected) {
- return function(actual) {
- return assert(JSON.stringify(actual)).equalTo(JSON.stringify(expected));
- };
- }
-
- function execute() {
- return driver.executeScript.apply(driver, arguments);
- }
-});
diff --git a/node_modules/selenium-webdriver/test/fingerprint_test.js b/node_modules/selenium-webdriver/test/fingerprint_test.js
deleted file mode 100644
index 0a13dd748..000000000
--- a/node_modules/selenium-webdriver/test/fingerprint_test.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('../testing/assert'),
- test = require('../lib/test'),
- Pages = test.Pages;
-
-
-test.suite(function(env) {
- var browsers = env.browsers;
-
- var driver;
- test.before(function() {
- driver = env.builder().build();
- });
-
- test.after(function() {
- driver.quit();
- });
-
- describe('fingerprinting', function() {
- test.it('it should fingerprint the navigator object', function*() {
- yield driver.get(Pages.simpleTestPage);
-
- let wd = yield driver.executeScript('return navigator.webdriver');
- assert(wd).equalTo(true);
- });
-
- test.it('fingerprint must not be writable', function*() {
- yield driver.get(Pages.simpleTestPage);
-
- let wd = yield driver.executeScript(
- 'navigator.webdriver = "ohai"; return navigator.webdriver');
- assert(wd).equalTo(true);
- });
-
- test.it('leaves fingerprint on svg pages', function*() {
- yield driver.get(Pages.svgPage);
-
- let wd = yield driver.executeScript('return navigator.webdriver');
- assert(wd).equalTo(true);
- });
- });
-
-// Currently only implemented in legacy firefox.
-}, {browsers: ['legacy-firefox']});
diff --git a/node_modules/selenium-webdriver/test/firefox/extension_test.js b/node_modules/selenium-webdriver/test/firefox/extension_test.js
deleted file mode 100644
index 50936f7cd..000000000
--- a/node_modules/selenium-webdriver/test/firefox/extension_test.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var AdmZip = require('adm-zip'),
- assert = require('assert'),
- crypto = require('crypto'),
- fs = require('fs'),
- path = require('path');
-
-var extension = require('../../firefox/extension'),
- io = require('../../io'),
- it = require('../../testing').it;
-
-
-var JETPACK_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/jetpack-sample.xpi');
-var NORMAL_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/sample.xpi');
-
-var JETPACK_EXTENSION_ID = 'jid1-EaXX7k0wwiZR7w@jetpack';
-var NORMAL_EXTENSION_ID = 'sample@seleniumhq.org';
-
-
-describe('extension', function() {
- it('can install a jetpack xpi file', function() {
- return io.tmpDir().then(function(dir) {
- return extension.install(JETPACK_EXTENSION, dir).then(function(id) {
- assert.equal(JETPACK_EXTENSION_ID, id);
- var file = path.join(dir, id + '.xpi');
- assert.ok(fs.existsSync(file), 'no such file: ' + file);
- assert.ok(!fs.statSync(file).isDirectory());
-
- var copiedSha1 = crypto.createHash('sha1')
- .update(fs.readFileSync(file))
- .digest('hex');
-
- var goldenSha1 = crypto.createHash('sha1')
- .update(fs.readFileSync(JETPACK_EXTENSION))
- .digest('hex');
-
- assert.equal(copiedSha1, goldenSha1);
- });
- });
- });
-
- it('can install a normal xpi file', function() {
- return io.tmpDir().then(function(dir) {
- return extension.install(NORMAL_EXTENSION, dir).then(function(id) {
- assert.equal(NORMAL_EXTENSION_ID, id);
-
- var file = path.join(dir, NORMAL_EXTENSION_ID);
- assert.ok(fs.statSync(file).isDirectory());
-
- assert.ok(fs.existsSync(path.join(file, 'chrome.manifest')));
- assert.ok(fs.existsSync(path.join(file, 'content/overlay.xul')));
- assert.ok(fs.existsSync(path.join(file, 'content/overlay.js')));
- assert.ok(fs.existsSync(path.join(file, 'install.rdf')));
- });
- });
- });
-
- it('can install an extension from a directory', function() {
- return io.tmpDir().then(function(srcDir) {
- var buf = fs.readFileSync(NORMAL_EXTENSION);
- new AdmZip(buf).extractAllTo(srcDir, true);
- return io.tmpDir().then(function(dstDir) {
- return extension.install(srcDir, dstDir).then(function(id) {
- assert.equal(NORMAL_EXTENSION_ID, id);
-
- var dir = path.join(dstDir, NORMAL_EXTENSION_ID);
-
- assert.ok(fs.existsSync(path.join(dir, 'chrome.manifest')));
- assert.ok(fs.existsSync(path.join(dir, 'content/overlay.xul')));
- assert.ok(fs.existsSync(path.join(dir, 'content/overlay.js')));
- assert.ok(fs.existsSync(path.join(dir, 'install.rdf')));
- });
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/firefox/firefox_test.js b/node_modules/selenium-webdriver/test/firefox/firefox_test.js
deleted file mode 100644
index dbf9910fa..000000000
--- a/node_modules/selenium-webdriver/test/firefox/firefox_test.js
+++ /dev/null
@@ -1,226 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var path = require('path');
-
-var firefox = require('../../firefox'),
- io = require('../../io'),
- test = require('../../lib/test'),
- assert = require('../../testing/assert'),
- Context = require('../../firefox').Context,
- error = require('../..').error;
-
-var {consume} = require('../../lib/promise');
-
-
-var JETPACK_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/jetpack-sample.xpi');
-var NORMAL_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/sample.xpi');
-
-
-test.suite(function(env) {
- describe('firefox', function() {
- describe('Options', function() {
- var driver;
-
- test.beforeEach(function() {
- driver = null;
- });
-
- test.afterEach(function() {
- if (driver) {
- return driver.quit();
- }
- });
-
- /**
- * Runs a test that requires Firefox Developer Edition. The test will be
- * skipped if dev cannot be found on the current system.
- */
- function runWithFirefoxDev(options, testFn) {
- return firefox.Channel.AURORA.locate().then(exe => {
- options.setBinary(exe);
- driver = env.builder()
- .setFirefoxOptions(options)
- .build();
- return driver.call(testFn);
- }, err => {
- console.warn(
- 'Skipping test: could not find Firefox Dev Edition: ' + err);
- });
- }
-
- describe('can start Firefox with custom preferences', function() {
- function runTest(opt_dir) {
- return consume(function*() {
- let profile = new firefox.Profile(opt_dir);
- profile.setPreference('general.useragent.override', 'foo;bar');
-
- let options = new firefox.Options().setProfile(profile);
-
- driver = env.builder().
- setFirefoxOptions(options).
- build();
-
- yield driver.get('data:text/html,<html><div>content</div></html>');
-
- var userAgent = yield driver.executeScript(
- 'return window.navigator.userAgent');
- assert(userAgent).equalTo('foo;bar');
- });
- }
-
- test.it('profile created from scratch', function() {
- return runTest();
- });
-
- test.it('profile created from template', function() {
- return io.tmpDir().then(runTest);
- });
- });
-
- test.it('can start Firefox with a jetpack extension', function() {
- let profile = new firefox.Profile();
- profile.addExtension(JETPACK_EXTENSION);
-
- let options = new firefox.Options().setProfile(profile);
-
- return runWithFirefoxDev(options, function*() {
- yield loadJetpackPage(driver,
- 'data:text/html;charset=UTF-8,<html><div>content</div></html>');
-
- let text =
- yield driver.findElement({id: 'jetpack-sample-banner'}).getText();
- assert(text).equalTo('Hello, world!');
- });
- });
-
- test.it('can start Firefox with a normal extension', function() {
- let profile = new firefox.Profile();
- profile.addExtension(NORMAL_EXTENSION);
-
- let options = new firefox.Options().setProfile(profile);
-
- return runWithFirefoxDev(options, function*() {
- yield driver.get('data:text/html,<html><div>content</div></html>');
-
- let footer =
- yield driver.findElement({id: 'sample-extension-footer'});
- let text = yield footer.getText();
- assert(text).equalTo('Goodbye');
- });
- });
-
- test.it('can start Firefox with multiple extensions', function() {
- let profile = new firefox.Profile();
- profile.addExtension(JETPACK_EXTENSION);
- profile.addExtension(NORMAL_EXTENSION);
-
- let options = new firefox.Options().setProfile(profile);
-
- return runWithFirefoxDev(options, function*() {
- yield loadJetpackPage(driver,
- 'data:text/html;charset=UTF-8,<html><div>content</div></html>');
-
- let banner =
- yield driver.findElement({id: 'jetpack-sample-banner'}).getText();
- assert(banner).equalTo('Hello, world!');
-
- let footer =
- yield driver.findElement({id: 'sample-extension-footer'})
- .getText();
- assert(footer).equalTo('Goodbye');
- });
- });
-
- function loadJetpackPage(driver, url) {
- // On linux the jetpack extension does not always run the first time
- // we load a page. If this happens, just reload the page (a simple
- // refresh doesn't appear to work).
- return driver.wait(function() {
- driver.get(url);
- return driver.findElements({id: 'jetpack-sample-banner'})
- .then(found => found.length > 0);
- }, 3000);
- }
- });
-
- describe('binary management', function() {
- var driver1, driver2;
-
- test.ignore(env.isRemote).
- it('can start multiple sessions with single binary instance', function*() {
- var options = new firefox.Options().setBinary(new firefox.Binary);
- env.builder().setFirefoxOptions(options);
- driver1 = yield env.builder().build();
- driver2 = yield env.builder().build();
- // Ok if this doesn't fail.
- });
-
- test.afterEach(function*() {
- if (driver1) {
- yield driver1.quit();
- }
-
- if (driver2) {
- yield driver2.quit();
- }
- });
- });
-
- describe('context switching', function() {
- var driver;
-
- test.beforeEach(function*() {
- driver = yield env.builder().build();
- });
-
- test.afterEach(function() {
- if (driver) {
- return driver.quit();
- }
- });
-
- test.ignore(() => !env.isMarionette).
- it('can get context', function() {
- return assert(driver.getContext()).equalTo(Context.CONTENT);
- });
-
- test.ignore(() => !env.isMarionette).
- it('can set context', function*() {
- yield driver.setContext(Context.CHROME);
- let ctxt = yield driver.getContext();
- assert(ctxt).equalTo(Context.CHROME);
-
- yield driver.setContext(Context.CONTENT);
- ctxt = yield driver.getContext();
- assert(ctxt).equalTo(Context.CONTENT);
- });
-
- test.ignore(() => !env.isMarionette).
- it('throws on unknown context', function() {
- return driver.setContext("foo").then(assert.fail, function(e) {
- assert(e).instanceOf(error.InvalidArgumentError);
- });
- });
- });
-
- });
-}, {browsers: ['firefox']});
diff --git a/node_modules/selenium-webdriver/test/firefox/profile_test.js b/node_modules/selenium-webdriver/test/firefox/profile_test.js
deleted file mode 100644
index de61c26b5..000000000
--- a/node_modules/selenium-webdriver/test/firefox/profile_test.js
+++ /dev/null
@@ -1,185 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var AdmZip = require('adm-zip'),
- assert = require('assert'),
- fs = require('fs'),
- path = require('path');
-
-var promise = require('../..').promise,
- Profile = require('../../firefox/profile').Profile,
- decode = require('../../firefox/profile').decode,
- loadUserPrefs = require('../../firefox/profile').loadUserPrefs,
- io = require('../../io');
-
-
-var JETPACK_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/jetpack-sample.xpi');
-var NORMAL_EXTENSION = path.join(__dirname,
- '../../lib/test/data/firefox/sample.xpi');
-
-var JETPACK_EXTENSION_ID = 'jid1-EaXX7k0wwiZR7w@jetpack.xpi';
-var NORMAL_EXTENSION_ID = 'sample@seleniumhq.org';
-var WEBDRIVER_EXTENSION_ID = 'fxdriver@googlecode.com';
-
-
-
-describe('Profile', function() {
- describe('setPreference', function() {
- it('allows setting custom properties', function() {
- var profile = new Profile();
- assert.equal(undefined, profile.getPreference('foo'));
-
- profile.setPreference('foo', 'bar');
- assert.equal('bar', profile.getPreference('foo'));
- });
-
- it('allows overriding mutable properties', function() {
- var profile = new Profile();
-
- profile.setPreference('browser.newtab.url', 'http://www.example.com');
- assert.equal('http://www.example.com',
- profile.getPreference('browser.newtab.url'));
- });
-
- it('throws if setting a frozen preference', function() {
- var profile = new Profile();
- assert.throws(function() {
- profile.setPreference('app.update.auto', true);
- });
- });
- });
-
- describe('writeToDisk', function() {
- it('copies template directory recursively', function() {
- var templateDir;
- return io.tmpDir().then(function(td) {
- templateDir = td;
- var foo = path.join(templateDir, 'foo');
- fs.writeFileSync(foo, 'Hello, world');
-
- var bar = path.join(templateDir, 'subfolder/bar');
- fs.mkdirSync(path.dirname(bar));
- fs.writeFileSync(bar, 'Goodbye, world!');
-
- return new Profile(templateDir).writeToDisk();
- }).then(function(profileDir) {
- assert.notEqual(profileDir, templateDir);
-
- assert.equal('Hello, world',
- fs.readFileSync(path.join(profileDir, 'foo')));
- assert.equal('Goodbye, world!',
- fs.readFileSync(path.join(profileDir, 'subfolder/bar')));
- });
- });
-
- it('does not copy lock files', function() {
- return io.tmpDir().then(function(dir) {
- fs.writeFileSync(path.join(dir, 'parent.lock'), 'lock');
- fs.writeFileSync(path.join(dir, 'lock'), 'lock');
- fs.writeFileSync(path.join(dir, '.parentlock'), 'lock');
- return new Profile(dir).writeToDisk();
- }).then(function(dir) {
- assert.ok(fs.existsSync(dir));
- assert.ok(!fs.existsSync(path.join(dir, 'parent.lock')));
- assert.ok(!fs.existsSync(path.join(dir, 'lock')));
- assert.ok(!fs.existsSync(path.join(dir, '.parentlock')));
- });
- });
-
- describe('user.js', function() {
-
- it('writes defaults', function() {
- return new Profile().writeToDisk().then(function(dir) {
- return loadUserPrefs(path.join(dir, 'user.js'));
- }).then(function(prefs) {
- // Just check a few.
- assert.equal(false, prefs['app.update.auto']);
- assert.equal(true, prefs['browser.EULA.override']);
- assert.equal(false, prefs['extensions.update.enabled']);
- assert.equal('about:blank', prefs['browser.newtab.url']);
- assert.equal(30, prefs['dom.max_script_run_time']);
- });
- });
-
- it('merges template user.js into preferences', function() {
- return io.tmpDir().then(function(dir) {
- fs.writeFileSync(path.join(dir, 'user.js'), [
- 'user_pref("browser.newtab.url", "http://www.example.com")',
- 'user_pref("dom.max_script_run_time", 1234)'
- ].join('\n'));
-
- return new Profile(dir).writeToDisk();
- }).then(function(profile) {
- return loadUserPrefs(path.join(profile, 'user.js'));
- }).then(function(prefs) {
- assert.equal('http://www.example.com', prefs['browser.newtab.url']);
- assert.equal(1234, prefs['dom.max_script_run_time']);
- });
- });
-
- it('ignores frozen preferences when merging template user.js',
- function() {
- return io.tmpDir().then(function(dir) {
- fs.writeFileSync(path.join(dir, 'user.js'),
- 'user_pref("app.update.auto", true)');
- return new Profile(dir).writeToDisk();
- }).then(function(profile) {
- return loadUserPrefs(path.join(profile, 'user.js'));
- }).then(function(prefs) {
- assert.equal(false, prefs['app.update.auto']);
- });
- });
- });
-
- describe('extensions', function() {
- it('are copied into new profile directory', function() {
- var profile = new Profile();
- profile.addExtension(JETPACK_EXTENSION);
- profile.addExtension(NORMAL_EXTENSION);
-
- return profile.writeToDisk().then(function(dir) {
- dir = path.join(dir, 'extensions');
- assert.ok(fs.existsSync(path.join(dir, JETPACK_EXTENSION_ID)));
- assert.ok(fs.existsSync(path.join(dir, NORMAL_EXTENSION_ID)));
- assert.ok(fs.existsSync(path.join(dir, WEBDRIVER_EXTENSION_ID)));
- });
- });
- });
- });
-
- describe('encode', function() {
- it('excludes the bundled WebDriver extension', function() {
- return new Profile().encode().then(function(data) {
- return decode(data);
- }).then(function(dir) {
- assert.ok(fs.existsSync(path.join(dir, 'user.js')));
- assert.ok(fs.existsSync(path.join(dir, 'extensions')));
- return loadUserPrefs(path.join(dir, 'user.js'));
- }).then(function(prefs) {
- // Just check a few.
- assert.equal(false, prefs['app.update.auto']);
- assert.equal(true, prefs['browser.EULA.override']);
- assert.equal(false, prefs['extensions.update.enabled']);
- assert.equal('about:blank', prefs['browser.newtab.url']);
- assert.equal(30, prefs['dom.max_script_run_time']);
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/http/http_test.js b/node_modules/selenium-webdriver/test/http/http_test.js
deleted file mode 100644
index 6056cda8e..000000000
--- a/node_modules/selenium-webdriver/test/http/http_test.js
+++ /dev/null
@@ -1,205 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert'),
- http = require('http'),
- url = require('url');
-
-var HttpClient = require('../../http').HttpClient,
- HttpRequest = require('../../lib/http').Request,
- HttpResponse = require('../../lib/http').Response,
- Server = require('../../lib/test/httpserver').Server;
-
-describe('HttpClient', function() {
- this.timeout(4 * 1000);
-
- var server = new Server(function(req, res) {
- let parsedUrl = url.parse(req.url);
-
- if (req.method == 'GET' && req.url == '/echo') {
- res.writeHead(200, req.headers);
- res.end();
-
- } else if (req.method == 'GET' && req.url == '/redirect') {
- res.writeHead(303, {'Location': server.url('/hello')});
- res.end();
-
- } else if (req.method == 'GET' && req.url == '/hello') {
- res.writeHead(200, {'content-type': 'text/plain'});
- res.end('hello, world!');
-
- } else if (req.method == 'GET' && req.url == '/badredirect') {
- res.writeHead(303, {});
- res.end();
-
- } else if (req.method == 'GET' && req.url == '/protected') {
- var denyAccess = function() {
- res.writeHead(401, {'WWW-Authenticate': 'Basic realm="test"'});
- res.end('Access denied');
- };
-
- var basicAuthRegExp = /^\s*basic\s+([a-z0-9\-\._~\+\/]+)=*\s*$/i
- var auth = req.headers.authorization;
- var match = basicAuthRegExp.exec(auth || '');
- if (!match) {
- denyAccess();
- return;
- }
-
- var userNameAndPass = new Buffer(match[1], 'base64').toString();
- var parts = userNameAndPass.split(':', 2);
- if (parts[0] !== 'genie' && parts[1] !== 'bottle') {
- denyAccess();
- return;
- }
-
- res.writeHead(200, {'content-type': 'text/plain'});
- res.end('Access granted!');
-
- } else if (req.method == 'GET'
- && parsedUrl.pathname
- && parsedUrl.pathname.endsWith('/proxy')) {
- let headers = Object.assign({}, req.headers);
- headers['x-proxy-request-uri'] = req.url;
- res.writeHead(200, headers);
- res.end();
-
- } else if (req.method == 'GET'
- && parsedUrl.pathname
- && parsedUrl.pathname.endsWith('/proxy/redirect')) {
- let path = `/proxy${parsedUrl.search || ''}${parsedUrl.hash || ''}`;
- res.writeHead(303, {'Location': path});
- res.end();
-
- } else {
- res.writeHead(404, {});
- res.end();
- }
- });
-
- before(function() {
- return server.start();
- });
-
- after(function() {
- return server.stop();
- });
-
- it('can send a basic HTTP request', function() {
- var request = new HttpRequest('GET', '/echo');
- request.headers.set('Foo', 'Bar');
-
- var agent = new http.Agent();
- agent.maxSockets = 1; // Only making 1 request.
-
- var client = new HttpClient(server.url(), agent);
- return client.send(request).then(function(response) {
- assert.equal(200, response.status);
- assert.equal(response.headers.get('content-length'), '0');
- assert.equal(response.headers.get('connection'), 'keep-alive');
- assert.equal(response.headers.get('host'), server.host());
-
- assert.equal(request.headers.get('Foo'), 'Bar');
- assert.equal(
- request.headers.get('Accept'), 'application/json; charset=utf-8');
- });
- });
-
- it('can use basic auth', function() {
- var parsed = url.parse(server.url());
- parsed.auth = 'genie:bottle';
-
- var client = new HttpClient(url.format(parsed));
- var request = new HttpRequest('GET', '/protected');
- return client.send(request).then(function(response) {
- assert.equal(200, response.status);
- assert.equal(response.headers.get('content-type'), 'text/plain');
- assert.equal(response.body, 'Access granted!');
- });
- });
-
- it('fails requests missing required basic auth', function() {
- var client = new HttpClient(server.url());
- var request = new HttpRequest('GET', '/protected');
- return client.send(request).then(function(response) {
- assert.equal(401, response.status);
- assert.equal(response.body, 'Access denied');
- });
- });
-
- it('automatically follows redirects', function() {
- var request = new HttpRequest('GET', '/redirect');
- var client = new HttpClient(server.url());
- return client.send(request).then(function(response) {
- assert.equal(200, response.status);
- assert.equal(response.headers.get('content-type'), 'text/plain');
- assert.equal(response.body, 'hello, world!');
- });
- });
-
- it('handles malformed redirect responses', function() {
- var request = new HttpRequest('GET', '/badredirect');
- var client = new HttpClient(server.url());
- return client.send(request).then(assert.fail, function(err) {
- assert.ok(/Failed to parse "Location"/.test(err.message),
- 'Not the expected error: ' + err.message);
- });
- });
-
- describe('with proxy', function() {
- it('sends request to proxy with absolute URI', function() {
- var request = new HttpRequest('GET', '/proxy');
- var client = new HttpClient(
- 'http://another.server.com', undefined, server.url());
- return client.send(request).then(function(response) {
- assert.equal(200, response.status);
- assert.equal(response.headers.get('host'), 'another.server.com');
- assert.equal(
- response.headers.get('x-proxy-request-uri'),
- 'http://another.server.com/proxy');
- });
- });
-
- it('uses proxy when following redirects', function() {
- var request = new HttpRequest('GET', '/proxy/redirect');
- var client = new HttpClient(
- 'http://another.server.com', undefined, server.url());
- return client.send(request).then(function(response) {
- assert.equal(200, response.status);
- assert.equal(response.headers.get('host'), 'another.server.com');
- assert.equal(
- response.headers.get('x-proxy-request-uri'),
- 'http://another.server.com/proxy');
- });
- });
-
- it('includes search and hash in redirect URI', function() {
- var request = new HttpRequest('GET', '/proxy/redirect?foo#bar');
- var client = new HttpClient(
- 'http://another.server.com', undefined, server.url());
- return client.send(request).then(function(response) {
- assert.equal(200, response.status);
- assert.equal(response.headers.get('host'), 'another.server.com');
- assert.equal(
- response.headers.get('x-proxy-request-uri'),
- 'http://another.server.com/proxy?foo#bar');
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/http/util_test.js b/node_modules/selenium-webdriver/test/http/util_test.js
deleted file mode 100644
index 6361c0650..000000000
--- a/node_modules/selenium-webdriver/test/http/util_test.js
+++ /dev/null
@@ -1,178 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const http = require('http');
-
-const error = require('../../lib/error');
-const util = require('../../http/util');
-const promise = require('../../lib/promise');
-
-describe('selenium-webdriver/http/util', function() {
-
- var server, baseUrl;
-
- var status, value, responseCode;
-
- function startServer(done) {
- if (server) return done();
-
- server = http.createServer(function(req, res) {
- var data = JSON.stringify({status: status, value: value});
- res.writeHead(responseCode, {
- 'Content-Type': 'application/json; charset=utf-8',
- 'Content-Length': Buffer.byteLength(data, 'utf8')
- });
- res.end(data);
- });
-
- server.listen(0, '127.0.0.1', function(e) {
- if (e) return done(e);
-
- var addr = server.address();
- baseUrl = 'http://' + addr.address + ':' + addr.port;
- done();
- });
- }
-
- function killServer(done) {
- if (!server) return done();
- server.close(done);
- server = null;
- }
-
- after(killServer);
-
- beforeEach(function(done) {
- status = 0;
- value = 'abc123';
- responseCode = 200;
- startServer(done);
- });
-
- describe('#getStatus', function() {
- it('should return value field on success', function() {
- return util.getStatus(baseUrl).then(function(response) {
- assert.equal('abc123', response);
- });
- });
-
- it('should fail if response object is not success', function() {
- status = 1;
- return util.getStatus(baseUrl).then(function() {
- throw Error('expected a failure');
- }, function(err) {
- assert.ok(err instanceof error.WebDriverError);
- assert.equal(err.code, error.WebDriverError.code);
- assert.equal(err.message, value);
- });
- });
-
- it('should fail if the server is not listening', function(done) {
- killServer(function(e) {
- if(e) return done(e);
-
- util.getStatus(baseUrl).then(function() {
- done(Error('expected a failure'));
- }, function() {
- // Expected.
- done();
- });
- });
- });
-
- it('should fail if HTTP status is not 200', function() {
- status = 1;
- responseCode = 404;
- return util.getStatus(baseUrl).then(function() {
- throw Error('expected a failure');
- }, function(err) {
- assert.ok(err instanceof error.WebDriverError);
- assert.equal(err.code, error.WebDriverError.code);
- assert.equal(err.message, value);
- });
- });
- });
-
- describe('#waitForServer', function() {
- it('resolves when server is ready', function() {
- status = 1;
- setTimeout(function() { status = 0; }, 50);
- return util.waitForServer(baseUrl, 100);
- });
-
- it('should fail if server does not become ready', function() {
- status = 1;
- return util.waitForServer(baseUrl, 50).
- then(function() {throw Error('Expected to time out')},
- function() {});
- });
-
- it('can cancel wait', function() {
- status = 1;
- let cancel = new Promise(resolve => {
- setTimeout(_ => resolve(), 50)
- });
- return util.waitForServer(baseUrl, 200, cancel)
- .then(
- () => { throw Error('Did not expect to succeed!'); },
- (e) => assert.ok(e instanceof promise.CancellationError));
- });
- });
-
- describe('#waitForUrl', function() {
- it('succeeds when URL returns 2xx', function() {
- responseCode = 404;
- setTimeout(function() { responseCode = 200; }, 50);
-
- return util.waitForUrl(baseUrl, 200);
- });
-
- it('fails if URL always returns 4xx', function() {
- responseCode = 404;
-
- return util.waitForUrl(baseUrl, 50)
- .then(() => assert.fail('Expected to time out'),
- () => true);
- });
-
- it('fails if cannot connect to server', function() {
- return new Promise((resolve, reject) => {
- killServer(function(e) {
- if (e) return reject(e);
-
- util.waitForUrl(baseUrl, 50).
- then(function() { reject(Error('Expected to time out')); },
- function() { resolve(); });
- });
- });
- });
-
- it('can cancel wait', function() {
- responseCode = 404;
- let cancel = new Promise(resolve => {
- setTimeout(_ => resolve(), 50);
- });
- return util.waitForUrl(baseUrl, 200, cancel)
- .then(
- () => { throw Error('Did not expect to succeed!'); },
- (e) => assert.ok(e instanceof promise.CancellationError));
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/io_test.js b/node_modules/selenium-webdriver/test/io_test.js
deleted file mode 100644
index 840d7644b..000000000
--- a/node_modules/selenium-webdriver/test/io_test.js
+++ /dev/null
@@ -1,321 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert'),
- fs = require('fs'),
- path = require('path'),
- tmp = require('tmp');
-
-var io = require('../io');
-
-
-describe('io', function() {
- describe('copy', function() {
- var tmpDir;
-
- before(function() {
- return io.tmpDir().then(function(d) {
- tmpDir = d;
-
- fs.writeFileSync(path.join(d, 'foo'), 'Hello, world');
- });
- });
-
- it('can copy one file to another', function() {
- return io.tmpFile().then(function(f) {
- return io.copy(path.join(tmpDir, 'foo'), f).then(function(p) {
- assert.equal(p, f);
- assert.equal('Hello, world', fs.readFileSync(p));
- });
- });
- });
-
- it('can copy symlink to destination', function() {
- if (process.platform === 'win32') {
- return; // No symlinks on windows.
- }
- fs.symlinkSync(
- path.join(tmpDir, 'foo'),
- path.join(tmpDir, 'symlinked-foo'));
- return io.tmpFile().then(function(f) {
- return io.copy(path.join(tmpDir, 'symlinked-foo'), f).then(function(p) {
- assert.equal(p, f);
- assert.equal('Hello, world', fs.readFileSync(p));
- });
- });
- });
-
- it('fails if given a directory as a source', function() {
- return io.tmpFile().then(function(f) {
- return io.copy(tmpDir, f);
- }).then(function() {
- throw Error('Should have failed with a type error');
- }, function() {
- // Do nothing; expected.
- });
- });
- });
-
- describe('copyDir', function() {
- it('copies recursively', function() {
- return io.tmpDir().then(function(dir) {
- fs.writeFileSync(path.join(dir, 'file1'), 'hello');
- fs.mkdirSync(path.join(dir, 'sub'));
- fs.mkdirSync(path.join(dir, 'sub/folder'));
- fs.writeFileSync(path.join(dir, 'sub/folder/file2'), 'goodbye');
-
- return io.tmpDir().then(function(dst) {
- return io.copyDir(dir, dst).then(function(ret) {
- assert.equal(dst, ret);
-
- assert.equal('hello',
- fs.readFileSync(path.join(dst, 'file1')));
- assert.equal('goodbye',
- fs.readFileSync(path.join(dst, 'sub/folder/file2')));
- });
- });
- });
- });
-
- it('creates destination dir if necessary', function() {
- return io.tmpDir().then(function(srcDir) {
- fs.writeFileSync(path.join(srcDir, 'foo'), 'hi');
- return io.tmpDir().then(function(dstDir) {
- return io.copyDir(srcDir, path.join(dstDir, 'sub'));
- });
- }).then(function(p) {
- assert.equal('sub', path.basename(p));
- assert.equal('hi', fs.readFileSync(path.join(p, 'foo')));
- });
- });
-
- it('supports regex exclusion filter', function() {
- return io.tmpDir().then(function(src) {
- fs.writeFileSync(path.join(src, 'foo'), 'a');
- fs.writeFileSync(path.join(src, 'bar'), 'b');
- fs.writeFileSync(path.join(src, 'baz'), 'c');
- fs.mkdirSync(path.join(src, 'sub'));
- fs.writeFileSync(path.join(src, 'sub/quux'), 'd');
- fs.writeFileSync(path.join(src, 'sub/quot'), 'e');
-
- return io.tmpDir().then(function(dst) {
- return io.copyDir(src, dst, /(bar|quux)/);
- });
- }).then(function(dir) {
- assert.equal('a', fs.readFileSync(path.join(dir, 'foo')));
- assert.equal('c', fs.readFileSync(path.join(dir, 'baz')));
- assert.equal('e', fs.readFileSync(path.join(dir, 'sub/quot')));
-
- assert.ok(!fs.existsSync(path.join(dir, 'bar')));
- assert.ok(!fs.existsSync(path.join(dir, 'sub/quux')));
- });
- });
-
- it('supports exclusion filter function', function() {
- return io.tmpDir().then(function(src) {
- fs.writeFileSync(path.join(src, 'foo'), 'a');
- fs.writeFileSync(path.join(src, 'bar'), 'b');
- fs.writeFileSync(path.join(src, 'baz'), 'c');
- fs.mkdirSync(path.join(src, 'sub'));
- fs.writeFileSync(path.join(src, 'sub/quux'), 'd');
- fs.writeFileSync(path.join(src, 'sub/quot'), 'e');
-
- return io.tmpDir().then(function(dst) {
- return io.copyDir(src, dst, function(f) {
- return f !== path.join(src, 'foo')
- && f !== path.join(src, 'sub/quot');
- });
- });
- }).then(function(dir) {
- assert.equal('b', fs.readFileSync(path.join(dir, 'bar')));
- assert.equal('c', fs.readFileSync(path.join(dir, 'baz')));
- assert.equal('d', fs.readFileSync(path.join(dir, 'sub/quux')));
-
- assert.ok(!fs.existsSync(path.join(dir, 'foo')));
- assert.ok(!fs.existsSync(path.join(dir, 'sub/quot')));
- });
- });
- });
-
- describe('exists', function() {
- var dir;
-
- before(function() {
- return io.tmpDir().then(function(d) {
- dir = d;
- });
- });
-
- it('returns a rejected promise if input value is invalid', function() {
- return io.exists(undefined).then(
- () => assert.fail('should have failed'),
- e => assert.ok(e instanceof TypeError));
- });
-
- it('works for directories', function() {
- return io.exists(dir).then(assert.ok);
- });
-
- it('works for files', function() {
- var file = path.join(dir, 'foo');
- fs.writeFileSync(file, '');
- return io.exists(file).then(assert.ok);
- });
-
- it('does not return a rejected promise if file does not exist', function() {
- return io.exists(path.join(dir, 'not-there')).then(function(exists) {
- assert.ok(!exists);
- });
- });
- });
-
- describe('unlink', function() {
- var dir;
-
- before(function() {
- return io.tmpDir().then(function(d) {
- dir = d;
- });
- });
-
- it('silently succeeds if the path does not exist', function() {
- return io.unlink(path.join(dir, 'not-there'));
- });
-
- it('deletes files', function() {
- var file = path.join(dir, 'foo');
- fs.writeFileSync(file, '');
- return io.exists(file).then(assert.ok).then(function() {
- return io.unlink(file);
- }).then(function() {
- return io.exists(file);
- }).then(function(exists) {
- return assert.ok(!exists);
- });
- });
- });
-
- describe('rmDir', function() {
- it('succeeds if the designated directory does not exist', function() {
- return io.tmpDir().then(function(d) {
- return io.rmDir(path.join(d, 'i/do/not/exist'));
- });
- });
-
- it('deletes recursively', function() {
- return io.tmpDir().then(function(dir) {
- fs.writeFileSync(path.join(dir, 'file1'), 'hello');
- fs.mkdirSync(path.join(dir, 'sub'));
- fs.mkdirSync(path.join(dir, 'sub/folder'));
- fs.writeFileSync(path.join(dir, 'sub/folder/file2'), 'goodbye');
-
- return io.rmDir(dir).then(function() {
- assert.ok(!fs.existsSync(dir));
- assert.ok(!fs.existsSync(path.join(dir, 'sub/folder/file2')));
- });
- });
- });
- });
-
- describe('findInPath', function() {
- const savedPathEnv = process.env['PATH'];
- afterEach(() => process.env['PATH'] = savedPathEnv);
-
- const cwd = process.cwd;
- afterEach(() => process.cwd = cwd);
-
- let dirs;
- beforeEach(() => {
- return Promise.all([io.tmpDir(), io.tmpDir(), io.tmpDir()]).then(arr => {
- dirs = arr;
- process.env['PATH'] = arr.join(path.delimiter);
- });
- });
-
- it('returns null if file cannot be found', () => {
- assert.strictEqual(io.findInPath('foo.txt'), null);
- });
-
- it('can find file on path', () => {
- let filePath = path.join(dirs[1], 'foo.txt');
- fs.writeFileSync(filePath, 'hi');
-
- assert.strictEqual(io.findInPath('foo.txt'), filePath);
- });
-
- it('returns null if file is in a subdir of a directory on the path', () => {
- let subDir = path.join(dirs[2], 'sub');
- fs.mkdirSync(subDir);
-
- let filePath = path.join(subDir, 'foo.txt');
- fs.writeFileSync(filePath, 'hi');
-
- assert.strictEqual(io.findInPath('foo.txt'), null);
- });
-
- it('does not match on directories', () => {
- fs.mkdirSync(path.join(dirs[2], 'sub'));
- assert.strictEqual(io.findInPath('sub'), null);
- });
-
- it('will look in cwd first if requested', () => {
- return io.tmpDir().then(fakeCwd => {
- process.cwd = () => fakeCwd;
-
- let theFile = path.join(fakeCwd, 'foo.txt');
-
- fs.writeFileSync(path.join(dirs[1], 'foo.txt'), 'hi');
- fs.writeFileSync(theFile, 'bye');
-
- assert.strictEqual(io.findInPath('foo.txt', true), theFile);
- });
- });
- });
-
- describe('read', function() {
- var tmpDir;
-
- before(function() {
- return io.tmpDir().then(function(d) {
- tmpDir = d;
-
- fs.writeFileSync(path.join(d, 'foo'), 'Hello, world');
- });
- });
-
- it('can read a file', function() {
- return io.read(path.join(tmpDir, 'foo')).then(buff => {
- assert.ok(buff instanceof Buffer);
- assert.equal('Hello, world', buff.toString());
- });
- });
-
- it('catches errors from invalid input', function() {
- return io.read({})
- .then(() => assert.fail('should have failed'),
- (e) => assert.ok(e instanceof TypeError));
- });
-
- it('rejects returned promise if file does not exist', function() {
- return io.read(path.join(tmpDir, 'not-there'))
- .then(() => assert.fail('should have failed'),
- (e) => assert.equal('ENOENT', e.code));
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/by_test.js b/node_modules/selenium-webdriver/test/lib/by_test.js
deleted file mode 100644
index 34314fbf8..000000000
--- a/node_modules/selenium-webdriver/test/lib/by_test.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert');
-var by = require('../../lib/by');
-
-describe('by', function() {
- describe('By', function() {
- describe('className', function() {
- it('delegates to By.css', function() {
- let locator = by.By.className('foo');
- assert.equal('css selector', locator.using);
- assert.equal('.foo', locator.value);
- });
-
- it('escapes class name', function() {
- let locator = by.By.className('foo#bar');
- assert.equal('css selector', locator.using);
- assert.equal('.foo\\#bar', locator.value);
- });
-
- it('translates compound class names', function() {
- let locator = by.By.className('a b');
- assert.equal('css selector', locator.using);
- assert.equal('.a.b', locator.value);
-
- locator = by.By.className(' x y z-1 "g" ');
- assert.equal('css selector', locator.using);
- assert.equal('.x.y.z-1.\\"g\\"', locator.value);
- });
- });
-
- describe('id', function() {
- it('delegates to By.css', function() {
- let locator = by.By.id('foo');
- assert.equal('css selector', locator.using);
- assert.equal('*[id="foo"]', locator.value);
- });
-
- it('escapes the ID', function() {
- let locator = by.By.id('foo#bar');
- assert.equal('css selector', locator.using);
- assert.equal('*[id="foo\\#bar"]', locator.value);
- });
- });
-
- describe('name', function() {
- it('delegates to By.css', function() {
- let locator = by.By.name('foo')
- assert.equal('css selector', locator.using);
- assert.equal('*[name="foo"]', locator.value);
- });
-
- it('escapes the name', function() {
- let locator = by.By.name('foo"bar"')
- assert.equal('css selector', locator.using);
- assert.equal('*[name="foo\\"bar\\""]', locator.value);
- });
-
- it('escapes the name when it starts with a number', function() {
- let locator = by.By.name('123foo"bar"')
- assert.equal('css selector', locator.using);
- assert.equal('*[name="\\31 23foo\\"bar\\""]', locator.value);
- });
-
- it('escapes the name when it starts with a negative number', function() {
- let locator = by.By.name('-123foo"bar"')
- assert.equal('css selector', locator.using);
- assert.equal('*[name="-\\31 23foo\\"bar\\""]', locator.value);
- });
- });
- });
-
- describe('checkedLocator', function() {
- it('accepts a By instance', function() {
- let original = by.By.name('foo');
- let locator = by.checkedLocator(original);
- assert.strictEqual(locator, original);
- });
-
- it('accepts custom locator functions', function() {
- let original = function() {};
- let locator = by.checkedLocator(original);
- assert.strictEqual(locator, original);
- });
-
- // See https://github.com/SeleniumHQ/selenium/issues/3056
- it('accepts By-like objects', function() {
- let fakeBy = {using: 'id', value: 'foo'};
- let locator = by.checkedLocator(fakeBy);
- assert.strictEqual(locator.constructor, by.By);
- assert.equal(locator.using, 'id');
- assert.equal(locator.value, 'foo');
- });
-
- it('accepts class name', function() {
- let locator = by.checkedLocator({className: 'foo'});
- assert.equal('css selector', locator.using);
- assert.equal('.foo', locator.value);
- });
-
- it('accepts css', function() {
- let locator = by.checkedLocator({css: 'a > b'});
- assert.equal('css selector', locator.using);
- assert.equal('a > b', locator.value);
- });
-
- it('accepts id', function() {
- let locator = by.checkedLocator({id: 'foobar'});
- assert.equal('css selector', locator.using);
- assert.equal('*[id="foobar"]', locator.value);
- });
-
- it('accepts linkText', function() {
- let locator = by.checkedLocator({linkText: 'hello'});
- assert.equal('link text', locator.using);
- assert.equal('hello', locator.value);
- });
-
- it('accepts name', function() {
- let locator = by.checkedLocator({name: 'foobar'});
- assert.equal('css selector', locator.using);
- assert.equal('*[name="foobar"]', locator.value);
- });
-
- it('accepts partialLinkText', function() {
- let locator = by.checkedLocator({partialLinkText: 'hello'});
- assert.equal('partial link text', locator.using);
- assert.equal('hello', locator.value);
- });
-
- it('accepts tagName', function() {
- let locator = by.checkedLocator({tagName: 'div'});
- assert.equal('css selector', locator.using);
- assert.equal('div', locator.value);
- });
-
- it('accepts xpath', function() {
- let locator = by.checkedLocator({xpath: '//div[1]'});
- assert.equal('xpath', locator.using);
- assert.equal('//div[1]', locator.value);
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/capabilities_test.js b/node_modules/selenium-webdriver/test/lib/capabilities_test.js
deleted file mode 100644
index 0d0c67c9a..000000000
--- a/node_modules/selenium-webdriver/test/lib/capabilities_test.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const Capabilities = require('../../lib/capabilities').Capabilities;
-const Symbols = require('../../lib/symbols');
-
-const assert = require('assert');
-
-describe('Capabilities', function() {
- it('can set and unset a capability', function() {
- let caps = new Capabilities();
- assert.equal(undefined, caps.get('foo'));
- assert.ok(!caps.has('foo'));
-
- caps.set('foo', 'bar');
- assert.equal('bar', caps.get('foo'));
- assert.ok(caps.has('foo'));
-
- caps.set('foo', null);
- assert.equal(null, caps.get('foo'));
- assert.ok(caps.has('foo'));
- });
-
- it('requires string capability keys', function() {
- let caps = new Capabilities();
- assert.throws(() => caps.set({}, 'hi'));
- });
-
- it('can merge capabilities', function() {
- let caps1 = new Capabilities()
- .set('foo', 'bar')
- .set('color', 'red');
-
- let caps2 = new Capabilities()
- .set('color', 'green');
-
- assert.equal('bar', caps1.get('foo'));
- assert.equal('red', caps1.get('color'));
- assert.equal('green', caps2.get('color'));
- assert.equal(undefined, caps2.get('foo'));
-
- caps2.merge(caps1);
- assert.equal('bar', caps1.get('foo'));
- assert.equal('red', caps1.get('color'));
- assert.equal('red', caps2.get('color'));
- assert.equal('bar', caps2.get('foo'));
- });
-
- it('can be initialized from a hash object', function() {
- let caps = new Capabilities({'one': 123, 'abc': 'def'});
- assert.equal(123, caps.get('one'));
- assert.equal('def', caps.get('abc'));
- });
-
- it('can be initialized from a map', function() {
- let m = new Map([['one', 123], ['abc', 'def']]);
-
- let caps = new Capabilities(m);
- assert.equal(123, caps.get('one'));
- assert.equal('def', caps.get('abc'));
- });
-
- describe('serialize', function() {
- it('works for simple capabilities', function() {
- let m = new Map([['one', 123], ['abc', 'def']]);
- let caps = new Capabilities(m);
- assert.deepEqual({one: 123, abc: 'def'}, caps[Symbols.serialize]());
- });
-
- it('does not omit capabilities set to a false-like value', function() {
- let caps = new Capabilities;
- caps.set('bool', false);
- caps.set('number', 0);
- caps.set('string', '');
-
- assert.deepEqual(
- {bool: false, number: 0, string: ''},
- caps[Symbols.serialize]());
- });
-
- it('omits capabilities with a null value', function() {
- let caps = new Capabilities;
- caps.set('foo', null);
- caps.set('bar', 123);
- assert.deepEqual({bar: 123}, caps[Symbols.serialize]());
- });
-
- it('omits capabilities with an undefined value', function() {
- let caps = new Capabilities;
- caps.set('foo', undefined);
- caps.set('bar', 123);
- assert.deepEqual({bar: 123}, caps[Symbols.serialize]());
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/error_test.js b/node_modules/selenium-webdriver/test/lib/error_test.js
deleted file mode 100644
index a9fc87193..000000000
--- a/node_modules/selenium-webdriver/test/lib/error_test.js
+++ /dev/null
@@ -1,286 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-describe('error', function() {
- let assert = require('assert');
- let error = require('../../lib/error');
-
- describe('checkResponse', function() {
- it('defaults to WebDriverError if type is unrecognized', function() {
- assert.throws(
- () => error.checkResponse({error: 'foo', message: 'hi there'}),
- (e) => {
- assert.equal(e.constructor, error.WebDriverError);
- return true;
- });
- });
-
- it('does not throw if error property is not a string', function() {
- let resp = {error: 123, message: 'abc123'};
- let out = error.checkResponse(resp);
- assert.strictEqual(out, resp);
- });
-
- test('unknown error', error.WebDriverError);
- test('element not selectable', error.ElementNotSelectableError);
- test('element not visible', error.ElementNotVisibleError);
- test('invalid argument', error.InvalidArgumentError);
- test('invalid cookie domain', error.InvalidCookieDomainError);
- test('invalid element coordinates', error.InvalidElementCoordinatesError);
- test('invalid element state', error.InvalidElementStateError);
- test('invalid selector', error.InvalidSelectorError);
- test('invalid session id', error.NoSuchSessionError);
- test('javascript error', error.JavascriptError);
- test('move target out of bounds', error.MoveTargetOutOfBoundsError);
- test('no such alert', error.NoSuchAlertError);
- test('no such element', error.NoSuchElementError);
- test('no such frame', error.NoSuchFrameError);
- test('no such window', error.NoSuchWindowError);
- test('script timeout', error.ScriptTimeoutError);
- test('session not created', error.SessionNotCreatedError);
- test('stale element reference', error.StaleElementReferenceError);
- test('timeout', error.TimeoutError);
- test('unable to set cookie', error.UnableToSetCookieError);
- test('unable to capture screen', error.UnableToCaptureScreenError);
- test('unexpected alert open', error.UnexpectedAlertOpenError);
- test('unknown command', error.UnknownCommandError);
- test('unknown method', error.UnknownMethodError);
- test('unsupported operation', error.UnsupportedOperationError);
-
- function test(status, expectedType) {
- it(`"${status}" => ${expectedType.name}`, function() {
- assert.throws(
- () => error.checkResponse({error: status, message: 'oops'}),
- (e) => {
- assert.equal(expectedType, e.constructor);
- assert.equal(e.message, 'oops');
- return true;
- });
- });
- }
- });
-
- describe('encodeError', function() {
- describe('defaults to an unknown error', function() {
- it('for a generic error value', function() {
- runTest('hi', 'unknown error', 'hi');
- runTest(1, 'unknown error', '1');
- runTest({}, 'unknown error', '[object Object]');
- });
-
- it('for a generic Error object', function() {
- runTest(Error('oops'), 'unknown error', 'oops');
- runTest(TypeError('bad value'), 'unknown error', 'bad value');
- });
- });
-
- test(error.WebDriverError, 'unknown error');
- test(error.ElementNotSelectableError, 'element not selectable');
- test(error.ElementNotVisibleError, 'element not visible');
- test(error.InvalidArgumentError, 'invalid argument');
- test(error.InvalidCookieDomainError, 'invalid cookie domain');
- test(error.InvalidElementStateError, 'invalid element state');
- test(error.InvalidSelectorError, 'invalid selector');
- test(error.NoSuchSessionError, 'invalid session id');
- test(error.JavascriptError, 'javascript error');
- test(error.MoveTargetOutOfBoundsError, 'move target out of bounds');
- test(error.NoSuchAlertError, 'no such alert');
- test(error.NoSuchElementError, 'no such element');
- test(error.NoSuchFrameError, 'no such frame');
- test(error.NoSuchWindowError, 'no such window');
- test(error.ScriptTimeoutError, 'script timeout');
- test(error.SessionNotCreatedError, 'session not created');
- test(error.StaleElementReferenceError, 'stale element reference');
- test(error.TimeoutError, 'timeout');
- test(error.UnableToSetCookieError, 'unable to set cookie');
- test(error.UnableToCaptureScreenError, 'unable to capture screen');
- test(error.UnexpectedAlertOpenError, 'unexpected alert open');
- test(error.UnknownCommandError, 'unknown command');
- test(error.UnknownMethodError, 'unknown method');
- test(error.UnsupportedOperationError, 'unsupported operation');
-
- function test(ctor, code) {
- it(`${ctor.name} => "${code}"`, () => {
- runTest(new ctor('oops'), code, 'oops');
- });
- }
-
- function runTest(err, code, message) {
- let obj = error.encodeError(err);
- assert.strictEqual(obj['error'], code);
- assert.strictEqual(obj['message'], message);
- }
- });
-
- describe('throwDecodedError', function() {
- it('defaults to WebDriverError if type is unrecognized', function() {
- assert.throws(
- () => error.throwDecodedError({error: 'foo', message: 'hi there'}),
- (e) => {
- assert.equal(e.constructor, error.WebDriverError);
- return true;
- });
- });
-
- it('throws generic error if encoded data is not valid', function() {
- assert.throws(
- () => error.throwDecodedError({error: 123, message: 'abc123'}),
- (e) => {
- assert.strictEqual(e.constructor, error.WebDriverError);
- return true;
- });
-
- assert.throws(
- () => error.throwDecodedError('null'),
- (e) => {
- assert.strictEqual(e.constructor, error.WebDriverError);
- return true;
- });
-
- assert.throws(
- () => error.throwDecodedError(''),
- (e) => {
- assert.strictEqual(e.constructor, error.WebDriverError);
- return true;
- });
- });
-
- test('unknown error', error.WebDriverError);
- test('element not selectable', error.ElementNotSelectableError);
- test('element not visible', error.ElementNotVisibleError);
- test('invalid argument', error.InvalidArgumentError);
- test('invalid cookie domain', error.InvalidCookieDomainError);
- test('invalid element coordinates', error.InvalidElementCoordinatesError);
- test('invalid element state', error.InvalidElementStateError);
- test('invalid selector', error.InvalidSelectorError);
- test('invalid session id', error.NoSuchSessionError);
- test('javascript error', error.JavascriptError);
- test('move target out of bounds', error.MoveTargetOutOfBoundsError);
- test('no such alert', error.NoSuchAlertError);
- test('no such element', error.NoSuchElementError);
- test('no such frame', error.NoSuchFrameError);
- test('no such window', error.NoSuchWindowError);
- test('script timeout', error.ScriptTimeoutError);
- test('session not created', error.SessionNotCreatedError);
- test('stale element reference', error.StaleElementReferenceError);
- test('timeout', error.TimeoutError);
- test('unable to set cookie', error.UnableToSetCookieError);
- test('unable to capture screen', error.UnableToCaptureScreenError);
- test('unexpected alert open', error.UnexpectedAlertOpenError);
- test('unknown command', error.UnknownCommandError);
- test('unknown method', error.UnknownMethodError);
- test('unsupported operation', error.UnsupportedOperationError);
-
- function test(status, expectedType) {
- it(`"${status}" => ${expectedType.name}`, function() {
- assert.throws(
- () => error.throwDecodedError({error: status, message: 'oops'}),
- (e) => {
- assert.strictEqual(e.constructor, expectedType);
- assert.strictEqual(e.message, 'oops');
- return true;
- });
- });
- }
- });
-
- describe('checkLegacyResponse', function() {
- it('does not throw for success', function() {
- let resp = {status: error.ErrorCode.SUCCESS};
- assert.strictEqual(resp, error.checkLegacyResponse(resp));
- });
-
- test('NO_SUCH_ELEMENT', error.NoSuchElementError);
- test('NO_SUCH_FRAME', error.NoSuchFrameError);
- test('UNKNOWN_COMMAND', error.UnsupportedOperationError);
- test('UNSUPPORTED_OPERATION', error.UnsupportedOperationError);
- test('STALE_ELEMENT_REFERENCE', error.StaleElementReferenceError);
- test('ELEMENT_NOT_VISIBLE', error.ElementNotVisibleError);
- test('INVALID_ELEMENT_STATE', error.InvalidElementStateError);
- test('UNKNOWN_ERROR', error.WebDriverError);
- test('ELEMENT_NOT_SELECTABLE', error.ElementNotSelectableError);
- test('JAVASCRIPT_ERROR', error.JavascriptError);
- test('XPATH_LOOKUP_ERROR', error.InvalidSelectorError);
- test('TIMEOUT', error.TimeoutError);
- test('NO_SUCH_WINDOW', error.NoSuchWindowError);
- test('INVALID_COOKIE_DOMAIN', error.InvalidCookieDomainError);
- test('UNABLE_TO_SET_COOKIE', error.UnableToSetCookieError);
- test('UNEXPECTED_ALERT_OPEN', error.UnexpectedAlertOpenError);
- test('NO_SUCH_ALERT', error.NoSuchAlertError);
- test('SCRIPT_TIMEOUT', error.ScriptTimeoutError);
- test('INVALID_ELEMENT_COORDINATES', error.InvalidElementCoordinatesError);
- test('INVALID_SELECTOR_ERROR', error.InvalidSelectorError);
- test('SESSION_NOT_CREATED', error.SessionNotCreatedError);
- test('MOVE_TARGET_OUT_OF_BOUNDS', error.MoveTargetOutOfBoundsError);
- test('INVALID_XPATH_SELECTOR', error.InvalidSelectorError);
- test('INVALID_XPATH_SELECTOR_RETURN_TYPE', error.InvalidSelectorError);
- test('METHOD_NOT_ALLOWED', error.UnsupportedOperationError);
-
- describe('UnexpectedAlertOpenError', function() {
- it('includes alert text from the response object', function() {
- let response = {
- status: error.ErrorCode.UNEXPECTED_ALERT_OPEN,
- value: {
- message: 'hi',
- alert: {text: 'alert text here'}
- }
- };
- assert.throws(
- () => error.checkLegacyResponse(response),
- (e) => {
- assert.equal(error.UnexpectedAlertOpenError, e.constructor);
- assert.equal(e.message, 'hi');
- assert.equal(e.getAlertText(), 'alert text here');
- return true;
- });
- });
-
- it('uses an empty string if alert text omitted', function() {
- let response = {
- status: error.ErrorCode.UNEXPECTED_ALERT_OPEN,
- value: {
- message: 'hi'
- }
- };
- assert.throws(
- () => error.checkLegacyResponse(response),
- (e) => {
- assert.equal(error.UnexpectedAlertOpenError, e.constructor);
- assert.equal(e.message, 'hi');
- assert.equal(e.getAlertText(), '');
- return true;
- });
- });
- });
-
- function test(codeKey, expectedType) {
- it(`${codeKey} => ${expectedType.name}`, function() {
- let code = error.ErrorCode[codeKey];
- let resp = {status: code, value: {message: 'hi'}};
- assert.throws(
- () => error.checkLegacyResponse(resp),
- (e) => {
- assert.equal(expectedType, e.constructor);
- assert.equal(e.message, 'hi');
- return true;
- });
- });
- }
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/events_test.js b/node_modules/selenium-webdriver/test/lib/events_test.js
deleted file mode 100644
index a02da9747..000000000
--- a/node_modules/selenium-webdriver/test/lib/events_test.js
+++ /dev/null
@@ -1,177 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const EventEmitter = require('../../lib/events').EventEmitter;
-
-const assert = require('assert');
-const sinon = require('sinon');
-
-describe('EventEmitter', function() {
- describe('#emit()', function() {
- it('can emit events when nothing is registered', function() {
- let emitter = new EventEmitter;
- emitter.emit('foo');
- // Ok if no errors are thrown.
- });
-
- it('can pass args to listeners on emit', function() {
- let emitter = new EventEmitter;
- let now = Date.now();
-
- let messages = [];
- emitter.on('foo', (arg) => messages.push(arg));
-
- emitter.emit('foo', now);
- assert.deepEqual([now], messages);
-
- emitter.emit('foo', now + 15);
- assert.deepEqual([now, now + 15], messages);
- });
- });
-
- describe('#addListener()', function() {
- it('can add multiple listeners for one event', function() {
- let emitter = new EventEmitter;
- let count = 0;
- emitter.addListener('foo', () => count++);
- emitter.addListener('foo', () => count++);
- emitter.addListener('foo', () => count++);
- emitter.emit('foo');
- assert.equal(3, count);
- });
-
- it('only registers each listener function once', function() {
- let emitter = new EventEmitter;
- let count = 0;
- let onFoo = () => count++;
- emitter.addListener('foo', onFoo);
- emitter.addListener('foo', onFoo);
- emitter.addListener('foo', onFoo);
-
- emitter.emit('foo');
- assert.equal(1, count);
-
- emitter.emit('foo');
- assert.equal(2, count);
- });
-
- it('allows users to specify a custom scope', function() {
- let obj = {
- count: 0,
- inc: function() {
- this.count++;
- }
- };
- let emitter = new EventEmitter;
- emitter.addListener('foo', obj.inc, obj);
-
- emitter.emit('foo');
- assert.equal(1, obj.count);
-
- emitter.emit('foo');
- assert.equal(2, obj.count);
- });
- });
-
- describe('#once()', function() {
- it('only calls registered callback once', function() {
- let emitter = new EventEmitter;
- let count = 0;
- emitter.once('foo', () => count++);
- emitter.once('foo', () => count++);
- emitter.once('foo', () => count++);
-
- emitter.emit('foo');
- assert.equal(3, count);
-
- emitter.emit('foo');
- assert.equal(3, count);
-
- emitter.emit('foo');
- assert.equal(3, count);
- });
- });
-
- describe('#removeListeners()', function() {
- it('only removes the given listener function', function() {
- let emitter = new EventEmitter;
- let count = 0;
- emitter.addListener('foo', () => count++);
- emitter.addListener('foo', () => count++);
-
- let toRemove = () => count++;
- emitter.addListener('foo', toRemove);
-
- emitter.emit('foo');
- assert.equal(3, count);
-
- emitter.removeListener('foo', toRemove);
- emitter.emit('foo');
- assert.equal(5, count);
- });
- });
-
- describe('#removeAllListeners()', function() {
- it('only removes listeners for type if specified', function() {
- let emitter = new EventEmitter;
- let count = 0;
- emitter.addListener('foo', () => count++);
- emitter.addListener('foo', () => count++);
- emitter.addListener('foo', () => count++);
- emitter.addListener('bar', () => count++);
-
- emitter.emit('foo');
- assert.equal(3, count);
-
- emitter.removeAllListeners('foo');
-
- emitter.emit('foo');
- assert.equal(3, count);
-
- emitter.emit('bar');
- assert.equal(4, count);
- });
-
- it('removes absolutely all listeners if no type specified', function() {
- let emitter = new EventEmitter;
- let count = 0;
- emitter.addListener('foo', () => count++);
- emitter.addListener('bar', () => count++);
- emitter.addListener('baz', () => count++);
- emitter.addListener('baz', () => count++);
-
- emitter.emit('foo');
- assert.equal(1, count);
-
- emitter.emit('baz');
- assert.equal(3, count);
-
- emitter.removeAllListeners();
-
- emitter.emit('foo');
- assert.equal(3, count);
-
- emitter.emit('bar');
- assert.equal(3, count);
-
- emitter.emit('baz');
- assert.equal(3, count);
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/http_test.js b/node_modules/selenium-webdriver/test/lib/http_test.js
deleted file mode 100644
index 7cb0050f7..000000000
--- a/node_modules/selenium-webdriver/test/lib/http_test.js
+++ /dev/null
@@ -1,696 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert'),
- sinon = require('sinon');
-
-var Capabilities = require('../../lib/capabilities').Capabilities,
- Command = require('../../lib/command').Command,
- CommandName = require('../../lib/command').Name,
- error = require('../../lib/error'),
- http = require('../../lib/http'),
- Session = require('../../lib/session').Session,
- promise = require('../../lib/promise'),
- WebElement = require('../../lib/webdriver').WebElement;
-
-describe('http', function() {
- describe('buildPath', function() {
- it('properly replaces path segments with command parameters', function() {
- var parameters = {'sessionId':'foo', 'url':'http://www.google.com'};
- var finalPath = http.buildPath('/session/:sessionId/url', parameters);
- assert.equal(finalPath, '/session/foo/url');
- assert.deepEqual(parameters, {'url':'http://www.google.com'});
- });
-
- it('handles web element references', function() {
- var parameters = {'sessionId':'foo', 'id': WebElement.buildId('bar')};
-
- var finalPath = http.buildPath(
- '/session/:sessionId/element/:id/click', parameters);
- assert.equal(finalPath, '/session/foo/element/bar/click');
- assert.deepEqual(parameters, {});
- });
-
- it('throws if missing a parameter', function() {
- assert.throws(
- () => http.buildPath('/session/:sessionId', {}),
- function(err) {
- return err instanceof error.InvalidArgumentError
- && 'Missing required parameter: sessionId' === err.message;
- });
-
- assert.throws(
- () => http.buildPath(
- '/session/:sessionId/element/:id', {'sessionId': 'foo'}),
- function(err) {
- return err instanceof error.InvalidArgumentError
- && 'Missing required parameter: id' === err.message;
- });
- });
-
- it('does not match on segments that do not start with a colon', function() {
- assert.equal(
- http.buildPath('/session/foo:bar/baz', {}),
- '/session/foo:bar/baz');
- });
- });
-
- describe('Executor', function() {
- let executor;
- let client;
- let send;
-
- beforeEach(function setUp() {
- client = new http.Client;
- send = sinon.stub(client, 'send');
- executor = new http.Executor(client);
- });
-
- describe('command routing', function() {
- it('rejects unrecognized commands', function() {
- return executor.execute(new Command('fake-name'))
- .then(assert.fail, err => {
- if (err instanceof error.UnknownCommandError
- && 'Unrecognized command: fake-name' === err.message) {
- return;
- }
- throw err;
- })
- });
-
- it('rejects promise if client fails to send request', function() {
- let error = new Error('boom');
- send.returns(Promise.reject(error));
- return assertFailsToSend(new Command(CommandName.NEW_SESSION))
- .then(function(e) {
- assert.strictEqual(error, e);
- assertSent(
- 'POST', '/session', {},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
-
- it('can execute commands with no URL parameters', function() {
- var resp = JSON.stringify({sessionId: 'abc123'});
- send.returns(Promise.resolve(new http.Response(200, {}, resp)));
-
- let command = new Command(CommandName.NEW_SESSION);
- return assertSendsSuccessfully(command).then(function(response) {
- assertSent(
- 'POST', '/session', {},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
-
- it('rejects commands missing URL parameters', function() {
- let command =
- new Command(CommandName.FIND_CHILD_ELEMENT).
- setParameter('sessionId', 's123').
- // Let this be missing: setParameter('id', {'ELEMENT': 'e456'}).
- setParameter('using', 'id').
- setParameter('value', 'foo');
-
- assert.throws(
- () => executor.execute(command),
- function(err) {
- return err instanceof error.InvalidArgumentError
- && 'Missing required parameter: id' === err.message;
- });
- assert.ok(!send.called);
- });
-
- it('replaces URL parameters with command parameters', function() {
- var command = new Command(CommandName.GET).
- setParameter('sessionId', 's123').
- setParameter('url', 'http://www.google.com');
-
- send.returns(Promise.resolve(new http.Response(200, {}, '')));
-
- return assertSendsSuccessfully(command).then(function(response) {
- assertSent(
- 'POST', '/session/s123/url', {'url': 'http://www.google.com'},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
-
- describe('uses correct URL', function() {
- beforeEach(() => executor = new http.Executor(client));
-
- describe('in legacy mode', function() {
- test(CommandName.GET_WINDOW_SIZE, {sessionId:'s123'}, false,
- 'GET', '/session/s123/window/current/size');
-
- test(CommandName.SET_WINDOW_SIZE,
- {sessionId:'s123', width: 1, height: 1}, false,
- 'POST', '/session/s123/window/current/size',
- {width: 1, height: 1});
-
- test(CommandName.MAXIMIZE_WINDOW, {sessionId:'s123'}, false,
- 'POST', '/session/s123/window/current/maximize');
-
- // This is consistent b/w legacy and W3C, just making sure.
- test(CommandName.GET,
- {sessionId:'s123', url: 'http://www.example.com'}, false,
- 'POST', '/session/s123/url', {url: 'http://www.example.com'});
- });
-
- describe('in W3C mode', function() {
- test(CommandName.GET_WINDOW_SIZE,
- {sessionId:'s123'}, true,
- 'GET', '/session/s123/window/size');
-
- test(CommandName.SET_WINDOW_SIZE,
- {sessionId:'s123', width: 1, height: 1}, true,
- 'POST', '/session/s123/window/size', {width: 1, height: 1});
-
- test(CommandName.MAXIMIZE_WINDOW, {sessionId:'s123'}, true,
- 'POST', '/session/s123/window/maximize');
-
- // This is consistent b/w legacy and W3C, just making sure.
- test(CommandName.GET,
- {sessionId:'s123', url: 'http://www.example.com'}, true,
- 'POST', '/session/s123/url', {url: 'http://www.example.com'});
- });
-
- function test(command, parameters, w3c,
- expectedMethod, expectedUrl, opt_expectedParams) {
- it(`command=${command}`, function() {
- var resp = JSON.stringify({sessionId: 'abc123'});
- send.returns(Promise.resolve(new http.Response(200, {}, resp)));
-
- let cmd = new Command(command).setParameters(parameters);
- executor.w3c = w3c;
- return executor.execute(cmd).then(function() {
- assertSent(
- expectedMethod, expectedUrl, opt_expectedParams || {},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
- }
- });
- });
-
- describe('response parsing', function() {
- it('extracts value from JSON response', function() {
- var responseObj = {
- 'status': error.ErrorCode.SUCCESS,
- 'value': 'http://www.google.com'
- };
-
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(responseObj))));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, 'http://www.google.com');
- });
- });
-
- describe('extracts Session from NEW_SESSION response', function() {
- beforeEach(() => executor = new http.Executor(client));
-
- const command = new Command(CommandName.NEW_SESSION);
-
- describe('fails if server returns invalid response', function() {
- describe('(empty response)', function() {
- test(true);
- test(false);
-
- function test(w3c) {
- it('w3c === ' + w3c, function() {
- send.returns(Promise.resolve(new http.Response(200, {}, '')));
- executor.w3c = w3c;
- return executor.execute(command).then(
- () => assert.fail('expected to fail'),
- (e) => {
- if (!e.message.startsWith('Unable to parse')) {
- throw e;
- }
- });
- });
- }
- });
-
- describe('(no session ID)', function() {
- test(true);
- test(false);
-
- function test(w3c) {
- it('w3c === ' + w3c, function() {
- let resp = {value:{name: 'Bob'}};
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(resp))));
- executor.w3c = w3c;
- return executor.execute(command).then(
- () => assert.fail('expected to fail'),
- (e) => {
- if (!e.message.startsWith('Unable to parse')) {
- throw e;
- }
- });
- });
- }
- });
- });
-
- it('handles legacy response', function() {
- var rawResponse = {sessionId: 's123', status: 0, value: {name: 'Bob'}};
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(rawResponse))));
-
- assert.ok(!executor.w3c);
- return executor.execute(command).then(function(response) {
- assert.ok(response instanceof Session);
- assert.equal(response.getId(), 's123');
-
- let caps = response.getCapabilities();
- assert.ok(caps instanceof Capabilities);
- assert.equal(caps.get('name'), 'Bob');
-
- assert.ok(!executor.w3c);
- });
- });
-
- it('auto-upgrades on W3C response', function() {
- let rawResponse = {
- value: {
- sessionId: 's123',
- value: {
- name: 'Bob'
- }
- }
- };
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(rawResponse))));
-
- assert.ok(!executor.w3c);
- return executor.execute(command).then(function(response) {
- assert.ok(response instanceof Session);
- assert.equal(response.getId(), 's123');
-
- let caps = response.getCapabilities();
- assert.ok(caps instanceof Capabilities);
- assert.equal(caps.get('name'), 'Bob');
-
- assert.ok(executor.w3c);
- });
- });
-
- it('if w3c, does not downgrade on legacy response', function() {
- var rawResponse = {sessionId: 's123', status: 0, value: null};
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(rawResponse))));
-
- executor.w3c = true;
- return executor.execute(command).then(function(response) {
- assert.ok(response instanceof Session);
- assert.equal(response.getId(), 's123');
- assert.equal(response.getCapabilities().size, 0);
- assert.ok(executor.w3c, 'should never downgrade');
- });
- });
-
- it('handles legacy new session failures', function() {
- let rawResponse = {
- status: error.ErrorCode.NO_SUCH_ELEMENT,
- value: {message: 'hi'}
- };
-
- send.returns(Promise.resolve(
- new http.Response(500, {}, JSON.stringify(rawResponse))));
-
- return executor.execute(command)
- .then(() => assert.fail('should have failed'),
- e => {
- assert.ok(e instanceof error.NoSuchElementError);
- assert.equal(e.message, 'hi');
- });
- });
-
- it('handles w3c new session failures', function() {
- let rawResponse =
- {value: {error: 'no such element', message: 'oops'}};
-
- send.returns(Promise.resolve(
- new http.Response(500, {}, JSON.stringify(rawResponse))));
-
- return executor.execute(command)
- .then(() => assert.fail('should have failed'),
- e => {
- assert.ok(e instanceof error.NoSuchElementError);
- assert.equal(e.message, 'oops');
- });
- });
- });
-
- describe('extracts Session from DESCRIBE_SESSION response', function() {
- let command;
-
- beforeEach(function() {
- executor = new http.Executor(client);
- command = new Command(CommandName.DESCRIBE_SESSION)
- .setParameter('sessionId', 'foo');
- });
-
- describe('fails if server returns invalid response', function() {
- describe('(empty response)', function() {
- test(true);
- test(false);
-
- function test(w3c) {
- it('w3c === ' + w3c, function() {
- send.returns(Promise.resolve(new http.Response(200, {}, '')));
- executor.w3c = w3c;
- return executor.execute(command).then(
- () => assert.fail('expected to fail'),
- (e) => {
- if (!e.message.startsWith('Unable to parse')) {
- throw e;
- }
- });
- });
- }
- });
-
- describe('(no session ID)', function() {
- test(true);
- test(false);
-
- function test(w3c) {
- it('w3c === ' + w3c, function() {
- let resp = {value:{name: 'Bob'}};
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(resp))));
- executor.w3c = w3c;
- return executor.execute(command).then(
- () => assert.fail('expected to fail'),
- (e) => {
- if (!e.message.startsWith('Unable to parse')) {
- throw e;
- }
- });
- });
- }
- });
- });
-
- it('handles legacy response', function() {
- var rawResponse = {sessionId: 's123', status: 0, value: {name: 'Bob'}};
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(rawResponse))));
-
- assert.ok(!executor.w3c);
- return executor.execute(command).then(function(response) {
- assert.ok(response instanceof Session);
- assert.equal(response.getId(), 's123');
-
- let caps = response.getCapabilities();
- assert.ok(caps instanceof Capabilities);
- assert.equal(caps.get('name'), 'Bob');
-
- assert.ok(!executor.w3c);
- });
- });
-
- it('does not auto-upgrade on W3C response', function() {
- var rawResponse = {value: {sessionId: 's123', value: {name: 'Bob'}}};
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(rawResponse))));
-
- assert.ok(!executor.w3c);
- return executor.execute(command).then(function(response) {
- assert.ok(response instanceof Session);
- assert.equal(response.getId(), 's123');
-
- let caps = response.getCapabilities();
- assert.ok(caps instanceof Capabilities);
- assert.equal(caps.get('name'), 'Bob');
-
- assert.ok(!executor.w3c);
- });
- });
-
- it('if w3c, does not downgrade on legacy response', function() {
- var rawResponse = {sessionId: 's123', status: 0, value: null};
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, JSON.stringify(rawResponse))));
-
- executor.w3c = true;
- return executor.execute(command).then(function(response) {
- assert.ok(response instanceof Session);
- assert.equal(response.getId(), 's123');
- assert.equal(response.getCapabilities().size, 0);
- assert.ok(executor.w3c, 'should never downgrade');
- });
- });
- });
-
- it('handles JSON null', function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(new http.Response(200, {}, 'null')));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, null);
- });
- });
-
- describe('falsy values', function() {
- test(0);
- test(false);
- test('');
-
- function test(value) {
- it(`value=${value}`, function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(
- new http.Response(200, {},
- JSON.stringify({status: 0, value: value}))));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, value);
- });
- });
- }
- });
-
- it('handles non-object JSON', function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(new http.Response(200, {}, '123')));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, 123);
- });
- });
-
- it('returns body text when 2xx but not JSON', function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, 'hello, world\r\ngoodbye, world!')));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, 'hello, world\ngoodbye, world!');
- });
- });
-
- it('returns body text when 2xx but invalid JSON', function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(
- new http.Response(200, {}, '[')));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, '[');
- });
- });
-
- it('returns null if no body text and 2xx', function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(new http.Response(200, {}, '')));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, null);
- });
- });
-
- it('returns normalized body text when 2xx but not JSON', function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(new http.Response(200, {}, '\r\n\n\n\r\n')));
-
- return executor.execute(command).then(function(response) {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- assert.strictEqual(response, '\n\n\n\n');
- });
- });
-
- it('throws UnsupportedOperationError for 404 and body not JSON',
- function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(
- new http.Response(404, {}, 'hello, world\r\ngoodbye, world!')));
-
- return executor.execute(command)
- .then(
- () => assert.fail('should have failed'),
- checkError(
- error.UnsupportedOperationError,
- 'hello, world\ngoodbye, world!'));
- });
-
- it('throws WebDriverError for generic 4xx when body not JSON',
- function() {
- var command = new Command(CommandName.GET_CURRENT_URL)
- .setParameter('sessionId', 's123');
-
- send.returns(Promise.resolve(
- new http.Response(500, {}, 'hello, world\r\ngoodbye, world!')));
-
- return executor.execute(command)
- .then(
- () => assert.fail('should have failed'),
- checkError(
- error.WebDriverError,
- 'hello, world\ngoodbye, world!'))
- .then(function() {
- assertSent('GET', '/session/s123/url', {},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
- });
-
- it('canDefineNewCommands', function() {
- executor.defineCommand('greet', 'GET', '/person/:name');
-
- var command = new Command('greet').
- setParameter('name', 'Bob');
-
- send.returns(Promise.resolve(new http.Response(200, {}, '')));
-
- return assertSendsSuccessfully(command).then(function(response) {
- assertSent('GET', '/person/Bob', {},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
-
- it('canRedefineStandardCommands', function() {
- executor.defineCommand(CommandName.GO_BACK, 'POST', '/custom/back');
-
- var command = new Command(CommandName.GO_BACK).
- setParameter('times', 3);
-
- send.returns(Promise.resolve(new http.Response(200, {}, '')));
-
- return assertSendsSuccessfully(command).then(function(response) {
- assertSent('POST', '/custom/back', {'times': 3},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
-
- it('accepts promised http clients', function() {
- executor = new http.Executor(Promise.resolve(client));
-
- var resp = JSON.stringify({sessionId: 'abc123'});
- send.returns(Promise.resolve(new http.Response(200, {}, resp)));
-
- let command = new Command(CommandName.NEW_SESSION);
- return executor.execute(command).then(response => {
- assertSent(
- 'POST', '/session', {},
- [['Accept', 'application/json; charset=utf-8']]);
- });
- });
-
- function entries(map) {
- let entries = [];
- for (let e of map.entries()) {
- entries.push(e);
- }
- return entries;
- }
-
- function checkError(type, message) {
- return function(e) {
- if (e instanceof type) {
- assert.strictEqual(e.message, message);
- } else {
- throw e;
- }
- };
- }
-
- function assertSent(method, path, data, headers) {
- assert.ok(send.calledWith(sinon.match(function(value) {
- assert.equal(value.method, method);
- assert.equal(value.path, path);
- assert.deepEqual(value.data, data);
- assert.deepEqual(entries(value.headers), headers);
- return true;
- })));
- }
-
- function assertSendsSuccessfully(command) {
- return executor.execute(command).then(function(response) {
- return response;
- });
- }
-
- function assertFailsToSend(command, opt_onError) {
- return executor.execute(command).then(
- () => {throw Error('should have failed')},
- (e) => {return e});
- }
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/logging_test.js b/node_modules/selenium-webdriver/test/lib/logging_test.js
deleted file mode 100644
index 29d2af40f..000000000
--- a/node_modules/selenium-webdriver/test/lib/logging_test.js
+++ /dev/null
@@ -1,272 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const sinon = require('sinon');
-const logging = require('../../lib/logging');
-
-describe('logging', function() {
- let mgr, root, clock;
-
- beforeEach(function setUp() {
- mgr = new logging.LogManager;
- root = mgr.getLogger('');
-
- clock = sinon.useFakeTimers();
- });
-
- afterEach(function tearDown() {
- clock.restore();
- });
-
- describe('LogManager', function() {
- describe('getLogger()', function() {
- it('handles falsey input', function() {
- assert.strictEqual(root, mgr.getLogger());
- assert.strictEqual(root, mgr.getLogger(''));
- assert.strictEqual(root, mgr.getLogger(null));
- assert.strictEqual(root, mgr.getLogger(0));
- });
-
- it('creates parent loggers', function() {
- let logger = mgr.getLogger('foo.bar.baz');
- assert.strictEqual(logger.parent_, mgr.getLogger('foo.bar'));
-
- logger = logger.parent_;
- assert.strictEqual(logger.parent_, mgr.getLogger('foo'));
-
- logger = logger.parent_;
- assert.strictEqual(logger.parent_, mgr.getLogger(''));
-
- assert.strictEqual(logger.parent_.parent_, null);
- });
- });
- });
-
- describe('Logger', function() {
- describe('getEffectiveLevel()', function() {
- it('defaults to OFF', function() {
- assert.strictEqual(root.getLevel(), logging.Level.OFF);
- assert.strictEqual(root.getEffectiveLevel(), logging.Level.OFF);
-
- root.setLevel(null);
- assert.strictEqual(root.getLevel(), null);
- assert.strictEqual(root.getEffectiveLevel(), logging.Level.OFF);
- });
-
- it('uses own level if set', function() {
- let logger = mgr.getLogger('foo.bar.baz');
- assert.strictEqual(logger.getLevel(), null);
- assert.strictEqual(logger.getEffectiveLevel(), logging.Level.OFF);
-
- logger.setLevel(logging.Level.INFO);
- assert.strictEqual(logger.getLevel(), logging.Level.INFO);
- assert.strictEqual(logger.getEffectiveLevel(), logging.Level.INFO);
- });
-
- it('uses level from set on nearest parent', function() {
- let ancestor = mgr.getLogger('foo');
- ancestor.setLevel(logging.Level.SEVERE);
-
- let logger = mgr.getLogger('foo.bar.baz');
- assert.strictEqual(logger.getLevel(), null);
- assert.strictEqual(logger.getEffectiveLevel(), logging.Level.SEVERE);
- });
- });
-
- describe('isLoggable()', function() {
- it('compares level against logger\'s effective level', function() {
- const log1 = mgr.getLogger('foo');
- log1.setLevel(logging.Level.WARNING);
-
- const log2 = mgr.getLogger('foo.bar.baz');
-
- assert(!log2.isLoggable(logging.Level.FINEST));
- assert(!log2.isLoggable(logging.Level.INFO));
- assert(log2.isLoggable(logging.Level.WARNING));
- assert(log2.isLoggable(logging.Level.SEVERE));
-
- log2.setLevel(logging.Level.INFO);
-
- assert(!log2.isLoggable(logging.Level.FINEST));
- assert(log2.isLoggable(logging.Level.INFO));
- assert(log2.isLoggable(logging.Level.WARNING));
- assert(log2.isLoggable(logging.Level.SEVERE));
-
- log2.setLevel(logging.Level.ALL);
-
- assert(log2.isLoggable(logging.Level.FINEST));
- assert(log2.isLoggable(logging.Level.INFO));
- assert(log2.isLoggable(logging.Level.WARNING));
- assert(log2.isLoggable(logging.Level.SEVERE));
- });
-
- it('Level.OFF is never loggable', function() {
- function test(level) {
- root.setLevel(level);
- assert(!root.isLoggable(logging.Level.OFF),
- 'OFF should not be loggable at ' + level);
- }
-
- test(logging.Level.ALL);
- test(logging.Level.INFO);
- test(logging.Level.OFF);
- });
- });
-
- describe('log()', function() {
- it('does not invoke loggable if message is not loggable', function() {
- const log = mgr.getLogger('foo');
- log.setLevel(logging.Level.OFF);
-
- let callback = sinon.spy();
- log.addHandler(callback);
- root.addHandler(callback);
-
- assert(!callback.called);
- });
-
- it('invokes handlers for each parent logger', function() {
- const cb1 = sinon.spy();
- const cb2 = sinon.spy();
- const cb3 = sinon.spy();
- const cb4 = sinon.spy();
-
- const log1 = mgr.getLogger('foo');
- const log2 = mgr.getLogger('foo.bar');
- const log3 = mgr.getLogger('foo.bar.baz');
- const log4 = mgr.getLogger('foo.bar.baz.quot');
-
- log1.addHandler(cb1);
- log1.setLevel(logging.Level.INFO);
-
- log2.addHandler(cb2);
- log2.setLevel(logging.Level.WARNING);
-
- log3.addHandler(cb3);
- log3.setLevel(logging.Level.FINER);
-
- clock.tick(123456);
-
- log4.finest('this is the finest message');
- log4.finer('this is a finer message');
- log4.info('this is an info message');
- log4.warning('this is a warning message');
- log4.severe('this is a severe message');
-
- assert.equal(4, cb1.callCount);
- assert.equal(4, cb2.callCount);
- assert.equal(4, cb3.callCount);
-
- const entry1 = new logging.Entry(
- logging.Level.FINER,
- '[foo.bar.baz.quot] this is a finer message',
- 123456);
- const entry2 = new logging.Entry(
- logging.Level.INFO,
- '[foo.bar.baz.quot] this is an info message',
- 123456);
- const entry3 = new logging.Entry(
- logging.Level.WARNING,
- '[foo.bar.baz.quot] this is a warning message',
- 123456);
- const entry4 = new logging.Entry(
- logging.Level.SEVERE,
- '[foo.bar.baz.quot] this is a severe message',
- 123456);
-
- check(cb1.getCall(0).args[0], entry1);
- check(cb1.getCall(1).args[0], entry2);
- check(cb1.getCall(2).args[0], entry3);
- check(cb1.getCall(3).args[0], entry4);
-
- check(cb2.getCall(0).args[0], entry1);
- check(cb2.getCall(1).args[0], entry2);
- check(cb2.getCall(2).args[0], entry3);
- check(cb2.getCall(3).args[0], entry4);
-
- check(cb3.getCall(0).args[0], entry1);
- check(cb3.getCall(1).args[0], entry2);
- check(cb3.getCall(2).args[0], entry3);
- check(cb3.getCall(3).args[0], entry4);
-
- function check(entry, expected) {
- assert.equal(entry.level, expected.level, 'wrong level');
- assert.equal(entry.message, expected.message, 'wrong message');
- assert.equal(entry.timestamp, expected.timestamp, 'wrong time');
- }
- });
-
- it('does not invoke removed handler', function() {
- root.setLevel(logging.Level.INFO);
- const cb = sinon.spy();
-
- root.addHandler(cb);
- root.info('hi');
- assert.equal(1, cb.callCount);
-
- assert(root.removeHandler(cb));
- root.info('bye');
- assert.equal(1, cb.callCount);
-
- assert(!root.removeHandler(cb));
- });
- });
- });
-
- describe('getLevel()', function() {
- it('converts named levels', function() {
- assert.strictEqual(logging.Level.DEBUG, logging.getLevel('DEBUG'));
- assert.strictEqual(logging.Level.ALL, logging.getLevel('FAKE'));
- });
-
- it('converts numeric levels', function() {
- assert.strictEqual(
- logging.Level.DEBUG,
- logging.getLevel(logging.Level.DEBUG.value));
- });
-
- it('normalizes numeric levels', function() {
- assert.strictEqual(
- logging.Level.OFF,
- logging.getLevel(logging.Level.OFF.value * 2));
-
- let diff = logging.Level.SEVERE.value - logging.Level.WARNING.value;
- assert.strictEqual(
- logging.Level.WARNING,
- logging.getLevel(logging.Level.WARNING.value + (diff * .5)));
-
- assert.strictEqual(logging.Level.ALL, logging.getLevel(0));
- assert.strictEqual(logging.Level.ALL, logging.getLevel(-1));
- });
- });
-
- describe('Preferences', function() {
- it('can be converted to JSON', function() {
- let prefs = new logging.Preferences;
- assert.equal('{}', JSON.stringify(prefs));
-
- prefs.setLevel('foo', logging.Level.DEBUG);
- assert.equal('{"foo":"DEBUG"}', JSON.stringify(prefs));
-
- prefs.setLevel(logging.Type.BROWSER, logging.Level.FINE);
- assert.equal('{"foo":"DEBUG","browser":"FINE"}', JSON.stringify(prefs));
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/promise_aplus_test.js b/node_modules/selenium-webdriver/test/lib/promise_aplus_test.js
deleted file mode 100644
index 207f490a1..000000000
--- a/node_modules/selenium-webdriver/test/lib/promise_aplus_test.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const promise = require('../../lib/promise');
-const {enablePromiseManager} = require('../../lib/test/promise');
-
-describe('Promises/A+ Compliance Tests', function() {
- enablePromiseManager(() => {
- // The promise spec does not define behavior for unhandled rejections and
- // assumes they are effectively swallowed. This is not the case with our
- // implementation, so we have to disable error propagation to test that the
- // rest of our behavior is compliant.
- // We run the tests with a separate instance of the control flow to ensure
- // disablign error propagation does not impact other tests.
- var flow = new promise.ControlFlow();
- flow.setPropagateUnhandledRejections(false);
-
- // Skip the tests in 2.2.6.1/2. We are not compliant in these scenarios.
- var realDescribe = global.describe;
- global.describe = function(name, fn) {
- realDescribe(name, function() {
- var prefix = 'Promises/A+ Compliance Tests '
- + 'SELENIUM_PROMISE_MANAGER=true 2.2.6: '
- + '`then` may be called multiple times on the same promise.';
- var suffix = 'even when one handler is added inside another handler';
- if (this.fullTitle().startsWith(prefix)
- && this.fullTitle().endsWith(suffix)) {
- var realSpecify = global.specify;
- try {
- global.specify = function(name) {
- realSpecify(name);
- };
- fn();
- } finally {
- global.specify = realSpecify;
- }
- } else {
- fn();
- }
- });
- };
-
- require('promises-aplus-tests').mocha({
- resolved: function(value) {
- return new promise.Promise((fulfill) => fulfill(value), flow);
- },
- rejected: function(error) {
- return new promise.Promise((_, reject) => reject(error), flow);
- },
- deferred: function() {
- var d = new promise.Deferred(flow);
- return {
- resolve: d.fulfill,
- reject: d.reject,
- promise: d.promise
- };
- }
- });
-
- global.describe = realDescribe;
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/promise_error_test.js b/node_modules/selenium-webdriver/test/lib/promise_error_test.js
deleted file mode 100644
index b89a2f875..000000000
--- a/node_modules/selenium-webdriver/test/lib/promise_error_test.js
+++ /dev/null
@@ -1,884 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-/**
- * @fileoverview Contains tests against promise error handling. Many tests use
- * NativePromise to control test termination independent of promise
- * (and notably promise.ControlFlow).
- */
-
-'use strict';
-
-const testutil = require('./testutil');
-
-const assert = require('assert');
-const promise = require('../../lib/promise');
-const {enablePromiseManager} = require('../../lib/test/promise');
-
-const NativePromise = Promise;
-const StubError = testutil.StubError;
-const throwStubError = testutil.throwStubError;
-const assertIsStubError = testutil.assertIsStubError;
-
-describe('promise error handling', function() {
- enablePromiseManager(() => {
- var flow, uncaughtExceptions;
-
- beforeEach(function setUp() {
- if (promise.USE_PROMISE_MANAGER) {
- flow = promise.controlFlow();
- uncaughtExceptions = [];
- flow.on('uncaughtException', onUncaughtException);
- }
- });
-
- afterEach(function tearDown() {
- if (promise.USE_PROMISE_MANAGER) {
- return waitForIdle(flow).then(function() {
- assert.deepEqual(
- [], uncaughtExceptions, 'There were uncaught exceptions');
- flow.reset();
- });
- }
- });
-
- function onUncaughtException(e) {
- uncaughtExceptions.push(e);
- }
-
- function waitForAbort(opt_flow, opt_n) {
- var n = opt_n || 1;
- var theFlow = opt_flow || flow;
- theFlow.removeAllListeners(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION);
- return new NativePromise(function(fulfill, reject) {
- theFlow.once('idle', function() {
- reject(Error('expected flow to report an unhandled error'));
- });
-
- var errors = [];
- theFlow.on('uncaughtException', onError);
- function onError(e) {
- errors.push(e);
- if (errors.length === n) {
- theFlow.removeListener('uncaughtException', onError);
- fulfill(n === 1 ? errors[0] : errors);
- }
- }
- });
- }
-
- function waitForIdle(opt_flow) {
- var theFlow = opt_flow || flow;
- return new NativePromise(function(fulfill, reject) {
- if (theFlow.isIdle()) {
- fulfill();
- return;
- }
- theFlow.once('idle', fulfill);
- theFlow.once('uncaughtException', reject);
- });
- }
-
- it('testRejectedPromiseTriggersErrorCallback', function() {
- return promise.rejected(new StubError).
- then(assert.fail, assertIsStubError);
- });
-
- describe('callback throws trigger subsequent error callback', function() {
- it('fulfilled promise', function() {
- return promise.fulfilled().
- then(throwStubError).
- then(assert.fail, assertIsStubError);
- });
-
- it('rejected promise', function() {
- var e = Error('not the droids you are looking for');
- return promise.rejected(e).
- then(assert.fail, throwStubError).
- then(assert.fail, assertIsStubError);
- });
- });
-
- describe('callback returns rejected promise triggers subsequent errback', function() {
- it('from fulfilled callback', function() {
- return promise.fulfilled().then(function() {
- return promise.rejected(new StubError);
- }).then(assert.fail, assertIsStubError);
- });
-
- it('from rejected callback', function() {
- var e = Error('not the droids you are looking for');
- return promise.rejected(e).
- then(assert.fail, function() {
- return promise.rejected(new StubError);
- }).
- then(assert.fail, assertIsStubError);
- });
- });
-
- it('testReportsUnhandledRejectionsThroughTheControlFlow', function() {
- promise.rejected(new StubError);
- return waitForAbort().then(assertIsStubError);
- });
-
- describe('multiple unhandled rejections outside a task', function() {
- it('are reported in order they occurred', function() {
- var e1 = Error('error 1');
- var e2 = Error('error 2');
-
- promise.rejected(e1);
- promise.rejected(e2);
-
- return waitForAbort(flow).then(function(error) {
- assert.ok(
- error instanceof promise.MultipleUnhandledRejectionError);
- // TODO: switch to Array.from when we drop node 0.12.x
- var errors = [];
- for (var e of error.errors) {
- errors.push(e);
- }
- assert.deepEqual([e1, e2], errors);
- });
- });
- });
-
- describe('does not report unhandled rejection when', function() {
- it('handler added before next tick', function() {
- promise.rejected(new StubError).then(assert.fail, assertIsStubError);
- return waitForIdle();
- });
-
- it('added async but before next tick', function() {
- var called = false;
- return new NativePromise(function(fulfill, reject) {
- var aPromise;
- NativePromise.resolve().then(function() {
- aPromise.then(assert.fail, function(e) {
- called = true;
- assertIsStubError(e);
- });
- waitForIdle().then(fulfill, reject);
- });
- aPromise = promise.rejected(new StubError);
- }).then(function() {
- assert.ok(called);
- })
- });
- });
-
- it('testTaskThrows', function() {
- return flow.execute(throwStubError).then(assert.fail, assertIsStubError);
- });
-
- it('testTaskReturnsRejectedPromise', function() {
- return flow.execute(function() {
- return promise.rejected(new StubError)
- }).then(assert.fail, assertIsStubError);
- });
-
- it('testTaskHasUnhandledRejection', function() {
- return flow.execute(function() {
- promise.rejected(new StubError)
- }).then(assert.fail, assertIsStubError);
- });
-
- it('testTaskfails_returnedPromiseIsUnhandled', function() {
- flow.execute(throwStubError);
- return waitForAbort().then(assertIsStubError);
- });
-
- it('testTaskHasUnhandledRejection_cancelsRemainingSubTasks', function() {
- var seen = [];
- flow.execute(function() {
- promise.rejected(new StubError);
-
- flow.execute(() => seen.push('a'))
- .then(() => seen.push('b'), (e) => seen.push(e));
- flow.execute(() => seen.push('c'))
- .then(() => seen.push('b'), (e) => seen.push(e));
- });
-
- return waitForAbort()
- .then(assertIsStubError)
- .then(() => assert.deepEqual([], seen));
- });
-
- describe('nested task failures', function() {
- it('returns up to paren', function() {
- return flow.execute(function() {
- return flow.execute(function() {
- return flow.execute(throwStubError);
- });
- }).then(assert.fail, assertIsStubError);
- });
-
- it('task throws; uncaught error bubbles up', function() {
- flow.execute(function() {
- flow.execute(function() {
- flow.execute(throwStubError);
- });
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('task throws; uncaught error bubbles up; is caught at root', function() {
- flow.execute(function() {
- flow.execute(function() {
- flow.execute(throwStubError);
- });
- }).then(assert.fail, assertIsStubError);
- return waitForIdle();
- });
-
- it('unhandled rejection bubbles up', function() {
- flow.execute(function() {
- flow.execute(function() {
- flow.execute(function() {
- promise.rejected(new StubError);
- });
- });
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('unhandled rejection bubbles up; caught at root', function() {
- flow.execute(function() {
- flow.execute(function() {
- promise.rejected(new StubError);
- });
- }).then(assert.fail, assertIsStubError);
- return waitForIdle();
- });
-
- it('mixtureof hanging and free subtasks', function() {
- flow.execute(function() {
- return flow.execute(function() {
- flow.execute(throwStubError);
- });
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('cancels remaining tasks', function() {
- var seen = [];
- flow.execute(function() {
- flow.execute(() => promise.rejected(new StubError));
- flow.execute(() => seen.push('a'))
- .then(() => seen.push('b'), (e) => seen.push(e));
- flow.execute(() => seen.push('c'))
- .then(() => seen.push('b'), (e) => seen.push(e));
- });
-
- return waitForAbort()
- .then(assertIsStubError)
- .then(() => assert.deepEqual([], seen));
- });
- });
-
- it('testTaskReturnsPromiseLikeObjectThatInvokesErrback', function() {
- return flow.execute(function() {
- return {
- 'then': function(_, errback) {
- errback('abc123');
- }
- };
- }).then(assert.fail, function(value) {
- assert.equal('abc123', value);
- });
- });
-
- describe('ControlFlow#wait();', function() {
- describe('condition throws;', function() {
- it('failure is caught', function() {
- return flow.wait(throwStubError, 50).then(assert.fail, assertIsStubError);
- });
-
- it('failure is not caught', function() {
- flow.wait(throwStubError, 50);
- return waitForAbort().then(assertIsStubError);
- });
- });
-
- describe('condition returns promise', function() {
- it('failure is caught', function() {
- return flow.wait(function() {
- return promise.rejected(new StubError);
- }, 50).then(assert.fail, assertIsStubError);
- });
-
- it('failure is not caught', function() {
- flow.wait(function() {
- return promise.rejected(new StubError);
- }, 50);
- return waitForAbort().then(assertIsStubError);
- });
- });
-
- describe('condition has unhandled promise rejection', function() {
- it('failure is caught', function() {
- return flow.wait(function() {
- promise.rejected(new StubError);
- }, 50).then(assert.fail, assertIsStubError);
- });
-
- it('failure is not caught', function() {
- flow.wait(function() {
- promise.rejected(new StubError);
- }, 50);
- return waitForAbort().then(assertIsStubError);
- });
- });
-
- describe('condition has subtask failure', function() {
- it('failure is caught', function() {
- return flow.wait(function() {
- flow.execute(function() {
- flow.execute(throwStubError);
- });
- }, 50).then(assert.fail, assertIsStubError);
- });
-
- it('failure is not caught', function() {
- flow.wait(function() {
- flow.execute(function() {
- flow.execute(throwStubError);
- });
- }, 50);
- return waitForAbort().then(assertIsStubError);
- });
- });
- });
-
- describe('errback throws a new error', function() {
- it('start with normal promise', function() {
- var error = Error('an error');
- return promise.rejected(error).
- catch(function(e) {
- assert.equal(e, error);
- throw new StubError;
- }).
- catch(assertIsStubError);
- });
-
- it('start with task result', function() {
- var error = Error('an error');
- return flow.execute(function() {
- throw error;
- }).
- catch(function(e) {
- assert.equal(e, error);
- throw new StubError;
- }).
- catch(assertIsStubError);
- });
-
- it('start with normal promise; uncaught error', function() {
- var error = Error('an error');
- promise.rejected(error).
- catch(function(e) {
- assert.equal(e, error);
- throw new StubError;
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('start with task result; uncaught error', function() {
- var error = Error('an error');
- flow.execute(function() {
- throw error;
- }).
- catch(function(e) {
- assert.equal(e, error);
- throw new StubError;
- });
- return waitForAbort().then(assertIsStubError);
- });
- });
-
- it('thrownPromiseCausesCallbackRejection', function() {
- let p = promise.fulfilled(1234);
- return promise.fulfilled().then(function() {
- throw p;
- }).then(assert.fail, function(value) {
- assert.strictEqual(p, value);
- });
- });
-
- describe('task throws promise', function() {
- it('promise was fulfilled', function() {
- var toThrow = promise.fulfilled(1234);
- flow.execute(function() {
- throw toThrow;
- }).then(assert.fail, function(value) {
- assert.equal(toThrow, value);
- return toThrow;
- }).then(function(value) {
- assert.equal(1234, value);
- });
- return waitForIdle();
- });
-
- it('promise was rejected', function() {
- var toThrow = promise.rejected(new StubError);
- toThrow.catch(function() {}); // For tearDown.
- flow.execute(function() {
- throw toThrow;
- }).then(assert.fail, function(e) {
- assert.equal(toThrow, e);
- return e;
- }).then(assert.fail, assertIsStubError);
- return waitForIdle();
- });
- });
-
- it('testFailsTaskIfThereIsAnUnhandledErrorWhileWaitingOnTaskResult', function() {
- var d = promise.defer();
- flow.execute(function() {
- promise.rejected(new StubError);
- return d.promise;
- }).then(assert.fail, assertIsStubError);
-
- return waitForIdle().then(function() {
- return d.promise;
- }).then(assert.fail, function(e) {
- assert.equal('CancellationError: StubError', e.toString());
- });
- });
-
- it('testFailsParentTaskIfAsyncScheduledTaskFails', function() {
- var d = promise.defer();
- flow.execute(function() {
- flow.execute(throwStubError);
- return d.promise;
- }).then(assert.fail, assertIsStubError);
-
- return waitForIdle().then(function() {
- return d.promise;
- }).then(assert.fail, function(e) {
- assert.equal('CancellationError: StubError', e.toString());
- });
- });
-
- describe('long stack traces', function() {
- afterEach(() => promise.LONG_STACK_TRACES = false);
-
- it('always includes task stacks in failures', function() {
- promise.LONG_STACK_TRACES = false;
- flow.execute(function() {
- flow.execute(function() {
- flow.execute(throwStubError, 'throw error');
- }, 'two');
- }, 'three').
- then(assert.fail, function(e) {
- assertIsStubError(e);
- if (typeof e.stack !== 'string') {
- return;
- }
- var messages = e.stack.split(/\n/).filter(function(line, index) {
- return /^From: /.test(line);
- });
- assert.deepEqual([
- 'From: Task: throw error',
- 'From: Task: two',
- 'From: Task: three'
- ], messages);
- });
- return waitForIdle();
- });
-
- it('does not include completed tasks', function () {
- flow.execute(function() {}, 'succeeds');
- flow.execute(throwStubError, 'kaboom').then(assert.fail, function(e) {
- assertIsStubError(e);
- if (typeof e.stack !== 'string') {
- return;
- }
- var messages = e.stack.split(/\n/).filter(function(line, index) {
- return /^From: /.test(line);
- });
- assert.deepEqual(['From: Task: kaboom'], messages);
- });
- return waitForIdle();
- });
-
- it('does not include promise chain when disabled', function() {
- promise.LONG_STACK_TRACES = false;
- flow.execute(function() {
- flow.execute(function() {
- return promise.fulfilled().
- then(function() {}).
- then(function() {}).
- then(throwStubError);
- }, 'eventually assert.fails');
- }, 'start').
- then(assert.fail, function(e) {
- assertIsStubError(e);
- if (typeof e.stack !== 'string') {
- return;
- }
- var messages = e.stack.split(/\n/).filter(function(line, index) {
- return /^From: /.test(line);
- });
- assert.deepEqual([
- 'From: Task: eventually assert.fails',
- 'From: Task: start'
- ], messages);
- });
- return waitForIdle();
- });
-
- it('includes promise chain when enabled', function() {
- promise.LONG_STACK_TRACES = true;
- flow.execute(function() {
- flow.execute(function() {
- return promise.fulfilled().
- then(function() {}).
- then(function() {}).
- then(throwStubError);
- }, 'eventually assert.fails');
- }, 'start').
- then(assert.fail, function(e) {
- assertIsStubError(e);
- if (typeof e.stack !== 'string') {
- return;
- }
- var messages = e.stack.split(/\n/).filter(function(line, index) {
- return /^From: /.test(line);
- });
- assert.deepEqual([
- 'From: Promise: then',
- 'From: Task: eventually assert.fails',
- 'From: Task: start'
- ], messages);
- });
- return waitForIdle();
- });
- });
-
- describe('frame cancels remaining tasks', function() {
- it('on unhandled task failure', function() {
- var run = false;
- return flow.execute(function() {
- flow.execute(throwStubError);
- flow.execute(function() { run = true; });
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.ok(!run);
- });
- });
-
- it('on unhandled promise rejection', function() {
- var run = false;
- return flow.execute(function() {
- promise.rejected(new StubError);
- flow.execute(function() { run = true; });
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.ok(!run);
- });
- });
-
- it('if task throws', function() {
- var run = false;
- return flow.execute(function() {
- flow.execute(function() { run = true; });
- throw new StubError;
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.ok(!run);
- });
- });
-
- describe('task callbacks scheduled in another frame', function() {
- flow = promise.controlFlow();
- function noop() {}
-
- let subTask;
-
- before(function() {
- flow.execute(function() {
- // This task will be discarded and never run because of the error below.
- subTask = flow.execute(() => 'abc');
- throw new StubError('stub');
- }).catch(noop);
- });
-
- function assertCancellation(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal(
- 'Task was discarded due to a previous failure: stub', e.message);
- }
-
- it('are rejected with cancellation error', function() {
- let result;
- return Promise.resolve().then(function() {
- return flow.execute(function() {
- result = subTask.then(assert.fail);
- });
- })
- .then(() => result)
- .then(assert.fail, assertCancellation);
- });
-
- it('cancellation errors propagate through callbacks (1)', function() {
- let result;
- return Promise.resolve().then(function() {
- return flow.execute(function() {
- result = subTask
- .then(assert.fail, assertCancellation)
- .then(() => 'abc123');
- });
- })
- .then(() => result)
- .then(value => assert.equal('abc123', value));
- });
-
- it('cancellation errors propagate through callbacks (2)', function() {
- let result;
- return Promise.resolve().then(function() {
- return flow.execute(function() {
- result = subTask.then(assert.fail)
- .then(noop, assertCancellation)
- .then(() => 'fin');
- });
- })
- // Verify result actually computed successfully all the way through.
- .then(() => result)
- .then(value => assert.equal('fin', value));
- });
- });
- });
-
- it('testRegisteredTaskCallbacksAreDroppedWhenTaskIsCancelled_return', function() {
- var seen = [];
- return flow.execute(function() {
- flow.execute(throwStubError);
-
- flow.execute(function() {
- seen.push(1);
- }).then(function() {
- seen.push(2);
- }, function() {
- seen.push(3);
- });
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.deepEqual([], seen);
- });
- });
-
- it('testRegisteredTaskCallbacksAreDroppedWhenTaskIsCancelled_withReturn', function() {
- var seen = [];
- return flow.execute(function() {
- flow.execute(throwStubError);
-
- return flow.execute(function() {
- seen.push(1);
- }).then(function() {
- seen.push(2);
- }, function() {
- seen.push(3);
- });
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.deepEqual([], seen);
- });
- });
-
- it('testTasksWithinACallbackAreDroppedIfContainingTaskIsAborted', function() {
- var seen = [];
- return flow.execute(function() {
- flow.execute(throwStubError);
-
- // None of the callbacks on this promise should execute because the
- // task assert.failure above is never handled, causing the containing task to
- // abort.
- promise.fulfilled().then(function() {
- seen.push(1);
- return flow.execute(function() {
- seen.push(2);
- });
- }).finally(function() {
- seen.push(3);
- });
-
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.deepEqual([], seen);
- });
- });
-
- it('testTaskIsCancelledAfterWaitTimeout', function() {
- var seen = [];
- return flow.execute(function() {
- flow.wait(function() {
- return promise.delayed(50);
- }, 5);
-
- return flow.execute(function() {
- seen.push(1);
- }).then(function() {
- seen.push(2);
- }, function() {
- seen.push(3);
- });
- }).then(assert.fail, function() {
- assert.deepEqual([], seen);
- });
- });
-
- describe('task callbacks get cancellation error if registered after task was cancelled', function() {
- it('(a)', function() {
- var task;
- flow.execute(function() {
- flow.execute(throwStubError);
- task = flow.execute(function() {});
- }).then(assert.fail, assertIsStubError);
- return waitForIdle().then(function() {
- return task.then(assert.fail, function(e) {
- assert.ok(e instanceof promise.CancellationError);
- });
- });
- });
-
- it('(b)', function() {
- var seen = [];
-
- var task;
- flow.execute(function() {
- flow.execute(throwStubError);
- task = flow.execute(function() {});
-
- task.then(() => seen.push(1))
- .then(() => seen.push(2));
- task.then(() => seen.push(3))
- .then(() => seen.push(4));
-
- }).then(assert.fail, assertIsStubError);
-
- return waitForIdle().then(function() {
- return task.then(assert.fail, function(e) {
- seen.push(5);
- assert.ok(e instanceof promise.CancellationError);
- });
- }).then(() => assert.deepEqual([5], seen));
- });
- });
-
- it('unhandledRejectionInParallelTaskQueue', function() {
- var seen = [];
- function schedule(name) {
- return flow.execute(() => seen.push(name), name);
- }
-
- flow.async(function() {
- schedule('a.1');
- flow.execute(throwStubError, 'a.2 (throws)');
- });
-
- var b3;
- flow.async(function() {
- schedule('b.1');
- schedule('b.2');
- b3 = schedule('b.3');
- });
-
- var c3;
- flow.async(function() {
- schedule('c.1');
- schedule('c.2');
- c3 = schedule('c.3');
- });
-
- function assertWasCancelled(p) {
- return p.then(assert.fail, function(e) {
- assert.ok(e instanceof promise.CancellationError);
- });
- }
-
- return waitForAbort()
- .then(function() {
- assert.deepEqual(['a.1', 'b.1', 'c.1', 'b.2', 'c.2'], seen);
- })
- .then(() => assertWasCancelled(b3))
- .then(() => assertWasCancelled(c3));
- });
-
- it('errorsInAsyncFunctionsAreReportedAsUnhandledRejection', function() {
- flow.removeAllListeners(); // For tearDown.
-
- var task;
- return new Promise(function(fulfill) {
- flow.once('uncaughtException', fulfill);
- flow.async(function() {
- task = flow.execute(function() {});
- throw Error('boom');
- });
- }).then(function(error) {
- assert.ok(error instanceof promise.CancellationError);
- return task.catch(function(error) {
- assert.ok(error instanceof promise.CancellationError);
- });
- });
- });
-
- describe('does not wait for values thrown from callbacks to be resolved', function() {
- it('(a)', function() {
- var p1 = promise.fulfilled();
- var reason = promise.fulfilled('should not see me');
- return p1.then(function() {
- throw reason;
- }).then(assert.fail, function(e) {
- assert.equal(reason, e);
- });
- });
-
- it('(b)', function() {
- var p1 = promise.fulfilled();
- var reason = promise.rejected('should not see me');
- reason.catch(function() {}); // For tearDown.
- return p1.then(function() {
- throw reason;
- }).then(assert.fail, function(e) {
- assert.equal(reason, e);
- });
- });
-
- it('(c)', function() {
- var p1 = promise.fulfilled();
- var reason = promise.defer();
- setTimeout(() => reason.fulfill('should not see me'), 100);
- return p1.then(function() {
- throw reason.promise;
- }).then(assert.fail, function(e) {
- assert.equal(reason.promise, e);
- });
- });
-
- it('(d)', function() {
- var p1 = promise.fulfilled();
- var reason = {then: function() {}}; // A thenable like object.
- return p1.then(function() {
- throw reason;
- }).then(assert.fail, function(e) {
- assert.equal(reason, e);
- });
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/promise_flow_test.js b/node_modules/selenium-webdriver/test/lib/promise_flow_test.js
deleted file mode 100644
index 407fd547e..000000000
--- a/node_modules/selenium-webdriver/test/lib/promise_flow_test.js
+++ /dev/null
@@ -1,2288 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const fail = assert.fail;
-const sinon = require('sinon');
-
-const testutil = require('./testutil');
-const {TimeoutError} = require('../../lib/error');
-const promise = require('../../lib/promise');
-const {enablePromiseManager} = require('../../lib/test/promise');
-
-const NativePromise = Promise;
-
-// Aliases for readability.
-const StubError = testutil.StubError;
-const assertIsStubError = testutil.assertIsStubError;
-const callbackPair = testutil.callbackPair;
-const throwStubError = testutil.throwStubError;
-
-describe('promise control flow', function() {
- enablePromiseManager(() => {
- let flow, flowHistory, messages, uncaughtExceptions;
-
- beforeEach(function setUp() {
- promise.LONG_STACK_TRACES = false;
- flow = new promise.ControlFlow();
- promise.setDefaultFlow(flow);
- messages = [];
- flowHistory = [];
-
- uncaughtExceptions = [];
- flow.on(promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION,
- onUncaughtException);
- });
-
- afterEach(function tearDown() {
- flow.removeAllListeners(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION);
- assert.deepEqual([], uncaughtExceptions,
- 'There were uncaught exceptions');
- flow.reset();
- promise.LONG_STACK_TRACES = false;
- });
-
- function onUncaughtException(e) {
- uncaughtExceptions.push(e);
- }
-
- function defer() {
- let d = {};
- let promise = new Promise((resolve, reject) => {
- Object.assign(d, {resolve, reject});
- });
- d.promise = promise;
- return d;
- }
-
- function waitForAbort(opt_flow) {
- var theFlow = opt_flow || flow;
- theFlow.removeAllListeners(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION);
- return new NativePromise(function(fulfill, reject) {
- theFlow.once(promise.ControlFlow.EventType.IDLE, function() {
- reject(Error('expected flow to report an unhandled error'));
- });
- theFlow.once(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION,
- fulfill);
- });
- }
-
- function waitForIdle(opt_flow) {
- var theFlow = opt_flow || flow;
- return new NativePromise(function(fulfill, reject) {
- theFlow.once(promise.ControlFlow.EventType.IDLE, fulfill);
- theFlow.once(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION, reject);
- });
- }
-
- function timeout(ms) {
- return new NativePromise(function(fulfill) {
- setTimeout(fulfill, ms);
- });
- }
-
-
- function schedule(msg, opt_return) {
- return scheduleAction(msg, function() {
- return opt_return;
- });
- }
-
- /**
- * @param {string} value The value to push.
- * @param {promise.Promise=} opt_taskPromise Promise to return from
- * the task.
- * @return {!promise.Promise} The result.
- */
- function schedulePush(value, opt_taskPromise) {
- return scheduleAction(value, function() {
- messages.push(value);
- return opt_taskPromise;
- });
- }
-
- /**
- * @param {string} msg Debug message.
- * @param {!Function} actionFn The function.
- * @return {!promise.Promise} The function result.
- */
- function scheduleAction(msg, actionFn) {
- return promise.controlFlow().execute(function() {
- flowHistory.push(msg);
- return actionFn();
- }, msg);
- }
-
- /**
- * @param {!Function} condition The condition function.
- * @param {number=} opt_timeout The timeout.
- * @param {string=} opt_message Optional message.
- * @return {!promise.Promise} The wait result.
- */
- function scheduleWait(condition, opt_timeout, opt_message) {
- var msg = opt_message || '';
- // It's not possible to hook into when the wait itself is scheduled, so
- // we record each iteration of the wait loop.
- var count = 0;
- return promise.controlFlow().wait(function() {
- flowHistory.push((count++) + ': ' + msg);
- return condition();
- }, opt_timeout, msg);
- }
-
- function asyncRun(fn, opt_self) {
- NativePromise.resolve().then(() => fn.call(opt_self));
- }
-
- function assertFlowHistory(var_args) {
- var expected = Array.prototype.slice.call(arguments, 0);
- assert.deepEqual(expected, flowHistory);
- }
-
- function assertMessages(var_args) {
- var expected = Array.prototype.slice.call(arguments, 0);
- assert.deepEqual(expected, messages);
- }
-
- function assertingMessages(var_args) {
- var args = Array.prototype.slice.call(arguments, 0);
- return () => assertMessages.apply(null, args);
- }
-
- function assertFlowIs(flow) {
- assert.equal(flow, promise.controlFlow());
- }
-
- describe('testScheduling', function() {
- it('aSimpleFunction', function() {
- schedule('go');
- return waitForIdle().then(function() {
- assertFlowHistory('go');
- });
- });
-
- it('aSimpleFunctionWithANonPromiseReturnValue', function() {
- schedule('go', 123).then(function(value) {
- assert.equal(123, value);
- });
- return waitForIdle().then(function() {
- assertFlowHistory('go');
- });
- });
-
- it('aSimpleSequence', function() {
- schedule('a');
- schedule('b');
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('invokesCallbacksWhenTaskIsDone', function() {
- var d = new promise.Deferred();
- var called = false;
- var done = schedule('a', d.promise).then(function(value) {
- called = true;
- assert.equal(123, value);
- });
- return timeout(5).then(function() {
- assert.ok(!called);
- d.fulfill(123);
- return done;
- }).
- then(function() {
- assertFlowHistory('a');
- });
- });
-
- it('blocksUntilPromiseReturnedByTaskIsResolved', function() {
- var done = promise.defer();
- schedulePush('a', done.promise);
- schedulePush('b');
- setTimeout(function() {
- done.fulfill();
- messages.push('c');
- }, 25);
- return waitForIdle().then(assertingMessages('a', 'c', 'b'));
- });
-
- it('waitsForReturnedPromisesToResolve', function() {
- var d1 = new promise.Deferred();
- var d2 = new promise.Deferred();
-
- var callback = sinon.spy();
- schedule('a', d1.promise).then(callback);
-
- return timeout(5).then(function() {
- assert(!callback.called);
- d1.fulfill(d2.promise);
- return timeout(5);
- }).then(function() {
- assert(!callback.called);
- d2.fulfill('fluffy bunny');
- return waitForIdle();
- }).then(function() {
- assert(callback.called);
- assert.equal('fluffy bunny', callback.getCall(0).args[0]);
- assertFlowHistory('a');
- });
- });
-
- it('executesTasksInAFutureTurnAfterTheyAreScheduled', function() {
- var count = 0;
- function incr() { count++; }
-
- scheduleAction('', incr);
- assert.equal(0, count);
- return waitForIdle().then(function() {
- assert.equal(1, count);
- });
- });
-
- it('executesOneTaskPerTurnOfTheEventLoop', function() {
- var order = [];
- function go() {
- order.push(order.length / 2);
- asyncRun(function() {
- order.push('-');
- });
- }
-
- scheduleAction('', go);
- scheduleAction('', go);
- return waitForIdle().then(function() {
- assert.deepEqual([0, '-', 1, '-'], order);
- })
- });
-
- it('firstScheduledTaskIsWithinACallback', function() {
- promise.fulfilled().then(function() {
- schedule('a');
- schedule('b');
- schedule('c');
- }).then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- return waitForIdle();
- });
-
- it('newTasksAddedWhileWaitingOnTaskReturnedPromise1', function() {
- scheduleAction('a', function() {
- var d = promise.defer();
- setTimeout(function() {
- schedule('c');
- d.fulfill();
- }, 10);
- return d.promise;
- });
- schedule('b');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('newTasksAddedWhileWaitingOnTaskReturnedPromise2', function() {
- scheduleAction('a', function() {
- var d = promise.defer();
- setTimeout(function() {
- schedule('c');
- asyncRun(d.fulfill);
- }, 10);
- return d.promise;
- });
- schedule('b');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'c', 'b');
- });
- });
- });
-
- describe('testFraming', function() {
- it('callbacksRunInANewFrame', function() {
- schedule('a').then(function() {
- schedule('c');
- });
- schedule('b');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'c', 'b');
- });
- });
-
- it('lotsOfNesting', function() {
- schedule('a').then(function() {
- schedule('c').then(function() {
- schedule('e').then(function() {
- schedule('g');
- });
- schedule('f');
- });
- schedule('d');
- });
- schedule('b');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'c', 'e', 'g', 'f', 'd', 'b');
- });
- });
-
- it('callbackReturnsPromiseThatDependsOnATask_1', function() {
- schedule('a').then(function() {
- schedule('b');
- return promise.delayed(5).then(function() {
- return schedule('c');
- });
- });
- schedule('d');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd');
- });
- });
-
- it('callbackReturnsPromiseThatDependsOnATask_2', function() {
- schedule('a').then(function() {
- schedule('b');
- return promise.delayed(5).
- then(function() { return promise.delayed(5) }).
- then(function() { return promise.delayed(5) }).
- then(function() { return promise.delayed(5) }).
- then(function() { return schedule('c'); });
- });
- schedule('d');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd');
- });
- });
-
- it('eachCallbackWaitsForAllScheduledTasksToComplete', function() {
- schedule('a').
- then(function() {
- schedule('b');
- schedule('c');
- }).
- then(function() {
- schedule('d');
- });
- schedule('e');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e');
- });
- });
-
- it('eachCallbackWaitsForReturnTasksToComplete', function() {
- schedule('a').
- then(function() {
- schedule('b');
- return schedule('c');
- }).
- then(function() {
- schedule('d');
- });
- schedule('e');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e');
- });
- });
-
- it('callbacksOnAResolvedPromiseInsertIntoTheCurrentFlow', function() {
- promise.fulfilled().then(function() {
- schedule('b');
- });
- schedule('a');
-
- return waitForIdle().then(function() {
- assertFlowHistory('b', 'a');
- });
- });
-
- it('callbacksInterruptTheFlowWhenPromiseIsResolved', function() {
- schedule('a').then(function() {
- schedule('c');
- });
- schedule('b');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'c', 'b');
- });
- });
-
- it('allCallbacksInAFrameAreScheduledWhenPromiseIsResolved', function() {
- var a = schedule('a');
- a.then(function() { schedule('b'); });
- schedule('c');
- a.then(function() { schedule('d'); });
- schedule('e');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e');
- });
- });
-
- it('tasksScheduledInInActiveFrameDoNotGetPrecedence', function() {
- var d = promise.fulfilled();
- schedule('a');
- schedule('b');
- d.then(function() { schedule('c'); });
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('tasksScheduledInAFrameGetPrecedence_1', function() {
- var a = schedule('a');
- schedule('b').then(function() {
- a.then(function() {
- schedule('c');
- schedule('d');
- });
- var e = schedule('e');
- a.then(function() {
- schedule('f');
- e.then(function() {
- schedule('g');
- });
- schedule('h');
- });
- schedule('i');
- });
- schedule('j');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j');
- });
- });
- });
-
- describe('testErrorHandling', function() {
- it('thrownErrorsArePassedToTaskErrback', function() {
- scheduleAction('function that throws', throwStubError).
- then(fail, assertIsStubError);
- return waitForIdle();
- });
-
- it('thrownErrorsPropagateThroughPromiseChain', function() {
- scheduleAction('function that throws', throwStubError).
- then(fail).
- then(fail, assertIsStubError);
- return waitForIdle();
- });
-
- it('catchesErrorsFromFailedTasksInAFrame', function() {
- schedule('a').then(function() {
- schedule('b');
- scheduleAction('function that throws', throwStubError);
- }).
- then(fail, assertIsStubError);
- return waitForIdle();
- });
-
- it('abortsIfOnlyTaskReturnsAnUnhandledRejection', function() {
- scheduleAction('function that returns rejected promise', function() {
- return promise.rejected(new StubError);
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('abortsIfThereIsAnUnhandledRejection', function() {
- promise.rejected(new StubError);
- schedule('this should not run');
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory(/* none */);
- });
- });
-
- it('abortsSequenceIfATaskFails', function() {
- schedule('a');
- schedule('b');
- scheduleAction('c', throwStubError);
- schedule('d'); // Should never execute.
-
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('abortsFromUnhandledFramedTaskFailures_1', function() {
- schedule('outer task').then(function() {
- scheduleAction('inner task', throwStubError);
- });
- schedule('this should not run');
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('outer task', 'inner task');
- });
- });
-
- it('abortsFromUnhandledFramedTaskFailures_2', function() {
- schedule('a').then(function() {
- schedule('b').then(function() {
- scheduleAction('c', throwStubError);
- // This should not execute.
- schedule('d');
- });
- });
-
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('abortsWhenErrorBubblesUpFromFullyResolvingAnObject', function() {
- var callback = sinon.spy();
-
- scheduleAction('', function() {
- var obj = {'foo': promise.rejected(new StubError)};
- return promise.fullyResolved(obj).then(callback);
- });
-
- return waitForAbort().
- then(assertIsStubError).
- then(() => assert(!callback.called));
- });
-
- it('abortsWhenErrorBubblesUpFromFullyResolvingAnObject_withCallback', function() {
- var callback1 = sinon.spy();
- var callback2 = sinon.spy();
-
- scheduleAction('', function() {
- var obj = {'foo': promise.rejected(new StubError)};
- return promise.fullyResolved(obj).then(callback1);
- }).then(callback2);
-
- return waitForAbort().
- then(assertIsStubError).
- then(() => assert(!callback1.called)).
- then(() => assert(!callback2.called));
- });
-
- it('canCatchErrorsFromNestedTasks', function() {
- var errback = sinon.spy();
- schedule('a').
- then(function() {
- return scheduleAction('b', throwStubError);
- }).
- catch(errback);
- return waitForIdle().then(function() {
- assert(errback.called);
- assertIsStubError(errback.getCall(0).args[0]);
- });
- });
-
- it('nestedCommandFailuresCanBeCaughtAndSuppressed', function() {
- var errback = sinon.spy();
- schedule('a').then(function() {
- return schedule('b').then(function() {
- return schedule('c').then(function() {
- throw new StubError;
- });
- });
- }).catch(errback);
- schedule('d');
- return waitForIdle().
- then(function() {
- assert(errback.called);
- assertIsStubError(errback.getCall(0).args[0]);
- assertFlowHistory('a', 'b', 'c', 'd');
- });
- });
-
- it('aTaskWithAnUnhandledPromiseRejection', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- promise.rejected(new StubError);
- });
- schedule('should never run');
-
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('a', 'sub-tasks');
- });
- });
-
- it('aTaskThatReutrnsARejectedPromise', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- return promise.rejected(new StubError);
- });
- schedule('should never run');
-
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('a', 'sub-tasks');
- });
- });
-
- it('discardsSubtasksIfTaskThrows', function() {
- var pair = callbackPair(null, assertIsStubError);
- scheduleAction('a', function() {
- schedule('b');
- schedule('c');
- throwStubError();
- }).then(pair.callback, pair.errback);
- schedule('d');
-
- return waitForIdle().
- then(pair.assertErrback).
- then(function() {
- assertFlowHistory('a', 'd');
- });
- });
-
- it('discardsRemainingSubtasksIfASubtaskFails', function() {
- var pair = callbackPair(null, assertIsStubError);
- scheduleAction('a', function() {
- schedule('b');
- scheduleAction('c', throwStubError);
- schedule('d');
- }).then(pair.callback, pair.errback);
- schedule('e');
-
- return waitForIdle().
- then(pair.assertErrback).
- then(function() {
- assertFlowHistory('a', 'b', 'c', 'e');
- });
- });
- });
-
- describe('testTryModelingFinally', function() {
- it('happyPath', function() {
- /* Model:
- try {
- doFoo();
- doBar();
- } finally {
- doBaz();
- }
- */
- schedulePush('foo').
- then(() => schedulePush('bar')).
- finally(() => schedulePush('baz'));
- return waitForIdle().then(assertingMessages('foo', 'bar', 'baz'));
- });
-
- it('firstTryFails', function() {
- /* Model:
- try {
- doFoo();
- doBar();
- } finally {
- doBaz();
- }
- */
-
- scheduleAction('doFoo and throw', function() {
- messages.push('foo');
- throw new StubError;
- }).
- then(function() { schedulePush('bar'); }).
- finally(function() { schedulePush('baz'); });
-
- return waitForAbort().
- then(assertIsStubError).
- then(assertingMessages('foo', 'baz'));
- });
-
- it('secondTryFails', function() {
- /* Model:
- try {
- doFoo();
- doBar();
- } finally {
- doBaz();
- }
- */
-
- schedulePush('foo').
- then(function() {
- return scheduleAction('doBar and throw', function() {
- messages.push('bar');
- throw new StubError;
- });
- }).
- finally(function() {
- return schedulePush('baz');
- });
- return waitForAbort().
- then(assertIsStubError).
- then(assertingMessages('foo', 'bar', 'baz'));
- });
- });
-
- describe('testTaskCallbacksInterruptFlow', function() {
- it('(base case)', function() {
- schedule('a').then(function() {
- schedule('b');
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskDependsOnImmediatelyFulfilledPromise', function() {
- scheduleAction('a', function() {
- return promise.fulfilled();
- }).then(function() {
- schedule('b');
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskDependsOnPreviouslyFulfilledPromise', function() {
- var aPromise = promise.fulfilled(123);
- scheduleAction('a', function() {
- return aPromise;
- }).then(function(value) {
- assert.equal(123, value);
- schedule('b');
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskDependsOnAsyncPromise', function() {
- scheduleAction('a', function() {
- return promise.delayed(25);
- }).then(function() {
- schedule('b');
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('promiseChainedToTaskInterruptFlow', function() {
- schedule('a').then(function() {
- return promise.fulfilled();
- }).then(function() {
- return promise.fulfilled();
- }).then(function() {
- schedule('b');
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('nestedTaskCallbacksInterruptFlowWhenResolved', function() {
- schedule('a').then(function() {
- schedule('b').then(function() {
- schedule('c');
- });
- });
- schedule('d');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd');
- });
- });
- });
-
- describe('testDelayedNesting', function() {
-
- it('1', function() {
- var a = schedule('a');
- schedule('b').then(function() {
- a.then(function() { schedule('c'); });
- schedule('d');
- });
- schedule('e');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e');
- });
- });
-
- it('2', function() {
- var a = schedule('a');
- schedule('b').then(function() {
- a.then(function() { schedule('c'); });
- schedule('d');
- a.then(function() { schedule('e'); });
- });
- schedule('f');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e', 'f');
- });
- });
-
- it('3', function() {
- var a = schedule('a');
- schedule('b').then(function() {
- a.then(function() { schedule('c'); });
- a.then(function() { schedule('d'); });
- });
- schedule('e');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e');
- });
- });
-
- it('4', function() {
- var a = schedule('a');
- schedule('b').then(function() {
- a.then(function() { schedule('c'); }).then(function() {
- schedule('d');
- });
- a.then(function() { schedule('e'); });
- });
- schedule('f');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e', 'f');
- });
- });
-
- it('5', function() {
- var a = schedule('a');
- schedule('b').then(function() {
- var c;
- a.then(function() { c = schedule('c'); }).then(function() {
- schedule('d');
- a.then(function() { schedule('e'); });
- c.then(function() { schedule('f'); });
- schedule('g');
- });
- a.then(function() { schedule('h'); });
- });
- schedule('i');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');
- });
- });
- });
-
- describe('testWaiting', function() {
- it('onAConditionThatIsAlwaysTrue', function() {
- scheduleWait(function() { return true;}, 0, 'waiting on true');
- return waitForIdle().then(function() {
- assertFlowHistory('0: waiting on true');
- });
- });
-
- it('aSimpleCountingCondition', function() {
- var count = 0;
- scheduleWait(function() {
- return ++count == 3;
- }, 100, 'counting to 3');
-
- return waitForIdle().then(function() {
- assert.equal(3, count);
- });
- });
-
- it('aConditionThatReturnsAPromise', function() {
- var d = new promise.Deferred();
- var count = 0;
-
- scheduleWait(function() {
- count += 1;
- return d.promise;
- }, 0, 'waiting for promise');
-
- return timeout(50).then(function() {
- assert.equal(1, count);
- d.fulfill(123);
- return waitForIdle();
- });
- });
-
- it('aConditionThatReturnsAPromise_2', function() {
- var count = 0;
- scheduleWait(function() {
- return promise.fulfilled(++count == 3);
- }, 100, 'waiting for promise');
-
- return waitForIdle().then(function() {
- assert.equal(3, count);
- });
- });
-
- it('aConditionThatReturnsATaskResult', function() {
- var count = 0;
- scheduleWait(function() {
- return scheduleAction('increment count', function() {
- return ++count == 3;
- });
- }, 100, 'counting to 3');
- schedule('post wait');
-
- return waitForIdle().then(function() {
- assert.equal(3, count);
- assertFlowHistory(
- '0: counting to 3', 'increment count',
- '1: counting to 3', 'increment count',
- '2: counting to 3', 'increment count',
- 'post wait');
- });
- });
-
- it('conditionContainsASubtask', function() {
- var count = 0;
- scheduleWait(function() {
- schedule('sub task');
- return ++count == 3;
- }, 100, 'counting to 3');
- schedule('post wait');
-
- return waitForIdle().then(function() {
- assert.equal(3, count);
- assertFlowHistory(
- '0: counting to 3', 'sub task',
- '1: counting to 3', 'sub task',
- '2: counting to 3', 'sub task',
- 'post wait');
- });
- });
-
- it('cancelsWaitIfScheduledTaskFails', function() {
- var pair = callbackPair(null, assertIsStubError);
- scheduleWait(function() {
- scheduleAction('boom', throwStubError);
- schedule('this should not run');
- return true;
- }, 100, 'waiting to go boom').then(pair.callback, pair.errback);
- schedule('post wait');
-
- return waitForIdle().
- then(pair.assertErrback).
- then(function() {
- assertFlowHistory(
- '0: waiting to go boom', 'boom',
- 'post wait');
- });
- });
-
- it('failsIfConditionThrows', function() {
- var callbacks = callbackPair(null, assertIsStubError);
- scheduleWait(throwStubError, 0, 'goes boom').
- then(callbacks.callback, callbacks.errback);
- schedule('post wait');
-
- return waitForIdle().
- then(callbacks.assertErrback).
- then(function() {
- assertFlowHistory('0: goes boom', 'post wait');
- });
- });
-
- it('failsIfConditionReturnsARejectedPromise', function() {
- var callbacks = callbackPair(null, assertIsStubError);
- scheduleWait(function() {
- return promise.rejected(new StubError);
- }, 0, 'goes boom').then(callbacks.callback, callbacks.errback);
- schedule('post wait');
-
- return waitForIdle().
- then(callbacks.assertErrback).
- then(function() {
- assertFlowHistory('0: goes boom', 'post wait');
- });
- });
-
- it('failsIfConditionHasUnhandledRejection', function() {
- var callbacks = callbackPair(null, assertIsStubError);
- scheduleWait(function() {
- promise.controlFlow().execute(throwStubError);
- }, 0, 'goes boom').then(callbacks.callback, callbacks.errback);
- schedule('post wait');
-
- return waitForIdle().
- then(callbacks.assertErrback).
- then(function() {
- assertFlowHistory('0: goes boom', 'post wait');
- });
- });
-
- it('failsIfConditionHasAFailedSubtask', function() {
- var callbacks = callbackPair(null, assertIsStubError);
- var count = 0;
- scheduleWait(function() {
- scheduleAction('maybe throw', function() {
- if (++count == 2) {
- throw new StubError;
- }
- });
- }, 100, 'waiting').then(callbacks.callback, callbacks.errback);
- schedule('post wait');
-
- return waitForIdle().then(function() {
- assert.equal(2, count);
- assertFlowHistory(
- '0: waiting', 'maybe throw',
- '1: waiting', 'maybe throw',
- 'post wait');
- });
- });
-
- it('pollingLoopWaitsForAllScheduledTasksInCondition', function() {
- var count = 0;
- scheduleWait(function() {
- scheduleAction('increment count', function() { ++count; });
- return count >= 3;
- }, 100, 'counting to 3');
- schedule('post wait');
-
- return waitForIdle().then(function() {
- assert.equal(4, count);
- assertFlowHistory(
- '0: counting to 3', 'increment count',
- '1: counting to 3', 'increment count',
- '2: counting to 3', 'increment count',
- '3: counting to 3', 'increment count',
- 'post wait');
- });
- });
-
- it('waitsForeverOnAZeroTimeout', function() {
- var done = false;
- setTimeout(function() {
- done = true;
- }, 150);
- var waitResult = scheduleWait(function() {
- return done;
- }, 0);
-
- return timeout(75).then(function() {
- assert.ok(!done);
- return timeout(100);
- }).then(function() {
- assert.ok(done);
- return waitResult;
- });
- });
-
- it('waitsForeverIfTimeoutOmitted', function() {
- var done = false;
- setTimeout(function() {
- done = true;
- }, 150);
- var waitResult = scheduleWait(function() {
- return done;
- });
-
- return timeout(75).then(function() {
- assert.ok(!done);
- return timeout(100);
- }).then(function() {
- assert.ok(done);
- return waitResult;
- });
- });
-
- it('timesOut_nonZeroTimeout', function() {
- var count = 0;
- scheduleWait(function() {
- count += 1;
- var ms = count === 2 ? 65 : 5;
- return promise.delayed(ms).then(function() {
- return false;
- });
- }, 60, 'counting to 3');
- return waitForAbort().then(function(e) {
- switch (count) {
- case 1:
- assertFlowHistory('0: counting to 3');
- break;
- case 2:
- assertFlowHistory('0: counting to 3', '1: counting to 3');
- break;
- default:
- fail('unexpected polling count: ' + count);
- }
- assert.ok(e instanceof TimeoutError, 'Unexpected error: ' + e);
- assert.ok(
- /^counting to 3\nWait timed out after \d+ms$/.test(e.message));
- });
- });
-
- it('shouldFailIfConditionReturnsARejectedPromise', function() {
- scheduleWait(function() {
- return promise.rejected(new StubError);
- }, 100, 'returns rejected promise on first pass');
- return waitForAbort().then(assertIsStubError);
- });
-
- it('scheduleWithIntermittentWaits', function() {
- schedule('a');
- scheduleWait(function() { return true; }, 0, 'wait 1');
- schedule('b');
- scheduleWait(function() { return true; }, 0, 'wait 2');
- schedule('c');
- scheduleWait(function() { return true; }, 0, 'wait 3');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', '0: wait 1', 'b', '0: wait 2', 'c', '0: wait 3');
- });
- });
-
- it('scheduleWithIntermittentAndNestedWaits', function() {
- schedule('a');
- scheduleWait(function() { return true; }, 0, 'wait 1').
- then(function() {
- schedule('d');
- scheduleWait(function() { return true; }, 0, 'wait 2');
- schedule('e');
- });
- schedule('b');
- scheduleWait(function() { return true; }, 0, 'wait 3');
- schedule('c');
- scheduleWait(function() { return true; }, 0, 'wait 4');
-
- return waitForIdle().then(function() {
- assertFlowHistory(
- 'a', '0: wait 1', 'd', '0: wait 2', 'e', 'b', '0: wait 3', 'c',
- '0: wait 4');
- });
- });
-
- it('requiresConditionToBeAPromiseOrFunction', function() {
- assert.throws(function() {
- flow.wait(1234, 0);
- });
- flow.wait(function() { return true;}, 0);
- flow.wait(promise.fulfilled(), 0);
- return waitForIdle();
- });
-
- it('promiseThatDoesNotResolveBeforeTimeout', function() {
- var d = promise.defer();
- flow.wait(d.promise, 5).then(fail, function(e) {
- assert.ok(e instanceof TimeoutError, 'Unexpected error: ' + e);
- assert.ok(
- /Timed out waiting for promise to resolve after \d+ms/
- .test(e.message),
- 'unexpected error message: ' + e.message);
- });
- return waitForIdle();
- });
-
- it('unboundedWaitOnPromiseResolution', function() {
- var messages = [];
- var d = promise.defer();
- var waitResult = flow.wait(d.promise).then(function(value) {
- messages.push('b');
- assert.equal(1234, value);
- });
- setTimeout(function() {
- messages.push('a');
- }, 5);
-
- timeout(10).then(function() {
- assert.deepEqual(['a'], messages);
- d.fulfill(1234);
- return waitResult;
- }).then(function() {
- assert.deepEqual(['a', 'b'], messages);
- });
-
- return waitForIdle();
- });
- });
-
- describe('testSubtasks', function() {
- it('(base case)', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- schedule('c');
- schedule('d');
- });
- schedule('b');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'sub-tasks', 'c', 'd', 'b');
- });
- });
-
- it('nesting', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- schedule('b');
- scheduleAction('sub-sub-tasks', function() {
- schedule('c');
- schedule('d');
- });
- schedule('e');
- });
- schedule('f');
-
- return waitForIdle().then(function() {
- assertFlowHistory(
- 'a', 'sub-tasks', 'b', 'sub-sub-tasks', 'c', 'd', 'e', 'f');
- });
- });
-
- it('taskReturnsSubTaskResult_1', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- return schedule('c');
- });
- schedule('b');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'sub-tasks', 'c', 'b');
- });
- });
-
- it('taskReturnsSubTaskResult_2', function() {
- let pair = callbackPair((value) => assert.equal(123, value));
- schedule('a');
- schedule('sub-tasks', promise.fulfilled(123)).then(pair.callback);
- schedule('b');
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'sub-tasks','b');
- pair.assertCallback();
- });
- });
-
- it('taskReturnsPromiseThatDependsOnSubtask_1', function() {
- scheduleAction('a', function() {
- return promise.delayed(10).then(function() {
- schedule('b');
- });
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskReturnsPromiseThatDependsOnSubtask_2', function() {
- scheduleAction('a', function() {
- return promise.fulfilled().then(function() {
- schedule('b');
- });
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskReturnsPromiseThatDependsOnSubtask_3', function() {
- scheduleAction('a', function() {
- return promise.delayed(10).then(function() {
- return schedule('b');
- });
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskReturnsPromiseThatDependsOnSubtask_4', function() {
- scheduleAction('a', function() {
- return promise.delayed(5).then(function() {
- return promise.delayed(5).then(function() {
- return schedule('b');
- });
- });
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskReturnsPromiseThatDependsOnSubtask_5', function() {
- scheduleAction('a', function() {
- return promise.delayed(5).then(function() {
- return promise.delayed(5).then(function() {
- return promise.delayed(5).then(function() {
- return promise.delayed(5).then(function() {
- return schedule('b');
- });
- });
- });
- });
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('taskReturnsPromiseThatDependsOnSubtask_6', function() {
- scheduleAction('a', function() {
- return promise.delayed(5).
- then(function() { return promise.delayed(5) }).
- then(function() { return promise.delayed(5) }).
- then(function() { return promise.delayed(5) }).
- then(function() { return schedule('b'); });
- });
- schedule('c');
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'b', 'c');
- });
- });
-
- it('subTaskFails_1', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- scheduleAction('sub-task that fails', throwStubError);
- });
- schedule('should never execute');
-
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('a', 'sub-tasks', 'sub-task that fails');
- });
- });
-
- it('subTaskFails_2', function() {
- schedule('a');
- scheduleAction('sub-tasks', function() {
- return promise.rejected(new StubError);
- });
- schedule('should never execute');
-
- return waitForAbort().
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('a', 'sub-tasks');
- });
- });
-
- it('subTaskFails_3', function() {
- var callbacks = callbackPair(null, assertIsStubError);
-
- schedule('a');
- scheduleAction('sub-tasks', function() {
- return promise.rejected(new StubError);
- }).then(callbacks.callback, callbacks.errback);
- schedule('b');
-
- return waitForIdle().
- then(function() {
- assertFlowHistory('a', 'sub-tasks', 'b');
- callbacks.assertErrback();
- });
- });
- });
-
- describe('testEventLoopWaitsOnPendingPromiseRejections', function() {
- it('oneRejection', function() {
- var d = new promise.Deferred;
- scheduleAction('one', function() {
- return d.promise;
- });
- scheduleAction('two', function() {});
-
- return timeout(50).then(function() {
- assertFlowHistory('one');
- d.reject(new StubError);
- return waitForAbort();
- }).
- then(assertIsStubError).
- then(function() {
- assertFlowHistory('one');
- });
- });
-
- it('multipleRejections', function() {
- var once = Error('once');
- var twice = Error('twice');
-
- scheduleAction('one', function() {
- promise.rejected(once);
- promise.rejected(twice);
- });
- var twoResult = scheduleAction('two', function() {});
-
- flow.removeAllListeners(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION);
- return new NativePromise(function(fulfill, reject) {
- setTimeout(function() {
- reject(Error('Should have reported the two errors by now'));
- }, 50);
- flow.on(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION,
- fulfill);
- }).then(function(e) {
- assert.ok(e instanceof promise.MultipleUnhandledRejectionError,
- 'Not a MultipleUnhandledRejectionError');
- let errors = Array.from(e.errors);
- assert.deepEqual([once, twice], errors);
- assertFlowHistory('one');
- });
- });
- });
-
- describe('testCancelsPromiseReturnedByCallbackIfFrameFails', function() {
- it('promiseCallback', function() {
- var chainPair = callbackPair(null, assertIsStubError);
- var deferredPair = callbackPair(null, function(e) {
- assert.equal('CancellationError: StubError', e.toString(),
- 'callback result should be cancelled');
- });
-
- var d = new promise.Deferred();
- d.promise.then(deferredPair.callback, deferredPair.errback);
-
- promise.fulfilled().
- then(function() {
- scheduleAction('boom', throwStubError);
- schedule('this should not run');
- return d.promise;
- }).
- then(chainPair.callback, chainPair.errback);
-
- return waitForIdle().then(function() {
- assertFlowHistory('boom');
- chainPair.assertErrback('chain errback not invoked');
- deferredPair.assertErrback('deferred errback not invoked');
- });
- });
-
- it('taskCallback', function() {
- var chainPair = callbackPair(null, assertIsStubError);
- var deferredPair = callbackPair(null, function(e) {
- assert.equal('CancellationError: StubError', e.toString(),
- 'callback result should be cancelled');
- });
-
- var d = new promise.Deferred();
- d.promise.then(deferredPair.callback, deferredPair.errback);
-
- schedule('a').
- then(function() {
- scheduleAction('boom', throwStubError);
- schedule('this should not run');
- return d.promise;
- }).
- then(chainPair.callback, chainPair.errback);
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'boom');
- chainPair.assertErrback('chain errback not invoked');
- deferredPair.assertErrback('deferred errback not invoked');
- });
- });
- });
-
- it('testMaintainsOrderInCallbacksWhenATaskReturnsAPromise', function() {
- schedule('__start__', promise.fulfilled()).
- then(function() {
- messages.push('a');
- schedulePush('b');
- messages.push('c');
- }).
- then(function() {
- messages.push('d');
- });
- schedulePush('e');
-
- return waitForIdle().then(function() {
- assertFlowHistory('__start__', 'b', 'e');
- assertMessages('a', 'c', 'b', 'd', 'e');
- });
- });
-
- it('testOwningFlowIsActivatedForExecutingTasks', function() {
- var defaultFlow = promise.controlFlow();
- var order = [];
-
- promise.createFlow(function(flow) {
- assertFlowIs(flow);
- order.push(0);
-
- defaultFlow.execute(function() {
- assertFlowIs(defaultFlow);
- order.push(1);
- });
- });
-
- return waitForIdle().then(function() {
- assertFlowIs(defaultFlow);
- assert.deepEqual([0, 1], order);
- });
- });
-
- it('testCreateFlowReturnsPromisePairedWithCreatedFlow', function() {
- return new NativePromise(function(fulfill, reject) {
- var newFlow;
- promise.createFlow(function(flow) {
- newFlow = flow;
- assertFlowIs(newFlow);
- }).then(function() {
- assertFlowIs(newFlow);
- waitForIdle(newFlow).then(fulfill, reject);
- });
- });
- });
-
- it('testDeferredFactoriesCreateForActiveFlow_defaultFlow', function() {
- var e = Error();
- var defaultFlow = promise.controlFlow();
- promise.fulfilled().then(function() {
- assertFlowIs(defaultFlow);
- });
- promise.rejected(e).then(null, function(err) {
- assert.equal(e, err);
- assertFlowIs(defaultFlow);
- });
- promise.defer().promise.then(function() {
- assertFlowIs(defaultFlow);
- });
-
- return waitForIdle();
- });
-
- it('testDeferredFactoriesCreateForActiveFlow_newFlow', function() {
- var e = Error();
- var newFlow = new promise.ControlFlow;
- newFlow.execute(function() {
- promise.fulfilled().then(function() {
- assertFlowIs(newFlow);
- });
-
- promise.rejected(e).then(null, function(err) {
- assert.equal(e, err);
- assertFlowIs(newFlow);
- });
-
- let d = promise.defer();
- d.promise.then(function() {
- assertFlowIs(newFlow);
- });
- d.fulfill();
- }).then(function() {
- assertFlowIs(newFlow);
- });
-
- return waitForIdle(newFlow);
- });
-
- it('testFlowsSynchronizeWithThemselvesNotEachOther', function() {
- var defaultFlow = promise.controlFlow();
- schedulePush('a', 'a');
- promise.controlFlow().timeout(500);
- schedulePush('b', 'b');
-
- promise.createFlow(function(flow2) {
- assertFlowIs(flow2);
- schedulePush('c', 'c');
- schedulePush('d', 'd');
- });
-
- return waitForIdle().then(function() {
- assertMessages('a', 'c', 'd', 'b');
- });
- });
-
- it('testUnhandledErrorsAreReportedToTheOwningFlow', function() {
- var error1 = Error('e1');
- var error2 = Error('e2');
-
- var defaultFlow = promise.controlFlow();
- defaultFlow.removeAllListeners('uncaughtException');
-
- var flow1Error = defer();
- flow1Error.promise.then(function(value) {
- assert.equal(error2, value);
- });
-
- var flow2Error = defer();
- flow2Error.promise.then(function(value) {
- assert.equal(error1, value);
- });
-
- promise.createFlow(function(flow) {
- flow.once('uncaughtException', flow2Error.resolve);
- promise.rejected(error1);
-
- defaultFlow.once('uncaughtException', flow1Error.resolve);
- defaultFlow.execute(function() {
- promise.rejected(error2);
- });
- });
-
- return NativePromise.all([flow1Error.promise, flow2Error.promise]);
- });
-
- it('testCanSynchronizeFlowsByReturningPromiseFromOneToAnother', function() {
- var flow1 = new promise.ControlFlow;
- var flow1Done = defer();
- flow1.once('idle', flow1Done.resolve);
- flow1.once('uncaughtException', flow1Done.reject);
-
- var flow2 = new promise.ControlFlow;
- var flow2Done = defer();
- flow2.once('idle', flow2Done.resolve);
- flow2.once('uncaughtException', flow2Done.reject);
-
- flow1.execute(function() {
- schedulePush('a', 'a');
- return promise.delayed(25);
- }, 'start flow 1');
-
- flow2.execute(function() {
- schedulePush('b', 'b');
- schedulePush('c', 'c');
- flow2.execute(function() {
- return flow1.execute(function() {
- schedulePush('d', 'd');
- }, 'flow 1 task');
- }, 'inject flow1 result into flow2');
- schedulePush('e', 'e');
- }, 'start flow 2');
-
- return NativePromise.all([flow1Done.promise, flow2Done.promise]).
- then(function() {
- assertMessages('a', 'b', 'c', 'd', 'e');
- });
- });
-
- it('testFramesWaitToCompleteForPendingRejections', function() {
- return new NativePromise(function(fulfill, reject) {
-
- promise.controlFlow().execute(function() {
- promise.rejected(new StubError);
- }).then(fulfill, reject);
-
- }).
- then(() => fail('expected to fail'), assertIsStubError);
- });
-
- it('testSynchronizeErrorsPropagateToOuterFlow', function() {
- var outerFlow = new promise.ControlFlow;
- var innerFlow = new promise.ControlFlow;
-
- var block = defer();
- innerFlow.execute(function() {
- return block.promise;
- }, 'block inner flow');
-
- outerFlow.execute(function() {
- block.resolve();
- return innerFlow.execute(function() {
- promise.rejected(new StubError);
- }, 'trigger unhandled rejection error');
- }, 'run test');
-
- return NativePromise.all([
- waitForIdle(innerFlow),
- waitForAbort(outerFlow).then(assertIsStubError)
- ]);
- });
-
- it('testFailsIfErrbackThrows', function() {
- promise.rejected('').then(null, throwStubError);
- return waitForAbort().then(assertIsStubError);
- });
-
- it('testFailsIfCallbackReturnsRejectedPromise', function() {
- promise.fulfilled().then(function() {
- return promise.rejected(new StubError);
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('testAbortsFrameIfTaskFails', function() {
- promise.fulfilled().then(function() {
- promise.controlFlow().execute(throwStubError);
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('testAbortsFramePromisedChainedFromTaskIsNotHandled', function() {
- promise.fulfilled().then(function() {
- promise.controlFlow().execute(function() {}).
- then(throwStubError);
- });
- return waitForAbort().then(assertIsStubError);
- });
-
- it('testTrapsChainedUnhandledRejectionsWithinAFrame', function() {
- var pair = callbackPair(null, assertIsStubError);
- promise.fulfilled().then(function() {
- promise.controlFlow().execute(function() {}).
- then(throwStubError);
- }).then(pair.callback, pair.errback);
-
- return waitForIdle().then(pair.assertErrback);
- });
-
- it('testCancelsRemainingTasksIfFrameThrowsDuringScheduling', function() {
- var task1, task2;
- var pair = callbackPair(null, assertIsStubError);
- var flow = promise.controlFlow();
- flow.execute(function() {
- task1 = flow.execute(function() {});
- task2 = flow.execute(function() {});
- throw new StubError;
- }).then(pair.callback, pair.errback);
-
- return waitForIdle().
- then(pair.assertErrback).
- then(function() {
- pair = callbackPair();
- return task1.then(pair.callback, pair.errback);
- }).
- then(function() {
- pair.assertErrback();
- pair = callbackPair();
- return task2.then(pair.callback, pair.errback);
- }).
- then(function() {
- pair.assertErrback();
- });
- });
-
- it('testCancelsRemainingTasksInFrameIfATaskFails', function() {
- var task;
- var pair = callbackPair(null, assertIsStubError);
- var flow = promise.controlFlow();
- flow.execute(function() {
- flow.execute(throwStubError);
- task = flow.execute(function() {});
- }).then(pair.callback, pair.errback);
-
- return waitForIdle().then(pair.assertErrback).then(function() {
- pair = callbackPair();
- task.then(pair.callback, pair.errback);
- }).then(function() {
- pair.assertErrback();
- });
- });
-
- it('testDoesNotModifyRejectionErrorIfPromiseNotInsideAFlow', function() {
- var error = Error('original message');
- var originalStack = error.stack;
- var originalStr = error.toString();
-
- var pair = callbackPair(null, function(e) {
- assert.equal(error, e);
- assert.equal('original message', e.message);
- assert.equal(originalStack, e.stack);
- assert.equal(originalStr, e.toString());
- });
-
- promise.rejected(error).then(pair.callback, pair.errback);
- return waitForIdle().then(pair.assertErrback);
- });
-
- /** See https://github.com/SeleniumHQ/selenium/issues/444 */
- it('testMaintainsOrderWithPromiseChainsCreatedWithinAForeach_1', function() {
- var messages = [];
- flow.execute(function() {
- return promise.fulfilled(['a', 'b', 'c', 'd']);
- }, 'start').then(function(steps) {
- steps.forEach(function(step) {
- promise.fulfilled(step)
- .then(function() {
- messages.push(step + '.1');
- }).then(function() {
- messages.push(step + '.2');
- });
- })
- });
- return waitForIdle().then(function() {
- assert.deepEqual(
- ['a.1', 'a.2', 'b.1', 'b.2', 'c.1', 'c.2', 'd.1', 'd.2'],
- messages);
- });
- });
-
- /** See https://github.com/SeleniumHQ/selenium/issues/444 */
- it('testMaintainsOrderWithPromiseChainsCreatedWithinAForeach_2', function() {
- var messages = [];
- flow.execute(function() {
- return promise.fulfilled(['a', 'b', 'c', 'd']);
- }, 'start').then(function(steps) {
- steps.forEach(function(step) {
- promise.fulfilled(step)
- .then(function() {
- messages.push(step + '.1');
- }).then(function() {
- flow.execute(function() {}, step + '.2').then(function() {
- messages.push(step + '.2');
- });
- });
- })
- });
- return waitForIdle().then(function() {
- assert.deepEqual(
- ['a.1', 'a.2', 'b.1', 'b.2', 'c.1', 'c.2', 'd.1', 'd.2'],
- messages);
- });
- });
-
- /** See https://github.com/SeleniumHQ/selenium/issues/444 */
- it('testMaintainsOrderWithPromiseChainsCreatedWithinAForeach_3', function() {
- var messages = [];
- flow.execute(function() {
- return promise.fulfilled(['a', 'b', 'c', 'd']);
- }, 'start').then(function(steps) {
- steps.forEach(function(step) {
- promise.fulfilled(step)
- .then(function(){})
- .then(function() {
- messages.push(step + '.1');
- return flow.execute(function() {}, step + '.1');
- }).then(function() {
- flow.execute(function() {}, step + '.2').then(function(text) {
- messages.push(step + '.2');
- });
- });
- })
- });
- return waitForIdle().then(function() {
- assert.deepEqual(
- ['a.1', 'a.2', 'b.1', 'b.2', 'c.1', 'c.2', 'd.1', 'd.2'],
- messages);
- });
- });
-
- /** See https://github.com/SeleniumHQ/selenium/issues/363 */
- it('testTasksScheduledInASeparateTurnOfTheEventLoopGetASeparateTaskQueue_2', function() {
- scheduleAction('a', () => promise.delayed(10));
- schedule('b');
- setTimeout(() => schedule('c'), 0);
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'c', 'b');
- });
- });
-
- /** See https://github.com/SeleniumHQ/selenium/issues/363 */
- it('testTasksScheduledInASeparateTurnOfTheEventLoopGetASeparateTaskQueue_2', function() {
- scheduleAction('a', () => promise.delayed(10));
- schedule('b');
- schedule('c');
- setTimeout(function() {
- schedule('d');
- scheduleAction('e', () => promise.delayed(10));
- schedule('f');
- }, 0);
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'd', 'e', 'b', 'c', 'f');
- });
- });
-
- /** See https://github.com/SeleniumHQ/selenium/issues/363 */
- it('testCanSynchronizeTasksFromAdjacentTaskQueues', function() {
- var task1 = scheduleAction('a', () => promise.delayed(10));
- schedule('b');
- setTimeout(function() {
- scheduleAction('c', () => task1);
- schedule('d');
- }, 0);
-
- return waitForIdle().then(function() {
- assertFlowHistory('a', 'c', 'd', 'b');
- });
- });
-
- describe('testCancellingAScheduledTask', function() {
- it('1', function() {
- var called = false;
- var task1 = scheduleAction('a', () => called = true);
- task1.cancel('no soup for you');
-
- return waitForIdle().then(function() {
- assert.ok(!called);
- assertFlowHistory();
- return task1.catch(function(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('no soup for you', e.message);
- });
- });
- });
-
- it('2', function() {
- schedule('a');
- var called = false;
- var task2 = scheduleAction('b', () => called = true);
- schedule('c');
-
- task2.cancel('no soup for you');
-
- return waitForIdle().then(function() {
- assert.ok(!called);
- assertFlowHistory('a', 'c');
- return task2.catch(function(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('no soup for you', e.message);
- });
- });
- });
-
- it('3', function() {
- var called = false;
- var task = scheduleAction('a', () => called = true);
- task.cancel(new StubError);
-
- return waitForIdle().then(function() {
- assert.ok(!called);
- assertFlowHistory();
- return task.catch(function(e) {
- assert.ok(e instanceof promise.CancellationError);
- });
- });
- });
-
- it('4', function() {
- var seen = [];
- var task = scheduleAction('a', () => seen.push(1))
- .then(() => seen.push(2))
- .then(() => seen.push(3))
- .then(() => seen.push(4))
- .then(() => seen.push(5));
- task.cancel(new StubError);
-
- return waitForIdle().then(function() {
- assert.deepEqual([], seen);
- assertFlowHistory();
- return task.catch(function(e) {
- assert.ok(e instanceof promise.CancellationError);
- });
- });
- });
-
- it('fromWithinAnExecutingTask', function() {
- var called = false;
- var task;
- scheduleAction('a', function() {
- task.cancel('no soup for you');
- });
- task = scheduleAction('b', () => called = true);
- schedule('c');
-
- return waitForIdle().then(function() {
- assert.ok(!called);
- assertFlowHistory('a', 'c');
- return task.catch(function(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('no soup for you', e.message);
- });
- });
- });
- });
-
- it('testCancellingAPendingTask', function() {
- var order = [];
- var unresolved = promise.defer();
-
- var innerTask;
- var outerTask = scheduleAction('a', function() {
- order.push(1);
-
- // Schedule a task that will never finish.
- innerTask = scheduleAction('a.1', function() {
- return unresolved.promise;
- });
-
- // Since the outerTask is cancelled below, innerTask should be cancelled
- // with a DiscardedTaskError, which means its callbacks are silently
- // dropped - so this should never execute.
- innerTask.catch(function(e) {
- order.push(2);
- });
- });
- schedule('b');
-
- outerTask.catch(function(e) {
- order.push(3);
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('no soup for you', e.message);
- });
-
- unresolved.promise.catch(function(e) {
- order.push(4);
- assert.ok(e instanceof promise.CancellationError);
- });
-
- return timeout(10).then(function() {
- assert.deepEqual([1], order);
-
- outerTask.cancel('no soup for you');
- return waitForIdle();
- }).then(function() {
- assertFlowHistory('a', 'a.1', 'b');
- assert.deepEqual([1, 3, 4], order);
- });
- });
-
- it('testCancellingAPendingPromiseCallback', function() {
- var called = false;
-
- var root = promise.fulfilled();
- root.then(function() {
- cb2.cancel('no soup for you');
- });
-
- var cb2 = root.then(fail, fail); // These callbacks should never be called.
- cb2.then(fail, function(e) {
- called = true;
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('no soup for you', e.message);
- });
-
- return waitForIdle().then(function() {
- assert.ok(called);
- });
- });
-
- describe('testResetFlow', function() {
- it('1', function() {
- var called = 0;
- var task = flow.execute(() => called++);
- task.finally(() => called++);
-
- return new Promise(function(fulfill) {
- flow.once('reset', fulfill);
- flow.reset();
-
- }).then(function() {
- assert.equal(0, called);
- return task;
-
- }).then(fail, function(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('ControlFlow was reset', e.message);
- });
- });
-
- it('2', function() {
- var called = 0;
- var task1 = flow.execute(() => called++);
- task1.finally(() => called++);
-
- var task2 = flow.execute(() => called++);
- task2.finally(() => called++);
-
- var task3 = flow.execute(() => called++);
- task3.finally(() => called++);
-
- return new Promise(function(fulfill) {
- flow.once('reset', fulfill);
- flow.reset();
-
- }).then(function() {
- assert.equal(0, called);
- });
- });
- });
-
- describe('testPromiseFulfilledInsideTask', function() {
- it('1', function() {
- var order = [];
-
- flow.execute(function() {
- var d = promise.defer();
-
- d.promise.then(() => order.push('a'));
- d.promise.then(() => order.push('b'));
- d.promise.then(() => order.push('c'));
- d.fulfill();
-
- flow.execute(() => order.push('d'));
-
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'b', 'c', 'd', 'fin'], order);
- });
- });
-
- it('2', function() {
- var order = [];
-
- flow.execute(function() {
- flow.execute(() => order.push('a'));
- flow.execute(() => order.push('b'));
-
- var d = promise.defer();
- d.promise.then(() => order.push('c'));
- d.promise.then(() => order.push('d'));
- d.fulfill();
-
- flow.execute(() => order.push('e'));
-
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'b', 'c', 'd', 'e', 'fin'], order);
- });
- });
-
- it('3', function() {
- var order = [];
- var d = promise.defer();
- d.promise.then(() => order.push('c'));
- d.promise.then(() => order.push('d'));
-
- flow.execute(function() {
- flow.execute(() => order.push('a'));
- flow.execute(() => order.push('b'));
-
- d.promise.then(() => order.push('e'));
- d.fulfill();
-
- flow.execute(() => order.push('f'));
-
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['c', 'd', 'a', 'b', 'e', 'f', 'fin'], order);
- });
- });
-
- it('4', function() {
- var order = [];
- var d = promise.defer();
- d.promise.then(() => order.push('a'));
- d.promise.then(() => order.push('b'));
-
- flow.execute(function() {
- flow.execute(function() {
- order.push('c');
- flow.execute(() => order.push('d'));
- d.promise.then(() => order.push('e'));
- });
- flow.execute(() => order.push('f'));
-
- d.promise.then(() => order.push('g'));
- d.fulfill();
-
- flow.execute(() => order.push('h'));
-
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'fin'], order);
- });
- });
- });
-
- describe('testSettledPromiseCallbacksInsideATask', function() {
- it('1', function() {
- var order = [];
- var p = promise.fulfilled();
-
- flow.execute(function() {
- flow.execute(() => order.push('a'));
- p.then(() => order.push('b'));
- flow.execute(() => order.push('c'));
- p.then(() => order.push('d'));
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'b', 'c', 'd', 'fin'], order);
- });
- });
-
- it('2', function() {
- var order = [];
-
- flow.execute(function() {
- flow.execute(() => order.push('a'))
- .then( () => order.push('c'));
- flow.execute(() => order.push('b'));
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'c', 'b', 'fin'], order);
- });
- });
- });
-
- it('testTasksDoNotWaitForNewlyCreatedPromises', function() {
- var order = [];
-
- flow.execute(function() {
- var d = promise.defer();
-
- // This is a normal promise, not a task, so the task for this callback is
- // considered volatile. Volatile tasks should be skipped when they reach
- // the front of the task queue.
- d.promise.then(() => order.push('a'));
-
- flow.execute(() => order.push('b'));
- flow.execute(function() {
- flow.execute(() => order.push('c'));
- d.promise.then(() => order.push('d'));
- d.fulfill();
- });
- flow.execute(() => order.push('e'));
-
- }).then(() => order.push('fin'));
-
- return waitForIdle().then(function() {
- assert.deepEqual(['b', 'a', 'c', 'd', 'e', 'fin'], order);
- });
- });
-
- it('testCallbackDependenciesDoNotDeadlock', function() {
- var order = [];
- var root = promise.defer();
- var dep = promise.fulfilled().then(function() {
- order.push('a');
- return root.promise.then(function() {
- order.push('b');
- });
- });
- // This callback depends on |dep|, which depends on another callback
- // attached to |root| via a chain.
- root.promise.then(function() {
- order.push('c');
- return dep.then(() => order.push('d'));
- }).then(() => order.push('fin'));
-
- setTimeout(() => root.fulfill(), 20);
-
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'b', 'c', 'd', 'fin'], order);
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/promise_generator_test.js b/node_modules/selenium-webdriver/test/lib/promise_generator_test.js
deleted file mode 100644
index b3388da78..000000000
--- a/node_modules/selenium-webdriver/test/lib/promise_generator_test.js
+++ /dev/null
@@ -1,310 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const promise = require('../../lib/promise');
-const {enablePromiseManager, promiseManagerSuite} = require('../../lib/test/promise');
-
-describe('promise.consume()', function() {
- promiseManagerSuite(() => {
- it('requires inputs to be generator functions', function() {
- assert.throws(function() {
- promise.consume(function() {});
- });
- });
-
- it('handles a basic generator with no yielded promises', function() {
- var values = [];
- return promise.consume(function* () {
- var i = 0;
- while (i < 4) {
- i = yield i + 1;
- values.push(i);
- }
- }).then(function() {
- assert.deepEqual([1, 2, 3, 4], values);
- });
- });
-
- it('handles a promise yielding generator', function() {
- var values = [];
- return promise.consume(function* () {
- var i = 0;
- while (i < 4) {
- // Test that things are actually async here.
- setTimeout(function() {
- values.push(i * 2);
- }, 10);
-
- yield promise.delayed(10).then(function() {
- values.push(i++);
- });
- }
- }).then(function() {
- assert.deepEqual([0, 0, 2, 1, 4, 2, 6, 3], values);
- });
- });
-
- it('assignments to yielded promises get fulfilled value', function() {
- return promise.consume(function* () {
- let x = yield Promise.resolve(2);
- assert.equal(2, x);
- });
- });
-
- it('uses final return value as fulfillment value', function() {
- return promise.consume(function* () {
- yield 1;
- yield 2;
- return 3;
- }).then(function(value) {
- assert.equal(3, value);
- });
- });
-
- it('throws rejected promise errors within the generator', function() {
- var values = [];
- return promise.consume(function* () {
- values.push('a');
- var e = Error('stub error');
- try {
- yield Promise.reject(e);
- values.push('b');
- } catch (ex) {
- assert.equal(e, ex);
- values.push('c');
- }
- values.push('d');
- }).then(function() {
- assert.deepEqual(['a', 'c', 'd'], values);
- });
- });
-
- it('aborts the generator if there is an unhandled rejection', function() {
- var values = [];
- var e = Error('stub error');
- return promise.consume(function* () {
- values.push(1);
- yield promise.rejected(e);
- values.push(2);
- }).catch(function() {
- assert.deepEqual([1], values);
- });
- });
-
- it('yield waits for promises', function() {
- let values = [];
- let blocker = promise.delayed(100).then(() => {
- assert.deepEqual([1], values);
- return 2;
- });
-
- return promise.consume(function* () {
- values.push(1);
- values.push(yield blocker, 3);
- }).then(function() {
- assert.deepEqual([1, 2, 3], values);
- });
- });
-
- it('accepts custom scopes', function() {
- return promise.consume(function* () {
- return this.name;
- }, {name: 'Bob'}).then(function(value) {
- assert.equal('Bob', value);
- });
- });
-
- it('accepts initial generator arguments', function() {
- return promise.consume(function* (a, b) {
- assert.equal('red', a);
- assert.equal('apples', b);
- }, null, 'red', 'apples');
- });
- });
-
- enablePromiseManager(() => {
- it('is possible to cancel promise generators', function() {
- var values = [];
- var p = promise.consume(function* () {
- var i = 0;
- while (i < 3) {
- yield promise.delayed(100).then(function() {
- values.push(i++);
- });
- }
- });
- return promise.delayed(75).then(function() {
- p.cancel();
- return p.catch(function() {
- return promise.delayed(300);
- });
- }).then(function() {
- assert.deepEqual([0], values);
- });
- });
-
- it('executes generator within the control flow', function() {
- var promises = [
- promise.defer(),
- promise.defer()
- ];
- var values = [];
-
- setTimeout(function() {
- assert.deepEqual([], values);
- promises[0].fulfill(1);
- }, 100);
-
- setTimeout(function() {
- assert.deepEqual([1], values);
- promises[1].fulfill(2);
- }, 200);
-
- return promise.controlFlow().execute(function* () {
- values.push(yield promises[0].promise);
- values.push(yield promises[1].promise);
- values.push('fin');
- }).then(function() {
- assert.deepEqual([1, 2, 'fin'], values);
- });
- });
-
- it('handles tasks scheduled in generator', function() {
- var flow = promise.controlFlow();
- return flow.execute(function* () {
- var x = yield flow.execute(function() {
- return promise.delayed(10).then(function() {
- return 1;
- });
- });
-
- var y = yield flow.execute(function() {
- return 2;
- });
-
- return x + y;
- }).then(function(value) {
- assert.equal(3, value);
- });
- });
-
- it('blocks the control flow while processing generator', function() {
- var values = [];
- return promise.controlFlow().wait(function* () {
- yield values.push(1);
- values.push(yield promise.delayed(10).then(function() {
- return 2;
- }));
- yield values.push(3);
- return values.length === 6;
- }, 250).then(function() {
- assert.deepEqual([1, 2, 3, 1, 2, 3], values);
- });
- });
-
- it('ControlFlow.wait() will timeout on long generator', function() {
- var values = [];
- return promise.controlFlow().wait(function* () {
- var i = 0;
- while (i < 3) {
- yield promise.delayed(100).then(function() {
- values.push(i++);
- });
- }
- }, 75).catch(function() {
- assert.deepEqual(
- [0, 1, 2], values, 'Should complete one loop of wait condition');
- });
- });
-
- describe('generators in promise callbacks', function() {
- it('works with no initial value', function() {
- var promises = [
- promise.defer(),
- promise.defer()
- ];
- var values = [];
-
- setTimeout(function() {
- promises[0].fulfill(1);
- }, 50);
-
- setTimeout(function() {
- promises[1].fulfill(2);
- }, 100);
-
- return promise.fulfilled().then(function*() {
- values.push(yield promises[0].promise);
- values.push(yield promises[1].promise);
- values.push('fin');
- }).then(function() {
- assert.deepEqual([1, 2, 'fin'], values);
- });
- });
-
- it('starts the generator with promised value', function() {
- var promises = [
- promise.defer(),
- promise.defer()
- ];
- var values = [];
-
- setTimeout(function() {
- promises[0].fulfill(1);
- }, 50);
-
- setTimeout(function() {
- promises[1].fulfill(2);
- }, 100);
-
- return promise.fulfilled(3).then(function*(value) {
- var p1 = yield promises[0].promise;
- var p2 = yield promises[1].promise;
- values.push(value + p1);
- values.push(value + p2);
- values.push('fin');
- }).then(function() {
- assert.deepEqual([4, 5, 'fin'], values);
- });
- });
-
- it('throws yielded rejections within the generator callback', function() {
- var d = promise.defer();
- var e = Error('stub');
-
- setTimeout(function() {
- d.reject(e);
- }, 50);
-
- return promise.fulfilled().then(function*() {
- var threw = false;
- try {
- yield d.promise;
- } catch (ex) {
- threw = true;
- assert.equal(e, ex);
- }
- assert.ok(threw);
- });
- });
- });
- });
-});
-
diff --git a/node_modules/selenium-webdriver/test/lib/promise_test.js b/node_modules/selenium-webdriver/test/lib/promise_test.js
deleted file mode 100644
index 8da1cd89e..000000000
--- a/node_modules/selenium-webdriver/test/lib/promise_test.js
+++ /dev/null
@@ -1,1109 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-
-const testutil = require('./testutil');
-const promise = require('../../lib/promise');
-const {enablePromiseManager, promiseManagerSuite} = require('../../lib/test/promise');
-
-// Aliases for readability.
-const NativePromise = Promise;
-const StubError = testutil.StubError;
-const assertIsStubError = testutil.assertIsStubError;
-const callbackHelper = testutil.callbackHelper;
-const callbackPair = testutil.callbackPair;
-const throwStubError = testutil.throwStubError;
-const fail = () => assert.fail();
-
-// Refer to promise_aplus_test for promise compliance with standard behavior.
-describe('promise', function() {
- var app, uncaughtExceptions;
-
- beforeEach(function setUp() {
- if (promise.USE_PROMISE_MANAGER) {
- promise.LONG_STACK_TRACES = false;
- uncaughtExceptions = [];
-
- app = promise.controlFlow();
- app.on(promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION,
- (e) => uncaughtExceptions.push(e));
- }
- });
-
- afterEach(function tearDown() {
- if (promise.USE_PROMISE_MANAGER) {
- app.reset();
- promise.setDefaultFlow(new promise.ControlFlow);
- assert.deepEqual([], uncaughtExceptions,
- 'Did not expect any uncaught exceptions');
- promise.LONG_STACK_TRACES = false;
- }
- });
-
- const assertIsPromise = (p) => assert.ok(promise.isPromise(p));
- const assertNotPromise = (v) => assert.ok(!promise.isPromise(v));
-
- function defer() {
- let d = {};
- let promise = new Promise((resolve, reject) => {
- Object.assign(d, {resolve, reject});
- });
- d.promise = promise;
- return d;
- }
-
- function createRejectedPromise(reason) {
- var p = Promise.reject(reason);
- p.catch(function() {}); // Silence unhandled rejection handlers.
- return p;
- }
-
- enablePromiseManager(() => {
- it('testCanDetectPromiseLikeObjects', function() {
- assertIsPromise(new promise.Promise(function(fulfill) {
- fulfill();
- }));
- assertIsPromise(new promise.Deferred().promise);
- assertIsPromise(Promise.resolve(123));
- assertIsPromise({then:function() {}});
-
- assertNotPromise(new promise.Deferred());
- assertNotPromise(undefined);
- assertNotPromise(null);
- assertNotPromise('');
- assertNotPromise(true);
- assertNotPromise(false);
- assertNotPromise(1);
- assertNotPromise({});
- assertNotPromise({then:1});
- assertNotPromise({then:true});
- assertNotPromise({then:''});
- });
-
- describe('then', function() {
- it('returnsOwnPromiseIfNoCallbacksWereGiven', function() {
- var deferred = new promise.Deferred();
- assert.equal(deferred.promise, deferred.promise.then());
- assert.equal(deferred.promise, deferred.promise.catch());
- assert.equal(deferred.promise, promise.when(deferred.promise));
- });
-
- it('stillConsideredUnHandledIfNoCallbacksWereGivenOnCallsToThen', function() {
- promise.rejected(new StubError).then();
- var handler = callbackHelper(assertIsStubError);
-
- // so tearDown() doesn't throw
- app.removeAllListeners();
- app.on(promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION, handler);
- return NativePromise.resolve()
- // Macro yield so the uncaught exception has a chance to trigger.
- .then(() => new NativePromise(resolve => setTimeout(resolve, 0)))
- .then(() => handler.assertCalled());
- });
- });
-
- describe('finally', function() {
- it('nonFailingCallbackDoesNotSuppressOriginalError', function() {
- var done = callbackHelper(assertIsStubError);
- return promise.rejected(new StubError).
- finally(function() {}).
- catch(done).
- finally(done.assertCalled);
- });
-
- it('failingCallbackSuppressesOriginalError', function() {
- var done = callbackHelper(assertIsStubError);
- return promise.rejected(new Error('original')).
- finally(throwStubError).
- catch(done).
- finally(done.assertCalled);
- });
-
- it('callbackThrowsAfterFulfilledPromise', function() {
- var done = callbackHelper(assertIsStubError);
- return promise.fulfilled().
- finally(throwStubError).
- catch(done).
- finally(done.assertCalled);
- });
-
- it('callbackReturnsRejectedPromise', function() {
- var done = callbackHelper(assertIsStubError);
- return promise.fulfilled().
- finally(function() {
- return promise.rejected(new StubError);
- }).
- catch(done).
- finally(done.assertCalled);
- });
- });
-
- describe('cancel', function() {
- it('passesTheCancellationReasonToReject', function() {
- var d = new promise.Deferred();
- var res = d.promise.then(assert.fail, function(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('because i said so', e.message);
- });
- d.promise.cancel('because i said so');
- return res;
- });
-
- describe('can cancel original promise from its child;', function() {
- it('child created by then()', function() {
- var d = new promise.Deferred();
- var p = d.promise.then(assert.fail, function(e) {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('because i said so', e.message);
- return 123;
- });
-
- p.cancel('because i said so');
- return p.then(v => assert.equal(123, v));
- });
-
- it('child linked by resolving with parent', function() {
- let parent = promise.defer();
- let child = new promise.Promise(resolve => resolve(parent.promise));
- child.cancel('all done');
-
- return parent.promise.then(
- () => assert.fail('expected a cancellation'),
- e => {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('all done', e.message);
- });
- });
-
- it('grand child through thenable chain', function() {
- let p = new promise.Promise(function() {/* never resolve*/});
-
- let noop = function() {};
- let gc = p.then(noop).then(noop).then(noop);
- gc.cancel('stop!');
-
- return p.then(
- () => assert.fail('expected to be cancelled'),
- (e) => {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('stop!', e.message);
- });
- });
-
- it('grand child through thenable chain started at resolve', function() {
- function noop() {}
-
- let parent = promise.defer();
- let child = new promise.Promise(resolve => resolve(parent.promise));
- let grandChild = child.then(noop).then(noop).then(noop);
- grandChild.cancel('all done');
-
- return parent.promise.then(
- () => assert.fail('expected a cancellation'),
- e => {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('all done', e.message);
- });
- });
-
- it('"parent" is a CancellableThenable', function() {
- function noop() {}
-
- class FakeThenable {
- constructor(p) {
- this.promise = p;
- }
-
- cancel(reason) {
- this.promise.cancel(reason);
- }
-
- then(cb, eb) {
- let result = this.promise.then(cb, eb);
- return new FakeThenable(result);
- }
- }
- promise.CancellableThenable.addImplementation(FakeThenable);
-
- let root = new promise.Promise(noop);
- let thenable = new FakeThenable(root);
- assert.ok(promise.Thenable.isImplementation(thenable));
- assert.ok(promise.CancellableThenable.isImplementation(thenable));
-
- let child = new promise.Promise(resolve => resolve(thenable));
- assert.ok(child instanceof promise.Promise);
- child.cancel('stop!');
-
- function assertStopped(p) {
- return p.then(
- () => assert.fail('not stopped!'),
- (e) => {
- assert.ok(e instanceof promise.CancellationError);
- assert.equal('stop!', e.message);
- });
- }
-
- return assertStopped(child).then(() => assertStopped(root));
- });
- });
-
- it('canCancelATimeout', function() {
- var p = promise.delayed(25)
- .then(assert.fail, (e) => e instanceof promise.CancellationError);
- setTimeout(() => p.cancel(), 20);
- p.cancel();
- return p;
- });
-
- it('can cancel timeout from grandchild', function() {
- });
-
- it('cancelIsANoopOnceAPromiseHasBeenFulfilled', function() {
- var p = promise.fulfilled(123);
- p.cancel();
- return p.then((v) => assert.equal(123, v));
- });
-
- it('cancelIsANoopOnceAPromiseHasBeenRejected', function() {
- var p = promise.rejected(new StubError);
- p.cancel();
-
- var pair = callbackPair(null, assertIsStubError);
- return p.then(assert.fail, assertIsStubError);
- });
-
- it('noopCancelTriggeredOnCallbackOfResolvedPromise', function() {
- var d = promise.defer();
- var p = d.promise.then();
-
- d.fulfill();
- p.cancel(); // This should not throw.
- return p; // This should not trigger a failure.
- });
- });
- });
-
- promiseManagerSuite(() => {
- describe('fulfilled', function() {
- it('returns input value if it is already a valid promise', function() {
- let p = promise.createPromise(function() {});
- let r = promise.fulfilled(p);
- assert.strictEqual(p, r);
- });
-
- it('creates a new promise fulfilled with input', function() {
- return promise.fulfilled(1234).then(v => assert.equal(1234, v));
- });
-
- it('can convert thenables to valid promise', function() {
- let thenable = {then: function(cb) {cb(1234)}};
- let p = promise.fulfilled(thenable);
- assert.notStrictEqual(thenable, p);
- return p.then(v => assert.equal(1234, v));
- });
- });
-
- describe('when', function() {
- it('ReturnsAResolvedPromiseIfGivenANonPromiseValue', function() {
- var ret = promise.when('abc');
- assertIsPromise(ret);
- return ret.then((value) => assert.equal('abc', value));
- });
-
- it('PassesRawErrorsToCallbacks', function() {
- var error = new Error('boo!');
- return promise.when(error, function(value) {
- assert.equal(error, value);
- });
- });
-
- it('WaitsForValueToBeResolvedBeforeInvokingCallback', function() {
- let d = defer();
- let callback;
- let result = promise.when(d.promise, callback = callbackHelper(function(value) {
- assert.equal('hi', value);
- }));
- callback.assertNotCalled();
- d.resolve('hi');
- return result.then(callback.assertCalled);
- });
- });
-
- describe('fullyResolved', function() {
- it('primitives', function() {
- function runTest(value) {
- var callback, errback;
- return promise.fullyResolved(value)
- .then((resolved) => assert.equal(value, resolved));
- }
- return runTest(true)
- .then(() => runTest(function() {}))
- .then(() => runTest(null))
- .then(() => runTest(123))
- .then(() => runTest('foo bar'))
- .then(() => runTest(undefined));
- });
-
- it('arrayOfPrimitives', function() {
- var fn = function() {};
- var array = [true, fn, null, 123, '', undefined, 1];
- return promise.fullyResolved(array).then(function(resolved) {
- assert.equal(array, resolved);
- assert.deepEqual([true, fn, null, 123, '', undefined, 1],
- resolved);
- });
- });
-
- it('nestedArrayOfPrimitives', function() {
- var fn = function() {};
- var array = [true, [fn, null, 123], '', undefined];
- return promise.fullyResolved(array)
- .then(function(resolved) {
- assert.equal(array, resolved);
- assert.deepEqual([true, [fn, null, 123], '', undefined], resolved);
- assert.deepEqual([fn, null, 123], resolved[1]);
- });
- });
-
- it('arrayWithPromisedPrimitive', function() {
- return promise.fullyResolved([Promise.resolve(123)])
- .then(function(resolved) {
- assert.deepEqual([123], resolved);
- });
- });
-
- it('promiseResolvesToPrimitive', function() {
- return promise.fullyResolved(Promise.resolve(123))
- .then((resolved) => assert.equal(123, resolved));
- });
-
- it('promiseResolvesToArray', function() {
- var fn = function() {};
- var array = [true, [fn, null, 123], '', undefined];
- var aPromise = Promise.resolve(array);
-
- var result = promise.fullyResolved(aPromise);
- return result.then(function(resolved) {
- assert.equal(array, resolved);
- assert.deepEqual([true, [fn, null, 123], '', undefined],
- resolved);
- assert.deepEqual([fn, null, 123], resolved[1]);
- });
- });
-
- it('promiseResolvesToArrayWithPromises', function() {
- var nestedPromise = Promise.resolve(123);
- var aPromise = Promise.resolve([true, nestedPromise]);
- return promise.fullyResolved(aPromise)
- .then(function(resolved) {
- assert.deepEqual([true, 123], resolved);
- });
- });
-
- it('rejectsIfArrayPromiseRejects', function() {
- var nestedPromise = createRejectedPromise(new StubError);
- var aPromise = Promise.resolve([true, nestedPromise]);
-
- var pair = callbackPair(null, assertIsStubError);
- return promise.fullyResolved(aPromise)
- .then(assert.fail, assertIsStubError);
- });
-
- it('rejectsOnFirstArrayRejection', function() {
- var e1 = new Error('foo');
- var e2 = new Error('bar');
- var aPromise = Promise.resolve([
- createRejectedPromise(e1),
- createRejectedPromise(e2)
- ]);
-
- return promise.fullyResolved(aPromise)
- .then(assert.fail, function(error) {
- assert.strictEqual(e1, error);
- });
- });
-
- it('rejectsIfNestedArrayPromiseRejects', function() {
- var aPromise = Promise.resolve([
- Promise.resolve([
- createRejectedPromise(new StubError)
- ])
- ]);
-
- return promise.fullyResolved(aPromise)
- .then(assert.fail, assertIsStubError);
- });
-
- it('simpleHash', function() {
- var hash = {'a': 123};
- return promise.fullyResolved(hash)
- .then(function(resolved) {
- assert.strictEqual(hash, resolved);
- assert.deepEqual(hash, {'a': 123});
- });
- });
-
- it('nestedHash', function() {
- var nestedHash = {'foo':'bar'};
- var hash = {'a': 123, 'b': nestedHash};
-
- return promise.fullyResolved(hash)
- .then(function(resolved) {
- assert.strictEqual(hash, resolved);
- assert.deepEqual({'a': 123, 'b': {'foo': 'bar'}}, resolved);
- assert.strictEqual(nestedHash, resolved['b']);
- });
- });
-
- it('promiseResolvesToSimpleHash', function() {
- var hash = {'a': 123};
- var aPromise = Promise.resolve(hash);
-
- return promise.fullyResolved(aPromise)
- .then((resolved) => assert.strictEqual(hash, resolved));
- });
-
- it('promiseResolvesToNestedHash', function() {
- var nestedHash = {'foo':'bar'};
- var hash = {'a': 123, 'b': nestedHash};
- var aPromise = Promise.resolve(hash);
-
- return promise.fullyResolved(aPromise)
- .then(function(resolved) {
- assert.strictEqual(hash, resolved);
- assert.strictEqual(nestedHash, resolved['b']);
- assert.deepEqual(hash, {'a': 123, 'b': {'foo': 'bar'}});
- });
- });
-
- it('promiseResolvesToHashWithPromises', function() {
- var aPromise = Promise.resolve({
- 'a': Promise.resolve(123)
- });
-
- return promise.fullyResolved(aPromise)
- .then(function(resolved) {
- assert.deepEqual({'a': 123}, resolved);
- });
- });
-
- it('rejectsIfHashPromiseRejects', function() {
- var aPromise = Promise.resolve({
- 'a': createRejectedPromise(new StubError)
- });
-
- return promise.fullyResolved(aPromise)
- .then(assert.fail, assertIsStubError);
- });
-
- it('rejectsIfNestedHashPromiseRejects', function() {
- var aPromise = Promise.resolve({
- 'a': {'b': createRejectedPromise(new StubError)}
- });
-
- return promise.fullyResolved(aPromise)
- .then(assert.fail, assertIsStubError);
- });
-
- it('instantiatedObject', function() {
- function Foo() {
- this.bar = 'baz';
- }
- var foo = new Foo;
-
- return promise.fullyResolved(foo).then(function(resolvedFoo) {
- assert.equal(foo, resolvedFoo);
- assert.ok(resolvedFoo instanceof Foo);
- assert.deepEqual(new Foo, resolvedFoo);
- });
- });
-
- it('withEmptyArray', function() {
- return promise.fullyResolved([]).then(function(resolved) {
- assert.deepEqual([], resolved);
- });
- });
-
- it('withEmptyHash', function() {
- return promise.fullyResolved({}).then(function(resolved) {
- assert.deepEqual({}, resolved);
- });
- });
-
- it('arrayWithPromisedHash', function() {
- var obj = {'foo': 'bar'};
- var array = [Promise.resolve(obj)];
-
- return promise.fullyResolved(array).then(function(resolved) {
- assert.deepEqual(resolved, [obj]);
- });
- });
- });
-
- describe('checkedNodeCall', function() {
- it('functionThrows', function() {
- return promise.checkedNodeCall(throwStubError)
- .then(assert.fail, assertIsStubError);
- });
-
- it('functionReturnsAnError', function() {
- return promise.checkedNodeCall(function(callback) {
- callback(new StubError);
- }).then(assert.fail, assertIsStubError);
- });
-
- it('functionReturnsSuccess', function() {
- var success = 'success!';
- return promise.checkedNodeCall(function(callback) {
- callback(null, success);
- }).then((value) => assert.equal(success, value));
- });
-
- it('functionReturnsAndThrows', function() {
- var error = new Error('boom');
- var error2 = new Error('boom again');
- return promise.checkedNodeCall(function(callback) {
- callback(error);
- throw error2;
- }).then(assert.fail, (e) => assert.equal(error, e));
- });
-
- it('functionThrowsAndReturns', function() {
- var error = new Error('boom');
- var error2 = new Error('boom again');
- return promise.checkedNodeCall(function(callback) {
- setTimeout(() => callback(error), 10);
- throw error2;
- }).then(assert.fail, (e) => assert.equal(error2, e));
- });
- });
-
- describe('all', function() {
- it('(base case)', function() {
- let deferredObjs = [defer(), defer()];
- var a = [
- 0, 1,
- deferredObjs[0].promise,
- deferredObjs[1].promise,
- 4, 5, 6
- ];
- delete a[5];
-
- var pair = callbackPair(function(value) {
- assert.deepEqual([0, 1, 2, 3, 4, undefined, 6], value);
- });
-
- var result = promise.all(a).then(pair.callback, pair.errback);
- pair.assertNeither();
-
- deferredObjs[0].resolve(2);
- pair.assertNeither();
-
- deferredObjs[1].resolve(3);
- return result.then(() => pair.assertCallback());
- });
-
- it('empty array', function() {
- return promise.all([]).then((a) => assert.deepEqual([], a));
- });
-
- it('usesFirstRejection', function() {
- let deferredObjs = [defer(), defer()];
- let a = [deferredObjs[0].promise, deferredObjs[1].promise];
-
- var result = promise.all(a).then(assert.fail, assertIsStubError);
- deferredObjs[1].reject(new StubError);
- setTimeout(() => deferredObjs[0].reject(Error('ignored')), 0);
- return result;
- });
- });
-
- describe('map', function() {
- it('(base case)', function() {
- var a = [1, 2, 3];
- return promise.map(a, function(value, index, a2) {
- assert.equal(a, a2);
- assert.equal('number', typeof index, 'not a number');
- return value + 1;
- }).then(function(value) {
- assert.deepEqual([2, 3, 4], value);
- });
- });
-
- it('omitsDeleted', function() {
- var a = [0, 1, 2, 3, 4, 5, 6];
- delete a[1];
- delete a[3];
- delete a[4];
- delete a[6];
-
- var expected = [0, 1, 4, 9, 16, 25, 36];
- delete expected[1];
- delete expected[3];
- delete expected[4];
- delete expected[6];
-
- return promise.map(a, function(value) {
- return value * value;
- }).then(function(value) {
- assert.deepEqual(expected, value);
- });
- });
-
- it('emptyArray', function() {
- return promise.map([], function(value) {
- return value + 1;
- }).then(function(value) {
- assert.deepEqual([], value);
- });
- });
-
- it('inputIsPromise', function() {
- var input = defer();
- var result = promise.map(input.promise, function(value) {
- return value + 1;
- });
-
- var pair = callbackPair(function(value) {
- assert.deepEqual([2, 3, 4], value);
- });
- result = result.then(pair.callback, pair.errback);
-
- setTimeout(function() {
- pair.assertNeither();
- input.resolve([1, 2, 3]);
- }, 10);
-
- return result;
- });
-
- it('waitsForFunctionResultToResolve', function() {
- var innerResults = [
- defer(),
- defer()
- ];
-
- var result = promise.map([1, 2], function(value, index) {
- return innerResults[index].promise;
- });
-
- var pair = callbackPair(function(value) {
- assert.deepEqual(['a', 'b'], value);
- });
- result = result.then(pair.callback, pair.errback);
-
- return NativePromise.resolve()
- .then(function() {
- pair.assertNeither();
- innerResults[0].resolve('a');
- })
- .then(function() {
- pair.assertNeither();
- innerResults[1].resolve('b');
- return result;
- })
- .then(pair.assertCallback);
- });
-
- it('rejectsPromiseIfFunctionThrows', function() {
- return promise.map([1], throwStubError)
- .then(assert.fail, assertIsStubError);
- });
-
- it('rejectsPromiseIfFunctionReturnsRejectedPromise', function() {
- return promise.map([1], function() {
- return createRejectedPromise(new StubError);
- }).then(assert.fail, assertIsStubError);
- });
-
- it('stopsCallingFunctionIfPreviousIterationFailed', function() {
- var count = 0;
- return promise.map([1, 2, 3, 4], function() {
- count++;
- if (count == 3) {
- throw new StubError;
- }
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.equal(3, count);
- });
- });
-
- it('rejectsWithFirstRejectedPromise', function() {
- var innerResult = [
- Promise.resolve(),
- createRejectedPromise(new StubError),
- createRejectedPromise(Error('should be ignored'))
- ];
- var count = 0;
- return promise.map([1, 2, 3, 4], function(value, index) {
- count += 1;
- return innerResult[index];
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.equal(2, count);
- });
- });
-
- it('preservesOrderWhenMapReturnsPromise', function() {
- var deferreds = [
- defer(),
- defer(),
- defer(),
- defer()
- ];
- var result = promise.map(deferreds, function(value) {
- return value.promise;
- });
-
- var pair = callbackPair(function(value) {
- assert.deepEqual([0, 1, 2, 3], value);
- });
- result = result.then(pair.callback, pair.errback);
-
- return Promise.resolve()
- .then(function() {
- pair.assertNeither();
- for (let i = deferreds.length; i > 0; i -= 1) {
- deferreds[i - 1].resolve(i - 1);
- }
- return result;
- }).then(pair.assertCallback);
- });
- });
-
- describe('filter', function() {
- it('basicFiltering', function() {
- var a = [0, 1, 2, 3];
- return promise.filter(a, function(val, index, a2) {
- assert.equal(a, a2);
- assert.equal('number', typeof index, 'not a number');
- return val > 1;
- }).then(function(val) {
- assert.deepEqual([2, 3], val);
- });
- });
-
- it('omitsDeleted', function() {
- var a = [0, 1, 2, 3, 4, 5, 6];
- delete a[3];
- delete a[4];
-
- return promise.filter(a, function(value) {
- return value > 1 && value < 6;
- }).then(function(val) {
- assert.deepEqual([2, 5], val);
- });
- });
-
- it('preservesInputs', function() {
- var a = [0, 1, 2, 3];
-
- return promise.filter(a, function(value, i, a2) {
- assert.equal(a, a2);
- // Even if a function modifies the input array, the original value
- // should be inserted into the new array.
- a2[i] = a2[i] - 1;
- return a2[i] >= 1;
- }).then(function(val) {
- assert.deepEqual([2, 3], val);
- });
- });
-
- it('inputIsPromise', function() {
- var input = defer();
- var result = promise.filter(input.promise, function(value) {
- return value > 1 && value < 3;
- });
-
- var pair = callbackPair(function(value) {
- assert.deepEqual([2], value);
- });
- result = result.then(pair.callback, pair.errback);
- return NativePromise.resolve()
- .then(function() {
- pair.assertNeither();
- input.resolve([1, 2, 3]);
- return result;
- })
- .then(pair.assertCallback);
- });
-
- it('waitsForFunctionResultToResolve', function() {
- var innerResults = [
- defer(),
- defer()
- ];
-
- var result = promise.filter([1, 2], function(value, index) {
- return innerResults[index].promise;
- });
-
- var pair = callbackPair(function(value) {
- assert.deepEqual([2], value);
- });
- result = result.then(pair.callback, pair.errback);
- return NativePromise.resolve()
- .then(function() {
- pair.assertNeither();
- innerResults[0].resolve(false);
- })
- .then(function() {
- pair.assertNeither();
- innerResults[1].resolve(true);
- return result;
- })
- .then(pair.assertCallback);
- });
-
- it('rejectsPromiseIfFunctionReturnsRejectedPromise', function() {
- return promise.filter([1], function() {
- return createRejectedPromise(new StubError);
- }).then(assert.fail, assertIsStubError);
- });
-
- it('stopsCallingFunctionIfPreviousIterationFailed', function() {
- var count = 0;
- return promise.filter([1, 2, 3, 4], function() {
- count++;
- if (count == 3) {
- throw new StubError;
- }
- }).then(assert.fail, function(e) {
- assertIsStubError(e);
- assert.equal(3, count);
- });
- });
-
- it('rejectsWithFirstRejectedPromise', function() {
- var innerResult = [
- Promise.resolve(),
- createRejectedPromise(new StubError),
- createRejectedPromise(Error('should be ignored'))
- ];
-
- return promise.filter([1, 2, 3, 4], function(value, index) {
- assert.ok(index < innerResult.length);
- return innerResult[index];
- }).then(assert.fail, assertIsStubError);
- });
-
- it('preservesOrderWhenFilterReturnsPromise', function() {
- var deferreds = [
- defer(),
- defer(),
- defer(),
- defer()
- ];
- var result = promise.filter([0, 1, 2, 3], function(value, index) {
- return deferreds[index].promise;
- });
-
- var pair = callbackPair(function(value) {
- assert.deepEqual([1, 2], value);
- });
- result = result.then(pair.callback, pair.errback);
-
- return NativePromise.resolve()
- .then(function() {
- pair.assertNeither();
- for (let i = deferreds.length - 1; i >= 0; i -= 1) {
- deferreds[i].resolve(i > 0 && i < 3);
- }
- return result;
- }).then(pair.assertCallback);
- });
- });
- });
-
- enablePromiseManager(() => {
- it('firesUncaughtExceptionEventIfRejectionNeverHandled', function() {
- promise.rejected(new StubError);
- var handler = callbackHelper(assertIsStubError);
-
- // so tearDown() doesn't throw
- app.removeAllListeners();
- app.on(promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION, handler);
-
- return NativePromise.resolve()
- // Macro yield so the uncaught exception has a chance to trigger.
- .then(() => new NativePromise(resolve => setTimeout(resolve, 0)))
- .then(handler.assertCalled);
- });
-
- it('cannotResolveADeferredWithItself', function() {
- var deferred = new promise.Deferred();
- assert.throws(() => deferred.fulfill(deferred));
- assert.throws(() => deferred.reject(deferred));
- });
-
- describe('testLongStackTraces', function() {
- beforeEach(() => promise.LONG_STACK_TRACES = false);
- afterEach(() => promise.LONG_STACK_TRACES = false);
-
- it('doesNotAppendStackIfFeatureDisabled', function() {
- promise.LONG_STACK_TRACES = false;
-
- var error = Error('hello');
- var originalStack = error.stack;
- return promise.rejected(error).
- then(fail).
- then(fail).
- then(fail).
- then(fail, function(e) {
- assert.equal(error, e);
- assert.equal(originalStack, e.stack);
- });
- });
-
- function getStackMessages(error) {
- return error.stack.split(/\n/).filter(function(line) {
- return /^From: /.test(line);
- });
- }
-
- it('appendsInitialPromiseCreation_resolverThrows', function() {
- promise.LONG_STACK_TRACES = true;
-
- var error = Error('hello');
- var originalStack = '(placeholder; will be overwritten later)';
-
- return new promise.Promise(function() {
- try {
- throw error;
- } catch (e) {
- originalStack = e.stack;
- throw e;
- }
- }).then(fail, function(e) {
- assert.strictEqual(error, e);
- if (typeof originalStack !== 'string') {
- return;
- }
- assert.notEqual(originalStack, e.stack);
- assert.equal(e.stack.indexOf(originalStack), 0,
- 'should start with original stack');
- assert.deepEqual(['From: ManagedPromise: new'], getStackMessages(e));
- });
- });
-
- it('appendsInitialPromiseCreation_rejectCalled', function() {
- promise.LONG_STACK_TRACES = true;
-
- var error = Error('hello');
- var originalStack = error.stack;
-
- return new promise.Promise(function(_, reject) {
- reject(error);
- }).then(fail, function(e) {
- assert.equal(error, e);
- if (typeof originalStack !== 'string') {
- return;
- }
- assert.notEqual(originalStack, e.stack);
- assert.equal(e.stack.indexOf(originalStack), 0,
- 'should start with original stack');
- assert.deepEqual(['From: ManagedPromise: new'], getStackMessages(e));
- });
- });
-
- it('appendsEachStepToRejectionError', function() {
- promise.LONG_STACK_TRACES = true;
-
- var error = Error('hello');
- var originalStack = '(placeholder; will be overwritten later)';
-
- return new promise.Promise(function() {
- try {
- throw error;
- } catch (e) {
- originalStack = e.stack;
- throw e;
- }
- }).
- then(fail).
- catch(function(e) { throw e; }).
- then(fail).
- catch(function(e) { throw e; }).
- then(fail, function(e) {
- assert.equal(error, e);
- if (typeof originalStack !== 'string') {
- return;
- }
- assert.notEqual(originalStack, e.stack);
- assert.equal(e.stack.indexOf(originalStack), 0,
- 'should start with original stack');
- assert.deepEqual([
- 'From: ManagedPromise: new',
- 'From: Promise: then',
- 'From: Promise: catch',
- 'From: Promise: then',
- 'From: Promise: catch',
- ], getStackMessages(e));
- });
- });
-
- it('errorOccursInCallbackChain', function() {
- promise.LONG_STACK_TRACES = true;
-
- var error = Error('hello');
- var originalStack = '(placeholder; will be overwritten later)';
-
- return promise.fulfilled().
- then(function() {}).
- then(function() {}).
- then(function() {
- try {
- throw error;
- } catch (e) {
- originalStack = e.stack;
- throw e;
- }
- }).
- catch(function(e) { throw e; }).
- then(fail, function(e) {
- assert.equal(error, e);
- if (typeof originalStack !== 'string') {
- return;
- }
- assert.notEqual(originalStack, e.stack);
- assert.equal(e.stack.indexOf(originalStack), 0,
- 'should start with original stack');
- assert.deepEqual([
- 'From: Promise: then',
- 'From: Promise: catch',
- ], getStackMessages(e));
- });
- });
- });
- });
-
- it('testAddThenableImplementation', function() {
- function tmp() {}
- assert.ok(!promise.Thenable.isImplementation(new tmp()));
- promise.Thenable.addImplementation(tmp);
- assert.ok(promise.Thenable.isImplementation(new tmp()));
-
- class tmpClass {}
- assert.ok(!promise.Thenable.isImplementation(new tmpClass()));
- promise.Thenable.addImplementation(tmpClass);
- assert.ok(promise.Thenable.isImplementation(new tmpClass()));
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/testutil.js b/node_modules/selenium-webdriver/test/lib/testutil.js
deleted file mode 100644
index e68ca28ba..000000000
--- a/node_modules/selenium-webdriver/test/lib/testutil.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const sinon = require('sinon');
-
-
-class StubError extends Error {
- constructor(opt_msg) {
- super(opt_msg);
- this.name = this.constructor.name;
- }
-}
-exports.StubError = StubError;
-
-exports.throwStubError = function() {
- throw new StubError;
-};
-
-exports.assertIsStubError = function(value) {
- assert.ok(value instanceof StubError, value + ' is not a ' + StubError.name);
-};
-
-exports.assertIsInstance = function(ctor, value) {
- assert.ok(value instanceof ctor, 'Not a ' + ctor.name + ': ' + value);
-};
-
-function callbackPair(cb, eb) {
- if (cb && eb) {
- throw new TypeError('can only specify one of callback or errback');
- }
-
- let callback = cb ? sinon.spy(cb) : sinon.spy();
- let errback = eb ? sinon.spy(eb) : sinon.spy();
-
- function assertCallback() {
- assert.ok(callback.called, 'callback not called');
- assert.ok(!errback.called, 'errback called');
- if (callback.threw()) {
- throw callback.exceptions[0];
- }
- }
-
- function assertErrback() {
- assert.ok(!callback.called, 'callback called');
- assert.ok(errback.called, 'errback not called');
- if (errback.threw()) {
- throw errback.exceptions[0];
- }
- }
-
- function assertNeither() {
- assert.ok(!callback.called, 'callback called');
- assert.ok(!errback.called, 'errback called');
- }
-
- return {
- callback,
- errback,
- assertCallback,
- assertErrback,
- assertNeither
- };
-}
-exports.callbackPair = callbackPair;
-
-
-exports.callbackHelper = function(cb) {
- let pair = callbackPair(cb);
- let wrapped = pair.callback.bind(null);
- wrapped.assertCalled = () => pair.assertCallback();
- wrapped.assertNotCalled = () => pair.assertNeither();
- return wrapped;
-};
diff --git a/node_modules/selenium-webdriver/test/lib/until_test.js b/node_modules/selenium-webdriver/test/lib/until_test.js
deleted file mode 100644
index 3226a467a..000000000
--- a/node_modules/selenium-webdriver/test/lib/until_test.js
+++ /dev/null
@@ -1,478 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-
-const By = require('../../lib/by').By;
-const CommandName = require('../../lib/command').Name;
-const error = require('../../lib/error');
-const promise = require('../../lib/promise');
-const until = require('../../lib/until');
-const webdriver = require('../../lib/webdriver'),
- WebElement = webdriver.WebElement;
-
-describe('until', function() {
- let driver, executor;
-
- class TestExecutor {
- constructor() {
- this.handlers_ = {};
- }
-
- on(cmd, handler) {
- this.handlers_[cmd] = handler;
- return this;
- }
-
- execute(cmd) {
- let self = this;
- return Promise.resolve().then(function() {
- if (!self.handlers_[cmd.getName()]) {
- throw new error.UnknownCommandError(cmd.getName());
- }
- return self.handlers_[cmd.getName()](cmd);
- });
- }
- }
-
- function fail(opt_msg) {
- throw new assert.AssertionError({message: opt_msg});
- }
-
- beforeEach(function setUp() {
- executor = new TestExecutor();
- driver = new webdriver.WebDriver('session-id', executor);
- });
-
- describe('ableToSwitchToFrame', function() {
- it('failsFastForNonSwitchErrors', function() {
- let e = Error('boom');
- executor.on(CommandName.SWITCH_TO_FRAME, function() {
- throw e;
- });
- return driver.wait(until.ableToSwitchToFrame(0), 100)
- .then(fail, (e2) => assert.strictEqual(e2, e));
- });
-
- const ELEMENT_ID = 'some-element-id';
- const ELEMENT_INDEX = 1234;
-
- function onSwitchFrame(expectedId) {
- if (typeof expectedId === 'string') {
- expectedId = WebElement.buildId(expectedId);
- } else {
- assert.equal(typeof expectedId, 'number', 'must be string or number');
- }
- return cmd => {
- assert.deepEqual(
- cmd.getParameter('id'), expectedId, 'frame ID not specified');
- return true;
- };
- }
-
- it('byIndex', function() {
- executor.on(CommandName.SWITCH_TO_FRAME, onSwitchFrame(ELEMENT_INDEX));
- return driver.wait(until.ableToSwitchToFrame(ELEMENT_INDEX), 100);
- });
-
- it('byWebElement', function() {
- executor.on(CommandName.SWITCH_TO_FRAME, onSwitchFrame(ELEMENT_ID));
-
- var el = new webdriver.WebElement(driver, ELEMENT_ID);
- return driver.wait(until.ableToSwitchToFrame(el), 100);
- });
-
- it('byWebElementPromise', function() {
- executor.on(CommandName.SWITCH_TO_FRAME, onSwitchFrame(ELEMENT_ID));
- var el = new webdriver.WebElementPromise(driver,
- Promise.resolve(new webdriver.WebElement(driver, ELEMENT_ID)));
- return driver.wait(until.ableToSwitchToFrame(el), 100);
- });
-
- it('byLocator', function() {
- executor.on(CommandName.FIND_ELEMENTS, () => [WebElement.buildId(ELEMENT_ID)]);
- executor.on(CommandName.SWITCH_TO_FRAME, onSwitchFrame(ELEMENT_ID));
- return driver.wait(until.ableToSwitchToFrame(By.id('foo')), 100);
- });
-
- it('byLocator_elementNotInitiallyFound', function() {
- let foundResponses = [[], [], [WebElement.buildId(ELEMENT_ID)]];
- executor.on(CommandName.FIND_ELEMENTS, () => foundResponses.shift());
- executor.on(CommandName.SWITCH_TO_FRAME, onSwitchFrame(ELEMENT_ID));
-
- return driver.wait(until.ableToSwitchToFrame(By.id('foo')), 2000)
- .then(() => assert.deepEqual(foundResponses, []));
- });
-
- it('timesOutIfNeverAbletoSwitchFrames', function() {
- var count = 0;
- executor.on(CommandName.SWITCH_TO_FRAME, function() {
- count += 1;
- throw new error.NoSuchFrameError;
- });
-
- return driver.wait(until.ableToSwitchToFrame(0), 100)
- .then(fail, function(e) {
- assert.ok(count > 0);
- assert.ok(
- e.message.startsWith('Waiting to be able to switch to frame'),
- 'Wrong message: ' + e.message);
- });
- });
- });
-
- describe('alertIsPresent', function() {
- it('failsFastForNonAlertSwitchErrors', function() {
- return driver.wait(until.alertIsPresent(), 100).then(fail, function(e) {
- assert.ok(e instanceof error.UnknownCommandError);
- assert.equal(e.message, CommandName.GET_ALERT_TEXT);
- });
- });
-
- it('waitsForAlert', function() {
- var count = 0;
- executor.on(CommandName.GET_ALERT_TEXT, function() {
- if (count++ < 3) {
- throw new error.NoSuchAlertError;
- } else {
- return true;
- }
- }).on(CommandName.DISMISS_ALERT, () => true);
-
- return driver.wait(until.alertIsPresent(), 1000).then(function(alert) {
- assert.equal(count, 4);
- return alert.dismiss();
- });
- });
-
- // TODO: Remove once GeckoDriver doesn't throw this unwanted error.
- // See https://github.com/SeleniumHQ/selenium/pull/2137
- describe('workaround for GeckoDriver', function() {
- it('doesNotFailWhenCannotConvertNullToObject', function() {
- var count = 0;
- executor.on(CommandName.GET_ALERT_TEXT, function() {
- if (count++ < 3) {
- throw new error.WebDriverError(`can't convert null to object`);
- } else {
- return true;
- }
- }).on(CommandName.DISMISS_ALERT, () => true);
-
- return driver.wait(until.alertIsPresent(), 1000).then(function(alert) {
- assert.equal(count, 4);
- return alert.dismiss();
- });
- });
-
- it('keepsRaisingRegularWebdriverError', function() {
- var webDriverError = new error.WebDriverError;
-
- executor.on(CommandName.GET_ALERT_TEXT, function() {
- throw webDriverError;
- });
-
- return driver.wait(until.alertIsPresent(), 1000).then(function() {
- throw new Error('driver did not fail against WebDriverError');
- }, function(error) {
- assert.equal(error, webDriverError);
- });
- })
- });
- });
-
- it('testUntilTitleIs', function() {
- var titles = ['foo', 'bar', 'baz'];
- executor.on(CommandName.GET_TITLE, () => titles.shift());
-
- return driver.wait(until.titleIs('bar'), 3000).then(function() {
- assert.deepStrictEqual(titles, ['baz']);
- });
- });
-
- it('testUntilTitleContains', function() {
- var titles = ['foo', 'froogle', 'google'];
- executor.on(CommandName.GET_TITLE, () => titles.shift());
-
- return driver.wait(until.titleContains('oogle'), 3000).then(function() {
- assert.deepStrictEqual(titles, ['google']);
- });
- });
-
- it('testUntilTitleMatches', function() {
- var titles = ['foo', 'froogle', 'aaaabc', 'aabbbc', 'google'];
- executor.on(CommandName.GET_TITLE, () => titles.shift());
-
- return driver.wait(until.titleMatches(/^a{2,3}b+c$/), 3000)
- .then(function() {
- assert.deepStrictEqual(titles, ['google']);
- });
- });
-
- it('testUntilUrlIs', function() {
- var urls = ['http://www.foo.com', 'https://boo.com', 'http://docs.yes.com'];
- executor.on(CommandName.GET_CURRENT_URL, () => urls.shift());
-
- return driver.wait(until.urlIs('https://boo.com'), 3000).then(function() {
- assert.deepStrictEqual(urls, ['http://docs.yes.com']);
- });
- });
-
- it('testUntilUrlContains', function() {
- var urls =
- ['http://foo.com', 'https://groups.froogle.com', 'http://google.com'];
- executor.on(CommandName.GET_CURRENT_URL, () => urls.shift());
-
- return driver.wait(until.urlContains('oogle.com'), 3000).then(function() {
- assert.deepStrictEqual(urls, ['http://google.com']);
- });
- });
-
- it('testUntilUrlMatches', function() {
- var urls = ['foo', 'froogle', 'aaaabc', 'aabbbc', 'google'];
- executor.on(CommandName.GET_CURRENT_URL, () => urls.shift());
-
- return driver.wait(until.urlMatches(/^a{2,3}b+c$/), 3000)
- .then(function() {
- assert.deepStrictEqual(urls, ['google']);
- });
- });
-
- it('testUntilElementLocated', function() {
- var responses = [
- [],
- [WebElement.buildId('abc123'), WebElement.buildId('foo')],
- ['end']
- ];
- executor.on(CommandName.FIND_ELEMENTS, () => responses.shift());
-
- let element = driver.wait(until.elementLocated(By.id('quux')), 2000);
- assert.ok(element instanceof webdriver.WebElementPromise);
- return element.getId().then(function(id) {
- assert.deepStrictEqual(responses, [['end']]);
- assert.equal(id, 'abc123');
- });
- });
-
- describe('untilElementLocated, elementNeverFound', function() {
- function runNoElementFoundTest(locator, locatorStr) {
- executor.on(CommandName.FIND_ELEMENTS, () => []);
-
- function expectedFailure() {
- fail('expected condition to timeout');
- }
-
- return driver.wait(until.elementLocated(locator), 100)
- .then(expectedFailure, function(error) {
- var expected = 'Waiting for element to be located ' + locatorStr;
- var lines = error.message.split(/\n/, 2);
- assert.equal(lines[0], expected);
-
- let regex = /^Wait timed out after \d+ms$/;
- assert.ok(regex.test(lines[1]),
- `Lines <${lines[1]}> does not match ${regex}`);
- });
- }
-
- it('byLocator', function() {
- return runNoElementFoundTest(
- By.id('quux'), 'By(css selector, *[id="quux"])');
- });
-
- it('byHash', function() {
- return runNoElementFoundTest(
- {id: 'quux'}, 'By(css selector, *[id="quux"])');
- });
-
- it('byFunction', function() {
- return runNoElementFoundTest(function() {}, 'by function()');
- });
- });
-
- it('testUntilElementsLocated', function() {
- var responses = [
- [],
- [WebElement.buildId('abc123'), WebElement.buildId('foo')],
- ['end']
- ];
- executor.on(CommandName.FIND_ELEMENTS, () => responses.shift());
-
- return driver.wait(until.elementsLocated(By.id('quux')), 2000)
- .then(function(els) {
- return Promise.all(els.map(e => e.getId()));
- }).then(function(ids) {
- assert.deepStrictEqual(responses, [['end']]);
- assert.equal(ids.length, 2);
- assert.equal(ids[0], 'abc123');
- assert.equal(ids[1], 'foo');
- });
- });
-
- describe('untilElementsLocated, noElementsFound', function() {
- function runNoElementsFoundTest(locator, locatorStr) {
- executor.on(CommandName.FIND_ELEMENTS, () => []);
-
- function expectedFailure() {
- fail('expected condition to timeout');
- }
-
- return driver.wait(until.elementsLocated(locator), 100)
- .then(expectedFailure, function(error) {
- var expected =
- 'Waiting for at least one element to be located ' + locatorStr;
- var lines = error.message.split(/\n/, 2);
- assert.equal(lines[0], expected);
-
- let regex = /^Wait timed out after \d+ms$/;
- assert.ok(regex.test(lines[1]),
- `Lines <${lines[1]}> does not match ${regex}`);
- });
- }
-
- it('byLocator', function() {
- return runNoElementsFoundTest(
- By.id('quux'), 'By(css selector, *[id="quux"])');
- });
-
- it('byHash', function() {
- return runNoElementsFoundTest(
- {id: 'quux'}, 'By(css selector, *[id="quux"])');
- });
-
- it('byFunction', function() {
- return runNoElementsFoundTest(function() {}, 'by function()');
- });
- });
-
- it('testUntilStalenessOf', function() {
- let count = 0;
- executor.on(CommandName.GET_ELEMENT_TAG_NAME, function() {
- while (count < 3) {
- count += 1;
- return 'body';
- }
- throw new error.StaleElementReferenceError('now stale');
- });
-
- var el = new webdriver.WebElement(driver, {ELEMENT: 'foo'});
- return driver.wait(until.stalenessOf(el), 2000)
- .then(() => assert.equal(count, 3));
- });
-
- describe('element state conditions', function() {
- function runElementStateTest(predicate, command, responses, var_args) {
- let original = new webdriver.WebElement(driver, 'foo');
- let predicateArgs = [original];
- if (arguments.length > 3) {
- predicateArgs = predicateArgs.concat(arguments[1]);
- command = arguments[2];
- responses = arguments[3];
- }
-
- assert.ok(responses.length > 1);
-
- responses = responses.concat(['end']);
- executor.on(command, () => responses.shift());
-
- let result = driver.wait(predicate.apply(null, predicateArgs), 2000);
- assert.ok(result instanceof webdriver.WebElementPromise);
- return result.then(function(value) {
- assert.ok(value instanceof webdriver.WebElement);
- assert.ok(!(value instanceof webdriver.WebElementPromise));
- return value.getId();
- }).then(function(id) {
- assert.equal('foo', id);
- assert.deepStrictEqual(responses, ['end']);
- });
- }
-
- it('elementIsVisible', function() {
- return runElementStateTest(
- until.elementIsVisible,
- CommandName.IS_ELEMENT_DISPLAYED, [false, false, true]);
- });
-
- it('elementIsNotVisible', function() {
- return runElementStateTest(
- until.elementIsNotVisible,
- CommandName.IS_ELEMENT_DISPLAYED, [true, true, false]);
- });
-
- it('elementIsEnabled', function() {
- return runElementStateTest(
- until.elementIsEnabled,
- CommandName.IS_ELEMENT_ENABLED, [false, false, true]);
- });
-
- it('elementIsDisabled', function() {
- return runElementStateTest(
- until.elementIsDisabled,
- CommandName.IS_ELEMENT_ENABLED, [true, true, false]);
- });
-
- it('elementIsSelected', function() {
- return runElementStateTest(
- until.elementIsSelected,
- CommandName.IS_ELEMENT_SELECTED, [false, false, true]);
- });
-
- it('elementIsNotSelected', function() {
- return runElementStateTest(
- until.elementIsNotSelected,
- CommandName.IS_ELEMENT_SELECTED, [true, true, false]);
- });
-
- it('elementTextIs', function() {
- return runElementStateTest(
- until.elementTextIs, 'foobar',
- CommandName.GET_ELEMENT_TEXT,
- ['foo', 'fooba', 'foobar']);
- });
-
- it('elementTextContains', function() {
- return runElementStateTest(
- until.elementTextContains, 'bar',
- CommandName.GET_ELEMENT_TEXT,
- ['foo', 'foobaz', 'foobarbaz']);
- });
-
- it('elementTextMatches', function() {
- return runElementStateTest(
- until.elementTextMatches, /fo+bar{3}/,
- CommandName.GET_ELEMENT_TEXT,
- ['foo', 'foobar', 'fooobarrr']);
- });
- });
-
- describe('WebElementCondition', function() {
- it('fails if wait completes with a non-WebElement value', function() {
- let result = driver.wait(
- new webdriver.WebElementCondition('testing', () => 123), 1000);
-
- return result.then(
- () => assert.fail('expected to fail'),
- function(e) {
- assert.ok(e instanceof TypeError);
- assert.equal(
- 'WebElementCondition did not resolve to a WebElement: '
- + '[object Number]',
- e.message);
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/lib/webdriver_test.js b/node_modules/selenium-webdriver/test/lib/webdriver_test.js
deleted file mode 100644
index 65fa5193a..000000000
--- a/node_modules/selenium-webdriver/test/lib/webdriver_test.js
+++ /dev/null
@@ -1,2309 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const testutil = require('./testutil');
-
-const By = require('../../lib/by').By;
-const Capabilities = require('../../lib/capabilities').Capabilities;
-const Executor = require('../../lib/command').Executor;
-const CName = require('../../lib/command').Name;
-const error = require('../../lib/error');
-const Button = require('../../lib/input').Button;
-const Key = require('../../lib/input').Key;
-const logging = require('../../lib/logging');
-const Session = require('../../lib/session').Session;
-const promise = require('../../lib/promise');
-const {enablePromiseManager, promiseManagerSuite} = require('../../lib/test/promise');
-const until = require('../../lib/until');
-const Alert = require('../../lib/webdriver').Alert;
-const AlertPromise = require('../../lib/webdriver').AlertPromise;
-const UnhandledAlertError = require('../../lib/webdriver').UnhandledAlertError;
-const WebDriver = require('../../lib/webdriver').WebDriver;
-const WebElement = require('../../lib/webdriver').WebElement;
-const WebElementPromise = require('../../lib/webdriver').WebElementPromise;
-
-const assert = require('assert');
-const sinon = require('sinon');
-
-const SESSION_ID = 'test_session_id';
-
-// Aliases for readability.
-const NativePromise = Promise;
-const StubError = testutil.StubError;
-const assertIsInstance = testutil.assertIsInstance;
-const assertIsStubError = testutil.assertIsStubError;
-const throwStubError = testutil.throwStubError;
-const fail = (msg) => assert.fail(msg);
-
-describe('WebDriver', function() {
- const LOG = logging.getLogger('webdriver.test');
-
- // before(function() {
- // logging.getLogger('webdriver').setLevel(logging.Level.ALL);
- // logging.installConsoleHandler();
- // });
-
- // after(function() {
- // logging.getLogger('webdriver').setLevel(null);
- // logging.removeConsoleHandler();
- // });
-
- var driver;
- var flow;
- var uncaughtExceptions;
-
- beforeEach(function setUp() {
- flow = promise.controlFlow();
- uncaughtExceptions = [];
- flow.on('uncaughtException', onUncaughtException);
- });
-
- afterEach(function tearDown() {
- if (!promise.USE_PROMISE_MANAGER) {
- return;
- }
- return waitForIdle(flow).then(function() {
- assert.deepEqual([], uncaughtExceptions);
- flow.reset();
- });
- });
-
- function onUncaughtException(e) {
- uncaughtExceptions.push(e);
- }
-
- function defer() {
- let d = {};
- let promise = new Promise((resolve, reject) => {
- Object.assign(d, {resolve, reject});
- });
- d.promise = promise;
- return d;
- }
-
- function waitForIdle(opt_flow) {
- if (!promise.USE_PROMISE_MANAGER) {
- return Promise.resolve();
- }
- var theFlow = opt_flow || flow;
- return new Promise(function(fulfill, reject) {
- if (theFlow.isIdle()) {
- fulfill();
- return;
- }
- theFlow.once('idle', fulfill);
- theFlow.once('uncaughtException', reject);
- });
- }
-
- function waitForAbort(opt_flow, opt_n) {
- var n = opt_n || 1;
- var theFlow = opt_flow || flow;
- theFlow.removeAllListeners(
- promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION);
- return new Promise(function(fulfill, reject) {
- theFlow.once('idle', function() {
- reject(Error('expected flow to report an unhandled error'));
- });
-
- var errors = [];
- theFlow.on('uncaughtException', onError);
- function onError(e) {
- errors.push(e);
- if (errors.length === n) {
- theFlow.removeListener('uncaughtException', onError);
- fulfill(n === 1 ? errors[0] : errors);
- }
- }
- });
- }
-
- function expectedError(ctor, message) {
- return function(e) {
- assertIsInstance(ctor, e);
- assert.equal(message, e.message);
- };
- }
-
- class Expectation {
- constructor(executor, name, opt_parameters) {
- this.executor_ = executor;
- this.name_ = name;
- this.times_ = 1;
- this.sessionId_ = SESSION_ID;
- this.check_ = null;
- this.toDo_ = null;
- this.withParameters(opt_parameters || {});
- }
-
- anyTimes() {
- this.times_ = Infinity;
- return this;
- }
-
- times(n) {
- this.times_ = n;
- return this;
- }
-
- withParameters(parameters) {
- this.parameters_ = parameters;
- if (this.name_ !== CName.NEW_SESSION) {
- this.parameters_['sessionId'] = this.sessionId_;
- }
- return this;
- }
-
- andReturn(code, opt_value) {
- this.toDo_ = function(command) {
- LOG.info('executing ' + command.getName() + '; returning ' + code);
- return Promise.resolve(opt_value !== void(0) ? opt_value : null);
- };
- return this;
- }
-
- andReturnSuccess(opt_value) {
- this.toDo_ = function(command) {
- LOG.info('executing ' + command.getName() + '; returning success');
- return Promise.resolve(opt_value !== void(0) ? opt_value : null);
- };
- return this;
- }
-
- andReturnError(error) {
- if (typeof error === 'number') {
- throw Error('need error type');
- }
- this.toDo_ = function(command) {
- LOG.info('executing ' + command.getName() + '; returning failure');
- return Promise.reject(error);
- };
- return this;
- }
-
- expect(name, opt_parameters) {
- this.end();
- return this.executor_.expect(name, opt_parameters);
- }
-
- end() {
- if (!this.toDo_) {
- this.andReturnSuccess(null);
- }
- return this.executor_;
- }
-
- execute(command) {
- assert.deepEqual(this.parameters_, command.getParameters());
- return this.toDo_(command);
- }
- }
-
- class FakeExecutor {
- constructor() {
- this.commands_ = new Map;
- }
-
- execute(command) {
- let expectations = this.commands_.get(command.getName());
- if (!expectations || !expectations.length) {
- assert.fail('unexpected command: ' + command.getName());
- return;
- }
-
- let next = expectations[0];
- let result = next.execute(command);
- if (next.times_ != Infinity) {
- next.times_ -= 1;
- if (!next.times_) {
- expectations.shift();
- }
- }
- return result;
- }
-
- expect(commandName, opt_parameters) {
- if (!this.commands_.has(commandName)) {
- this.commands_.set(commandName, []);
- }
- let e = new Expectation(this, commandName, opt_parameters);
- this.commands_.get(commandName).push(e);
- return e;
- }
-
- createDriver(opt_session) {
- let session = opt_session || new Session(SESSION_ID, {});
- return new WebDriver(session, this);
- }
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- //
- // Tests
- //
- /////////////////////////////////////////////////////////////////////////////
-
-
- describe('testAttachToSession', function() {
- it('sessionIsAvailable', function() {
- let aSession = new Session(SESSION_ID, {'browserName': 'firefox'});
- let executor = new FakeExecutor().
- expect(CName.DESCRIBE_SESSION).
- withParameters({'sessionId': SESSION_ID}).
- andReturnSuccess(aSession).
- end();
-
- let driver = WebDriver.attachToSession(executor, SESSION_ID);
- return driver.getSession().then(v => assert.strictEqual(v, aSession));
- });
-
- it('failsToGetSessionInfo', function() {
- let e = new Error('boom');
- let executor = new FakeExecutor().
- expect(CName.DESCRIBE_SESSION).
- withParameters({'sessionId': SESSION_ID}).
- andReturnError(e).
- end();
-
- let driver = WebDriver.attachToSession(executor, SESSION_ID);
- return driver.getSession()
- .then(() => assert.fail('should have failed!'),
- (actual) => assert.strictEqual(actual, e));
- });
-
- it('remote end does not recognize DESCRIBE_SESSION command', function() {
- let e = new error.UnknownCommandError;
- let executor = new FakeExecutor().
- expect(CName.DESCRIBE_SESSION).
- withParameters({'sessionId': SESSION_ID}).
- andReturnError(e).
- end();
-
- let driver = WebDriver.attachToSession(executor, SESSION_ID);
- return driver.getSession().then(session => {
- assert.ok(session instanceof Session);
- assert.strictEqual(session.getId(), SESSION_ID);
- assert.equal(session.getCapabilities().size, 0);
- });
- });
-
- it('usesActiveFlowByDefault', function() {
- let executor = new FakeExecutor().
- expect(CName.DESCRIBE_SESSION).
- withParameters({'sessionId': SESSION_ID}).
- andReturnSuccess({}).
- end();
-
- var driver = WebDriver.attachToSession(executor, SESSION_ID);
- assert.equal(driver.controlFlow(), promise.controlFlow());
-
- return waitForIdle(driver.controlFlow());
- });
-
- enablePromiseManager(() => {
- it('canAttachInCustomFlow', function() {
- let executor = new FakeExecutor().
- expect(CName.DESCRIBE_SESSION).
- withParameters({'sessionId': SESSION_ID}).
- andReturnSuccess({}).
- end();
-
- var otherFlow = new promise.ControlFlow();
- var driver = WebDriver.attachToSession(executor, SESSION_ID, otherFlow);
- assert.equal(otherFlow, driver.controlFlow());
- assert.notEqual(otherFlow, promise.controlFlow());
-
- return waitForIdle(otherFlow);
- });
- });
- });
-
- describe('testCreateSession', function() {
- it('happyPathWithCapabilitiesHashObject', function() {
- let aSession = new Session(SESSION_ID, {'browserName': 'firefox'});
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({
- 'desiredCapabilities': {'browserName': 'firefox'}
- }).
- andReturnSuccess(aSession).
- end();
-
- var driver = WebDriver.createSession(executor, {
- 'browserName': 'firefox'
- });
- return driver.getSession().then(v => assert.strictEqual(v, aSession));
- });
-
- it('happyPathWithCapabilitiesInstance', function() {
- let aSession = new Session(SESSION_ID, {'browserName': 'firefox'});
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({'desiredCapabilities': {'browserName': 'firefox'}}).
- andReturnSuccess(aSession).
- end();
-
- var driver = WebDriver.createSession(executor, Capabilities.firefox());
- return driver.getSession().then(v => assert.strictEqual(v, aSession));
- });
-
- it('handles desired and required capabilities', function() {
- let aSession = new Session(SESSION_ID, {'browserName': 'firefox'});
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({
- 'desiredCapabilities': {'foo': 'bar'},
- 'requiredCapabilities': {'bim': 'baz'}
- }).
- andReturnSuccess(aSession).
- end();
-
- let desired = new Capabilities().set('foo', 'bar');
- let required = new Capabilities().set('bim', 'baz');
- var driver = WebDriver.createSession(executor, {desired, required});
- return driver.getSession().then(v => assert.strictEqual(v, aSession));
- });
-
- it('failsToCreateSession', function() {
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({'desiredCapabilities': {'browserName': 'firefox'}}).
- andReturnError(new StubError()).
- end();
-
- var driver =
- WebDriver.createSession(executor, {'browserName': 'firefox'});
- return driver.getSession().then(fail, assertIsStubError);
- });
-
- it('invokes quit callback if it fails to create a session', function() {
- let called = false;
- let executor = new FakeExecutor()
- .expect(CName.NEW_SESSION)
- .withParameters({'desiredCapabilities': {'browserName': 'firefox'}})
- .andReturnError(new StubError())
- .end();
-
- var driver =
- WebDriver.createSession(executor, {'browserName': 'firefox'},
- null, null, () => called = true);
- return driver.getSession().then(fail, err => {
- assert.ok(called);
- assertIsStubError(err);
- });
- });
-
- it('usesActiveFlowByDefault', function() {
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({'desiredCapabilities': {}}).
- andReturnSuccess(new Session(SESSION_ID)).
- end();
-
- var driver = WebDriver.createSession(executor, {});
- assert.equal(promise.controlFlow(), driver.controlFlow());
-
- return waitForIdle(driver.controlFlow());
- });
-
- enablePromiseManager(() => {
- it('canCreateInCustomFlow', function() {
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({'desiredCapabilities': {}}).
- andReturnSuccess({}).
- end();
-
- var otherFlow = new promise.ControlFlow();
- var driver = WebDriver.createSession(executor, {}, otherFlow);
- assert.equal(otherFlow, driver.controlFlow());
- assert.notEqual(otherFlow, promise.controlFlow());
-
- return waitForIdle(otherFlow);
- });
-
- describe('creation failures bubble up in control flow', function() {
- function runTest(...args) {
- let executor = new FakeExecutor()
- .expect(CName.NEW_SESSION)
- .withParameters({'desiredCapabilities': {'browserName': 'firefox'}})
- .andReturnError(new StubError())
- .end();
-
- WebDriver.createSession(
- executor, {'browserName': 'firefox'}, ...args);
- return waitForAbort().then(assertIsStubError);
- }
-
- it('no onQuit callback', () => runTest());
- it('has onQuit callback', () => runTest(null, null, function() {}));
-
- it('onQuit callback failure suppress creation failure', function() {
- let e = new Error('hi!');
- let executor = new FakeExecutor()
- .expect(CName.NEW_SESSION)
- .withParameters({'desiredCapabilities': {'browserName': 'firefox'}})
- .andReturnError(new StubError())
- .end();
-
- WebDriver.createSession(
- executor, {'browserName': 'firefox'}, null, null,
- () => {throw e});
- return waitForAbort().then(err => assert.strictEqual(err, e));
- });
- });
- });
- });
-
- it('testDoesNotExecuteCommandIfSessionDoesNotResolve', function() {
- var session = Promise.reject(new StubError);
- return new FakeExecutor().createDriver(session)
- .getTitle()
- .then(_ => assert.fail('should have failed'), assertIsStubError);
- });
-
- it('testCommandReturnValuesArePassedToFirstCallback', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).andReturnSuccess('Google Search').
- end();
-
- var driver = executor.createDriver();
- return driver.getTitle()
- .then(title => assert.equal('Google Search', title));
- });
-
- it('testStopsCommandExecutionWhenAnErrorOccurs', function() {
- let e = new error.NoSuchWindowError('window not found');
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW).
- withParameters({
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(e).
- end();
-
- let driver = executor.createDriver();
- return driver.switchTo().window('foo')
- .then(
- _ => driver.getTitle(), // mock should blow if this gets executed
- v => assert.strictEqual(v, e));
- });
-
- it('testCanSuppressCommandFailures', function() {
- let e = new error.NoSuchWindowError('window not found');
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW).
- withParameters({
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(e).
- expect(CName.GET_TITLE).
- andReturnSuccess('Google Search').
- end();
-
- var driver = executor.createDriver();
- driver.switchTo().window('foo')
- .catch(v => assert.strictEqual(v, e));
- driver.getTitle();
- return waitForIdle();
- });
-
- it('testErrorsPropagateUpToTheRunningApplication', function() {
- let e = new error.NoSuchWindowError('window not found');
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW).
- withParameters({
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(e).
- end();
-
- return executor.createDriver()
- .switchTo().window('foo')
- .then(_ => assert.fail(), v => assert.strictEqual(v, e));
- });
-
- it('testErrbacksThatReturnErrorsStillSwitchToCallbackChain', function() {
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW).
- withParameters({
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(new error.NoSuchWindowError('window not found')).
- end();
-
- var driver = executor.createDriver();
- return driver.switchTo().window('foo').
- catch(function() { return new StubError; });
- then(assertIsStubError, () => assert.fail());
- });
-
- it('testErrbacksThrownCanOverrideOriginalError', function() {
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW, {
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(new error.NoSuchWindowError('window not found')).
- end();
-
- var driver = executor.createDriver();
- return driver.switchTo().window('foo')
- .catch(throwStubError)
- .then(assert.fail, assertIsStubError);
- });
-
- it('testReportsErrorWhenExecutingCommandsAfterExecutingAQuit', function() {
- let executor = new FakeExecutor().
- expect(CName.QUIT).
- end();
-
- let verifyError = expectedError(
- error.NoSuchSessionError,
- 'This driver instance does not have a valid session ID ' +
- '(did you call WebDriver.quit()?) and may no longer be used.');
-
- let driver = executor.createDriver();
- return driver.quit()
- .then(_ => driver.get('http://www.google.com'))
- .then(assert.fail, verifyError);
- });
-
- it('testCallbackCommandsExecuteBeforeNextCommand', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_CURRENT_URL).
- expect(CName.GET, {'url': 'http://www.google.com'}).
- expect(CName.CLOSE).
- expect(CName.GET_TITLE).
- end();
-
- var driver = executor.createDriver();
- driver.getCurrentUrl().then(function() {
- driver.get('http://www.google.com').then(function() {
- driver.close();
- });
- });
- driver.getTitle();
-
- return waitForIdle();
- });
-
- enablePromiseManager(() => {
- it('testEachCallbackFrameRunsToCompletionBeforeTheNext', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).
- expect(CName.GET_CURRENT_URL).
- expect(CName.GET_CURRENT_WINDOW_HANDLE).
- expect(CName.CLOSE).
- expect(CName.QUIT).
- end();
-
- var driver = executor.createDriver();
- driver.getTitle().
- // Everything in this callback...
- then(function() {
- driver.getCurrentUrl();
- driver.getWindowHandle();
- }).
- // ...should execute before everything in this callback.
- then(function() {
- driver.close();
- });
- // This should execute after everything above
- driver.quit();
-
- return waitForIdle();
- });
- });
-
- describe('returningAPromise', function() {
- it('fromACallback', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).
- expect(CName.GET_CURRENT_URL).
- andReturnSuccess('http://www.google.com').
- end();
-
- var driver = executor.createDriver();
- return driver.getTitle().
- then(function() {
- return driver.getCurrentUrl();
- }).
- then(function(value) {
- assert.equal('http://www.google.com', value);
- });
- });
-
- it('fromAnErrbackSuppressesTheError', function() {
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW, {
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(new StubError()).
- expect(CName.GET_CURRENT_URL).
- andReturnSuccess('http://www.google.com').
- end();
-
- var driver = executor.createDriver();
- return driver.switchTo().window('foo').
- catch(function(e) {
- assertIsStubError(e);
- return driver.getCurrentUrl();
- }).
- then(url => assert.equal('http://www.google.com', url));
- });
- });
-
- describe('customFunctions', function() {
- it('returnsANonPromiseValue', function() {
- var driver = new FakeExecutor().createDriver();
- return driver.call(() => 'abc123').then(function(value) {
- assert.equal('abc123', value);
- });
- });
-
- enablePromiseManager(() => {
- it('executionOrderWithCustomFunctions', function() {
- var msg = [];
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).andReturnSuccess('cheese ').
- expect(CName.GET_CURRENT_URL).andReturnSuccess('tasty').
- end();
-
- var driver = executor.createDriver();
-
- var pushMsg = msg.push.bind(msg);
- driver.getTitle().then(pushMsg);
- driver.call(() => 'is ').then(pushMsg);
- driver.getCurrentUrl().then(pushMsg);
- driver.call(() => '!').then(pushMsg);
-
- return waitForIdle().then(function() {
- assert.equal('cheese is tasty!', msg.join(''));
- });
- });
- });
-
- it('passingArgumentsToACustomFunction', function() {
- var add = function(a, b) {
- return a + b;
- };
- var driver = new FakeExecutor().createDriver();
- return driver.call(add, null, 1, 2).then(function(value) {
- assert.equal(3, value);
- });
- });
-
- it('passingPromisedArgumentsToACustomFunction', function() {
- var promisedArg = Promise.resolve(2);
- var add = function(a, b) {
- return a + b;
- };
- var driver = new FakeExecutor().createDriver();
- return driver.call(add, null, 1, promisedArg).then(function(value) {
- assert.equal(3, value);
- });
- });
-
- it('passingArgumentsAndScopeToACustomFunction', function() {
- function Foo(name) {
- this.name = name;
- }
- Foo.prototype.getName = function() {
- return this.name;
- };
- var foo = new Foo('foo');
-
- var driver = new FakeExecutor().createDriver();
- return driver.call(foo.getName, foo).then(function(value) {
- assert.equal('foo', value);
- });
- });
-
- it('customFunctionThrowsAnError', function() {
- var driver = new FakeExecutor().createDriver();
- return driver.call(throwStubError).then(fail, assertIsStubError);
- });
-
- it('customFunctionSchedulesCommands', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).
- expect(CName.CLOSE).
- expect(CName.QUIT).
- end();
-
- var driver = executor.createDriver();
- driver.call(function() {
- driver.getTitle();
- driver.close();
- });
- driver.quit();
- return waitForIdle();
- });
-
- it('returnsATaskResultAfterSchedulingAnother', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).
- andReturnSuccess('Google Search').
- expect(CName.CLOSE).
- end();
-
- var driver = executor.createDriver();
- return driver.call(function() {
- var title = driver.getTitle();
- driver.close();
- return title;
- }).then(function(title) {
- assert.equal('Google Search', title);
- });
- });
-
- it('hasANestedCommandThatFails', function() {
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW, {
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(new StubError()).
- end();
-
- var driver = executor.createDriver();
- return driver.call(function() {
- return driver.switchTo().window('foo');
- }).then(fail, assertIsStubError);
- });
-
- enablePromiseManager(() => {
- it('doesNotCompleteUntilReturnedPromiseIsResolved', function() {
- var order = [];
- var driver = new FakeExecutor().createDriver();
-
- var d = promise.defer();
- d.promise.then(function() {
- order.push('b');
- });
-
- driver.call(function() {
- order.push('a');
- return d.promise;
- });
- driver.call(function() {
- order.push('c');
- });
-
- // timeout to ensure the first function starts its execution before we
- // trigger d's callbacks.
- return new Promise(f => setTimeout(f, 0)).then(function() {
- assert.deepEqual(['a'], order);
- d.fulfill();
- return waitForIdle().then(function() {
- assert.deepEqual(['a', 'b', 'c'], order);
- });
- });
- });
- });
-
- it('returnsADeferredAction', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).andReturnSuccess('Google').
- end();
-
- var driver = executor.createDriver();
- driver.call(function() {
- return driver.getTitle();
- }).then(function(title) {
- assert.equal('Google', title);
- });
- return waitForIdle();
- });
- });
-
- describe('nestedCommands', function() {
- enablePromiseManager(() => {
- it('commandExecutionOrder', function() {
- var msg = [];
- var driver = new FakeExecutor().createDriver();
- driver.call(msg.push, msg, 'a');
- driver.call(function() {
- driver.call(msg.push, msg, 'c');
- driver.call(function() {
- driver.call(msg.push, msg, 'e');
- driver.call(msg.push, msg, 'f');
- });
- driver.call(msg.push, msg, 'd');
- });
- driver.call(msg.push, msg, 'b');
- return waitForIdle().then(function() {
- assert.equal('acefdb', msg.join(''));
- });
- });
-
- it('basicUsage', function() {
- var msg = [];
- var driver = new FakeExecutor().createDriver();
- var pushMsg = msg.push.bind(msg);
- driver.call(() => 'cheese ').then(pushMsg);
- driver.call(function() {
- driver.call(() => 'is ').then(pushMsg);
- driver.call(() => 'tasty').then(pushMsg);
- });
- driver.call(() => '!').then(pushMsg);
- return waitForIdle().then(function() {
- assert.equal('cheese is tasty!', msg.join(''));
- });
- });
-
- it('normalCommandAfterNestedCommandThatReturnsAnAction', function() {
- var msg = [];
- let executor = new FakeExecutor().
- expect(CName.CLOSE).
- end();
- var driver = executor.createDriver();
- driver.call(function() {
- return driver.call(function() {
- msg.push('a');
- return driver.call(() => 'foobar');
- });
- });
- driver.close().then(function() {
- msg.push('b');
- });
- return waitForIdle().then(function() {
- assert.equal('ab', msg.join(''));
- });
- });
- });
-
- it('canReturnValueFromNestedFunction', function() {
- var driver = new FakeExecutor().createDriver();
- return driver.call(function() {
- return driver.call(function() {
- return driver.call(() => 'foobar');
- });
- }).then(function(value) {
- assert.equal('foobar', value);
- });
- });
-
- it('errorsBubbleUp_caught', function() {
- var driver = new FakeExecutor().createDriver();
- var result = driver.call(function() {
- return driver.call(function() {
- return driver.call(throwStubError);
- });
- }).then(fail, assertIsStubError);
- return Promise.all([waitForIdle(), result]);
- });
-
- it('errorsBubbleUp_uncaught', function() {
- var driver = new FakeExecutor().createDriver();
- return driver.call(function() {
- return driver.call(function() {
- return driver.call(throwStubError);
- });
- })
- .then(_ => assert.fail('should have failed'), assertIsStubError);
- });
-
- it('canScheduleCommands', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_TITLE).
- expect(CName.CLOSE).
- end();
-
- var driver = executor.createDriver();
- driver.call(function() {
- driver.call(function() {
- driver.getTitle();
- });
- driver.close();
- });
- return waitForIdle();
- });
- });
-
- describe('WebElementPromise', function() {
- let driver = new FakeExecutor().createDriver();
-
- it('resolvesWhenUnderlyingElementDoes', function() {
- let el = new WebElement(driver, {'ELEMENT': 'foo'});
- return new WebElementPromise(driver, Promise.resolve(el))
- .then(e => assert.strictEqual(e, el));
- });
-
- it('resolvesBeforeCallbacksOnWireValueTrigger', function() {
- var el = defer();
-
- var element = new WebElementPromise(driver, el.promise);
- var messages = [];
-
- let steps = [
- element.then(_ => messages.push('element resolved')),
- element.getId().then(_ => messages.push('wire value resolved'))
- ];
-
- el.resolve(new WebElement(driver, {'ELEMENT': 'foo'}));
- return Promise.all(steps).then(function() {
- assert.deepEqual([
- 'element resolved',
- 'wire value resolved'
- ], messages);
- });
- });
-
- it('isRejectedIfUnderlyingIdIsRejected', function() {
- let element =
- new WebElementPromise(driver, Promise.reject(new StubError));
- return element.then(fail, assertIsStubError);
- });
- });
-
- describe('executeScript', function() {
- it('nullReturnValue', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return document.body;',
- 'args': []
- }).
- andReturnSuccess(null).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript('return document.body;')
- .then((result) => assert.equal(null, result));
- });
-
- it('primitiveReturnValue', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return document.body;',
- 'args': []
- }).
- andReturnSuccess(123).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript('return document.body;')
- .then((result) => assert.equal(123, result));
- });
-
- it('webElementReturnValue', function() {
- var json = WebElement.buildId('foo');
-
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return document.body;',
- 'args': []
- }).
- andReturnSuccess(json).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript('return document.body;')
- .then((element) => element.getId())
- .then((id) => assert.equal(id, 'foo'));
- });
-
- it('arrayReturnValue', function() {
- var json = [WebElement.buildId('foo')];
-
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return document.body;',
- 'args': []
- }).
- andReturnSuccess(json).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript('return document.body;')
- .then(function(array) {
- assert.equal(1, array.length);
- return array[0].getId();
- })
- .then((id) => assert.equal('foo', id));
- });
-
- it('objectReturnValue', function() {
- var json = {'foo': WebElement.buildId('foo')};
-
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return document.body;',
- 'args': []
- }).
- andReturnSuccess(json).
- end();
-
- var driver = executor.createDriver();
- var callback;
- return driver.executeScript('return document.body;')
- .then((obj) => obj['foo'].getId())
- .then((id) => assert.equal(id, 'foo'));
- });
-
- it('scriptAsFunction', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return (' + function() {} +
- ').apply(null, arguments);',
- 'args': []
- }).
- andReturnSuccess(null).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript(function() {});
- });
-
- it('simpleArgumentConversion', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return 1;',
- 'args': ['abc', 123, true, [123, {'foo': 'bar'}]]
- }).
- andReturnSuccess(null).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript(
- 'return 1;', 'abc', 123, true, [123, {'foo': 'bar'}]);
- });
-
- it('webElementArgumentConversion', function() {
- var elementJson = WebElement.buildId('fefifofum');
-
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return 1;',
- 'args': [elementJson]
- }).
- andReturnSuccess(null).
- end();
-
- var driver = executor.createDriver();
- return driver.executeScript('return 1;',
- new WebElement(driver, 'fefifofum'));
- });
-
- it('webElementPromiseArgumentConversion', function() {
- var elementJson = WebElement.buildId('bar');
-
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {'using': 'css selector', 'value': '*[id="foo"]'}).
- andReturnSuccess(elementJson).
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return 1;',
- 'args': [elementJson]
- }).
- andReturnSuccess(null).
- end();
-
- var driver = executor.createDriver();
- var element = driver.findElement(By.id('foo'));
- return driver.executeScript('return 1;', element);
- });
-
- it('argumentConversion', function() {
- var elementJson = WebElement.buildId('fefifofum');
-
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'return 1;',
- 'args': ['abc', 123, true, elementJson, [123, {'foo': 'bar'}]]
- }).
- andReturnSuccess(null).
- end();
-
- var driver = executor.createDriver();
- var element = new WebElement(driver, 'fefifofum');
- return driver.executeScript('return 1;',
- 'abc', 123, true, element, [123, {'foo': 'bar'}]);
- });
-
- it('scriptReturnsAnError', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT).
- withParameters({
- 'script': 'throw Error(arguments[0]);',
- 'args': ['bam']
- }).
- andReturnError(new StubError).
- end();
- var driver = executor.createDriver();
- return driver.executeScript('throw Error(arguments[0]);', 'bam').
- then(fail, assertIsStubError);
- });
-
- it('failsIfArgumentIsARejectedPromise', function() {
- let executor = new FakeExecutor();
-
- var arg = Promise.reject(new StubError);
- arg.catch(function() {}); // Suppress default handler.
-
- var driver = executor.createDriver();
- return driver.executeScript(function() {}, arg).
- then(fail, assertIsStubError);
- });
- });
-
- describe('executeAsyncScript', function() {
- it('failsIfArgumentIsARejectedPromise', function() {
- var arg = Promise.reject(new StubError);
- arg.catch(function() {}); // Suppress default handler.
-
- var driver = new FakeExecutor().createDriver();
- return driver.executeAsyncScript(function() {}, arg).
- then(fail, assertIsStubError);
- });
- });
-
- describe('findElement', function() {
- it('elementNotFound', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnError(new StubError).
- end();
-
- var driver = executor.createDriver();
- return driver.findElement(By.id('foo'))
- .then(assert.fail, assertIsStubError);
- });
-
- it('elementNotFoundInACallback', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnError(new StubError).
- end();
-
- var driver = executor.createDriver();
- return Promise.resolve()
- .then(_ => driver.findElement(By.id('foo')))
- .then(assert.fail, assertIsStubError);
- });
-
- it('elementFound', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnSuccess(WebElement.buildId('bar')).
- expect(CName.CLICK_ELEMENT, {'id': WebElement.buildId('bar')}).
- andReturnSuccess().
- end();
-
- var driver = executor.createDriver();
- var element = driver.findElement(By.id('foo'));
- element.click();
- return waitForIdle();
- });
-
- it('canUseElementInCallback', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnSuccess(WebElement.buildId('bar')).
- expect(CName.CLICK_ELEMENT, {'id': WebElement.buildId('bar')}).
- andReturnSuccess().
- end();
-
- var driver = executor.createDriver();
- driver.findElement(By.id('foo')).then(function(element) {
- element.click();
- });
- return waitForIdle();
- });
-
- it('byJs', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {
- 'script': 'return document.body',
- 'args': []
- }).
- andReturnSuccess(WebElement.buildId('bar')).
- expect(CName.CLICK_ELEMENT, {'id': WebElement.buildId('bar')}).
- end();
-
- var driver = executor.createDriver();
- var element = driver.findElement(By.js('return document.body'));
- element.click(); // just to make sure
- return waitForIdle();
- });
-
- it('byJs_returnsNonWebElementValue', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {'script': 'return 123', 'args': []}).
- andReturnSuccess(123).
- end();
-
- var driver = executor.createDriver();
- return driver.findElement(By.js('return 123'))
- .then(assert.fail, function(e) {
- assertIsInstance(TypeError, e);
- assert.equal(
- 'Custom locator did not return a WebElement', e.message);
- });
- });
-
- it('byJs_canPassArguments', function() {
- var script = 'return document.getElementsByTagName(arguments[0]);';
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {
- 'script': script,
- 'args': ['div']
- }).
- andReturnSuccess(WebElement.buildId('one')).
- end();
- var driver = executor.createDriver();
- driver.findElement(By.js(script, 'div'));
- return waitForIdle();
- });
-
- it('customLocator', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENTS, {'using': 'css selector', 'value': 'a'}).
- andReturnSuccess([
- WebElement.buildId('foo'),
- WebElement.buildId('bar')]).
- expect(CName.CLICK_ELEMENT, {'id': WebElement.buildId('foo')}).
- andReturnSuccess().
- end();
-
- var driver = executor.createDriver();
- var element = driver.findElement(function(d) {
- assert.equal(driver, d);
- return d.findElements(By.tagName('a'));
- });
- return element.click();
- });
-
- it('customLocatorThrowsIfresultIsNotAWebElement', function() {
- var driver = new FakeExecutor().createDriver();
- return driver.findElement(_ => 1)
- .then(assert.fail, function(e) {
- assertIsInstance(TypeError, e);
- assert.equal(
- 'Custom locator did not return a WebElement', e.message);
- });
- });
- });
-
- describe('findElements', function() {
- it('returnsMultipleElements', function() {
- var ids = ['foo', 'bar', 'baz'];
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENTS, {'using':'css selector', 'value':'a'}).
- andReturnSuccess(ids.map(WebElement.buildId)).
- end();
-
- var driver = executor.createDriver();
- return driver.findElements(By.tagName('a'))
- .then(function(elements) {
- return promise.all(elements.map(function(e) {
- assert.ok(e instanceof WebElement);
- return e.getId();
- }));
- })
- .then((actual) => assert.deepEqual(ids, actual));
- });
-
- it('byJs', function() {
- var ids = ['foo', 'bar', 'baz'];
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {
- 'script': 'return document.getElementsByTagName("div");',
- 'args': []
- }).
- andReturnSuccess(ids.map(WebElement.buildId)).
- end();
-
- var driver = executor.createDriver();
-
- return driver.
- findElements(By.js('return document.getElementsByTagName("div");')).
- then(function(elements) {
- return promise.all(elements.map(function(e) {
- assert.ok(e instanceof WebElement);
- return e.getId();
- }));
- }).
- then((actual) => assert.deepEqual(ids, actual));
- });
-
- it('byJs_filtersOutNonWebElementResponses', function() {
- var ids = ['foo', 'bar', 'baz'];
- var json = [
- WebElement.buildId(ids[0]),
- 123,
- 'a',
- false,
- WebElement.buildId(ids[1]),
- {'not a web element': 1},
- WebElement.buildId(ids[2])
- ];
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {
- 'script': 'return document.getElementsByTagName("div");',
- 'args': []
- }).
- andReturnSuccess(json).
- end();
-
- var driver = executor.createDriver();
- driver.findElements(By.js('return document.getElementsByTagName("div");')).
- then(function(elements) {
- return promise.all(elements.map(function(e) {
- assert.ok(e instanceof WebElement);
- return e.getId();
- }));
- }).
- then((actual) => assert.deepEqual(ids, actual));
- return waitForIdle();
- });
-
- it('byJs_convertsSingleWebElementResponseToArray', function() {
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {
- 'script': 'return document.getElementsByTagName("div");',
- 'args': []
- }).
- andReturnSuccess(WebElement.buildId('foo')).
- end();
-
- var driver = executor.createDriver();
- return driver.
- findElements(By.js('return document.getElementsByTagName("div");')).
- then(function(elements) {
- return promise.all(elements.map(function(e) {
- assert.ok(e instanceof WebElement);
- return e.getId();
- }));
- }).
- then((actual) => assert.deepEqual(['foo'], actual));
- });
-
- it('byJs_canPassScriptArguments', function() {
- var script = 'return document.getElementsByTagName(arguments[0]);';
- let executor = new FakeExecutor().
- expect(CName.EXECUTE_SCRIPT, {
- 'script': script,
- 'args': ['div']
- }).
- andReturnSuccess([
- WebElement.buildId('one'),
- WebElement.buildId('two')
- ]).
- end();
-
- var driver = executor.createDriver();
- return driver.findElements(By.js(script, 'div'))
- then(function(elements) {
- return promise.all(elements.map(function(e) {
- assert.ok(e instanceof WebElement);
- return e.getId();
- }));
- }).
- then((actual) => assert.deepEqual(['one', 'two'], actual));
- });
- });
-
- describe('sendKeys', function() {
- it('convertsVarArgsIntoStrings_simpleArgs', function() {
- let executor = new FakeExecutor().
- expect(CName.SEND_KEYS_TO_ELEMENT,
- {'id': WebElement.buildId('one'),
- 'value':'12abc3'.split('')}).
- andReturnSuccess().
- end();
-
- var driver = executor.createDriver();
- var element = new WebElement(driver, 'one');
- element.sendKeys(1, 2, 'abc', 3);
- return waitForIdle();
- });
-
- it('convertsVarArgsIntoStrings_promisedArgs', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {'using':'css selector', 'value':'*[id="foo"]'}).
- andReturnSuccess(WebElement.buildId('one')).
- expect(CName.SEND_KEYS_TO_ELEMENT,
- {'id':WebElement.buildId('one'),
- 'value':'abc123def'.split('')}).
- andReturnSuccess().
- end();
-
- var driver = executor.createDriver();
- var element = driver.findElement(By.id('foo'));
- return element.sendKeys(
- Promise.resolve('abc'),
- 123,
- Promise.resolve('def'));
- });
-
- it('sendKeysWithAFileDetector', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {'using':'css selector', 'value':'*[id="foo"]'}).
- andReturnSuccess(WebElement.buildId('one')).
- expect(CName.SEND_KEYS_TO_ELEMENT,
- {'id': WebElement.buildId('one'),
- 'value':'modified/path'.split('')}).
- andReturnSuccess().
- end();
-
- let driver = executor.createDriver();
- let handleFile = function(d, path) {
- assert.strictEqual(driver, d);
- assert.equal(path, 'original/path');
- return Promise.resolve('modified/path');
- };
- driver.setFileDetector({handleFile});
-
- return driver.findElement(By.id('foo')).sendKeys('original/', 'path');
- });
- });
-
- describe("switchTo()", function() {
- describe("window", function() {
- it('should return a resolved promise when the window is found', function() {
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW).
- withParameters({
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnSuccess().
- end();
-
- executor.createDriver().switchTo().window('foo');
- return waitForIdle();
- });
-
- it('should propagate exceptions', function() {
- let e = new error.NoSuchWindowError('window not found');
- let executor = new FakeExecutor().
- expect(CName.SWITCH_TO_WINDOW).
- withParameters({
- 'name': 'foo',
- 'handle': 'foo'
- }).
- andReturnError(e).
- end();
-
- return executor.createDriver()
- .switchTo().window('foo')
- .then(assert.fail, v => assert.strictEqual(v, e));
- });
- });
- });
-
- describe('elementEquality', function() {
- it('isReflexive', function() {
- var a = new WebElement(new FakeExecutor().createDriver(), 'foo');
- return WebElement.equals(a, a).then(assert.ok);
- });
-
- it('failsIfAnInputElementCouldNotBeFound', function() {
- let id = Promise.reject(new StubError);
-
- var driver = new FakeExecutor().createDriver();
- var a = new WebElement(driver, 'foo');
- var b = new WebElementPromise(driver, id);
-
- return WebElement.equals(a, b).then(fail, assertIsStubError);
- });
- });
-
- describe('waiting', function() {
- describe('supports custom wait functions', function() {
- it('waitSucceeds', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnSuccess([]).
- times(2).
- expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnSuccess([WebElement.buildId('bar')]).
- end();
-
- var driver = executor.createDriver();
- driver.wait(function() {
- return driver.findElements(By.id('foo')).then(els => els.length > 0);
- }, 200);
- return waitForIdle();
- });
-
- it('waitTimesout_timeoutCaught', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnSuccess([]).
- anyTimes().
- end();
-
- var driver = executor.createDriver();
- return driver.wait(function() {
- return driver.findElements(By.id('foo')).then(els => els.length > 0);
- }, 25).then(fail, function(e) {
- assert.equal('Wait timed out after ',
- e.message.substring(0, 'Wait timed out after '.length));
- });
- });
-
- enablePromiseManager(() => {
- it('waitTimesout_timeoutNotCaught', function() {
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnSuccess([]).
- anyTimes().
- end();
-
- var driver = executor.createDriver();
- driver.wait(function() {
- return driver.findElements(By.id('foo')).then(els => els.length > 0);
- }, 25);
- return waitForAbort().then(function(e) {
- assert.equal('Wait timed out after ',
- e.message.substring(0, 'Wait timed out after '.length));
- });
- });
- });
- });
-
- describe('supports condition objects', function() {
- it('wait succeeds', function() {
- let executor = new FakeExecutor()
- .expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'})
- .andReturnSuccess([])
- .times(2)
- .expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'})
- .andReturnSuccess([WebElement.buildId('bar')])
- .end();
-
- let driver = executor.createDriver();
- return driver.wait(until.elementLocated(By.id('foo')), 200);
- });
-
- it('wait times out', function() {
- let executor = new FakeExecutor()
- .expect(CName.FIND_ELEMENTS,
- {using: 'css selector', value: '*[id="foo"]'})
- .andReturnSuccess([])
- .anyTimes()
- .end();
-
- let driver = executor.createDriver();
- return driver.wait(until.elementLocated(By.id('foo')), 5)
- .then(fail, err => assert.ok(err instanceof error.TimeoutError));
- });
- });
-
- describe('supports promise objects', function() {
- it('wait succeeds', function() {
- let promise = new Promise(resolve => {
- setTimeout(() => resolve(1), 10);
- });
-
- let driver = new FakeExecutor().createDriver();
- return driver.wait(promise, 200).then(v => assert.equal(v, 1));
- });
-
- it('wait times out', function() {
- let promise = new Promise(resolve => {/* never resolves */});
-
- let driver = new FakeExecutor().createDriver();
- return driver.wait(promise, 5)
- .then(fail, err => assert.ok(err instanceof error.TimeoutError));
- });
-
- it('wait fails if promise is rejected', function() {
- let err = Error('boom');
- let driver = new FakeExecutor().createDriver();
- return driver.wait(Promise.reject(err), 5)
- .then(fail, e => assert.strictEqual(e, err));
- });
- });
-
- it('fails if not supported condition type provided', function() {
- let driver = new FakeExecutor().createDriver();
- assert.throws(() => driver.wait({}, 5), TypeError);
- });
- });
-
- describe('alert handling', function() {
- it('alertResolvesWhenPromisedTextResolves', function() {
- let driver = new FakeExecutor().createDriver();
- let deferredText = defer();
-
- let alert = new AlertPromise(driver, deferredText.promise);
-
- deferredText.resolve(new Alert(driver, 'foo'));
- return alert.getText().then(text => assert.equal(text, 'foo'));
- });
-
- it('cannotSwitchToAlertThatIsNotPresent', function() {
- let e = new error.NoSuchAlertError;
- let executor = new FakeExecutor()
- .expect(CName.GET_ALERT_TEXT)
- .andReturnError(e)
- .end();
-
- return executor.createDriver()
- .switchTo().alert()
- .then(assert.fail, v => assert.strictEqual(v, e));
- });
-
- enablePromiseManager(() => {
- it('alertsBelongToSameFlowAsParentDriver', function() {
- let executor = new FakeExecutor()
- .expect(CName.GET_ALERT_TEXT).andReturnSuccess('hello')
- .end();
-
- var driver = executor.createDriver();
- var otherFlow = new promise.ControlFlow();
- otherFlow.execute(function() {
- driver.switchTo().alert().then(function() {
- assert.strictEqual(
- driver.controlFlow(), promise.controlFlow(),
- 'Alert should belong to the same flow as its parent driver');
- });
- });
-
- assert.notEqual(otherFlow, driver.controlFlow);
- return Promise.all([
- waitForIdle(otherFlow),
- waitForIdle(driver.controlFlow())
- ]);
- });
- });
-
- it('commandsFailIfAlertNotPresent', function() {
- let e = new error.NoSuchAlertError;
- let executor = new FakeExecutor()
- .expect(CName.GET_ALERT_TEXT)
- .andReturnError(e)
- .end();
-
- var driver = executor.createDriver();
- var alert = driver.switchTo().alert();
-
- var expectError = (v) => assert.strictEqual(v, e);
-
- return alert.getText()
- .then(fail, expectedError)
- .then(() => alert.accept())
- .then(fail, expectedError)
- .then(() => alert.dismiss())
- .then(fail, expectError)
- .then(() => alert.sendKeys('hi'))
- .then(fail, expectError);
- });
- });
-
- enablePromiseManager(() => {
- it('testWebElementsBelongToSameFlowAsParentDriver', function() {
- let executor = new FakeExecutor()
- .expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'})
- .andReturnSuccess(WebElement.buildId('abc123'))
- .end();
-
- var driver = executor.createDriver();
- var otherFlow = new promise.ControlFlow();
- otherFlow.execute(function() {
- driver.findElement({id: 'foo'}).then(function() {
- assert.equal(driver.controlFlow(), promise.controlFlow());
- });
- });
-
- assert.notEqual(otherFlow, driver.controlFlow);
- return Promise.all([
- waitForIdle(otherFlow),
- waitForIdle(driver.controlFlow())
- ]);
- });
- });
-
- it('testFetchingLogs', function() {
- let executor = new FakeExecutor().
- expect(CName.GET_LOG, {'type': 'browser'}).
- andReturnSuccess([
- {'level': 'INFO', 'message': 'hello', 'timestamp': 1234},
- {'level': 'DEBUG', 'message': 'abc123', 'timestamp': 5678}
- ]).
- end();
-
- var driver = executor.createDriver();
- return driver.manage().logs().get('browser').then(function(entries) {
- assert.equal(2, entries.length);
-
- assert.ok(entries[0] instanceof logging.Entry);
- assert.equal(logging.Level.INFO.value, entries[0].level.value);
- assert.equal('hello', entries[0].message);
- assert.equal(1234, entries[0].timestamp);
-
- assert.ok(entries[1] instanceof logging.Entry);
- assert.equal(logging.Level.DEBUG.value, entries[1].level.value);
- assert.equal('abc123', entries[1].message);
- assert.equal(5678, entries[1].timestamp);
- });
- });
-
- it('testCommandsFailIfInitialSessionCreationFailed', function() {
- var session = Promise.reject(new StubError);
-
- var driver = new FakeExecutor().createDriver(session);
- var navigateResult = driver.get('some-url').then(fail, assertIsStubError);
- var quitResult = driver.quit().then(fail, assertIsStubError);
-
- return waitForIdle().then(function() {
- return promise.all(navigateResult, quitResult);
- });
- });
-
- it('testWebElementCommandsFailIfInitialDriverCreationFailed', function() {
- var session = Promise.reject(new StubError);
- var driver = new FakeExecutor().createDriver(session);
- return driver.findElement(By.id('foo')).click().
- then(fail, assertIsStubError);
- });
-
- it('testWebElementCommansFailIfElementCouldNotBeFound', function() {
- let e = new error.NoSuchElementError('Unable to find element');
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnError(e).
- end();
-
- var driver = executor.createDriver();
- return driver.findElement(By.id('foo')).click()
- .then(fail, v => assert.strictEqual(v, e));
- });
-
- it('testCannotFindChildElementsIfParentCouldNotBeFound', function() {
- let e = new error.NoSuchElementError('Unable to find element');
- let executor = new FakeExecutor().
- expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'}).
- andReturnError(e).
- end();
-
- var driver = executor.createDriver();
- return driver.findElement(By.id('foo'))
- .findElement(By.id('bar'))
- .findElement(By.id('baz'))
- .then(fail, v => assert.strictEqual(v, e));
- });
-
- describe('actions()', function() {
- it('failsIfInitialDriverCreationFailed', function() {
- let session = Promise.reject(new StubError('no session for you'));
- let driver = new FakeExecutor().createDriver(session);
- driver.getSession().catch(function() {});
- return driver.
- actions().
- mouseDown().
- mouseUp().
- perform().
- catch(assertIsStubError);
- });
-
- describe('mouseMove', function() {
- it('noElement', function() {
- let executor = new FakeExecutor()
- .expect(CName.MOVE_TO, {'xoffset': 0, 'yoffset': 125})
- .andReturnSuccess()
- .end();
-
- return executor.createDriver().
- actions().
- mouseMove({x: 0, y: 125}).
- perform();
- });
-
- it('element', function() {
- let executor = new FakeExecutor()
- .expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="foo"]'})
- .andReturnSuccess(WebElement.buildId('abc123'))
- .expect(CName.MOVE_TO,
- {'element': 'abc123', 'xoffset': 0, 'yoffset': 125})
- .andReturnSuccess()
- .end();
-
- var driver = executor.createDriver();
- var element = driver.findElement(By.id('foo'));
- return driver.actions()
- .mouseMove(element, {x: 0, y: 125})
- .perform();
- });
- });
-
- it('supportsMouseDown', function() {
- let executor = new FakeExecutor()
- .expect(CName.MOUSE_DOWN, {'button': Button.LEFT})
- .andReturnSuccess()
- .end();
-
- return executor.createDriver().
- actions().
- mouseDown().
- perform();
- });
-
- it('testActionSequence', function() {
- let executor = new FakeExecutor()
- .expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="a"]'})
- .andReturnSuccess(WebElement.buildId('id1'))
- .expect(CName.FIND_ELEMENT,
- {using: 'css selector', value: '*[id="b"]'})
- .andReturnSuccess(WebElement.buildId('id2'))
- .expect(CName.SEND_KEYS_TO_ACTIVE_ELEMENT,
- {'value': [Key.SHIFT]})
- .andReturnSuccess()
- .expect(CName.MOVE_TO, {'element': 'id1'})
- .andReturnSuccess()
- .expect(CName.CLICK, {'button': Button.LEFT})
- .andReturnSuccess()
- .expect(CName.MOVE_TO, {'element': 'id2'})
- .andReturnSuccess()
- .expect(CName.CLICK, {'button': Button.LEFT})
- .andReturnSuccess()
- .end();
-
- var driver = executor.createDriver();
- var element1 = driver.findElement(By.id('a'));
- var element2 = driver.findElement(By.id('b'));
-
- return driver.actions()
- .keyDown(Key.SHIFT)
- .click(element1)
- .click(element2)
- .perform();
- });
- });
-
- describe('touchActions()', function() {
- it('failsIfInitialDriverCreationFailed', function() {
- let session = Promise.reject(new StubError);
- let driver = new FakeExecutor().createDriver(session);
- driver.getSession().catch(function() {});
- return driver.
- touchActions().
- scroll({x: 3, y: 4}).
- perform().
- catch(assertIsStubError);
- });
-
- it('testTouchActionSequence', function() {
- let executor = new FakeExecutor()
- .expect(CName.TOUCH_DOWN, {x: 1, y: 2}).andReturnSuccess()
- .expect(CName.TOUCH_MOVE, {x: 3, y: 4}).andReturnSuccess()
- .expect(CName.TOUCH_UP, {x: 5, y: 6}).andReturnSuccess()
- .end();
-
- var driver = executor.createDriver();
- return driver.touchActions()
- .tapAndHold({x: 1, y: 2})
- .move({x: 3, y: 4})
- .release({x: 5, y: 6})
- .perform();
- });
- });
-
- describe('manage()', function() {
- describe('setTimeouts()', function() {
- describe('throws if no timeouts are specified', function() {
- let driver;
- before(() => driver = new FakeExecutor().createDriver());
-
- it('; no arguments', function() {
- assert.throws(() => driver.manage().setTimeouts(), TypeError);
- });
-
- it('; ignores unrecognized timeout keys', function() {
- assert.throws(
- () => driver.manage().setTimeouts({foo: 123}), TypeError);
- });
-
- it('; ignores positional arguments', function() {
- assert.throws(
- () => driver.manage().setTimeouts(1234, 56), TypeError);
- });
- });
-
- describe('throws timeout is not a number, null, or undefined', () => {
- let driver;
- before(() => driver = new FakeExecutor().createDriver());
-
- function checkError(e) {
- return e instanceof TypeError
- && /expected "(script|pageLoad|implicit)" to be a number/.test(
- e.message);
- }
-
- it('script', function() {
- assert.throws(
- () => driver.manage().setTimeouts({script: 'abc'}),
- checkError);
- });
-
- it('pageLoad', function() {
- assert.throws(
- () => driver.manage().setTimeouts({pageLoad: 'abc'}),
- checkError);
- });
-
- it('implicit', function() {
- assert.throws(
- () => driver.manage().setTimeouts({implicit: 'abc'}),
- checkError);
- });
- });
-
- it('can set multiple timeouts', function() {
- let executor = new FakeExecutor()
- .expect(CName.SET_TIMEOUT, {script:1, pageLoad: 2, implicit: 3})
- .andReturnSuccess()
- .end();
- let driver = executor.createDriver();
- return driver.manage()
- .setTimeouts({script: 1, pageLoad: 2, implicit: 3});
- });
-
- it('falls back to legacy wire format if W3C version fails', () => {
- let executor = new FakeExecutor()
- .expect(CName.SET_TIMEOUT, {implicit: 3})
- .andReturnError(Error('oops'))
- .expect(CName.SET_TIMEOUT, {type: 'implicit', ms: 3})
- .andReturnSuccess()
- .end();
- let driver = executor.createDriver();
- return driver.manage().setTimeouts({implicit: 3});
- });
-
- describe('deprecated API calls setTimeouts()', function() {
- it('implicitlyWait()', function() {
- let executor = new FakeExecutor()
- .expect(CName.SET_TIMEOUT, {implicit: 3})
- .andReturnSuccess()
- .end();
- let driver = executor.createDriver();
- return driver.manage().timeouts().implicitlyWait(3);
- });
-
- it('setScriptTimeout()', function() {
- let executor = new FakeExecutor()
- .expect(CName.SET_TIMEOUT, {script: 3})
- .andReturnSuccess()
- .end();
- let driver = executor.createDriver();
- return driver.manage().timeouts().setScriptTimeout(3);
- });
-
- it('pageLoadTimeout()', function() {
- let executor = new FakeExecutor()
- .expect(CName.SET_TIMEOUT, {pageLoad: 3})
- .andReturnSuccess()
- .end();
- let driver = executor.createDriver();
- return driver.manage().timeouts().pageLoadTimeout(3);
- });
- });
- });
- });
-
- describe('generator support', function() {
- var driver;
-
- beforeEach(function() {
- driver = new WebDriver(
- new Session('test-session', {}),
- new ExplodingExecutor());
- });
-
- it('canUseGeneratorsWithWebDriverCall', function() {
- return driver.call(function* () {
- var x = yield Promise.resolve(1);
- var y = yield Promise.resolve(2);
- return x + y;
- }).then(function(value) {
- assert.deepEqual(3, value);
- });
- });
-
- it('canDefineScopeOnGeneratorCall', function() {
- return driver.call(function* () {
- var x = yield Promise.resolve(1);
- return this.name + x;
- }, {name: 'Bob'}).then(function(value) {
- assert.deepEqual('Bob1', value);
- });
- });
-
- it('canSpecifyArgsOnGeneratorCall', function() {
- return driver.call(function* (a, b) {
- var x = yield Promise.resolve(1);
- var y = yield Promise.resolve(2);
- return [x + y, a, b];
- }, null, 'abc', 123).then(function(value) {
- assert.deepEqual([3, 'abc', 123], value);
- });
- });
-
- it('canUseGeneratorWithWebDriverWait', function() {
- var values = [];
- return driver.wait(function* () {
- yield values.push(1);
- values.push(yield promise.delayed(10).then(function() {
- return 2;
- }));
- yield values.push(3);
- return values.length === 6;
- }, 250).then(function() {
- assert.deepEqual([1, 2, 3, 1, 2, 3], values);
- });
- });
-
- /**
- * @constructor
- * @implements {CommandExecutor}
- */
- function ExplodingExecutor() {}
-
-
- /** @override */
- ExplodingExecutor.prototype.execute = function(command, cb) {
- cb(Error('Unsupported operation'));
- };
- });
-
- describe('wire format', function() {
- const FAKE_DRIVER = new FakeExecutor().createDriver();
-
- describe('can serialize', function() {
- function runSerializeTest(input, want) {
- let executor = new FakeExecutor().
- expect(CName.NEW_SESSION).
- withParameters({'desiredCapabilities': want}).
- andReturnSuccess({'browserName': 'firefox'}).
- end();
- return WebDriver.createSession(executor, input)
- .getSession();
- }
-
- it('function as a string', function() {
- function foo() { return 'foo'; }
- return runSerializeTest(foo, '' + foo);
- });
-
- it('object with toJSON()', function() {
- return runSerializeTest(
- new Date(605728511546),
- '1989-03-12T17:55:11.546Z');
- });
-
- it('Session', function() {
- return runSerializeTest(new Session('foo', {}), 'foo');
- });
-
- it('Capabilities', function() {
- var prefs = new logging.Preferences();
- prefs.setLevel(logging.Type.BROWSER, logging.Level.DEBUG);
-
- var caps = Capabilities.chrome();
- caps.setLoggingPrefs(prefs);
-
- return runSerializeTest(
- caps,
- {
- 'browserName': 'chrome',
- 'loggingPrefs': {'browser': 'DEBUG'}
- });
- });
-
- it('WebElement', function() {
- return runSerializeTest(
- new WebElement(FAKE_DRIVER, 'fefifofum'),
- WebElement.buildId('fefifofum'));
- });
-
- it('WebElementPromise', function() {
- return runSerializeTest(
- new WebElementPromise(
- FAKE_DRIVER,
- Promise.resolve(new WebElement(FAKE_DRIVER, 'fefifofum'))),
- WebElement.buildId('fefifofum'));
- });
-
- describe('an array', function() {
- it('with Serializable', function() {
- return runSerializeTest([new Session('foo', {})], ['foo']);
- });
-
- it('with WebElement', function() {
- return runSerializeTest(
- [new WebElement(FAKE_DRIVER, 'fefifofum')],
- [WebElement.buildId('fefifofum')]);
- });
-
- it('with WebElementPromise', function() {
- return runSerializeTest(
- [new WebElementPromise(
- FAKE_DRIVER,
- Promise.resolve(new WebElement(FAKE_DRIVER, 'fefifofum')))],
- [WebElement.buildId('fefifofum')]);
- });
-
- it('complex array', function() {
- var expected = [
- 'abc', 123, true, WebElement.buildId('fefifofum'),
- [123, {'foo': 'bar'}]
- ];
-
- var element = new WebElement(FAKE_DRIVER, 'fefifofum');
- var input = ['abc', 123, true, element, [123, {'foo': 'bar'}]];
- return runSerializeTest(input, expected);
- });
-
- it('nested promises', function() {
- return runSerializeTest(
- ['abc', Promise.resolve([123, Promise.resolve(true)])],
- ['abc', [123, true]]);
- });
- });
-
- describe('an object', function() {
- it('literal', function() {
- var expected = {sessionId: 'foo'};
- return runSerializeTest({sessionId: 'foo'}, expected);
- });
-
- it('with sub-objects', function() {
- var expected = {sessionId: {value: 'foo'}};
- return runSerializeTest(
- {sessionId: {value: 'foo'}}, expected);
- });
-
- it('with values that have toJSON', function() {
- return runSerializeTest(
- {a: {b: new Date(605728511546)}},
- {a: {b: '1989-03-12T17:55:11.546Z'}});
- });
-
- it('with a Session', function() {
- return runSerializeTest(
- {a: new Session('foo', {})},
- {a: 'foo'});
- });
-
- it('nested', function() {
- var elementJson = WebElement.buildId('fefifofum');
- var expected = {
- 'script': 'return 1',
- 'args': ['abc', 123, true, elementJson, [123, {'foo': 'bar'}]],
- 'sessionId': 'foo'
- };
-
- var element = new WebElement(FAKE_DRIVER, 'fefifofum');
- var parameters = {
- 'script': 'return 1',
- 'args':['abc', 123, true, element, [123, {'foo': 'bar'}]],
- 'sessionId': new Session('foo', {})
- };
-
- return runSerializeTest(parameters, expected);
- });
- });
- });
-
- describe('can deserialize', function() {
- function runDeserializeTest(original, want) {
- let executor = new FakeExecutor()
- .expect(CName.GET_CURRENT_URL)
- .andReturnSuccess(original)
- .end();
- let driver = executor.createDriver();
- return driver.getCurrentUrl().then(function(got) {
- assert.deepEqual(got, want);
- });
- }
-
- it('primitives', function() {
- return Promise.all([
- runDeserializeTest(1, 1),
- runDeserializeTest('', ''),
- runDeserializeTest(true, true),
- runDeserializeTest(undefined, undefined),
- runDeserializeTest(null, null)
- ]);
- });
-
- it('simple object', function() {
- return runDeserializeTest(
- {sessionId: 'foo'},
- {sessionId: 'foo'});
- });
-
- it('nested object', function() {
- return runDeserializeTest(
- {'foo': {'bar': 123}},
- {'foo': {'bar': 123}});
- });
-
- it('array', function() {
- return runDeserializeTest(
- [{'foo': {'bar': 123}}],
- [{'foo': {'bar': 123}}]);
- });
-
- it('passes through function properties', function() {
- function bar() {}
- return runDeserializeTest(
- [{foo: {'bar': 123}, func: bar}],
- [{foo: {'bar': 123}, func: bar}]);
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/logging_test.js b/node_modules/selenium-webdriver/test/logging_test.js
deleted file mode 100644
index 546879715..000000000
--- a/node_modules/selenium-webdriver/test/logging_test.js
+++ /dev/null
@@ -1,167 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var Browser = require('..').Browser,
- By = require('..').By,
- logging = require('..').logging,
- assert = require('../testing/assert'),
- test = require('../lib/test');
-
-test.suite(function(env) {
- // Logging API has numerous issues with PhantomJS:
- // - does not support adjusting log levels for type "browser".
- // - does not return proper log level for "browser" messages.
- // - does not delete logs after retrieval
- // Logging API is not supported in IE.
- // Logging API not supported in Marionette.
- // Tests depend on opening data URLs, which is broken in Safari (issue 7586)
- test.ignore(env.browsers(
- Browser.PHANTOM_JS, Browser.IE, Browser.SAFARI, Browser.FIREFOX)).
- describe('logging', function() {
- var driver;
-
- test.beforeEach(function() {
- driver = null;
- });
-
- test.afterEach(function*() {
- if (driver) {
- return driver.quit();
- }
- });
-
- test.it('can be disabled', function*() {
- var prefs = new logging.Preferences();
- prefs.setLevel(logging.Type.BROWSER, logging.Level.OFF);
-
- driver = yield env.builder()
- .setLoggingPrefs(prefs)
- .build();
-
- yield driver.get(dataUrl(
- '<!DOCTYPE html><script>',
- 'console.info("hello");',
- 'console.warn("this is a warning");',
- 'console.error("and this is an error");',
- '</script>'));
- return driver.manage().logs().get(logging.Type.BROWSER)
- .then(entries => assert(entries.length).equalTo(0));
- });
-
- // Firefox does not capture JS error console log messages.
- test.ignore(env.browsers(Browser.FIREFOX, 'legacy-firefox')).
- it('can be turned down', function*() {
- var prefs = new logging.Preferences();
- prefs.setLevel(logging.Type.BROWSER, logging.Level.SEVERE);
-
- driver = yield env.builder()
- .setLoggingPrefs(prefs)
- .build();
-
- yield driver.get(dataUrl(
- '<!DOCTYPE html><script>',
- 'console.info("hello");',
- 'console.warn("this is a warning");',
- 'console.error("and this is an error");',
- '</script>'));
- return driver.manage().logs().get(logging.Type.BROWSER)
- .then(function(entries) {
- assert(entries.length).equalTo(1);
- assert(entries[0].level.name).equalTo('SEVERE');
- assert(entries[0].message).matches(/.*\"?and this is an error\"?/);
- });
- });
-
- // Firefox does not capture JS error console log messages.
- test.ignore(env.browsers(Browser.FIREFOX, 'legacy-firefox')).
- it('can be made verbose', function*() {
- var prefs = new logging.Preferences();
- prefs.setLevel(logging.Type.BROWSER, logging.Level.DEBUG);
-
- driver = yield env.builder()
- .setLoggingPrefs(prefs)
- .build();
-
- yield driver.get(dataUrl(
- '<!DOCTYPE html><script>',
- 'console.debug("hello");',
- 'console.warn("this is a warning");',
- 'console.error("and this is an error");',
- '</script>'));
- return driver.manage().logs().get(logging.Type.BROWSER)
- .then(function(entries) {
- assert(entries.length).equalTo(3);
- assert(entries[0].level.name).equalTo('DEBUG');
- assert(entries[0].message).matches(/.*\"?hello\"?/);
-
- assert(entries[1].level.name).equalTo('WARNING');
- assert(entries[1].message).matches(/.*\"?this is a warning\"?/);
-
- assert(entries[2].level.name).equalTo('SEVERE');
- assert(entries[2].message).matches(/.*\"?and this is an error\"?/);
- });
- });
-
- // Firefox does not capture JS error console log messages.
- test.ignore(env.browsers(Browser.FIREFOX, 'legacy-firefox')).
- it('clears records after retrieval', function*() {
- var prefs = new logging.Preferences();
- prefs.setLevel(logging.Type.BROWSER, logging.Level.DEBUG);
-
- driver = yield env.builder()
- .setLoggingPrefs(prefs)
- .build();
-
- yield driver.get(dataUrl(
- '<!DOCTYPE html><script>',
- 'console.debug("hello");',
- 'console.warn("this is a warning");',
- 'console.error("and this is an error");',
- '</script>'));
- yield driver.manage().logs().get(logging.Type.BROWSER)
- .then(entries => assert(entries.length).equalTo(3));
- return driver.manage().logs().get(logging.Type.BROWSER)
- .then(entries => assert(entries.length).equalTo(0));
- });
-
- test.it('does not mix log types', function*() {
- var prefs = new logging.Preferences();
- prefs.setLevel(logging.Type.BROWSER, logging.Level.DEBUG);
- prefs.setLevel(logging.Type.DRIVER, logging.Level.SEVERE);
-
- driver = yield env.builder()
- .setLoggingPrefs(prefs)
- .build();
-
- yield driver.get(dataUrl(
- '<!DOCTYPE html><script>',
- 'console.debug("hello");',
- 'console.warn("this is a warning");',
- 'console.error("and this is an error");',
- '</script>'));
- return driver.manage().logs().get(logging.Type.DRIVER)
- .then(entries => assert(entries.length).equalTo(0));
- });
- });
-
- function dataUrl(var_args) {
- return 'data:text/html,'
- + Array.prototype.slice.call(arguments, 0).join('');
- }
-});
diff --git a/node_modules/selenium-webdriver/test/net/index_test.js b/node_modules/selenium-webdriver/test/net/index_test.js
deleted file mode 100644
index 88c52c063..000000000
--- a/node_modules/selenium-webdriver/test/net/index_test.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert');
-
-var net = require('../../net');
-
-describe('net.splitHostAndPort', function() {
- it('hostname with no port', function() {
- assert.deepEqual(
- net.splitHostAndPort('www.example.com'),
- {host: 'www.example.com', port: null});
- });
-
- it('hostname with port', function() {
- assert.deepEqual(
- net.splitHostAndPort('www.example.com:80'),
- {host: 'www.example.com', port: 80});
- });
-
- it('IPv4 with no port', function() {
- assert.deepEqual(
- net.splitHostAndPort('127.0.0.1'),
- {host: '127.0.0.1', port: null});
- });
-
- it('IPv4 with port', function() {
- assert.deepEqual(
- net.splitHostAndPort('127.0.0.1:1234'),
- {host: '127.0.0.1', port: 1234});
- });
-
- it('IPv6 with no port', function() {
- assert.deepEqual(
- net.splitHostAndPort('1234:0:1000:5768:1234:5678:90'),
- {host: '1234:0:1000:5768:1234:5678:90', port: null});
- });
-
- it('IPv6 with port', function() {
- assert.deepEqual(
- net.splitHostAndPort('[1234:0:1000:5768:1234:5678:90]:1234'),
- {host: '1234:0:1000:5768:1234:5678:90', port: 1234});
- });
-});
diff --git a/node_modules/selenium-webdriver/test/net/portprober_test.js b/node_modules/selenium-webdriver/test/net/portprober_test.js
deleted file mode 100644
index 668c4ae0e..000000000
--- a/node_modules/selenium-webdriver/test/net/portprober_test.js
+++ /dev/null
@@ -1,128 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const net = require('net');
-
-const portprober = require('../../net/portprober');
-
-describe('isFree', function() {
-
- var server;
-
- beforeEach(function() {
- server = net.createServer(function(){});
- })
-
- afterEach(function(done) {
- if (!server) return done();
- server.close(function() {
- done();
- });
- });
-
- it('should work for INADDR_ANY', function(done) {
- server.listen(0, function() {
- var port = server.address().port;
- assertPortNotfree(port).then(function() {
- return new Promise(resolve => {
- server.close(function() {
- server = null;
- resolve(assertPortIsFree(port));
- });
- });
- }).then(function() { done(); }, done);
- });
- });
-
- it('should work for a specific host', function(done) {
- var host = '127.0.0.1';
- server.listen(0, host, function() {
- var port = server.address().port;
- assertPortNotfree(port, host).then(function() {
- return new Promise(resolve => {
- server.close(function() {
- server = null;
- resolve(assertPortIsFree(port, host));
- });
- });
- }).then(function() { done(); }, done);
- });
- });
-});
-
-describe('findFreePort', function() {
- var server;
-
- beforeEach(function() {
- server = net.createServer(function(){});
- })
-
- afterEach(function(done) {
- if (!server) return done();
- server.close(function() {
- done();
- });
- });
-
- it('should work for INADDR_ANY', function(done) {
- portprober.findFreePort().then(function(port) {
- server.listen(port, function() {
- assertPortNotfree(port).then(function() {
- return new Promise(resolve => {
- server.close(function() {
- server = null;
- resolve(assertPortIsFree(port));
- });
- });
- }).then(function() { done(); }, done);
- });
- });
- });
-
- it('should work for a specific host', function(done) {
- var host = '127.0.0.1';
- portprober.findFreePort(host).then(function(port) {
- server.listen(port, host, function() {
- assertPortNotfree(port, host).then(function() {
- return new Promise(resolve => {
- server.close(function() {
- server = null;
- resolve(assertPortIsFree(port, host));
- });
- });
- }).then(function() { done(); }, done);
- });
- });
- });
-});
-
-
-function assertPortIsFree(port, opt_host) {
- return portprober.isFree(port, opt_host).then(function(free) {
- assert.ok(free, 'port should be free');
- });
-}
-
-
-function assertPortNotfree(port, opt_host) {
- return portprober.isFree(port, opt_host).then(function(free) {
- assert.ok(!free, 'port should is not free');
- });
-}
diff --git a/node_modules/selenium-webdriver/test/page_loading_test.js b/node_modules/selenium-webdriver/test/page_loading_test.js
deleted file mode 100644
index 1f09db5b5..000000000
--- a/node_modules/selenium-webdriver/test/page_loading_test.js
+++ /dev/null
@@ -1,172 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var Browser = require('..').Browser,
- By = require('..').By,
- until = require('..').until,
- assert = require('../testing/assert'),
- error = require('../lib/error'),
- test = require('../lib/test'),
- Pages = test.Pages;
-
-
-test.suite(function(env) {
- var browsers = env.browsers;
-
- var driver;
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- test.beforeEach(function*() {
- if (!driver) {
- driver = yield env.builder().build();
- }
- });
-
- test.after(function() {
- if (driver) {
- return driver.quit();
- }
- });
-
- test.it('should wait for document to be loaded', function*() {
- yield driver.get(Pages.simpleTestPage);
- return assert(driver.getTitle()).equalTo('Hello WebDriver');
- });
-
- test.it('should follow redirects sent in the http response headers',
- function*() {
- yield driver.get(Pages.redirectPage);
- return assert(driver.getTitle()).equalTo('We Arrive Here');
- });
-
- test.ignore(browsers(Browser.SAFARI)).
- it('should follow meta redirects', function*() {
- yield driver.get(Pages.metaRedirectPage);
- return assert(driver.getTitle()).equalTo('We Arrive Here');
- });
-
- // Skip Firefox; see https://bugzilla.mozilla.org/show_bug.cgi?id=1280300
- test.ignore(browsers(Browser.FIREFOX)).
- it('should be able to get a fragment on the current page', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- yield driver.get(Pages.xhtmlTestPage + '#text');
- yield driver.findElement(By.id('id1'));
- });
-
- test.ignore(browsers(Browser.IPAD, Browser.IPHONE)).
- it('should wait for all frames to load in a frameset', function*() {
- yield driver.get(Pages.framesetPage);
- yield driver.switchTo().frame(0);
-
- let txt = yield driver.findElement(By.css('span#pageNumber')).getText();
- assert(txt.trim()).equalTo('1');
-
- yield driver.switchTo().defaultContent();
- yield driver.switchTo().frame(1);
- txt = yield driver.findElement(By.css('span#pageNumber')).getText();
-
- assert(txt.trim()).equalTo('2');
- });
-
- test.ignore(browsers(Browser.SAFARI)).
- it('should be able to navigate back in browser history', function*() {
- yield driver.get(Pages.formPage);
-
- yield driver.findElement(By.id('imageButton')).click();
- yield driver.wait(until.titleIs('We Arrive Here'), 2500);
-
- yield driver.navigate().back();
- yield driver.wait(until.titleIs('We Leave From Here'), 2500);
- });
-
- test.ignore(browsers(Browser.SAFARI)).
- it('should be able to navigate back in presence of iframes', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- yield driver.findElement(By.name('sameWindow')).click();
- yield driver.wait(until.titleIs('This page has iframes'), 2500);
-
- yield driver.navigate().back();
- yield driver.wait(until.titleIs('XHTML Test Page'), 2500);
- });
-
- test.ignore(browsers(Browser.SAFARI)).
- it('should be able to navigate forwards in browser history', function*() {
- yield driver.get(Pages.formPage);
-
- yield driver.findElement(By.id('imageButton')).click();
- yield driver.wait(until.titleIs('We Arrive Here'), 5000);
-
- yield driver.navigate().back();
- yield driver.wait(until.titleIs('We Leave From Here'), 5000);
-
- yield driver.navigate().forward();
- yield driver.wait(until.titleIs('We Arrive Here'), 5000);
- });
-
- // PhantomJS 2.0 does not properly reload pages on refresh.
- test.ignore(browsers(Browser.PHANTOM_JS)).
- it('should be able to refresh a page', function*() {
- yield driver.get(Pages.xhtmlTestPage);
-
- yield driver.navigate().refresh();
-
- yield assert(driver.getTitle()).equalTo('XHTML Test Page');
- });
-
- test.it('should return title of page if set', function*() {
- yield driver.get(Pages.xhtmlTestPage);
- yield assert(driver.getTitle()).equalTo('XHTML Test Page');
-
- yield driver.get(Pages.simpleTestPage);
- yield assert(driver.getTitle()).equalTo('Hello WebDriver');
- });
-
- describe('timeouts', function() {
- test.afterEach(function() {
- let nullDriver = () => driver = null;
- if (driver) {
- return driver.quit().then(nullDriver, nullDriver);
- }
- });
-
- // Only implemented in Firefox.
- test.ignore(browsers(
- Browser.CHROME,
- Browser.IE,
- Browser.IPAD,
- Browser.IPHONE,
- Browser.OPERA,
- Browser.PHANTOM_JS)).
- it('should timeout if page load timeout is set', function*() {
- yield driver.manage().timeouts().pageLoadTimeout(1);
- return driver.get(Pages.sleepingPage + '?time=3')
- .then(function() {
- throw Error('Should have timed out on page load');
- }, function(e) {
- if (!(e instanceof error.ScriptTimeoutError)
- && !(e instanceof error.TimeoutError)) {
- throw Error('Unexpected error response: ' + e);
- }
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/phantomjs/execute_phantomjs_test.js b/node_modules/selenium-webdriver/test/phantomjs/execute_phantomjs_test.js
deleted file mode 100644
index 8b7a99f8d..000000000
--- a/node_modules/selenium-webdriver/test/phantomjs/execute_phantomjs_test.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert');
-var path = require('path');
-var test = require('../../lib/test');
-
-test.suite(function(env) {
- var driver;
-
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- test.after(function() {
- return driver.quit();
- });
-
- var testPageUrl =
- 'data:text/html,<html><h1>' + path.basename(__filename) + '</h1></html>';
-
- test.beforeEach(function() {
- return driver.get(testPageUrl);
- });
-
- describe('phantomjs.Driver', function() {
- describe('#executePhantomJS()', function() {
-
- test.it('can execute scripts using PhantomJS API', function*() {
- let url = yield driver.executePhantomJS('return this.url;');
- assert.equal(testPageUrl, decodeURIComponent(url));
- });
-
- test.it('can execute scripts as functions', function*() {
- let result = yield driver.executePhantomJS(function(a, b) {
- return a + b;
- }, 1, 2);
-
- assert.equal(3, result);
- });
- });
- });
-}, {browsers: ['phantomjs']});
diff --git a/node_modules/selenium-webdriver/test/proxy_test.js b/node_modules/selenium-webdriver/test/proxy_test.js
deleted file mode 100644
index 442ff606e..000000000
--- a/node_modules/selenium-webdriver/test/proxy_test.js
+++ /dev/null
@@ -1,180 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var http = require('http'),
- url = require('url');
-
-var Browser = require('..').Browser,
- promise = require('..').promise,
- firefox = require('../firefox'),
- proxy = require('../proxy'),
- assert = require('../testing/assert'),
- test = require('../lib/test'),
- Server = require('../lib/test/httpserver').Server,
- Pages = test.Pages;
-
-test.suite(function(env) {
- function writeResponse(res, body, encoding, contentType) {
- res.writeHead(200, {
- 'Content-Length': Buffer.byteLength(body, encoding),
- 'Content-Type': contentType
- });
- res.end(body);
- }
-
- function writePacFile(res) {
- writeResponse(res, [
- 'function FindProxyForURL(url, host) {',
- ' if (shExpMatch(url, "' + goodbyeServer.url('*') + '")) {',
- ' return "DIRECT";',
- ' }',
- ' return "PROXY ' + proxyServer.host() + '";',
- '}'
- ].join('\n'), 'ascii', 'application/x-javascript-config');
- }
-
- var proxyServer = new Server(function(req, res) {
- var pathname = url.parse(req.url).pathname;
- if (pathname === '/proxy.pac') {
- return writePacFile(res);
- }
-
- writeResponse(res, [
- '<!DOCTYPE html>',
- '<title>Proxy page</title>',
- '<h3>This is the proxy landing page</h3>'
- ].join(''), 'utf8', 'text/html; charset=UTF-8');
- });
-
- var helloServer = new Server(function(req, res) {
- writeResponse(res, [
- '<!DOCTYPE html>',
- '<title>Hello</title>',
- '<h3>Hello, world!</h3>'
- ].join(''), 'utf8', 'text/html; charset=UTF-8');
- });
-
- var goodbyeServer = new Server(function(req, res) {
- writeResponse(res, [
- '<!DOCTYPE html>',
- '<title>Goodbye</title>',
- '<h3>Goodbye, world!</h3>'
- ].join(''), 'utf8', 'text/html; charset=UTF-8');
- });
-
- // Cannot pass start directly to mocha's before, as mocha will interpret the optional
- // port parameter as an async callback parameter.
- function mkStartFunc(server) {
- return function() {
- return server.start();
- };
- }
-
- test.before(mkStartFunc(proxyServer));
- test.before(mkStartFunc(helloServer));
- test.before(mkStartFunc(goodbyeServer));
-
- test.after(proxyServer.stop.bind(proxyServer));
- test.after(helloServer.stop.bind(helloServer));
- test.after(goodbyeServer.stop.bind(goodbyeServer));
-
- var driver;
- test.beforeEach(function() { driver = null; });
- test.afterEach(function() { return driver && driver.quit(); });
-
- function createDriver(proxy) {
- // For Firefox we need to explicitly enable proxies for localhost by
- // clearing the network.proxy.no_proxies_on preference.
- let profile = new firefox.Profile();
- profile.setPreference('network.proxy.no_proxies_on', '');
-
- return driver = env.builder()
- .setFirefoxOptions(new firefox.Options().setProfile(profile))
- .setProxy(proxy)
- .build();
- }
-
- // Proxy support not implemented.
- test.ignore(env.browsers(Browser.IE, Browser.OPERA, Browser.SAFARI)).
- describe('manual proxy settings', function() {
- // phantomjs 1.9.1 in webdriver mode does not appear to respect proxy
- // settings.
- test.ignore(env.browsers(Browser.PHANTOM_JS)).
- it('can configure HTTP proxy host', function*() {
- yield createDriver(proxy.manual({
- http: proxyServer.host()
- }));
-
- yield driver.get(helloServer.url());
- yield assert(driver.getTitle()).equalTo('Proxy page');
- yield assert(driver.findElement({tagName: 'h3'}).getText()).
- equalTo('This is the proxy landing page');
- });
-
- // PhantomJS does not support bypassing the proxy for individual hosts.
- // geckodriver does not support the bypass option, this must be configured
- // through profile preferences.
- test.ignore(env.browsers(
- Browser.FIREFOX,
- 'legacy-' + Browser.FIREFOX,
- Browser.PHANTOM_JS)).
- it('can bypass proxy for specific hosts', function*() {
- yield createDriver(proxy.manual({
- http: proxyServer.host(),
- bypass: helloServer.host()
- }));
-
- yield driver.get(helloServer.url());
- yield assert(driver.getTitle()).equalTo('Hello');
- yield assert(driver.findElement({tagName: 'h3'}).getText()).
- equalTo('Hello, world!');
-
- yield driver.get(goodbyeServer.url());
- yield assert(driver.getTitle()).equalTo('Proxy page');
- yield assert(driver.findElement({tagName: 'h3'}).getText()).
- equalTo('This is the proxy landing page');
- });
-
- // TODO: test ftp and https proxies.
- });
-
- // PhantomJS does not support PAC file proxy configuration.
- // Safari does not support proxies.
- test.ignore(env.browsers(
- Browser.IE, Browser.OPERA, Browser.PHANTOM_JS, Browser.SAFARI)).
- describe('pac proxy settings', function() {
- test.it('can configure proxy through PAC file', function*() {
- yield createDriver(proxy.pac(proxyServer.url('/proxy.pac')));
-
- yield driver.get(helloServer.url());
- yield assert(driver.getTitle()).equalTo('Proxy page');
- yield assert(driver.findElement({tagName: 'h3'}).getText()).
- equalTo('This is the proxy landing page');
-
- yield driver.get(goodbyeServer.url());
- yield assert(driver.getTitle()).equalTo('Goodbye');
- yield assert(driver.findElement({tagName: 'h3'}).getText()).
- equalTo('Goodbye, world!');
- });
- });
-
- // TODO: figure out how to test direct and system proxy settings.
- describe.skip('direct proxy settings', function() {});
- describe.skip('system proxy settings', function() {});
-});
diff --git a/node_modules/selenium-webdriver/test/rect_test.js b/node_modules/selenium-webdriver/test/rect_test.js
deleted file mode 100644
index e5ea36525..000000000
--- a/node_modules/selenium-webdriver/test/rect_test.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-
-const {By} = require('..');
-const test = require('../lib/test');
-
-test.suite(function(env) {
- describe('rect commands', function() {
- let driver;
- let el;
-
- test.before(function*() {
- driver = yield env.builder().build();
- yield driver.get(
- 'data:text/html,<!DOCTYPE html><style>'
- + '*{padding:0; margin:0}'
- + 'div{position: absolute; top: 50px; left: 50px;'
- + 'height: 50px;width:50px;background: green;}'
- + '</style><div>Hello</div>');
- el = yield driver.findElement(By.css('div'));
- });
-
- after(function() {
- if (driver) {
- return driver.quit();
- }
- });
-
- test.it('WebElement.getLocation()', function*() {
- let location = yield el.getLocation();
- assert.equal(location.x, 50);
- assert.equal(location.y, 50);
- });
-
- test.it('WebElement.getSize()', function*() {
- let size = yield el.getSize();
- assert.equal(size.width, 50);
- assert.equal(size.height, 50);
- });
-
- });
-});
diff --git a/node_modules/selenium-webdriver/test/remote_test.js b/node_modules/selenium-webdriver/test/remote_test.js
deleted file mode 100644
index 9b2b2eb73..000000000
--- a/node_modules/selenium-webdriver/test/remote_test.js
+++ /dev/null
@@ -1,117 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var assert = require('assert'),
- fs = require('fs'),
- path = require('path');
-
-var promise = require('../').promise,
- io = require('../io'),
- cmd = require('../lib/command'),
- remote = require('../remote');
-
-const {enablePromiseManager} = require('../lib/test/promise');
-
-describe('DriverService', function() {
- describe('start()', function() {
- var service;
-
- beforeEach(function() {
- service = new remote.DriverService(process.execPath, {
- port: 1234,
- args: ['-e', 'process.exit(1)']
- });
- });
-
- afterEach(function() {
- return service.kill();
- });
-
- it('fails if child-process dies', function() {
- this.timeout(1000);
- return service.start(500).then(expectFailure, verifyFailure);
- });
-
- enablePromiseManager(function() {
- describe(
- 'failures propagate through control flow if child-process dies',
- function() {
- it('', function() {
- this.timeout(1000);
-
- return promise.controlFlow().execute(function() {
- promise.controlFlow().execute(function() {
- return service.start(500);
- });
- }).then(expectFailure, verifyFailure);
- });
- });
- });
-
- function verifyFailure(e) {
- assert.ok(!(e instanceof promise.CancellationError));
- assert.equal('Server terminated early with status 1', e.message);
- }
-
- function expectFailure() {
- throw Error('expected to fail');
- }
- });
-});
-
-describe('FileDetector', function() {
- class ExplodingDriver {
- schedule() {
- throw Error('unexpected call');
- }
- }
-
- it('returns the original path if the file does not exist', function() {
- return io.tmpDir(dir => {
- let theFile = path.join(dir, 'not-there');
- return (new remote.FileDetector)
- .handleFile(new ExplodingDriver, theFile)
- .then(f => assert.equal(f, theFile));
- });
- });
-
- it('returns the original path if it is a directory', function() {
- return io.tmpDir(dir => {
- return (new remote.FileDetector)
- .handleFile(new ExplodingDriver, dir)
- .then(f => assert.equal(f, dir));
- });
- });
-
- it('attempts to upload valid files', function() {
- return io.tmpFile(theFile => {
- return (new remote.FileDetector)
- .handleFile(
- new (class FakeDriver {
- schedule(command) {
- assert.equal(command.getName(), cmd.Name.UPLOAD_FILE);
- assert.equal(typeof command.getParameters()['file'], 'string');
- return Promise.resolve('success!');
- }
- }),
- theFile)
- .then(f => assert.equal(f, 'success!'));
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/safari_test.js b/node_modules/selenium-webdriver/test/safari_test.js
deleted file mode 100644
index 6032b865d..000000000
--- a/node_modules/selenium-webdriver/test/safari_test.js
+++ /dev/null
@@ -1,108 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const webdriver = require('..'),
- proxy = require('../proxy'),
- safari = require('../safari'),
- assert = require('../testing/assert'),
- test = require('../lib/test');
-
-
-describe('safari.Options', function() {
- describe('fromCapabilities', function() {
- it('returns a new Options instance if none were defined', function() {
- let options = safari.Options.fromCapabilities(
- new webdriver.Capabilities());
- assert(options).instanceOf(safari.Options);
- });
-
- it('returns the options instance if present', function() {
- let options = new safari.Options().setCleanSession(true),
- caps = options.toCapabilities();
- assert(safari.Options.fromCapabilities(caps)).equalTo(options);
- });
-
- it('extracts supported WebDriver capabilities', function() {
- let proxyPrefs = proxy.direct(),
- logPrefs = {},
- caps = webdriver.Capabilities.chrome()
- .set(webdriver.Capability.PROXY, proxyPrefs)
- .set(webdriver.Capability.LOGGING_PREFS, logPrefs);
-
- let options = safari.Options.fromCapabilities(caps);
- assert(options.proxy_).equalTo(proxyPrefs);
- assert(options.logPrefs_).equalTo(logPrefs);
- });
- });
-
- describe('toCapabilities', function() {
- let options;
-
- before(function() {
- options = new safari.Options()
- .setCleanSession(true);
- });
-
- it('returns a new capabilities object if one is not provided', function() {
- let caps = options.toCapabilities();
- assert(caps).instanceOf(webdriver.Capabilities);
- assert(caps.get('browserName')).equalTo('safari');
- assert(caps.get('safari.options')).equalTo(options);
- });
-
- it('adds to input capabilities object', function() {
- let caps = webdriver.Capabilities.safari();
- assert(options.toCapabilities(caps)).equalTo(caps);
- assert(caps.get('safari.options')).equalTo(options);
- });
-
- it('sets generic driver capabilities', function() {
- let proxyPrefs = proxy.direct(),
- loggingPrefs = {};
-
- options
- .setLoggingPrefs(loggingPrefs)
- .setProxy(proxyPrefs);
-
- let caps = options.toCapabilities();
- assert(caps.get('proxy')).equalTo(proxyPrefs);
- assert(caps.get('loggingPrefs')).equalTo(loggingPrefs);
- });
- });
-});
-
-test.suite(function(env) {
- describe('safaridriver', function() {
- let service;
-
- afterEach(function() {
- if (service) {
- return service.kill();
- }
- });
-
- it('can start safaridriver', function() {
- service = new safari.ServiceBuilder().build();
-
- return service.start().then(function(url) {
- assert(url).matches(/127\.0\.0\.1/);
- });
- });
- });
-}, {browsers: ['safari']});
diff --git a/node_modules/selenium-webdriver/test/session_test.js b/node_modules/selenium-webdriver/test/session_test.js
deleted file mode 100644
index 546cd7fe9..000000000
--- a/node_modules/selenium-webdriver/test/session_test.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var WebDriver = require('..').WebDriver,
- assert = require('../testing/assert'),
- test = require('../lib/test'),
- Pages = test.Pages;
-
-
-test.suite(function(env) {
- var browsers = env.browsers;
-
- var driver;
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- test.after(function() {
- return driver.quit();
- });
-
- test.it('can connect to an existing session', function*() {
- yield driver.get(Pages.simpleTestPage);
- yield assert(driver.getTitle()).equalTo('Hello WebDriver');
-
- return driver.getSession().then(session1 => {
- let driver2 = WebDriver.attachToSession(
- driver.getExecutor(),
- session1.getId());
-
- return assert(driver2.getTitle()).equalTo('Hello WebDriver')
- .then(_ => {
- let session2Id = driver2.getSession().then(s => s.getId());
- return assert(session2Id).equalTo(session1.getId());
- });
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/stale_element_test.js b/node_modules/selenium-webdriver/test/stale_element_test.js
deleted file mode 100644
index d00b5d440..000000000
--- a/node_modules/selenium-webdriver/test/stale_element_test.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var fail = require('assert').fail;
-
-var Browser = require('..').Browser,
- By = require('..').By,
- error = require('..').error,
- until = require('..').until,
- assert = require('../testing/assert'),
- test = require('../lib/test'),
- Pages = test.Pages;
-
-
-test.suite(function(env) {
- var driver;
- test.before(function*() { driver = yield env.builder().build(); });
- test.after(function() { return driver.quit(); });
-
- // Element never goes stale in Safari.
- test.ignore(env.browsers(Browser.SAFARI)).
- it(
- 'dynamically removing elements from the DOM trigger a ' +
- 'StaleElementReferenceError',
- function*() {
- yield driver.get(Pages.javascriptPage);
-
- var toBeDeleted = yield driver.findElement(By.id('deleted'));
- yield assert(toBeDeleted.getTagName()).isEqualTo('p');
-
- yield driver.findElement(By.id('delete')).click();
- yield driver.wait(until.stalenessOf(toBeDeleted), 5000);
- });
-
- test.it('an element found in a different frame is stale', function*() {
- yield driver.get(Pages.missedJsReferencePage);
-
- var frame = yield driver.findElement(By.css('iframe[name="inner"]'));
- yield driver.switchTo().frame(frame);
-
- var el = yield driver.findElement(By.id('oneline'));
- yield driver.switchTo().defaultContent();
- return el.getText().then(fail, function(e) {
- assert(e).instanceOf(error.StaleElementReferenceError);
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/tag_name_test.js b/node_modules/selenium-webdriver/test/tag_name_test.js
deleted file mode 100644
index b934e6bb3..000000000
--- a/node_modules/selenium-webdriver/test/tag_name_test.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var By = require('..').By,
- assert = require('../testing/assert'),
- test = require('../lib/test');
-
-
-test.suite(function(env) {
- var driver;
- test.after(function() { return driver.quit(); });
-
- test.it('should return lower case tag name', function*() {
- driver = yield env.builder().build();
- yield driver.get(test.Pages.formPage);
-
- let el = yield driver.findElement(By.id('cheese'));
- return assert(el.getTagName()).equalTo('input');
- });
-});
diff --git a/node_modules/selenium-webdriver/test/testing/assert_test.js b/node_modules/selenium-webdriver/test/testing/assert_test.js
deleted file mode 100644
index eaced8bf1..000000000
--- a/node_modules/selenium-webdriver/test/testing/assert_test.js
+++ /dev/null
@@ -1,373 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('../../testing/assert');
-
-const AssertionError = require('assert').AssertionError;
-const assertTrue = require('assert').ok;
-const assertEqual = require('assert').equal;
-const assertThrows = require('assert').throws;
-const fail = require('assert').fail;
-
-
-describe('assert', function() {
- describe('atLeast', function() {
- it('compares subject >= value', function() {
- assert(1).atLeast(0);
- assert(1).atLeast(1);
- assertThrows(() => assert(1).atLeast(2));
- });
-
- it('accepts failure message', function() {
- assertThrows(
- () => assert(1).atLeast(2, 'hi there!'),
- (error) => error.message.indexOf('hi there') != -1);
- });
-
- it('fails if given a non-numeric subject', function() {
- assertThrows(() => assert('a').atLeast(1));
- });
-
- it('fails if given a non-numeric bound', function() {
- assertThrows(() => assert(1).atLeast('a'));
- });
-
- it('waits for promised subject', function() {
- return assert(Promise.resolve(123)).atLeast(100);
- });
-
- it('waits for promised subject (with failure)', function() {
- return assert(Promise.resolve(100))
- .atLeast(123)
- .then(() => fail('should have failed'), function(e) {
- assertInstanceOf(AssertionError, e);
- assertEqual('100 >= 123', e.message);
- });
- });
- });
-
- describe('atMost', function() {
- it('compares subject <= value', function() {
- assertThrows(() => assert(1).atMost(0));
- assert(1).atMost(1);
- assert(1).atMost(2);
- });
-
- it('accepts failure message', function() {
- assertThrows(
- () => assert(1).atMost(0, 'hi there!'),
- (error) => error.message.indexOf('hi there!') != -1);
- });
-
- it('fails if given a non-numeric subject', function() {
- assertThrows(() => assert(1).atMost('a'));
- });
-
- it('fails if given a non-numeric bound', function() {
- assertThrows(() => assert('a').atMost(1));
- });
-
- it('waits for promised subject', function() {
- return assert(Promise.resolve(100)).atMost(123);
- });
-
- it('waits for promised subject (with failure)', function() {
- return assert(Promise.resolve(123))
- .atMost(100)
- .then(() => fail('should have failed'), function(e) {
- assertInstanceOf(AssertionError, e);
- assertEqual('123 <= 100', e.message);
- });
- });
- });
-
- describe('greaterThan', function() {
- it('compares subject > value', function() {
- assertThrows(() => assert(1).greaterThan(1));
- assertThrows(() => assert(1).greaterThan(2));
- assert(2).greaterThan(1);
- });
-
- it('accepts failure message', function() {
- assertThrows(
- () => assert(0).greaterThan(1, 'hi there!'),
- (error) => error.message.indexOf('hi there!') != -1);
- });
-
- it('fails if given a non-numeric subject', function() {
- assertThrows(() => assert('a').atMost(1));
- });
-
- it('fails if given a non-numeric bound', function() {
- assertThrows(() => assert(1).atMost('a'));
- });
-
- it('waits for promised subject', function() {
- return assert(Promise.resolve(123)).greaterThan(100);
- });
-
- it('waits for promised subject (with failure)', function() {
- return assert(Promise.resolve(100))
- .greaterThan(123)
- .then(() => fail('should have failed'), function(e) {
- assertInstanceOf(AssertionError, e);
- assertEqual('100 > 123', e.message);
- });
- });
- });
-
- describe('lessThan', function() {
- it('compares subject < value', function() {
- assertThrows(() => assert(1).lessThan(0));
- assertThrows(() => assert(1).lessThan(1));
- assert(1).lessThan(2);
- });
-
- it('accepts failure message', function() {
- assertThrows(
- () => assert(1).lessThan(0, 'hi there!'),
- (error) => error.message.indexOf('hi there!') != -1);
- });
-
- it('fails if given a non-numeric subject', function() {
- assertThrows(() => assert('a').lessThan(1));
- });
-
- it('fails if given a non-numeric bound', function() {
- assertThrows(() => assert(1).lessThan('a'));
- });
-
- it('waits for promised subject', function() {
- return assert(Promise.resolve(100)).lessThan(123);
- });
-
- it('waits for promised subject (with failure)', function() {
- return assert(Promise.resolve(123))
- .lessThan(100)
- .then(() => fail('should have failed'), function(e) {
- assertInstanceOf(AssertionError, e);
- assertEqual('123 < 100', e.message);
- });
- });
- });
-
- describe('closeTo', function() {
- it('accepts values within epislon of target', function() {
- assert(123).closeTo(123, 0);
- assert(123).closeTo(124, 1);
- assert(125).closeTo(124, 1);
-
- assertThrows(() => assert(123).closeTo(125, .1));
- assertThrows(() => assert(1./3).closeTo(.8, .01));
- });
-
- it('waits for promised values', function() {
- let p = new Promise(resolve => setTimeout(() => resolve(123), 10));
- return assert(p).closeTo(124, 1);
- });
- });
-
- describe('instanceOf', function() {
- it('works with direct instances', function() {
- assert(Error('foo')).instanceOf(Error);
- });
-
- it('works with sub-types', function() {
- assert(TypeError('foo')).instanceOf(Error);
- });
-
- it('parent types are not instances of sub-types', function() {
- assertThrows(() => assert(Error('foo')).instanceOf(TypeError));
- });
- });
-
- describe('isNull', function() {
- it('normal case', function() {
- assert(null).isNull();
- assertThrows(() => assert(1).isNull());
- });
-
- it('handles promised values', function() {
- let p = new Promise(function(f) {
- setTimeout(() => f(null), 10);
- });
- return assert(p).isNull();
- });
-
- it('does not match on undefined', function() {
- assertThrows(() => assert(void(0)).isNull());
- })
- });
-
- describe('isUndefined', function() {
- it('normal case', function() {
- assert(void(0)).isUndefined();
- assertThrows(() => assert(1).isUndefined());
- });
-
- it('handles promised values', function() {
- let p = new Promise(function(f) {
- setTimeout(() => f(void(0)), 10);
- });
- return assert(p).isUndefined();
- });
-
- it('does not match on null', function() {
- assertThrows(() => assert(null).isUndefined());
- })
- });
-
- describe('contains', function() {
- it('works with strings', function() {
- assert('abc').contains('a');
- assert('abc').contains('ab');
- assert('abc').contains('abc');
- assert('abc').contains('bc');
- assert('abc').contains('c');
- assertThrows(() => assert('abc').contains('d'));
- });
-
- it('works with arrays', function() {
- assert([1, 2, 3]).contains(1);
- assert([1, 2, 3]).contains(2);
- assert([1, 2, 3]).contains(3);
- assertThrows(() => assert([1, 2]).contains(3));
- });
-
- it('works with maps', function() {
- let m = new Map;
- m.set(1, 2);
- assert(m).contains(1);
- assertThrows(() => assert(m).contains(2));
- });
-
- it('works with sets', function() {
- let s = new Set;
- s.add(1);
- assert(s).contains(1);
- assertThrows(() => assert(s).contains(2));
- });
-
- it('requires an array, string, map, or set subject', function() {
- assertThrows(() => assert(123).contains('a'));
- });
- });
-
- describe('endsWith', function() {
- it('works', function() {
- assert('abc').endsWith('abc');
- assert('abc').endsWith('bc');
- assert('abc').endsWith('c');
- assertThrows(() => assert('abc').endsWith('d'));
- })
- });
-
- describe('startsWith', function() {
- it('works', function() {
- assert('abc').startsWith('abc');
- assert('abc').startsWith('ab');
- assert('abc').startsWith('a');
- assertThrows(() => assert('abc').startsWith('d'));
- })
- });
-
- describe('matches', function() {
- it('requires a regex value', function() {
- assertThrows(() => assert('abc').matches(1234));
- });
-
- it('requires a string value', function() {
- assertThrows(() => assert(1234).matches(/abc/));
- });
-
- it('requires a string value (promise case)', function() {
- return assert(Promise.resolve(1234))
- .matches(/abc/)
- .then(fail, function(error) {
- assertEqual(
- 'Expected a string matching /abc/, got <1234> (number)',
- error.message);
- });
- });
-
- it('applies regex', function() {
- assert('abc').matches(/abc/);
- assertThrows(() => assert('def').matches(/abc/));
- });
- });
-
- describe('isTrue', function() {
- it('only accepts booleans', function() {
- assertThrows(() => assert(123).isTrue());
- });
-
- it('accepts true values', function() {
- assert(true).isTrue();
- assert(Boolean('abc')).isTrue();
- return assert(Promise.resolve(true)).isTrue();
- });
-
- it('rejects false values', function() {
- assertThrows(() => assert(false).isTrue());
- assertThrows(() => assert(Boolean(0)).isTrue());
- return assert(Promise.resolve(false)).isTrue()
- .then(fail, function() {/*no-op, ok*/});
- });
- });
-
- describe('isFalse', function() {
- it('only accepts booleans', function() {
- assertThrows(() => assert(123).isFalse());
- })
-
- it('accepts false values', function() {
- assert(false).isFalse();
- assert(Boolean('')).isFalse();
- return assert(Promise.resolve(false)).isFalse();
- });
-
- it('rejects true values', function() {
- assertThrows(() => assert(true).isFalse());
- assertThrows(() => assert(Boolean(1)).isFalse());
- return assert(Promise.resolve(true)).isFalse()
- .then(fail, function() {/*no-op, ok*/});
- });
- });
-
- describe('isEqualTo', function() {
- it('is strict equality', function() {
- assert('abc').isEqualTo('abc');
- assert('abc').equals('abc');
- assert('abc').equalTo('abc');
- assertThrows(() => assert('1').isEqualTo(1));
- });
- });
-
- describe('notEqualTo', function() {
- it('tests strict equality', function() {
- assert('1').notEqualTo(1);
- assert(1).notEqualTo('1');
- assertThrows(() => assert('abc').notEqualTo('abc'));
- });
- });
-
- function assertInstanceOf(ctor, value) {
- assertTrue(value instanceof ctor);
- }
-});
diff --git a/node_modules/selenium-webdriver/test/testing/index_test.js b/node_modules/selenium-webdriver/test/testing/index_test.js
deleted file mode 100644
index edc841bbe..000000000
--- a/node_modules/selenium-webdriver/test/testing/index_test.js
+++ /dev/null
@@ -1,224 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-const assert = require('assert');
-const promise = require('../..').promise;
-const {enablePromiseManager} = require('../../lib/test/promise');
-
-
-var test = require('../../testing');
-
-describe('Mocha Integration', function() {
-
- describe('beforeEach properly binds "this"', function() {
- beforeEach(function() { this.x = 1; });
- test.beforeEach(function() { this.x = 2; });
- it('', function() { assert.equal(this.x, 2); });
- });
-
- describe('afterEach properly binds "this"', function() {
- it('', function() { this.x = 1; });
- test.afterEach(function() { this.x = 2; });
- afterEach(function() { assert.equal(this.x, 2); });
- });
-
- describe('it properly binds "this"', function() {
- beforeEach(function() { this.x = 1; });
- test.it('', function() { this.x = 2; });
- afterEach(function() { assert.equal(this.x, 2); });
- });
-
- enablePromiseManager(function() {
- describe('timeout handling', function() {
- describe('it does not reset the control flow on a non-timeout', function() {
- var flowReset = false;
-
- beforeEach(function() {
- flowReset = false;
- test.controlFlow().once(promise.ControlFlow.EventType.RESET, onreset);
- });
-
- test.it('', function() {
- this.timeout(100);
- return promise.delayed(50);
- });
-
- afterEach(function() {
- assert.ok(!flowReset);
- test.controlFlow().removeListener(
- promise.ControlFlow.EventType.RESET, onreset);
- });
-
- function onreset() {
- flowReset = true;
- }
- });
-
- describe('it resets the control flow after a timeout' ,function() {
- var timeoutErr, flowReset;
-
- beforeEach(function() {
- flowReset = false;
- test.controlFlow().once(promise.ControlFlow.EventType.RESET, onreset);
- });
-
- test.it('', function() {
- var callback = this.runnable().callback;
- var test = this;
- this.runnable().callback = function(err) {
- timeoutErr = err;
- // Reset our timeout to 0 so Mocha does not fail the test.
- test.timeout(0);
- // When we invoke the real callback, do not pass along the error so
- // Mocha does not fail the test.
- return callback.call(this);
- };
-
- test.timeout(50);
- return promise.defer().promise;
- });
-
- afterEach(function() {
- return Promise.resolve().then(function() {
- test.controlFlow().removeListener(
- promise.ControlFlow.EventType.RESET, onreset);
- assert.ok(flowReset, 'control flow was not reset after a timeout');
- });
- });
-
- function onreset() {
- flowReset = true;
- }
- });
- });
-
- describe('async "done" support', function() {
- this.timeout(2*1000);
-
- var waited = false;
- var DELAY = 100; // ms enough to notice
-
- // Each test asynchronously sets waited to true, so clear/check waited
- // before/after:
- beforeEach(function() {
- waited = false;
- });
-
- afterEach(function() {
- assert.strictEqual(waited, true);
- });
-
- // --- First, vanilla mocha "it" should support the "done" callback correctly.
-
- // This 'it' should block until 'done' is invoked
- it('vanilla delayed', function(done) {
- setTimeout(function delayedVanillaTimeout() {
- waited = true;
- done();
- }, DELAY);
- });
-
- // --- Now with the webdriver wrappers for 'it' should support the "done" callback:
-
- test.it('delayed', function(done) {
- assert(done);
- assert.strictEqual(typeof done, 'function');
- setTimeout(function delayedTimeoutCallback() {
- waited = true;
- done();
- }, DELAY);
- });
-
- // --- And test that the webdriver wrapper for 'it' works with a returned promise, too:
-
- test.it('delayed by promise', function() {
- var defer = promise.defer();
- setTimeout(function delayedPromiseCallback() {
- waited = true;
- defer.fulfill('ignored');
- });
- return defer.promise;
- });
- });
-
- describe('ControlFlow and "done" work together', function() {
- var flow, order;
- before(function() {
- order = [];
- flow = test.controlFlow();
- flow.execute(function() { order.push(1); });
- });
-
- test.it('control flow updates and async done', function(done) {
- flow.execute(function() { order.push(2); });
- flow.execute(function() { order.push(3); }).then(function() {
- order.push(4);
- });
- done();
- });
-
- after(function() {
- assert.deepEqual([1, 2, 3, 4], order);
- });
- });
- });
-
- describe('generator support', function() {
- let arr;
-
- beforeEach(() => arr = []);
- afterEach(() => assert.deepEqual(arr, [0, 1, 2, 3]));
-
- test.it('sync generator', function* () {
- arr.push(yield arr.length);
- arr.push(yield arr.length);
- arr.push(yield arr.length);
- arr.push(yield arr.length);
- });
-
- test.it('async generator', function* () {
- arr.push(yield Promise.resolve(arr.length));
- arr.push(yield Promise.resolve(arr.length));
- arr.push(yield Promise.resolve(arr.length));
- arr.push(yield Promise.resolve(arr.length));
- });
-
- test.it('generator returns promise', function*() {
- arr.push(yield Promise.resolve(arr.length));
- arr.push(yield Promise.resolve(arr.length));
- arr.push(yield Promise.resolve(arr.length));
- setTimeout(_ => arr.push(arr.length), 10);
- return new Promise((resolve) => setTimeout(_ => resolve(), 25));
- });
-
- describe('generator runs with proper "this" context', () => {
- before(function() { this.values = [0, 1, 2, 3]; });
- test.it('', function*() {
- arr = this.values;
- });
- });
-
- it('generator function must not take a callback', function() {
- arr = [0, 1, 2, 3]; // For teardown hook.
- assert.throws(_ => {
- test.it('', function*(done){});
- }, TypeError);
- });
- });
-});
diff --git a/node_modules/selenium-webdriver/test/upload_test.js b/node_modules/selenium-webdriver/test/upload_test.js
deleted file mode 100644
index c677550fc..000000000
--- a/node_modules/selenium-webdriver/test/upload_test.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var fs = require('fs');
-
-var Browser = require('..').Browser,
- By = require('..').By,
- until = require('..').until,
- io = require('../io'),
- remote = require('../remote'),
- assert = require('../testing/assert'),
- test = require('../lib/test'),
- Pages = test.Pages;
-
-test.suite(function(env) {
- var LOREM_IPSUM_TEXT = 'lorem ipsum dolor sit amet';
- var FILE_HTML = '<!DOCTYPE html><div>' + LOREM_IPSUM_TEXT + '</div>';
-
- var fp;
- test.before(function() {
- return fp = io.tmpFile().then(function(fp) {
- fs.writeFileSync(fp, FILE_HTML);
- return fp;
- });
- })
-
- var driver;
- test.before(function*() {
- driver = yield env.builder().build();
- });
-
- test.after(function() {
- if (driver) {
- return driver.quit();
- }
- });
-
- test.ignore(env.browsers(
- Browser.IPAD,
- Browser.IPHONE,
- // Uploads broken in PhantomJS 2.0.
- // See https://github.com/ariya/phantomjs/issues/12506
- Browser.PHANTOM_JS,
- Browser.SAFARI)).
- it('can upload files', function*() {
- driver.setFileDetector(new remote.FileDetector);
-
- yield driver.get(Pages.uploadPage);
-
- var fp = yield driver.call(function() {
- return io.tmpFile().then(function(fp) {
- fs.writeFileSync(fp, FILE_HTML);
- return fp;
- });
- });
-
- yield driver.findElement(By.id('upload')).sendKeys(fp);
- yield driver.findElement(By.id('go')).click();
-
- // Uploading files across a network may take a while, even if they're small.
- var label = yield driver.findElement(By.id('upload_label'));
- yield driver.wait(until.elementIsNotVisible(label),
- 10 * 1000, 'File took longer than 10 seconds to upload!');
-
- var frame = yield driver.findElement(By.id('upload_target'));
- yield driver.switchTo().frame(frame);
- yield assert(driver.findElement(By.css('body')).getText())
- .equalTo(LOREM_IPSUM_TEXT);
- });
-});
diff --git a/node_modules/selenium-webdriver/test/window_test.js b/node_modules/selenium-webdriver/test/window_test.js
deleted file mode 100644
index 73cdd802d..000000000
--- a/node_modules/selenium-webdriver/test/window_test.js
+++ /dev/null
@@ -1,161 +0,0 @@
-// Licensed to the Software Freedom Conservancy (SFC) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The SFC licenses this file
-// to you 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.
-
-'use strict';
-
-var Browser = require('..').Browser,
- By = require('..').By,
- assert = require('../testing/assert'),
- test = require('../lib/test');
-
-
-test.suite(function(env) {
- var driver;
-
- test.before(function*() { driver = yield env.builder().build(); });
- test.after(function() { return driver.quit(); });
-
- test.beforeEach(function() {
- return driver.switchTo().defaultContent();
- });
-
- test.it('can set size of the current window', function*() {
- yield driver.get(test.Pages.echoPage);
- yield changeSizeBy(-20, -20);
- });
-
- test.it('can set size of the current window from frame', function*() {
- yield driver.get(test.Pages.framesetPage);
-
- var frame = yield driver.findElement({css: 'frame[name="fourth"]'});
- yield driver.switchTo().frame(frame);
- yield changeSizeBy(-20, -20);
- });
-
- test.it('can set size of the current window from iframe', function*() {
- yield driver.get(test.Pages.iframePage);
-
- var frame = yield driver.findElement({css: 'iframe[name="iframe1-name"]'});
- yield driver.switchTo().frame(frame);
- yield changeSizeBy(-20, -20);
- });
-
- test.it('can switch to a new window', function*() {
- yield driver.get(test.Pages.xhtmlTestPage);
-
- let handle = yield driver.getWindowHandle();
- let originalHandles = yield driver.getAllWindowHandles();
-
- yield driver.findElement(By.linkText("Open new window")).click();
- yield driver.wait(forNewWindowToBeOpened(originalHandles), 2000);
- yield assert(driver.getTitle()).equalTo("XHTML Test Page");
-
- let newHandle = yield getNewWindowHandle(originalHandles);
-
- yield driver.switchTo().window(newHandle);
- yield assert(driver.getTitle()).equalTo("We Arrive Here");
- });
-
- test.it('can set the window position of the current window', function*() {
- let position = yield driver.manage().window().getPosition();
-
- yield driver.manage().window().setSize(640, 480);
- yield driver.manage().window().setPosition(position.x + 10, position.y + 10);
-
- // For phantomjs, setPosition is a no-op and the "window" stays at (0, 0)
- if (env.currentBrowser() === Browser.PHANTOM_JS) {
- position = yield driver.manage().window().getPosition();
- assert(position.x).equalTo(0);
- assert(position.y).equalTo(0);
- } else {
- var dx = position.x + 10;
- var dy = position.y + 10;
- return driver.wait(forPositionToBe(dx, dy), 1000);
- }
- });
-
- test.it('can set the window position from a frame', function*() {
- yield driver.get(test.Pages.iframePage);
-
- let frame = yield driver.findElement(By.name('iframe1-name'));
- yield driver.switchTo().frame(frame);
-
- let position = yield driver.manage().window().getPosition();
- yield driver.manage().window().setSize(640, 480);
- yield driver.manage().window().setPosition(position.x + 10, position.y + 10);
-
- // For phantomjs, setPosition is a no-op and the "window" stays at (0, 0)
- if (env.currentBrowser() === Browser.PHANTOM_JS) {
- return driver.manage().window().getPosition().then(function(position) {
- assert(position.x).equalTo(0);
- assert(position.y).equalTo(0);
- });
- } else {
- var dx = position.x + 10;
- var dy = position.y + 10;
- return driver.wait(forPositionToBe(dx, dy), 1000);
- }
- });
-
- function changeSizeBy(dx, dy) {
- return driver.manage().window().getSize().then(function(size) {
- return driver.manage().window()
- .setSize(size.width + dx, size.height + dy)
- .then(_ => {
- return driver.wait(
- forSizeToBe(size.width + dx, size.height + dy), 1000);
- });
- });
- }
-
- function forSizeToBe(w, h) {
- return function() {
- return driver.manage().window().getSize().then(function(size) {
- return size.width === w && size.height === h;
- });
- };
- }
-
- function forPositionToBe(x, y) {
- return function() {
- return driver.manage().window().getPosition().then(function(position) {
- return position.x === x &&
- // On OSX, the window height may be bumped down 22px for the top
- // status bar.
- // On Linux, Opera's window position will be off by 28px.
- (position.y >= y && position.y <= (y + 28));
- });
- };
- }
-
- function forNewWindowToBeOpened(originalHandles) {
- return function() {
- return driver.getAllWindowHandles().then(function(currentHandles) {
- return currentHandles.length > originalHandles.length;
- });
- };
- }
-
- function getNewWindowHandle(originalHandles) {
- // Note: this assumes there's just one new window.
- return driver.getAllWindowHandles().then(function(currentHandles) {
- return currentHandles.filter(function(i) {
- return originalHandles.indexOf(i) < 0;
- })[0];
- });
- }
-});