1#!/usr/bin/env python
2# Copyright (c) 2012 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"""Start an HTTP server which serves Chrome Endure graphs.
7
8Usage:
9    python endure_server.py [options]
10
11To view Chrome Endure graphs from a browser,
12run this script to start a local HTTP server that serves the directory
13where graph code and test results are located. A port will be automatically
14picked. You can then view the graphs via http://localhost:<GIVEN_PORT>.
15
16Examples:
17    >python endure_server.py
18      Start a server which serves the default location
19      <CURRENT_WORKING_DIR>/chrome_graph.
20
21    >python endure_server.py --graph-dir=/home/user/Document/graph_dir
22      Start a server which serves /home/user/Document/graph_dir which
23      is where your graph code and test results are.
24"""
25
26import BaseHTTPServer
27import logging
28import optparse
29import os
30import SimpleHTTPServer
31import sys
32
33
34class HelpFormatter(optparse.IndentedHelpFormatter):
35  """Format the help message of this script."""
36
37  def format_description(self, description):
38    """Override to keep original format of the description."""
39    return description + '\n' if description else ''
40
41
42def _ParseArgs(argv):
43  parser = optparse.OptionParser(
44      usage='%prog [options]',
45      formatter=HelpFormatter(),
46      description=__doc__)
47  parser.add_option(
48      '-g', '--graph-dir', type='string',
49      default=os.path.join(os.getcwd(), 'chrome_graph'),
50      help='The directory that contains graph code ' \
51           'and data files of test results. Default value is ' \
52           '<CURRENT_WORKING_DIR>/chrome_graph')
53  return parser.parse_args(argv)
54
55
56def Run(argv):
57  """Start an HTTP server which serves Chrome Endure graphs."""
58  logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.DEBUG)
59  options, _ = _ParseArgs(argv)
60  graph_dir = os.path.abspath(options.graph_dir)
61  cur_dir = os.getcwd()
62  os.chdir(graph_dir)
63  httpd = BaseHTTPServer.HTTPServer(
64      ('', 0), SimpleHTTPServer.SimpleHTTPRequestHandler)
65  try:
66    logging.info('Serving %s at port %d', graph_dir, httpd.server_port)
67    logging.info('View graphs at http://localhost:%d', httpd.server_port)
68    logging.info('Press Ctrl-C to stop the server.')
69    httpd.serve_forever()
70  except KeyboardInterrupt:
71    logging.info('Shutting down ...')
72    httpd.shutdown()
73  finally:
74    os.chdir(cur_dir)
75  return 0
76
77
78if '__main__' == __name__:
79  sys.exit(Run(sys.argv[1:]))
80