Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Unified Diff: chrome/test/functional/prefetch.py

Issue 3050016: Implement prefetching in chrome (Closed)
Patch Set: merge to trunk Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/chrome_switches.cc ('k') | net/base/host_resolver_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()
« no previous file with comments | « chrome/common/chrome_switches.cc ('k') | net/base/host_resolver_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698