普通文本  |  115行  |  3.99 KB

# Copyright 2011 Google Inc. All Rights Reserved.
"""Module to print help message."""

from __future__ import print_function

import sys
import textwrap
from settings_factory import BenchmarkSettings
from settings_factory import GlobalSettings
from settings_factory import LabelSettings


class Help(object):
  """The help class."""

  def GetUsage(self):
    return """%s [OPTIONS] EXPERIMENT_FILE""" % (sys.argv[0])

  def _WrapLine(self, line):
    return '\n'.join(textwrap.wrap(line, 80))

  def _GetFieldDescriptions(self, fields):
    res = ''
    for field_name in fields:
      field = fields[field_name]
      res += 'Field:\t\t%s\n' % field.name
      res += self._WrapLine('Description:\t%s' % field.description) + '\n'
      res += 'Type:\t\t%s\n' % type(field).__name__.replace('Field', '')
      res += 'Required:\t%s\n' % field.required
      if field.default:
        res += 'Default:\t%s\n' % field.default
      res += '\n'
    return res

  def GetHelp(self):
    global_fields = self._GetFieldDescriptions(GlobalSettings('').fields)
    benchmark_fields = self._GetFieldDescriptions(BenchmarkSettings('').fields)
    label_fields = self._GetFieldDescriptions(LabelSettings('').fields)

    return """%s is a script for running performance experiments on
ChromeOS. It allows one to run ChromeOS Autotest benchmarks over
several images and compare the results to determine whether there
is a performance difference.

Comparing several images using %s is referred to as running an
"experiment". An "experiment file" is a configuration file which holds
all the information that describes the experiment and how it should be
run. An example of a simple experiment file is below:

--------------------------------- test.exp ---------------------------------
name: my_experiment
board: x86-alex
remote: chromeos2-row1-rack4-host7.cros 172.18.122.132

benchmark: page_cycler_v2.morejs {
  suite: telemetry_Crosperf
  iterations: 3
}

my_first_image {
  chromeos_image: /usr/local/chromeos-1/chromiumos_image.bin
}

my_second_image {
  chromeos_image:  /usr/local/chromeos-2/chromiumos_image.bin
}
----------------------------------------------------------------------------

This experiment file names the experiment "my_experiment". It will be
run on the board x86-alex. Benchmarks will be run using two remote
devices, one is a device specified by a hostname and the other is a
device specified by it's IP address. Benchmarks will be run in
parallel across these devices.  There is currently no way to specify
which benchmark will run on each device.

We define one "benchmark" that will be run, page_cycler_v2.morejs. This
benchmark has two "fields", one which specifies that this benchmark is
part of the telemetry_Crosperf suite (this is the common way to run
most Telemetry benchmarks), and the other which specifies how many
iterations it will run for.

We specify one or more "labels" or images which will be compared. The
page_cycler_v2.morejs benchmark will be run on each of these images 3
times and a result table will be output which compares them for all
the images specified.

The full list of fields that can be specified in the experiment file
are as follows:
=================
Global Fields
=================
%s
=================
Benchmark Fields
=================
%s
=================
Label Fields
=================
%s

Note that global fields are overidden by label or benchmark fields, if
they can be specified in both places. Fields that are specified as
arguments override fields specified in experiment files.

%s is invoked by passing it a path to an experiment file,
as well as any options (in addition to those specified in the
experiment file).  Crosperf runs the experiment and caches the results
(or reads the previously cached experiment results out of the cache),
generates and displays a report based on the run, and emails the
report to the user.  If the results were all read out of the cache,
then by default no email is generated.
""" % (sys.argv[0], sys.argv[0], global_fields, benchmark_fields, label_fields,
       sys.argv[0])