
binary_search_state.py is a general binary search triage tool that
performs a binary search on a set of things to try to identify which
thing or thing(s) in the set is 'bad'.  binary_search_state.py assumes
that the user has two sets, one where everything is known to be good,
ane one which contains at least one bad item.  binary_search_state.py
then copies items from the good and bad sets into a working set and
tests the result (good or bad).  binary_search_state.py requires that
a set of scripts be supplied to it for any particular job.  For more
information on binary_search_state.py, see

https://sites.google.com/a/google.com/chromeos-toolchain-team-home2/home/team-tools-and-scripts/binary-searcher-tool-for-triage

This particular set of scripts is designed to work wtih
binary_search_state.py in order to find the bad package or set of
packages in a ChromeOS build.


QUICKSTART:

After setting up your 3 build trees (see Prerequisites section), do the
following:

 - Decide which test script to use (boot_test.sh or
   interactive_test.sh)
 - Get the IP name or address of the chromebook you will use for testing.
 - Do the following inside your chroot:

   $ cd ~/trunk/src/third_party/toolchain_utils/binary_search_tool
   $ ./cros_pkg/setup.sh <board-to-test> <IP-name-or-address-of-chromebook>

   If you chose the boot test, then:

   $ python ./binary_search_state.py \
       --get_initial_items=cros_pkg/get_initial_items.sh \
       --switch_to_good=cros_pkg/switch_to_good.sh \
       --switch_to_bad=cros_pkg/switch_to_bad.sh \
       --test_setup_script=cros_pkg/test_setup.sh \
       --test_script=cros_pkg/boot_test.sh \
       --file_args \
       --prune

   Otherwise, if you chose the interactive test, then:

   $ python ./binary_search_state.py \
       --get_initial_items=cros_pkg/get_initial_items.sh \
       --switch_to_good=cros_pkg/switch_to_good.sh \
       --switch_to_bad=cros_pkg/switch_to_bad.sh \
       --test_setup_script=cros_pkg/test_setup.sh \
       --test_script=cros_pkg/interactive_test.sh \
       --file_args \
       --prune

   Once you have completely finished doing the binary search/triage,
   run the genereated cleanup script, to restore your chroot to the state
   it was in before you ran the setup.sh script:

   $ cros_pkg/${BOARD}_cleanup.sh



FILES AND SCRIPTS:

  boot_test.sh - One of two possible test scripts used to determine
                 if the ChromeOS image built from the packages is good
                 or bad.  This script tests to see if the image
                 booted, and requires no user intervention.

  create_cleanup_script.py - This is called by setup.sh, to
                             generate ${BOARD}_cleanup.sh,
                             which is supposed to be run by the user
                             after the binary search triage process is
                             finished, to undo the changes made by
                             setup.sh and return everything
                             to its original state.

  get_initial_items.sh - This script is used to determine the current
                         set of ChromeOS packages.

  test_setup.sh - This script will build and flash your image to the
                  remote machine. If the flash fails, this script will
                  help the user troubleshoot by flashing through usb or
                  by retrying the flash over ethernet.

  interactive_test.sh - One of two possible scripts used to determine
                        if the ChromeOS image built from the packages
                        is good or bad.  This script requires user
                        interaction to determine if the image is
                        good or bad.

  setup.sh - This is the first script the user should call, after
             taking care of the prerequisites.  It sets up the
             environment appropriately for running the ChromeOS
             package binary search triage, and it generates two
             necessary scripts (see below).

  switch_to_bad.sh - This script is used to copy packages from the
                     'bad' build tree into the work area.

  switch_to_good.sh - This script is used to copy packages from the
                      good' build tree into the work area.


GENERATED SCRIPTS:

  common.sh  - contains basic environment variable definitions for
               this binary search triage session.

  ${BOARD}_cleanup.sh - script to undo all the changes made by
                        running setup.sh, and returning
                        everything to its original state. The user
                        should manually run this script once the
                        binary search triage process is over.

ASSUMPTIONS:

- There are two different ChromeOS builds, for the same board, with the
  same set of ChromeOS packages.  One build creates a good working ChromeOS
  image and the other does not.

- You have saved the complete build trees for both the good and bad builds.


PREREQUISITES FOR USING THESE SCRIPTS (inside the chroot):

- The "good" build tree, for the board, is in /build/${board}.good
  (e.g. /build/lumpy.good or /build/daisy.good).

- The "bad" build tree is in /build/${board}.bad
  (e.g. /build/lumpy.bad or /build/daisy.bad).

- You made a complete copy of the "bad" build tree , and put it in
  /build/${board}.work (e.g. /build/lumpy.work or /build/daisy.work.
  The easiest way to do this is to use something similar to the
  following set of commands (this example assumes the board is
  'lumpy'):

   $ cd /build
   $ sudo tar -cvf lumpy.bad.tar lumpy.bad
   $ sudo mv lumpy.bad lumpy.work
   $ sudo tar -xvf lumpy.bad.tar


USING THESE SCRIPTS FOR BINARY TRIAGE OF PACKAGES:

To use these scripts, you must first run setup.sh, passing it two
arguments (in order): the board for which you are building the image;
and the name or ip address of the chromebook you want to use for
testing your chromeos images.  setup.sh will do the following:

   - Verify that your build trees are set up correctly (with good, bad
     and work).
   - Create a soft link for /build/${board} pointing to the work build
     tree.
   - Create the common.sh file that the other scripts passed to the
     binary triage tool will need.
   - Create a cleanup script, ${board}_cleanup.sh, for you to
     run after you are done with the binary triages, to undo all of these
     various changes that setup.sh did.


This set of scripts comes with two alternate test scripts.  One test
script, boot_test.sh, just checks to make sure that the image
booted (i.e. responds to ping) and assumes that is enough.  The other
test script, interactive_test.sh, is interactive and asks YOU
to tell it whether the image on the chromebook is ok or not (it
prompts you and waits for a response).


Once you have run setup.sh (and decided which test script you
want to use) run the binary triage tool using these scripts to
isolate/identify the bad package:

~/trunk/src/third_party/toolchain_utils/binary_search_tool/binary_search_state.py \
 --get_initial_items=cros_pkg/get_initial_items.sh \
 --switch_to_good=cros_pkg/switch_to_good.sh \
 --switch_to_bad=cros_pkg/switch_to_bad.sh \
 --test_setup_script=cros_pkg/test_setup.sh \
 --test_script=cros_pkg/boots_test.sh \  # could use interactive_test.sh instead
 --prune


After you have finished running the tool and have identified the bad
package(s), you will want to run the cleanup script that setup.sh
generated (cros_pkg/${BOARD}_cleanup.sh).
