Path: blob/trunk/javascript/webdriver/test/http/http_test.js
2868 views
// Licensed to the Software Freedom Conservancy (SFC) under one1// or more contributor license agreements. See the NOTICE file2// distributed with this work for additional information3// regarding copyright ownership. The SFC licenses this file4// to you under the Apache License, Version 2.0 (the5// "License"); you may not use this file except in compliance6// with the License. You may obtain a copy of the License at7//8// http://www.apache.org/licenses/LICENSE-2.09//10// Unless required by applicable law or agreed to in writing,11// software distributed under the License is distributed on an12// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY13// KIND, either express or implied. See the License for the14// specific language governing permissions and limitations15// under the License.1617goog.require('bot.ErrorCode');18goog.require('goog.Promise');19goog.require('goog.Uri');20goog.require('goog.testing.MockControl');21goog.require('goog.testing.jsunit');22goog.require('goog.userAgent');23goog.require('webdriver.Command');24goog.require('webdriver.http.Client');25goog.require('webdriver.http.Executor');26goog.require('webdriver.test.testutil');2728// Alias for readability.29var callbackHelper = webdriver.test.testutil.callbackHelper;3031var control = new goog.testing.MockControl();32var mockClient, executor, onCallback, onErrback;3334function shouldRunTests() {35return !goog.userAgent.IE || goog.userAgent.isVersionOrHigher(10);36}3738function setUp() {39mockClient = control.createStrictMock(webdriver.http.Client);4041executor = new webdriver.http.Executor(mockClient);42}4344function tearDown() {45control.$tearDown();46}4748function assertSuccess() {49onErrback.assertNotCalled('Did not expect errback');50onCallback.assertCalled('Expected callback');51}5253function assertFailure() {54onCallback.assertNotCalled('Did not expect callback');55onErrback.assertCalled('Expected errback');56}5758function headersToString(headers) {59var str = [];60for (var key in headers) {61str.push(key + ': ' + headers[key]);62}63return str.join('\n');64}6566function expectRequest(method, path, data, headers) {67var description = method + ' ' + path + '\n' + headersToString(headers) +68'\n' + JSON.stringify(data);6970return mockClient.send(new goog.testing.mockmatchers.ArgumentMatcher(71function(request) {72assertEquals('wrong method', method, request.method);73assertEquals('wrong path', path + '', request.path);74webdriver.test.testutil.assertObjectEquals(data, request.data);75assertNull(76'Wrong headers for request:\n' + description +77'\n Actual headers were:\n' + headersToString(request.headers),78goog.testing.asserts.findDifferences(headers, request.headers));79return true;80}, description));81}8283function response(status, headers, body) {84return new webdriver.http.Response(status, headers, body);85}8687function respondsWith(error, opt_response) {88return function() {89if (error) {90return goog.Promise.reject(error);91} else {92return goog.Promise.resolve(opt_response);93}94};95}9697///////////////////////////////////////////////////////////////////////////////98//99// Tests100//101///////////////////////////////////////////////////////////////////////////////102103function testBuildPath() {104var parameters = {'sessionId':'foo', 'url':'http://www.google.com'};105var finalPath = webdriver.http.Executor.buildPath_(106'/session/:sessionId/url', parameters);107assertEquals('/session/foo/url', finalPath);108webdriver.test.testutil.assertObjectEquals({'url':'http://www.google.com'},109parameters);110}111112function testBuildPath_withWebElement() {113var parameters = {'sessionId':'foo', 'id': {}};114parameters['id']['ELEMENT'] = 'bar';115116var finalPath = webdriver.http.Executor.buildPath_(117'/session/:sessionId/element/:id/click', parameters);118assertEquals('/session/foo/element/bar/click', finalPath);119webdriver.test.testutil.assertObjectEquals({}, parameters);120}121122function testBuildPath_throwsIfMissingParameter() {123assertThrows(goog.partial(webdriver.http.Executor.buildPath_,124'/session/:sessionId', {}));125126assertThrows(goog.partial(webdriver.http.Executor.buildPath_,127'/session/:sessionId/element/:id', {'sessionId': 'foo'}));128}129130function testBuildPath_doesNotMatchOnSegmentsThatDoNotStartWithColon() {131assertEquals('/session/foo:bar/baz',132webdriver.http.Executor.buildPath_('/session/foo:bar/baz', {}));133}134135function testExecute_rejectsUnrecognisedCommands() {136assertThrows(goog.bind(executor.execute, executor,137new webdriver.Command('fake-command-name')));138}139140/**141* @param {!webdriver.Command} command The command to send.142* @param {!Function=} opt_onSuccess The function to check the response with.143*/144function assertSendsSuccessfully(command, opt_onSuccess) {145return executor.execute(command)146.then(function(response) {147control.$verifyAll();148if (opt_onSuccess) {149opt_onSuccess(response);150}151});152}153154/**155* @param {!webdriver.Command} command The command to send.156* @param {!Function=} opt_onError The function to check the error with.157*/158function assertFailsToSend(command, opt_onError) {159return executor.execute(command)160.then(fail, function(e) {161control.$verifyAll();162if (opt_onError) {163opt_onError(e);164}165});166}167168function testExecute_clientFailsToSendRequest() {169var error = new Error('boom');170expectRequest('POST', '/session', {}, {171'Accept': 'application/json; charset=utf-8'172}).173$does(respondsWith(error));174control.$replayAll();175176return assertFailsToSend(177new webdriver.Command(webdriver.CommandName.NEW_SESSION),178function(e) {179assertEquals(error, e);180});181}182183function testExecute_commandWithNoUrlParameters() {184expectRequest('POST', '/session', {}, {185'Accept': 'application/json; charset=utf-8'186}).187$does(respondsWith(null, response(200, {}, '')));188control.$replayAll();189190return assertSendsSuccessfully(191new webdriver.Command(webdriver.CommandName.NEW_SESSION));192}193194function testExecute_rejectsCommandsMissingUrlParameters() {195var command =196new webdriver.Command(webdriver.CommandName.FIND_CHILD_ELEMENT).197setParameter('sessionId', 's123').198// Let this be missing: setParameter('id', {'ELEMENT': 'e456'}).199setParameter('using', 'id').200setParameter('value', 'foo');201202control.$replayAll();203assertThrows(goog.bind(executor.execute, executor, command));204control.$verifyAll();205}206207function testExecute_replacesUrlParametersWithCommandParameters() {208var command =209new webdriver.Command(webdriver.CommandName.GET).210setParameter('sessionId', 's123').211setParameter('url', 'http://www.google.com');212213expectRequest('POST', '/session/s123/url',214{'url': 'http://www.google.com'},215{'Accept': 'application/json; charset=utf-8'}).216$does(respondsWith(null, response(200, {}, '')));217control.$replayAll();218219return assertSendsSuccessfully(command);220}221222function testExecute_returnsParsedJsonResponse() {223var responseObj = {224'status': bot.ErrorCode.SUCCESS,225'value': 'http://www.google.com'226};227var command = new webdriver.Command(webdriver.CommandName.GET_CURRENT_URL).228setParameter('sessionId', 's123');229230expectRequest('GET', '/session/s123/url', {}, {231'Accept': 'application/json; charset=utf-8'232}).$does(respondsWith(null,233response(200, {'Content-Type': 'application/json'},234JSON.stringify(responseObj))));235control.$replayAll();236237return assertSendsSuccessfully(command, function(response) {238webdriver.test.testutil.assertObjectEquals(responseObj, response);239});240}241242function testExecute_returnsSuccessFor2xxWithBodyAsValueWhenNotJson() {243var command = new webdriver.Command(webdriver.CommandName.GET_CURRENT_URL).244setParameter('sessionId', 's123');245246expectRequest('GET', '/session/s123/url', {}, {247'Accept': 'application/json; charset=utf-8'248}).$does(respondsWith(null,249response(200, {}, 'hello, world\r\ngoodbye, world!')));250control.$replayAll();251252return assertSendsSuccessfully(command, function(response) {253webdriver.test.testutil.assertObjectEquals({254'status': bot.ErrorCode.SUCCESS,255'value': 'hello, world\ngoodbye, world!'256}, response);257});258}259260function testExecute_returnsSuccessFor2xxInvalidJsonBody() {261var invalidJson = '[';262expectRequest('POST', '/session', {}, {263'Accept': 'application/json; charset=utf-8'264}).265$does(respondsWith(null, response(200, {266'Content-Type': 'application/json'267}, invalidJson)));268control.$replayAll();269270return assertSendsSuccessfully(271new webdriver.Command(webdriver.CommandName.NEW_SESSION),272function(response) {273webdriver.test.testutil.assertObjectEquals({274'status': bot.ErrorCode.SUCCESS,275'value': invalidJson276}, response);277});278}279280function testExecute_returnsUnknownCommandFor404WithBodyAsValueWhenNotJson() {281var command = new webdriver.Command(webdriver.CommandName.GET_CURRENT_URL).282setParameter('sessionId', 's123');283284expectRequest('GET', '/session/s123/url', {}, {285'Accept': 'application/json; charset=utf-8'286}).$does(respondsWith(null,287response(404, {}, 'hello, world\r\ngoodbye, world!')));288control.$replayAll();289290return assertSendsSuccessfully(command, function(response) {291webdriver.test.testutil.assertObjectEquals({292'status': bot.ErrorCode.UNKNOWN_COMMAND,293'value': 'hello, world\ngoodbye, world!'294}, response);295});296}297298function testExecute_returnsUnknownErrorForGenericErrorCodeWithBodyAsValueWhenNotJson() {299var command = new webdriver.Command(webdriver.CommandName.GET_CURRENT_URL).300setParameter('sessionId', 's123');301302expectRequest('GET', '/session/s123/url', {}, {303'Accept': 'application/json; charset=utf-8'304}).$does(respondsWith(null,305response(500, {}, 'hello, world\r\ngoodbye, world!')));306control.$replayAll();307308return assertSendsSuccessfully(command, function(response) {309webdriver.test.testutil.assertObjectEquals({310'status': bot.ErrorCode.UNKNOWN_ERROR,311'value': 'hello, world\ngoodbye, world!'312}, response);313});314}315316function testExecute_attemptsToParseBodyWhenNoContentTypeSpecified() {317var responseObj = {318'status': bot.ErrorCode.SUCCESS,319'value': 'http://www.google.com'320};321var command = new webdriver.Command(webdriver.CommandName.GET_CURRENT_URL).322setParameter('sessionId', 's123');323324expectRequest('GET', '/session/s123/url', {}, {325'Accept': 'application/json; charset=utf-8'326}).$does(respondsWith(null,327response(200, {}, JSON.stringify(responseObj))));328control.$replayAll();329330return assertSendsSuccessfully(command, function(response) {331webdriver.test.testutil.assertObjectEquals(responseObj, response);332});333}334335function testCanDefineNewCommands() {336executor.defineCommand('greet', 'GET', '/person/:name');337338var command = new webdriver.Command('greet').339setParameter('name', 'Bob');340341expectRequest('GET', '/person/Bob', {},342{'Accept': 'application/json; charset=utf-8'}).343$does(respondsWith(null, response(200, {}, '')));344control.$replayAll();345346return assertSendsSuccessfully(command);347}348349function testCanRedefineStandardCommands() {350executor.defineCommand(webdriver.CommandName.GO_BACK,351'POST', '/custom/back');352353var command = new webdriver.Command(webdriver.CommandName.GO_BACK).354setParameter('times', 3);355356expectRequest('POST', '/custom/back',357{'times': 3},358{'Accept': 'application/json; charset=utf-8'}).359$does(respondsWith(null, response(200, {}, '')));360control.$replayAll();361362return assertSendsSuccessfully(command);363}364365function FakeXmlHttpRequest(headers, status, responseText) {366return {367getAllResponseHeaders: function() { return headers; },368status: status,369responseText: responseText370};371}372373function testXmlHttpRequestToHttpResponse_parseHeaders_windows() {374var response = webdriver.http.Response.fromXmlHttpRequest(375FakeXmlHttpRequest([376'a:b',377'c: d',378'e :f',379'g : h'380].join('\r\n'), 200, ''));381assertEquals(200, response.status);382assertEquals('', response.body);383384webdriver.test.testutil.assertObjectEquals({385'a': 'b',386'c': 'd',387'e': 'f',388'g': 'h'389}, response.headers);390}391392function testXmlHttpRequestToHttpResponse_parseHeaders_unix() {393var response = webdriver.http.Response.fromXmlHttpRequest(394FakeXmlHttpRequest([395'a:b',396'c: d',397'e :f',398'g : h'399].join('\n'), 200, ''));400assertEquals(200, response.status);401assertEquals('', response.body);402403webdriver.test.testutil.assertObjectEquals({404'a': 'b',405'c': 'd',406'e': 'f',407'g': 'h'408}, response.headers);409}410411function testXmlHttpRequestToHttpResponse_noHeaders() {412var response = webdriver.http.Response.fromXmlHttpRequest(413FakeXmlHttpRequest('', 200, ''));414assertEquals(200, response.status);415assertEquals('', response.body);416webdriver.test.testutil.assertObjectEquals({}, response.headers);417}418419function testXmlHttpRequestToHttpResponse_stripsNullCharactersFromBody() {420var response = webdriver.http.Response.fromXmlHttpRequest(421FakeXmlHttpRequest('', 200, '\x00\0foo\x00\x00bar\x00\0'));422assertEquals(200, response.status);423assertEquals('foobar', response.body);424webdriver.test.testutil.assertObjectEquals({}, response.headers);425}426427428