# Copyright (c) 2012 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.

import logging, os, re, shutil
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_ui
from autotest_lib.client.cros.graphics import graphics_utils

class graphics_O3DSelenium(test.test):
    """
    This test is broken and should be removed when possible.
    """
    version = 1
    GSC = None

    flaky_test_list = ["TestSampleanimated_sceneLarge",
                       "TestSamplebillboardsMedium",
                       "TestSampleconvolutionMedium",
                       "TestSamplegenerate_textureSmall",
                       "TestSampleinstance_overrideMedium",
                       "TestSamplejugglerMedium",
                       "TestSamplesobelMedium",
                       "TestSampleold_school_shadowsMedium",
                       "TestSampleshadow_mapMedium",
                       "TestSamplesimpleviewer_simpleviewerLarge",
                       "TestSampletrends_trendsLarge",
                       "TestSamplezsortingMedium",
                       "TestSampleGoogleIO_2009_step14exLarge",
                       "TestSampleShader_Test",
                       "TestSampleMultipleClientsLarge",
                       "TestUnitTesttexture_set_testMedium",
                       "TestUnitTestinit_status_testSmall",
                       "TestStressCullingZSort"]


    def setup(self, tarball='o3d-tests-0.0.1.tar.bz2'):
        if not os.path.exists(self.srcdir):
            os.mkdir(self.srcdir)

        dst_path = os.path.join(self.bindir, 'O3D')
        tarball_path = os.path.join(self.bindir, tarball)
        if not os.path.exists(dst_path):
            if not os.path.exists(tarball_path):
                utils.get_file(
                    'http://commondatastorage.googleapis.com/chromeos-localmirror/distfiles/' + tarball,
                    tarball_path)
            utils.extract_tarball_to_dir(tarball_path, dst_path)

        src_assets_path = os.path.join(self.bindir, 'assets_o3dtgz')
        tgz_file_list = os.listdir(src_assets_path)
        dst_assets_path = os.path.join(self.bindir,
                                       'O3D', 'o3d', 'samples', 'assets')
        for tgz_file in tgz_file_list:
            shutil.copyfile(os.path.join(src_assets_path, tgz_file),
                            os.path.join(dst_assets_path, tgz_file))

    def initialize(self):
        self.GSC = graphics_utils.GraphicsStateChecker()

    def cleanup(self):
        if self.GSC:
            self.GSC.finalize()

    def run_once(self, timeout=300):
        os.chdir(os.path.join(self.bindir, 'O3D', 'o3d'))
        # Pick any of these that exists. We probably don't want a generic
        # search for ANY java, and such is not even possible at this time
        #(java-config -J).
        java_paths = [
            "/usr/local/lib/icedtea6/bin/java",
            "/usr/local/opt/icedtea6-bin-1.6.2/bin/java",
            "" ]
        for java_bin in java_paths:
          if os.path.exists(java_bin):
            break
        # Selenium main will hang forever if --java argument !exists; fail
        # before that happens.
        if java_bin == "":
          raise error.TestFail('Missing java interpreter!')
        cmd = "python tests/selenium/main.py"
        cmd = cmd + " --referencedir=o3d_assets/tests/screenshots"
        cmd = cmd + " --product_dir=./"
        cmd = cmd + " --screencompare=perceptualdiff"
        cmd = cmd + " --browserpath=../../chrome_wrapper"
        cmd = cmd + " --browser=*googlechrome"
        cmd = cmd + " --screenshotsdir=tests/selenium/screenshots_chrome"
        cmd = cmd + " --java=" + java_bin
        cmd = cros_ui.xcommand(cmd)
        result = utils.run(cmd, ignore_status = True)

        # Find out total tests.
        report = re.findall(r"([0-9]+) tests run.", result.stdout)
        if not report:
            raise error.TestFail('Output missing: total test number unknown!')
        total = int(report[-1])
        # Find out failures.
        report = re.findall(r"([0-9]+) errors.", result.stdout)
        if not report:
            raise error.TestFail('Output missing: error number unknown!')
        failures = int(report[-1])
        report = re.findall(r"([0-9]+) failures.", result.stdout)
        if not report:
            raise error.TestFail('Output missing: failure number unknown!')
        failures += int(report[-1])
        logging.info('RESULTS: %d out of %d tests failed!', failures, total)

        # If all failed cases belong to flaky_test_list, we still pass the test.
        report = re.findall(r"SELENIUMRESULT ([a-zA-Z_0-9]+) "
                            r"\([a-zA-Z_0-9]+\.[a-zA-Z_0-9]+\) "
                            r"<\*googlechrome> \[[0-9.s]+\]: FAIL",
                            result.stdout)
        ignored_failures = 0
        error_message = "Unexpected failure cases:"
        for report_item in report:
            if report_item in self.flaky_test_list:
                ignored_failures += 1
                logging.info("FAILURE (ignored): %s", report_item)
            else:
                error_message += " " + report_item

        if failures > ignored_failures:
            raise error.TestFail(error_message)
