| Index: chrome/test/functional/prefetch.py
|
| diff --git a/chrome/test/functional/prefetch.py b/chrome/test/functional/prefetch.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..30c0912ec92349f4da0bcdc6da3888e22e273526
|
| --- /dev/null
|
| +++ b/chrome/test/functional/prefetch.py
|
| @@ -0,0 +1,138 @@
|
| +#!/usr/bin/python
|
| +# Copyright (c) 2010 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.
|
| +
|
| +# this functional test spawns a web server, and runs chrome to point
|
| +# at that web server. The content served contains prefetch requests,
|
| +# and the tests assert that the webserver logs reflect that.
|
| +
|
| +# run like any functional test:
|
| +# $ python chrome/test/functional/prefetch.py
|
| +# in a repo with a built pyautolib
|
| +
|
| +# the import of multiprocessing implies python 2.6 is required
|
| +
|
| +import os
|
| +import time
|
| +import multiprocessing
|
| +import Queue
|
| +import string
|
| +from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
|
| +
|
| +import pyauto_functional # Must be imported before pyauto
|
| +import pyauto
|
| +
|
| +# this class handles IPC retrieving server "logs" from our integral
|
| +# server. Each test should clear() the log, and then run asserts on
|
| +# the retrieval list.
|
| +
|
| +# at startup, the server puts an int in the queue which is its port,
|
| +# we store that for subsequent tests
|
| +
|
| +class ServerLog:
|
| + def clear(self):
|
| + self.log = {}
|
| +
|
| + def __init__(self,queue):
|
| + self.clear()
|
| + self.port = None
|
| + self.queue = queue
|
| +
|
| + def _readQueue(self):
|
| + try:
|
| + while True:
|
| + queueval = self.queue.get(False)
|
| + if isinstance(queueval,int):
|
| + self.port = queueval
|
| + else:
|
| + self.log[queueval] = True
|
| + except Queue.Empty:
|
| + return
|
| +
|
| + def getPort(self):
|
| + if not self.port:
|
| + self._readQueue()
|
| + return self.port
|
| +
|
| + def isRetrieved(self,path):
|
| + self._readQueue()
|
| + try:
|
| + return self.log[path]
|
| + except KeyError:
|
| + return None
|
| +
|
| +#
|
| +# The next few classes run a simple web server that returns log information
|
| +# via a multiprocessing.Queue.
|
| +#
|
| +class AbstractPrefetchServerHandler(BaseHTTPRequestHandler):
|
| + content = {
|
| + "prefetch-origin.html":
|
| + (200, """<html><head>
|
| +<link rel="prefetch" href="static-prefetch-target.html">
|
| +<script type="text/javascript">
|
| +function changeParagraph()
|
| +{
|
| + var newPara = document.createElement("p");
|
| + newPara.innerHTML =
|
| + "<link rel=\\"prefetch\\" href=\\"dynamic-prefetch-target.html\\">" +
|
| + "<p>This paragraph contains a dynamic link prefetch. " +
|
| + "The target of this prefetch is " +
|
| + "<a href=\\"dynamic-prefetch-target.html\\">this document.</a>";
|
| + var para = document.getElementById("p1");
|
| + document.body.insertBefore(newPara,para);
|
| +}
|
| +</script>
|
| +</head>
|
| +<body onload="changeParagraph()">
|
| +<p id="p1">This is a document that contains a link prefetch. The target of
|
| +that prefetch is <a href="static-prefetch-target.html">this document.</a>
|
| +</body>"""),
|
| + "static-prefetch-target.html":
|
| + (200, "<html><head></head><body>empty</body>"),
|
| + "dynamic-prefetch-target.html":
|
| + (200, "<html><head></head><body>empty</body>")}
|
| +
|
| + def do_GET(self):
|
| + self.queue.put(self.path[1:])
|
| + try:
|
| + response_code, response = self.content[self.path[1:]]
|
| + self.send_response(response_code)
|
| + self.end_headers()
|
| + self.wfile.write(response)
|
| + except KeyError:
|
| + self.send_response(404)
|
| + self.end_headers()
|
| +
|
| +def run_web_server(queue_arg):
|
| + class PrefetchServerHandler(AbstractPrefetchServerHandler):
|
| + queue = queue_arg
|
| + server = HTTPServer(('',0), PrefetchServerHandler)
|
| + queue.put(server.server_port)
|
| + server.serve_forever()
|
| +
|
| +#
|
| +# Here's the test itself
|
| +#
|
| +queue = multiprocessing.Queue()
|
| +server_log = ServerLog(queue)
|
| +
|
| +class PrefetchTest(pyauto.PyUITest):
|
| + """Testcase for Prefetching"""
|
| + def testBasic(self):
|
| + server_log.clear()
|
| + url = "http://localhost:%d/prefetch-origin.html" % server_log.getPort()
|
| + self.NavigateToURL(url)
|
| + self.assertEqual(True, server_log.isRetrieved("prefetch-origin.html"))
|
| + time.sleep(0.1) # required since prefetches occur after onload
|
| + self.assertEqual(True, server_log.isRetrieved(
|
| + "static-prefetch-target.html"))
|
| + self.assertEqual(True, server_log.isRetrieved(
|
| + "dynamic-prefetch-target.html"))
|
| +
|
| +if __name__ == '__main__':
|
| + web_server = multiprocessing.Process(target=run_web_server,args=(queue,))
|
| + web_server.daemon = True
|
| + web_server.start()
|
| + pyauto_functional.Main()
|
|
|