| // 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('node:assert') |
| const http = require('node:http') |
| |
| const error = require('selenium-webdriver/lib/error') |
| const util = require('selenium-webdriver/http/util') |
| |
| describe('selenium-webdriver/http/util', function () { |
| let server, baseUrl |
| |
| let status, value, responseCode |
| |
| function startServer(done) { |
| if (server) return done() |
| |
| server = http.createServer(function (_req, res) { |
| const 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) |
| |
| const 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.strictEqual('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.strictEqual(err.code, error.WebDriverError.code) |
| assert.strictEqual(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.strictEqual(err.code, error.WebDriverError.code) |
| assert.strictEqual(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 util.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 util.CancellationError), |
| ) |
| }) |
| }) |
| }) |