1# Copyright 2014 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4import BaseHTTPServer 5import SimpleHTTPServer 6 7from telemetry.core import local_server 8from telemetry.unittest import tab_test_case 9 10 11class SimpleLocalServerBackendRequestHandler( 12 SimpleHTTPServer.SimpleHTTPRequestHandler): 13 def do_GET(self): 14 msg = """<!DOCTYPE html> 15<html> 16<body> 17hello world 18</body> 19""" 20 self.send_response(200) 21 self.send_header('Content-Type', 'text/html') 22 self.send_header('Content-Length', len(msg)) 23 self.end_headers() 24 self.wfile.write(msg) 25 26 def log_request(self, code='-', size='-'): 27 pass 28 29class SimpleLocalServerBackend(BaseHTTPServer.HTTPServer, 30 local_server.LocalServerBackend): 31 def __init__(self): 32 BaseHTTPServer.HTTPServer.__init__( 33 self, ('127.0.0.1', 0), SimpleLocalServerBackendRequestHandler) 34 local_server.LocalServerBackend.__init__(self) 35 36 def StartAndGetNamedPorts(self, args): 37 assert 'hello' in args 38 assert args['hello'] == 'world' 39 return [local_server.NamedPort('http', self.server_address[1])] 40 41 def ServeForever(self): 42 self.serve_forever() 43 44class SimpleLocalServer(local_server.LocalServer): 45 def __init__(self): 46 super(SimpleLocalServer, self).__init__(SimpleLocalServerBackend) 47 48 def GetBackendStartupArgs(self): 49 return {'hello': 'world'} 50 51 @property 52 def url(self): 53 return self.forwarder.url + '/' 54 55class LocalServerUnittest(tab_test_case.TabTestCase): 56 @classmethod 57 def setUpClass(cls): 58 super(LocalServerUnittest, cls).setUpClass() 59 cls._server = SimpleLocalServer() 60 cls._browser.StartLocalServer(cls._server) 61 62 def testLocalServer(self): 63 self.assertTrue(self._server in self._browser.local_servers) 64 self._tab.Navigate(self._server.url) 65 self._tab.WaitForDocumentReadyStateToBeComplete() 66 body_text = self._tab.EvaluateJavaScript('document.body.textContent') 67 body_text = body_text.strip() 68 self.assertEquals('hello world', body_text) 69 70 def testStartingAndRestarting(self): 71 server2 = SimpleLocalServer() 72 self.assertRaises(Exception, 73 lambda: self._browser.StartLocalServer(server2)) 74 75 self._server.Close() 76 self.assertTrue(self._server not in self._browser.local_servers) 77 78 self._browser.StartLocalServer(server2) 79