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