blob: f53751dd67ebd66837f83fa624a66021ecb0eee2 [file] [log] [blame]
#!/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.
"""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()