diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-05 04:14:33 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-05 04:14:33 +0000 |
commit | ef4efd96729d227268a36f8f88e3bff17c3b56fc (patch) | |
tree | 9ff3f6f0b3d093fc14cd85f8e7e871bd7f0106bc /tools | |
parent | 79c50b91e2077dd5d704970ee8387331268b8c40 (diff) | |
download | chromium_src-ef4efd96729d227268a36f8f88e3bff17c3b56fc.zip chromium_src-ef4efd96729d227268a36f8f88e3bff17c3b56fc.tar.gz chromium_src-ef4efd96729d227268a36f8f88e3bff17c3b56fc.tar.bz2 |
Remove tools/playback_benchmark.
This hasn't been touched in substantive ways since it was added 3.5 years ago
(https://codereview.chromium.org/1515006/) and appears to be unused.
(I'm removing some infra bits that look related in
https://codereview.chromium.org/49503007/)
BUG=none
NOTRY=true
Review URL: https://codereview.chromium.org/57373008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232899 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools')
-rw-r--r-- | tools/playback_benchmark/common.js | 320 | ||||
-rw-r--r-- | tools/playback_benchmark/playback.js | 258 | ||||
-rw-r--r-- | tools/playback_benchmark/playback_driver.py | 195 | ||||
-rw-r--r-- | tools/playback_benchmark/proxy_handler.py | 122 | ||||
-rwxr-xr-x | tools/playback_benchmark/run.py | 44 |
5 files changed, 0 insertions, 939 deletions
diff --git a/tools/playback_benchmark/common.js b/tools/playback_benchmark/common.js deleted file mode 100644 index 69309aa..0000000 --- a/tools/playback_benchmark/common.js +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Classes and functions used during recording and playback. - */ - -var Benchmark = Benchmark || {}; - -Benchmark.functionList = [ - ['setTimeout', 'setTimeout'], - ['clearTimeout', 'clearTimeout'], - ['setInterval', 'setInterval'], - ['clearInterval', 'clearInterval'], - ['XMLHttpRequest', 'XMLHttpRequest'], - ['addEventListenerToWindow', 'addEventListener'], - ['addEventListenerToNode', 'addEventListener', ['Node', 'prototype']], - ['removeEventListenerFromNode', 'removeEventListener', ['Node', 'prototype']], - ['addEventListenerToXHR', 'addEventListener', - ['XMLHttpRequest', 'prototype']], - ['random', 'random', ['Math']], - ['Date', 'Date'], - ['documentWriteln', 'writeln', ['document']], - ['documentWrite', 'write', ['document']] -]; - -Benchmark.timeoutMapping = []; - -Benchmark.ignoredListeners = ['mousemove', 'mouseover', 'mouseout']; - -Benchmark.originals = {}; - -Benchmark.overrides = { - setTimeout: function(callback, timeout) { - var event = {type: 'timeout', timeout: timeout}; - var eventId = Benchmark.agent.createAsyncEvent(event); - var timerId = Benchmark.originals.setTimeout.call(this, function() { - Benchmark.agent.fireAsyncEvent(eventId, callback); - }, Benchmark.playback ? 0 : timeout); - Benchmark.timeoutMapping[timerId] = eventId; - return timerId; - }, - - clearTimeout: function(timerId) { - var eventId = Benchmark.timeoutMapping[timerId]; - if (eventId == undefined) return; - Benchmark.agent.cancelAsyncEvent(eventId); - Benchmark.originals.clearTimeout.call(this, timerId); - }, - - setInterval: function(callback, timeout) { - console.warn('setInterval'); - }, - - clearInterval: function(timerId) { - console.warn('clearInterval'); - }, - - XMLHttpRequest: function() { - return new Benchmark.XMLHttpRequestWrapper(); - }, - - addEventListener: function(type, listener, useCapture, target, targetType, - originalFunction) { - var event = {type: 'addEventListener', target: targetType, eventType: type}; - var eventId = Benchmark.agent.createAsyncEvent(event); - listener.eventId = eventId; - listener.wrapper = function(e) { - Benchmark.agent.fireAsyncEvent(eventId, function() { - listener.call(target, e); - }); - }; - originalFunction.call(target, type, listener.wrapper, useCapture); - }, - - addEventListenerToWindow: function(type, listener, useCapture) { - if (Benchmark.ignoredListeners.indexOf(type) != -1) return; - Benchmark.overrides.addEventListener( - type, listener, useCapture, this, 'window', - Benchmark.originals.addEventListenerToWindow); - }, - - addEventListenerToNode: function(type, listener, useCapture) { - if (Benchmark.ignoredListeners.indexOf(type) != -1) return; - Benchmark.overrides.addEventListener( - type, listener, useCapture, this, 'node', - Benchmark.originals.addEventListenerToNode); - }, - - addEventListenerToXHR: function(type, listener, useCapture) { - Benchmark.overrides.addEventListener( - type, listener, useCapture, this, 'xhr', - Benchmark.originals.addEventListenerToXHR); - }, - - removeEventListener: function(type, listener, useCapture, target, - originalFunction) { - Benchmark.agent.cancelAsyncEvent(listener.eventId); - originalFunction.call(target, listener.wrapper, useCapture); - }, - - removeEventListenerFromWindow: function(type, listener, useCapture) { - removeEventListener(type, listener, useCapture, this, - Benchmark.originals.removeEventListenerFromWindow); - }, - - removeEventListenerFromNode: function(type, listener, useCapture) { - removeEventListener(type, listener, useCapture, this, - Benchmark.originals.removeEventListenerFromNode); - }, - - removeEventListenerFromXHR: function(type, listener, useCapture) { - removeEventListener(type, listener, useCapture, this, - Benchmark.originals.removeEventListenerFromXHR); - }, - - random: function() { - return Benchmark.agent.random(); - }, - - Date: function() { - var a = arguments; - var D = Benchmark.originals.Date, d; - switch(a.length) { - case 0: d = new D(Benchmark.agent.dateNow()); break; - case 1: d = new D(a[0]); break; - case 2: d = new D(a[0], a[1]); break; - case 3: d = new D(a[0], a[1], a[2]); break; - default: Benchmark.die('window.Date', arguments); - } - d.getTimezoneOffset = function() { return -240; }; - return d; - }, - - dateNow: function() { - return Benchmark.agent.dateNow(); - }, - - documentWriteln: function() { - console.warn('writeln'); - }, - - documentWrite: function() { - console.warn('write'); - } -}; - -/** - * Replaces window functions specified by Benchmark.functionList with overrides - * and optionally saves original functions to Benchmark.originals. - * @param {Object} wnd Window object. - * @param {boolean} storeOriginals When true, original functions are saved to - * Benchmark.originals. - */ -Benchmark.installOverrides = function(wnd, storeOriginals) { - // Substitute window functions with overrides. - for (var i = 0; i < Benchmark.functionList.length; ++i) { - var info = Benchmark.functionList[i], object = wnd; - var propertyName = info[1], pathToProperty = info[2]; - if (pathToProperty) - for (var j = 0; j < pathToProperty.length; ++j) - object = object[pathToProperty[j]]; - if (storeOriginals) - Benchmark.originals[info[0]] = object[propertyName]; - object[propertyName] = Benchmark.overrides[info[0]]; - } - wnd.__defineSetter__('onload', function() { - console.warn('window.onload setter')} - ); - - // Substitute window functions of static frames when DOM content is loaded. - Benchmark.originals.addEventListenerToWindow.call(wnd, 'DOMContentLoaded', - function() { - var frames = document.getElementsByTagName('iframe'); - for (var i = 0, frame; frame = frames[i]; ++i) { - Benchmark.installOverrides(frame.contentWindow); - } - }, true); - - // Substitute window functions of dynamically added frames. - Benchmark.originals.addEventListenerToWindow.call( - wnd, 'DOMNodeInsertedIntoDocument', function(e) { - if (e.target.tagName && e.target.tagName.toLowerCase() != 'iframe') - return; - if (e.target.contentWindow) - Benchmark.installOverrides(e.target.contentWindow); - }, true); -}; - -// Install overrides on top window. -Benchmark.installOverrides(window, true); - -/** - * window.XMLHttpRequest wrapper. Notifies Benchmark.agent when request is - * opened, aborted, and when it's ready state changes to DONE. - * @constructor - */ -Benchmark.XMLHttpRequestWrapper = function() { - this.request = new Benchmark.originals.XMLHttpRequest(); - this.wrapperReadyState = 0; -}; - -// Create XMLHttpRequestWrapper functions and property accessors using original -// ones. -(function() { - var request = new Benchmark.originals.XMLHttpRequest(); - for (var property in request) { - if (property === 'channel') continue; // Quick fix for FF. - if (typeof(request[property]) == 'function') { - (function(property) { - var f = Benchmark.originals.XMLHttpRequest.prototype[property]; - Benchmark.XMLHttpRequestWrapper.prototype[property] = function() { - f.apply(this.request, arguments); - }; - })(property); - } else { - (function(property) { - Benchmark.XMLHttpRequestWrapper.prototype.__defineGetter__(property, - function() { return this.request[property]; }); - Benchmark.XMLHttpRequestWrapper.prototype.__defineSetter__(property, - function(value) { - this.request[property] = value; - }); - - })(property); - } - } -})(); - -// Define onreadystatechange getter. -Benchmark.XMLHttpRequestWrapper.prototype.__defineGetter__('onreadystatechange', - function() { return this.clientOnReadyStateChange; }); - -// Define onreadystatechange setter. -Benchmark.XMLHttpRequestWrapper.prototype.__defineSetter__('onreadystatechange', - function(value) { this.clientOnReadyStateChange = value; }); - -Benchmark.XMLHttpRequestWrapper.prototype.__defineGetter__('readyState', - function() { return this.wrapperReadyState; }); - -Benchmark.XMLHttpRequestWrapper.prototype.__defineSetter__('readyState', - function() {}); - - -/** - * Wrapper for XMLHttpRequest.open. - */ -Benchmark.XMLHttpRequestWrapper.prototype.open = function() { - var url = Benchmark.extractURL(arguments[1]); - var event = {type: 'request', method: arguments[0], url: url}; - this.eventId = Benchmark.agent.createAsyncEvent(event); - - var request = this.request; - var requestWrapper = this; - Benchmark.originals.XMLHttpRequest.prototype.open.apply(request, arguments); - request.onreadystatechange = function() { - if (this.readyState != 4 || requestWrapper.cancelled) return; - var callback = requestWrapper.clientOnReadyStateChange || function() {}; - Benchmark.agent.fireAsyncEvent(requestWrapper.eventId, function() { - requestWrapper.wrapperReadyState = 4; - callback.call(request); - }); - } -}; - -/** - * Wrapper for XMLHttpRequest.abort. - */ -Benchmark.XMLHttpRequestWrapper.prototype.abort = function() { - this.cancelled = true; - Benchmark.originals.XMLHttpRequest.prototype.abort.apply( - this.request, arguments); - Benchmark.agent.cancelAsyncEvent(this.eventId); -}; - -/** - * Driver url for reporting results. - * @const {string} - */ -Benchmark.DRIVER_URL = '/benchmark/'; - -/** - * Posts request as json to Benchmark.DRIVER_URL. - * @param {Object} request Request to post. - */ -Benchmark.post = function(request, async) { - if (async === undefined) async = true; - var xmlHttpRequest = new Benchmark.originals.XMLHttpRequest(); - xmlHttpRequest.open("POST", Benchmark.DRIVER_URL, async); - xmlHttpRequest.setRequestHeader("Content-type", "application/json"); - xmlHttpRequest.send(JSON.stringify(request)); -}; - -/** - * Extracts url string. - * @param {(string|Object)} url Object or string representing url. - * @return {string} Extracted url. - */ -Benchmark.extractURL = function(url) { - if (typeof(url) == 'string') return url; - return url.nI || url.G || ''; -}; - - -/** - * Logs error message to console and throws an exception. - * @param {string} message Error message - */ -Benchmark.die = function(message) { - // Debugging stuff. - var position = top.Benchmark.playback ? top.Benchmark.agent.timelinePosition : - top.Benchmark.agent.timeline.length; - message = message + ' at position ' + position; - console.error(message); - Benchmark.post({error: message}); - console.log(Benchmark.originals.setTimeout.call(window, function() {}, 9999)); - try { (0)() } catch(ex) { console.error(ex.stack); } - throw message; -}; diff --git a/tools/playback_benchmark/playback.js b/tools/playback_benchmark/playback.js deleted file mode 100644 index 4962851..0000000 --- a/tools/playback_benchmark/playback.js +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Playback agent. - */ - -var Benchmark = Benchmark || {}; - -/** - * Playback agent class. - * @param {Object} data Test data. - * @constructor - */ -Benchmark.Agent = function(data) { - this.timeline = data.timeline; - this.timelinePosition = 0; - this.steps = data.steps; - this.stepsPosition = 0; - this.randoms = data.randoms; - this.randomsPosition = 0; - this.ticks = data.ticks; - this.ticksPosition = 0; - this.delayedScriptElements = {}; - this.callStackDepth = 0; - document.cookie = data.cookie; - if (window.innerWidth != data.width || window.innerHeight != data.height) { - Benchmark.die('Wrong window size: ' + - window.innerWidth + 'x' + window.innerHeight + - ' instead of ' + data.width + 'x' + data.height); - } - this.startTime = Benchmark.originals.Date.now(); -}; - -/** - * Returns current timeline event. - * @return {Object} Event. - */ -Benchmark.Agent.prototype.getCurrentEvent = function() { - return this.timeline[this.timelinePosition]; -}; - -/** - * Returns next recorded event in timeline. If event is the last event in - * timeline, posts test results to driver. - * @param {Object} event Event that actually happened, should correspond to - * the recorded one (used for debug only). - * @return {Object} Recorded event from timeline. - */ -Benchmark.Agent.prototype.getNextEvent = function(event) { - var recordedEvent = this.getCurrentEvent(); - this.ensureEqual(event, recordedEvent); - if (event.type == 'random' || event.type == 'ticks') { - recordedEvent.count -= 1; - if (recordedEvent.count == 0) { - this.timelinePosition += 1; - } - } else { - this.timelinePosition += 1; - } - if (this.timelinePosition == this.steps[this.stepsPosition][1]) { - var score = Benchmark.originals.Date.now() - this.startTime; - Benchmark.reportScore(score); - } - return recordedEvent; -}; - -/** - * Checks if two events can be considered equal. Throws exception if events - * differ. - * @param {Object} event Event that actually happened. - * @param {Object} recordedEvent Event taken from timeline. - */ -Benchmark.Agent.prototype.ensureEqual = function(event, recordedEvent) { - var equal = false; - if (event.type == recordedEvent.type && - event.type in Benchmark.eventPropertiesMap) { - equal = true; - var properties = Benchmark.eventPropertiesMap[event.type]; - for (var i = 0; i < properties.length && equal; ++i) - if (event[properties[i]] != recordedEvent[properties[i]]) - equal = false; - } - if (!equal) { - Benchmark.die('unexpected event: ' + JSON.stringify(event) + - ' instead of ' + JSON.stringify(recordedEvent)); - } -}; - -/** - * Gets next event from timeline and returns its identifier. - * @param {Object} event Object with event information. - * @return {number} Event identifier. - */ -Benchmark.Agent.prototype.createAsyncEvent = function(event) { - return this.getNextEvent(event).id; -}; - -/** - * Stores callback to be invoked according to timeline order. - * @param {number} eventId 'Parent' event identifier. - * @param {function} callback Callback. - */ -Benchmark.Agent.prototype.fireAsyncEvent = function(eventId, callback) { - var event = this.timeline[eventId]; - if (!event.callbackReference) return; - this.timeline[event.callbackReference].callback = callback; - this.fireSome(); -}; - -/** - * Ensures that things are happening according to recorded timeline. - * @param {number} eventId Identifier of cancelled event. - */ -Benchmark.Agent.prototype.cancelAsyncEvent = function(eventId) { - this.getNextEvent({type: 'cancel', reference: eventId}); -}; - -/** - * Checks if script isn't going to be executed too early and delays script - * execution if necessary. - * @param {number} scriptId Unique script identifier. - * @param {HTMLElement} doc Document element. - * @param {boolean} inlined Indicates whether script is a text block in the page - * or resides in a separate file. - * @param {string} src Script url (if script is not inlined). - */ -Benchmark.Agent.prototype.readyToExecuteScript = function(scriptId, doc, - inlined, src) { - var event = this.getCurrentEvent(); - if (event.type == 'willExecuteScript' && event.scriptId == scriptId) { - this.timelinePosition += 1; - return true; - } - var element; - var elements = doc.getElementsByTagName('script'); - for (var i = 0, el; (el = elements[i]) && !element; ++i) { - if (inlined) { - if (el.src) continue; - var text = el.textContent; - if (scriptId == text.substring(2, text.indexOf("*/"))) - element = elements[i]; - } else { - if (!el.src) continue; - if (el.src.indexOf(src) != -1 || src.indexOf(el.src) != -1) { - element = el; - } - } - } - if (!element) { - Benchmark.die('script element not found', scriptId, src); - } - for (var el2 = element; el2; el2 = el2.parentElement) { - if (el2.onload) { - console.log('found', el2); - } - } - this.delayedScriptElements[scriptId] = element; - return false; -}; - -/** - * Ensures that things are happening according to recorded timeline. - * @param {Object} event Object with event information. - */ -Benchmark.Agent.prototype.didExecuteScript = function(scriptId ) { - this.getNextEvent({type: 'didExecuteScript', scriptId: scriptId}); - this.fireSome(); -}; - -/** - * Invokes async events' callbacks according to timeline order. - */ -Benchmark.Agent.prototype.fireSome = function() { - while (this.timelinePosition < this.timeline.length) { - var event = this.getCurrentEvent(); - if (event.type == 'willFire') { - if(!event.callback) break; - this.timelinePosition += 1; - this.callStackDepth += 1; - event.callback(); - this.callStackDepth -= 1; - this.getNextEvent({type: 'didFire', reference: event.reference}); - } else if (event.type == 'willExecuteScript') { - if (event.scriptId in this.delayedScriptElements) { - var element = this.delayedScriptElements[event.scriptId]; - var parent = element.parentElement; - var cloneElement = element.cloneNode(); - delete this.delayedScriptElements[event.scriptId]; - parent.replaceChild(cloneElement, element); - } - break; - } else if (this.callStackDepth > 0) { - break; - } else { - Benchmark.die('unexpected event in fireSome:' + JSON.stringify(event)); - } - } -}; - -/** - * Returns recorded random. - * @return {number} Recorded random. - */ -Benchmark.Agent.prototype.random = function() { - this.getNextEvent({type: 'random'}); - return this.randoms[this.randomsPosition++]; -}; - -/** - * Returns recorded ticks. - * @return {number} Recorded ticks. - */ -Benchmark.Agent.prototype.dateNow = function(event) { - this.getNextEvent({type: 'ticks'}); - return this.ticks[this.ticksPosition++]; -}; - -/** - * Event type -> property list mapping used for matching events. - * @const - */ -Benchmark.eventPropertiesMap = { - 'timeout': ['timeout'], - 'request': ['url'], - 'addEventListener': ['eventType'], - 'script load': ['src'], - 'willExecuteScript': ['scriptId'], - 'didExecuteScript': ['scriptId'], - 'willFire': ['reference'], - 'didFire': ['reference'], - 'cancel': ['reference'], - 'random': [], - 'ticks': [] -}; - -/** - * Agent used by native window functions wrappers. - */ -Benchmark.agent = new Benchmark.Agent(Benchmark.data); - -/** - * Playback flag. - * @const - */ -Benchmark.playback = true; - -Benchmark.reportScore = function(score) { - Benchmark.score = score; -}; - -Benchmark.originals.addEventListenerToWindow.call( - window, 'message', function(event) { - if (Benchmark.score) { - event.source.postMessage(Benchmark.score, event.origin); - } - }, false); diff --git a/tools/playback_benchmark/playback_driver.py b/tools/playback_benchmark/playback_driver.py deleted file mode 100644 index ef6c7b4..0000000 --- a/tools/playback_benchmark/playback_driver.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright (c) 2011 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""Playback driver.""" - -import cgi -import simplejson as json -import os -import string -import sys -import threading -import urlparse - -START_PAGE = """<html> - <script type="text/javascript"> -var runCount = $run_count; -var results = []; - -function run() { - var wnd = window.open('?resource=start_page_popup', '', - 'width=$width, height=$height'); - var timerId = setInterval(function() { - wnd.postMessage('ping', '$target_origin'); - }, 300); - var handleMessage = function(event) { - clearInterval(timerId); - wnd.close(); - document.writeln('<div>' + event.data + '</div>'); - results.push(event.data); - runCount -= 1; - window.removeEventListener('message', handleMessage); - if (runCount > 0) { - run(); - } else { - var xmlHttpRequest = new XMLHttpRequest(); - xmlHttpRequest.open("POST", '/benchmark/', true); - xmlHttpRequest.setRequestHeader("Content-type", "application/json"); - xmlHttpRequest.send(JSON.stringify({results: results})); - } - } - window.addEventListener('message', handleMessage, false); -} - -run(); - </script> -</html> -""" - -START_PAGE_POPUP = """<html> - <script type="text/javascript"> -window.setTimeout(function() { - console.log(window.innerWidth, window.innerHeight); - if (window.innerWidth == $width && window.innerHeight == $height) { - window.location = '$start_url'; - } else { - window.resizeBy($width - window.innerWidth, $height - window.innerHeight); - window.location = window.location; - } -}, 200); - </script> -</html> -""" - -DATA_JS = 'Benchmark.data = $data;' - - -def ReadFile(file_name, mode='r'): - f = open(file_name, mode) - data = f.read() - f.close() - return data - - -def ReadJSON(file_name): - f = open(file_name, 'r') - data = json.load(f) - f.close() - return data - - -class PlaybackRequestHandler(object): - """This class is used to process HTTP requests during test playback. - - Attributes: - test_dir: directory containing test files. - test_callback: function to be called when the test is finished. - script_dir: directory where javascript files are located. - """ - - def __init__(self, test_dir, test_callback=None, script_dir=os.getcwd()): - self.test_dir = test_dir - self.test_callback = test_callback - self.script_dir = script_dir - - def ProcessRequest(self, handler): - "Processes single HTTP request." - - parse_result = urlparse.urlparse(handler.path) - if parse_result.path.endswith('/benchmark/'): - query = cgi.parse_qs(parse_result.query) - if 'run_test' in query: - run_count = 1 - if 'run_count' in query: - run_count = query['run_count'][0] - self._StartTest(handler, self.test_dir, run_count) - elif 'resource' in query: - self._GetBenchmarkResource(query['resource'][0], handler) - else: - self._ProcessBenchmarkReport(handler.body, handler) - else: - self._GetApplicationResource(handler) - - def _StartTest(self, handler, test_dir, run_count): - "Sends test start page to browser." - - cache_data = ReadJSON(os.path.join(test_dir, 'cache.json')) - - # Load cached responses. - self.cache = {} - responses_dir = os.path.join(test_dir, 'responses') - for request in cache_data['requests']: - response_file = os.path.join(responses_dir, request['response_file']) - response = ReadFile(response_file, 'rb') - key = (request['method'], request['path']) - self.cache[key] = {'response': response, 'headers': request['headers']} - - # Load benchmark scripts. - self.benchmark_resources = {} - data = ReadFile(os.path.join(test_dir, 'data.json')) - data = string.Template(DATA_JS).substitute(data=data) - self.benchmark_resources['data.js'] = {'data': data, - 'type': 'application/javascript'} - for resource in ('common.js', 'playback.js'): - resource_file = os.path.join(self.script_dir, resource) - self.benchmark_resources[resource] = {'data': ReadFile(resource_file), - 'type': 'application/javascript'} - - # Format start page. - parse_result = urlparse.urlparse(cache_data['start_url']) - target_origin = '%s://%s' % (parse_result.scheme, parse_result.netloc) - start_page = string.Template(START_PAGE).substitute( - run_count=run_count, target_origin=target_origin, - width=cache_data['width'], height=cache_data['height']) - self.benchmark_resources['start_page'] = { - 'data': start_page, - 'type': 'text/html; charset=UTF-8' - } - - start_page_popup = string.Template(START_PAGE_POPUP).substitute( - start_url=cache_data['start_url'], - width=cache_data['width'], height=cache_data['height']) - self.benchmark_resources['start_page_popup'] = { - 'data': start_page_popup, - 'type': 'text/html; charset=UTF-8' - } - - self._GetBenchmarkResource('start_page', handler) - - def _GetBenchmarkResource(self, resource, handler): - "Sends requested resource to browser." - - if resource in self.benchmark_resources: - resource = self.benchmark_resources[resource] - handler.send_response(200) - handler.send_header('content-length', len(resource['data'])) - handler.send_header('content-type', resource['type']) - handler.end_headers() - handler.wfile.write(resource['data']) - else: - handler.send_response(404) - handler.end_headers() - - def _ProcessBenchmarkReport(self, content, handler): - "Reads benchmark score from report content and invokes callback." - - handler.send_response(204) - handler.end_headers() - content = json.loads(content) - if 'results' in content: - results = content['results'] - sys.stdout.write('Results: %s\n' % results) - if self.test_callback: self.test_callback(results) - elif 'error' in content: - sys.stderr.write('Error: %s\n' % content['error']) - - def _GetApplicationResource(self, handler): - "Searches for response in cache. If not found, responds with 204." - key = (handler.command, handler.path) - if key in self.cache: - sys.stdout.write('%s %s -> found\n' % key) - handler.wfile.write(self.cache[key]['response']) - else: - sys.stderr.write('%s %s -> not found\n' % key) - handler.send_response(204, "not in cache") - handler.end_headers() diff --git a/tools/playback_benchmark/proxy_handler.py b/tools/playback_benchmark/proxy_handler.py deleted file mode 100644 index b45f960..0000000 --- a/tools/playback_benchmark/proxy_handler.py +++ /dev/null @@ -1,122 +0,0 @@ -# Copyright (c) 2011 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -"""HTTP proxy request handler with SSL support. - - RequestHandler: Utility class for parsing HTTP requests. - ProxyHandler: HTTP proxy handler. -""" - -import BaseHTTPServer -import cgi -import OpenSSL -import os -import socket -import SocketServer -import sys -import traceback -import urlparse - - -class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): - """Class for reading HTTP requests and writing HTTP responses""" - - protocol_version = "HTTP/1.1" - request_version = protocol_version - - class HTTPRequestException(Exception): pass - - def __init__(self, rfile, wfile, server): - self.rfile = rfile - self.wfile = wfile - self.server = server - - def ReadRequest(self): - "Reads and parses single HTTP request from self.rfile" - - self.raw_requestline = self.rfile.readline() - if not self.raw_requestline: - self.close_connection = 1 - raise HTTPRequestException('failed to read request line') - if not self.parse_request(): - raise HTTPRequestException('failed to parse request') - self.headers = dict(self.headers) - self.body = None - if 'content-length' in self.headers: - self.body = self.rfile.read(int(self.headers['content-length'])) - - def log_message(self, format, *args): - pass - - -class ProxyHandler(BaseHTTPServer.BaseHTTPRequestHandler): - "Request handler class for proxy server" - - server_version = "PlaybackProxy/0.0.1" - protocol_version = "HTTP/1.1" - - def do_CONNECT(self): - "Handles CONNECT HTTP request" - - server = self.path.split(':')[0] - certificate_file = os.path.join(self.certificate_directory, server) - if not os.path.isfile(certificate_file): - sys.stderr.write('request to connect %s is ignored\n' % server) - self.send_response(501) - self.send_header('Proxy-agent', self.version_string()) - self.end_headers() - return - - # Send confirmation to browser. - self.send_response(200, 'Connection established') - self.send_header('Proxy-agent', self.version_string()) - self.end_headers() - - # Create SSL context. - context = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) - context.use_privatekey_file(certificate_file) - context.use_certificate_file(certificate_file) - - # Create and initialize SSL connection atop of tcp socket. - ssl_connection = OpenSSL.SSL.Connection(context, self.connection) - ssl_connection.set_accept_state() - ssl_connection.do_handshake() - ssl_rfile = socket._fileobject(ssl_connection, "rb", self.rbufsize) - ssl_wfile = socket._fileobject(ssl_connection, "wb", self.wbufsize) - - # Handle http requests coming from ssl_connection. - handler = RequestHandler(ssl_rfile, ssl_wfile, self.path) - try: - handler.close_connection = 1 - while True: - handler.ReadRequest() - self.driver.ProcessRequest(handler) - if handler.close_connection: break - except (OpenSSL.SSL.SysCallError, OpenSSL.SSL.ZeroReturnError): - pass - finally: - self.close_connection = 1 - - def do_GET(self): - self.driver.ProcessRequest(self) - - def do_POST(self): - if 'content-length' in self.headers: - self.body = self.rfile.read(int(self.headers['content-length'])) - self.driver.ProcessRequest(self) - - def log_message(self, format, *args): - sys.stdout.write((format % args) + '\n') - - -class ThreadingHTTPServer (SocketServer.ThreadingMixIn, - BaseHTTPServer.HTTPServer): - pass - - -def CreateServer(driver, port, certificate_directory=None): - if not certificate_directory: - certificate_directory = os.path.join(os.getcwd(), 'certificates') - ProxyHandler.driver = driver - ProxyHandler.certificate_directory = certificate_directory - return ThreadingHTTPServer(('', port), ProxyHandler) diff --git a/tools/playback_benchmark/run.py b/tools/playback_benchmark/run.py deleted file mode 100755 index 04ed12b..0000000 --- a/tools/playback_benchmark/run.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2011 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests playback. - -Prerequisites: -1. OpenSSL library - http://www.openssl.org/ -2. Python interface to the OpenSSL library - https://launchpad.net/pyopenssl - -Example usage: -python run.py -t <test_dir> -""" - -from optparse import OptionParser -import sys - -import playback_driver -import proxy_handler - - -def Run(options): - driver = playback_driver.PlaybackRequestHandler(options.test_dir) - httpd = proxy_handler.CreateServer(driver, options.port) - sa = httpd.socket.getsockname() - print "Serving HTTP on", sa[0], "port", sa[1], "..." - httpd.serve_forever() - - -def main(): - parser = OptionParser() - parser.add_option("-t", "--test-dir", dest="test_dir", - help="directory containing recorded test data") - parser.add_option("-p", "--port", dest="port", type="int", default=8000) - options = parser.parse_args()[0] - if not options.test_dir: - raise Exception('please specify test directory') - - Run(options) - - -if __name__ == '__main__': - sys.exit(main()) |