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
2.0
Ariya Hidayat 2014-09-07 20:04:26 -07:00
parent 2c10f6095b
commit f20835735c
6 changed files with 135 additions and 149 deletions

View File

@ -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');
});

View File

@ -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');
});

View File

@ -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');
});

View File

@ -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'));
});

View File

@ -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):

View File

@ -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();
});
});
});