#!/usr/bin/python

# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A command to display summary statistics from runs of 'bootperf'.

Command line options allow selecting from one of two sets of
performance statistics:  The boot time statistics (selected by
--timestats) measure time spent from kernel startup in milliseconds.
The disk statistics (selected by --diskstats) measure total bytes
read from the boot device since kernel startup.

Boot time statistics are recorded as cumulative time (or disk read)
since kernel startup, measured when specific events occur during
boot.  Events include such things as 'startup', the moment when the
upstart 'startup' job begins running, and 'login', when the
Chrome OS login screen is displayed.  By default, all recorded events
are included in the output; command line options allow restricting
the view to a selected subset of events.

Separate command line options allow selecting from one of two
different display modes.  When --averages is selected, the display
shows the average value and sample standard deviation (as a percent
of the average) for all selected events.  The --averages display also
calculates the time (or bytes) between adjacent events, and shows
the avearage and sample standard deviation of the differences.

The --rawdata display shows the raw data value associated with each
event for each boot:  Each line of output represents the event values
for one boot cycle.

"""

import sys
import optparse

import perfprinter


_usage = "%prog [options] [results-directory ...]"
_description = """\
Summarize boot time performance results.  The result directory
arguments are directories previously specified as output for the
'bootperf' script.
"""
optparser = optparse.OptionParser(usage=_usage, description=_description)

optgroup = optparse.OptionGroup(
    optparser, "Selecting boot time or disk statistics (choose one)")
optgroup.add_option(
    "-d", "--diskstats", action="store_true",
    dest="use_diskstats",
    help="use statistics for bytes read since kernel startup")
optgroup.add_option(
    "-t", "--timestats", action="store_true",
    dest="use_timestats",
    help="use statistics for time since kernel startup (default)")
optparser.add_option_group(optgroup)
optparser.set_defaults(use_diskstats=False)
optparser.set_defaults(use_timestats=False)

optgroup = optparse.OptionGroup(optparser, "Event selection")
optgroup.add_option(
    "-e", "--event", action="append",
    dest="eventnames",
    help="restrict statistics to the comma-separated list of events")
optparser.add_option_group(optgroup)

optgroup = optparse.OptionGroup(
    optparser, "Display mode selection (choose one)")
optgroup.add_option(
    "-a", "--averages", action="store_true",
    dest="print_averages",
    help="display a summary of the averages of chosen statistics (default)")
optgroup.add_option(
    "-r", "--rawdata", action="store_true",
    dest="print_raw",
    help="display raw data from all boot iterations")
optparser.add_option_group(optgroup)
optparser.set_defaults(print_averages=False)
optparser.set_defaults(print_raw=False)


def main(argv):
  (options, args) = optparser.parse_args(argv)
  if options.print_averages and options.print_raw:
    print >>sys.stderr, "Can't use -a and -r together.\n"
    optparser.print_help()
    sys.exit(1)
  elif options.print_raw:
    printfunc = perfprinter.PrintRawData
  else:
    printfunc = perfprinter.PrintStatisticsSummary
  if options.use_timestats and options.use_diskstats:
    print >>sys.stderr, "Can't use -t and -d together.\n"
    optparser.print_help()
    sys.exit(1)
  elif options.use_diskstats:
    use_timestats = False
  else:
    use_timestats = True
  if options.eventnames:
    keylist = []
    for kl in options.eventnames:
      keylist.extend(kl.split(','))
  else:
    keylist = None
  if not args:
    args = ["."]
  printfunc(args, use_timestats, keylist)

if __name__ == "__main__":
  main(sys.argv[1:])
