From f20835735ca9d4a9f287a563319f54e39ad79ccd Mon Sep 17 00:00:00 2001 From: Ariya Hidayat Date: Sun, 7 Sep 2014 20:04:26 -0700 Subject: [PATCH] Port custom headers testing of web page. The HTTP server launched by the test runner has a new endpoint called /echo. This simply echoes back some information (current on the made request, in the future it will be expanded to further information) formatted as JSON. This echo system facilitates easy testing for request header manipulation feature. https://github.com/ariya/phantomjs/issues/12439 --- test/module/webpage/add-header.js | 23 ++++ test/module/webpage/custom-headers.js | 30 ++++++ test/module/webpage/modify-header.js | 25 +++++ test/module/webpage/remove-header.js | 25 +++++ test/run-tests.py | 33 +++++- test/webpage-spec.js | 148 -------------------------- 6 files changed, 135 insertions(+), 149 deletions(-) create mode 100644 test/module/webpage/add-header.js create mode 100644 test/module/webpage/custom-headers.js create mode 100644 test/module/webpage/modify-header.js create mode 100644 test/module/webpage/remove-header.js diff --git a/test/module/webpage/add-header.js b/test/module/webpage/add-header.js new file mode 100644 index 00000000..23edacea --- /dev/null +++ b/test/module/webpage/add-header.js @@ -0,0 +1,23 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +page.onResourceRequested = function(requestData, request) { + assert.typeOf(request.setHeader, 'function'); + request.setHeader('CustomHeader', 'CustomValue'); +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + headers = json.headers; + assert.isTrue(headers.hasOwnProperty('customheader')); + assert.equal(headers.customheader, 'CustomValue'); +}); + diff --git a/test/module/webpage/custom-headers.js b/test/module/webpage/custom-headers.js new file mode 100644 index 00000000..430c5a6b --- /dev/null +++ b/test/module/webpage/custom-headers.js @@ -0,0 +1,30 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +page.customHeaders = { + 'Custom-Key': 'Custom-Value', + 'User-Agent': 'Overriden-UA', + 'Referer': 'Overriden-Referer' +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + assert.typeOf(json, 'object'); + headers = json.headers; + assert.typeOf(headers, 'object'); + + assert.isTrue(headers.hasOwnProperty('custom-key')); + assert.isTrue(headers.hasOwnProperty('user-agent')); + assert.isTrue(headers.hasOwnProperty('referer')); + assert.equal(headers['custom-key'], 'Custom-Value'); + assert.equal(headers['user-agent'], 'Overriden-UA'); + assert.equal(headers['referer'], 'Overriden-Referer'); +}); diff --git a/test/module/webpage/modify-header.js b/test/module/webpage/modify-header.js new file mode 100644 index 00000000..7f870d85 --- /dev/null +++ b/test/module/webpage/modify-header.js @@ -0,0 +1,25 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +page.customHeaders = { 'CustomHeader': 'ModifiedCustomValue' }; + +page.onResourceRequested = function(requestData, request) { + assert.typeOf(request.setHeader, 'function'); + request.setHeader('CustomHeader', 'ModifiedCustomValue'); +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + headers = json.headers; + assert.isTrue(headers.hasOwnProperty('customheader')); + assert.equal(headers.customheader, 'ModifiedCustomValue'); +}); + diff --git a/test/module/webpage/remove-header.js b/test/module/webpage/remove-header.js new file mode 100644 index 00000000..57ed04c3 --- /dev/null +++ b/test/module/webpage/remove-header.js @@ -0,0 +1,25 @@ +var assert = require('../../assert'); +var webpage = require('webpage'); + +// NOTE: HTTP header names are case-insensitive. Our test server +// returns the name in lowercase. + +var page = webpage.create(); +assert.typeOf(page.customHeaders, 'object'); +assert.strictEqual(JSON.stringify(page.customHeaders), '{}'); + +page.customHeaders = { 'CustomHeader': 'ModifiedCustomValue' }; + +page.onResourceRequested = function(requestData, request) { + assert.typeOf(request.setHeader, 'function'); + request.setHeader('CustomHeader', null); +}; +page.open('http://localhost:9180/echo', function (status) { + var json, headers; + assert.equal(status, 'success'); + json = JSON.parse(page.plainText); + headers = json.headers; + assert.isTrue(!headers.hasOwnProperty('customheader')); + assert.isTrue(!headers.hasOwnProperty('CustomHeader')); +}); + diff --git a/test/run-tests.py b/test/run-tests.py index 9c35325a..7feb751e 100755 --- a/test/run-tests.py +++ b/test/run-tests.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import inspect +import json import optparse import os import posixpath @@ -12,6 +13,7 @@ import sys import threading import time import urllib +import urlparse TIMEOUT = 35 # Maximum duration of PhantomJS execution (in seconds) @@ -26,6 +28,10 @@ TESTS = [ 'basics/version.js', 'module/webpage/open.js', 'module/webpage/loading.js', + 'module/webpage/custom-headers.js', + 'module/webpage/add-header.js', + 'module/webpage/remove-header.js', + 'module/webpage/modify-header.js', 'module/system/system.js', 'module/system/args.js', 'module/system/os.js', @@ -40,7 +46,32 @@ TESTS = [ ] -class FileHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): +class FileHandler(SimpleHTTPServer.SimpleHTTPRequestHandler, object): + + def do_GET(self): + url = urlparse.urlparse(self.path) + if url.path == '/echo': + headers = {} + for name, value in self.headers.items(): + headers[name] = value.rstrip() + d = dict( + command=self.command, + version=self.protocol_version, + origin=self.client_address, + url=self.path, + path=url.path, + params=url.params, + query=url.query, + fragment=url.fragment, + headers=headers + ) + + self.send_response(200) + self.send_header('Content-Type', 'application/json') + self.end_headers() + self.wfile.write(json.dumps(d, indent=2) + '\r\n') + else: + super(FileHandler, self).do_GET() # silent, do not pollute stdout nor stderr. def log_message(self, format, *args): diff --git a/test/webpage-spec.js b/test/webpage-spec.js index fe20076e..65eb4c92 100644 --- a/test/webpage-spec.js +++ b/test/webpage-spec.js @@ -183,11 +183,6 @@ describe("WebPage object", function() { expect(page.settings).toNotEqual({}); }); - expectHasProperty(page, 'customHeaders'); - it("should have customHeaders as an empty object", function() { - expect(page.customHeaders).toEqual({}); - }); - expectHasProperty(page, 'zoomFactor'); it("should have zoomFactor of 1", function() { expect(page.zoomFactor).toEqual(1.0); @@ -780,49 +775,6 @@ describe("WebPage object", function() { }); }); - it("should set custom headers properly", function() { - var server = require('webserver').create(); - server.listen(12345, function(request, response) { - // echo received request headers in response body - response.write(JSON.stringify(request.headers)); - response.close(); - }); - - var url = "http://localhost:12345/foo/headers.txt?ab=cd"; - var customHeaders = { - "Custom-Key" : "Custom-Value", - "User-Agent" : "Overriden-UA", - "Referer" : "Overriden-Referer" - }; - page.customHeaders = customHeaders; - - var handled = false; - runs(function() { - expect(handled).toEqual(false); - page.open(url, function (status) { - expect(status == 'success').toEqual(true); - handled = true; - - var echoedHeaders = JSON.parse(page.plainText); - // console.log(JSON.stringify(echoedHeaders, null, 4)); - // console.log(JSON.stringify(customHeaders, null, 4)); - - expect(echoedHeaders["Custom-Key"]).toEqual(customHeaders["Custom-Key"]); - expect(echoedHeaders["User-Agent"]).toEqual(customHeaders["User-Agent"]); - expect(echoedHeaders["Referer"]).toEqual(customHeaders["Referer"]); - - }); - }); - - waits(50); - - runs(function() { - expect(handled).toEqual(true); - server.close(); - }); - - }); - it("should process request body properly for POST", function() { var server = require('webserver').create(); server.listen(12345, function(request, response) { @@ -2168,103 +2120,3 @@ describe("WebPage render image", function(){ }); }); -describe("WebPage network request headers handling", function() { - it("should add HTTP header to a network request", function() { - var page = require("webpage").create(); - var server = require("webserver").create(); - var isCustomHeaderPresented = false; - - server.listen(12345, function(response) { - if (response.headers["CustomHeader"] && response.headers["CustomHeader"] === "CustomValue") { - isCustomHeaderPresented = true; - } - }); - - page.onResourceRequested = function(requestData, request) { - expect(typeof request.setHeader).toEqual("function"); - request.setHeader("CustomHeader", "CustomValue"); - }; - - runs(function() { - page.open("http://localhost:12345", function(status) { - expect(status).toEqual("success"); - }); - }); - - waitsFor(function() { - return isCustomHeaderPresented; - }, "isCustomHeaderPresented should be received", 3000); - - runs(function() { - page.close(); - server.close(); - }); - }); - - xit("should remove HTTP header from a network request", function() { - var page = require("webpage").create(); - page.customHeaders = {"CustomHeader": "CustomValue"}; - - var server = require("webserver").create(); - var handled = false; - - server.listen(12345, function(request) { - if (request.headers["CustomHeader"] == null) { - handled = true; - } - }); - - page.onResourceRequested = function(requestData, request) { - expect(typeof request.setHeader).toEqual("function"); - request.setHeader("CustomHeader", null); - }; - - runs(function() { - page.open("http://localhost:12345", function(status) { - expect(status).toEqual("success"); - }); - }); - - waits(3000); - - runs(function() { - expect(handled).toBeTruthy(); - page.close(); - server.close(); - }); - }); - - xit("should set HTTP header value for a network request", function() { - var page = require("webpage").create(); - page.customHeaders = {"CustomHeader": "CustomValue"}; - - var server = require("webserver").create(); - var handled = false; - - server.listen(12345, function(request) { - if (request.headers["CustomHeader"] && - request.headers["CustomHeader"] === "ChangedCustomValue") { - handled = true; - } - }); - - page.onResourceRequested = function(requestData, request) { - expect(typeof request.setHeader).toEqual("function"); - request.setHeader("CustomHeader", "ChangedCustomValue"); - }; - - runs(function() { - page.open("http://localhost:12345", function(status) { - expect(status).toEqual("success"); - }); - }); - - waits(3000); - - runs(function() { - expect(handled).toBeTruthy(); - page.close(); - server.close(); - }); - }); -});