| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 """This functional test spawns a web server, and runs chrome to point | |
| 7 at that web server. | |
| 8 | |
| 9 The content served contains prefetch requests, and the tests assert that the | |
| 10 webserver logs reflect that. | |
| 11 | |
| 12 Run like any functional test: | |
| 13 $ python chrome/test/functional/prefetch.py | |
| 14 in a repo with a built pyautolib | |
| 15 | |
| 16 The import of multiprocessing implies python 2.6 is required | |
| 17 """ | |
| 18 | |
| 19 import os | |
| 20 import time | |
| 21 import multiprocessing | |
| 22 import Queue | |
| 23 import string | |
| 24 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer | |
| 25 | |
| 26 import pyauto_functional # Must be imported before pyauto | |
| 27 import pyauto | |
| 28 | |
| 29 # this class handles IPC retrieving server "logs" from our integral | |
| 30 # server. Each test should clear() the log, and then run asserts on | |
| 31 # the retrieval list. | |
| 32 | |
| 33 # at startup, the server puts an int in the queue which is its port, | |
| 34 # we store that for subsequent tests | |
| 35 | |
| 36 class ServerLog: | |
| 37 def clear(self): | |
| 38 self.log = {} | |
| 39 | |
| 40 def __init__(self,queue): | |
| 41 self.clear() | |
| 42 self.port = None | |
| 43 self.queue = queue | |
| 44 | |
| 45 def _readQueue(self): | |
| 46 try: | |
| 47 while True: | |
| 48 queueval = self.queue.get(False) | |
| 49 if isinstance(queueval,int): | |
| 50 self.port = queueval | |
| 51 else: | |
| 52 self.log[queueval] = True | |
| 53 except Queue.Empty: | |
| 54 return | |
| 55 | |
| 56 def getPort(self): | |
| 57 if not self.port: | |
| 58 self._readQueue() | |
| 59 return self.port | |
| 60 | |
| 61 def isRetrieved(self,path): | |
| 62 self._readQueue() | |
| 63 try: | |
| 64 return self.log[path] | |
| 65 except KeyError: | |
| 66 return None | |
| 67 | |
| 68 # | |
| 69 # The next few classes run a simple web server that returns log information | |
| 70 # via a multiprocessing.Queue. | |
| 71 # | |
| 72 class AbstractPrefetchServerHandler(BaseHTTPRequestHandler): | |
| 73 content = { | |
| 74 "prefetch-origin.html": | |
| 75 (200, """<html><head> | |
| 76 <link rel="prefetch" href="static-prefetch-target.html"> | |
| 77 <script type="text/javascript"> | |
| 78 function changeParagraph() | |
| 79 { | |
| 80 var newPara = document.createElement("p"); | |
| 81 newPara.innerHTML = | |
| 82 "<link rel=\\"prefetch\\" href=\\"dynamic-prefetch-target.html\\">" + | |
| 83 "<p>This paragraph contains a dynamic link prefetch. " + | |
| 84 "The target of this prefetch is " + | |
| 85 "<a href=\\"dynamic-prefetch-target.html\\">this document.</a>"; | |
| 86 var para = document.getElementById("p1"); | |
| 87 document.body.insertBefore(newPara,para); | |
| 88 } | |
| 89 </script> | |
| 90 </head> | |
| 91 <body onload="changeParagraph()"> | |
| 92 <p id="p1">This is a document that contains a link prefetch. The target of | |
| 93 that prefetch is <a href="static-prefetch-target.html">this document.</a> | |
| 94 </body>"""), | |
| 95 "static-prefetch-target.html": | |
| 96 (200, "<html><head></head><body>empty</body>"), | |
| 97 "dynamic-prefetch-target.html": | |
| 98 (200, "<html><head></head><body>empty</body>")} | |
| 99 | |
| 100 def do_GET(self): | |
| 101 self.queue.put(self.path[1:]) | |
| 102 try: | |
| 103 response_code, response = self.content[self.path[1:]] | |
| 104 self.send_response(response_code) | |
| 105 self.end_headers() | |
| 106 self.wfile.write(response) | |
| 107 except KeyError: | |
| 108 self.send_response(404) | |
| 109 self.end_headers() | |
| 110 | |
| 111 def run_web_server(queue_arg): | |
| 112 class PrefetchServerHandler(AbstractPrefetchServerHandler): | |
| 113 queue = queue_arg | |
| 114 server = HTTPServer(('',0), PrefetchServerHandler) | |
| 115 queue.put(server.server_port) | |
| 116 server.serve_forever() | |
| 117 | |
| 118 # | |
| 119 # Here's the test itself | |
| 120 # | |
| 121 queue = multiprocessing.Queue() | |
| 122 server_log = ServerLog(queue) | |
| 123 | |
| 124 class PrefetchTest(pyauto.PyUITest): | |
| 125 """Testcase for Prefetching""" | |
| 126 def testBasic(self): | |
| 127 server_log.clear() | |
| 128 url = "http://localhost:%d/prefetch-origin.html" % server_log.getPort() | |
| 129 self.NavigateToURL(url) | |
| 130 self.assertEqual(True, server_log.isRetrieved("prefetch-origin.html")) | |
| 131 time.sleep(0.1) # required since prefetches occur after onload | |
| 132 self.assertEqual(True, server_log.isRetrieved( | |
| 133 "static-prefetch-target.html")) | |
| 134 self.assertEqual(True, server_log.isRetrieved( | |
| 135 "dynamic-prefetch-target.html")) | |
| 136 | |
| 137 if __name__ == '__main__': | |
| 138 web_server = multiprocessing.Process(target=run_web_server,args=(queue,)) | |
| 139 web_server.daemon = True | |
| 140 web_server.start() | |
| 141 pyauto_functional.Main() | |
| OLD | NEW |