#!/usr/bin/python
"""Create new scenario test instance from an existing results directory.

This automates creation of regression tests for the results parsers.
There are 2 primary use cases for this.

1) Bug fixing: Parser broke on some input in the field and we want
to start with a test that operates on that input and fails. We
then apply fixes to the parser implementation until it passes.

2) Regression alarms: We take input from various real scenarios that
work as expected with the parser. These will be used to ensure
we do not break the expected functionality of the parser while
refactoring it.

While much is done automatically, a scenario harness is meant to
be easily extended and configured once generated.
"""

import optparse, os, shutil, sys, tempfile
from os import path

import common
from autotest_lib.tko.parsers.test import scenario_base

usage = 'usage: %prog [options] results_dirpath scenerios_dirpath'
parser = optparse.OptionParser(usage=usage)
parser.add_option(
    '-n', '--name',
    help='Name for new scenario instance. Will use dirname if not specified')
parser.add_option(
    '-p', '--parser_result_tag',
    default='v1',
    help='Storage tag to use for initial parser result.')
parser.add_option(
    '-t', '--template_type',
    default='base',
    help='Type of unittest module to copy into new scenario.')


def main():
    (options, args) = parser.parse_args()
    if len(args) < 2:
        parser.print_help()
        sys.exit(1)

    results_dirpath = path.normpath(args[0])
    if not path.exists(results_dirpath) or not path.isdir(results_dirpath):
        print 'Invalid results_dirpath:', results_dirpath
        parser.print_help()
        sys.exit(1)

    scenarios_dirpath = path.normpath(args[1])
    if not path.exists(scenarios_dirpath) or not path.isdir(scenarios_dirpath):
        print 'Invalid scenarios_dirpath:', scenarios_dirpath
        parser.print_help()
        sys.exit(1)

    results_dirname = path.basename(results_dirpath)
    # Not everything is a valid python package name, fix if necessary
    package_dirname = scenario_base.fix_package_dirname(
        options.name or results_dirname)

    scenario_package_dirpath = path.join(
        scenarios_dirpath, package_dirname)
    if path.exists(scenario_package_dirpath):
        print (
            'Scenario package already exists at path: %s' %
            scenario_package_dirpath)
        parser.print_help()
        sys.exit(1)

    # Create new scenario package
    os.mkdir(scenario_package_dirpath)

    # Create tmp_dir
    tmp_dirpath = tempfile.mkdtemp()
    copied_dirpath = path.join(tmp_dirpath, results_dirname)
    # Copy results_dir
    shutil.copytree(results_dirpath, copied_dirpath)

    # scenario_base.sanitize_results_data(copied_dirpath)

    # Launch parser on copied_dirpath, collect emitted test objects.
    harness = scenario_base.new_parser_harness(copied_dirpath)
    try:
        parser_result = harness.execute()
    except Exception, e:
        parser_result = e

    scenario_base.store_parser_result(
        scenario_package_dirpath, parser_result,
        options.parser_result_tag)

    scenario_base.store_results_dir(
        scenario_package_dirpath, copied_dirpath)

    scenario_base.write_config(
        scenario_package_dirpath,
        status_version=harness.status_version,
        parser_result_tag=options.parser_result_tag,
        )

    scenario_base.install_unittest_module(
        scenario_package_dirpath, options.template_type)


if __name__ == '__main__':
    main()
