# -*- coding: utf-8 -*-
# Copyright 2017 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.

"""Invokes git bisect to find culprit commit inside Chromium repository."""

from __future__ import print_function

import json
import re

from chromite.cli import flash
from chromite.cros_bisect import git_bisector
from chromite.lib import cros_logging as logging
from chromite.lib import git
from chromite.lib import gs
from chromite.lib import retry_util


REGEX_CROS_VERSION = re.compile(r'[Rr]?(\d+)[.-](\d+)\.(\d+)\.(\d+)$')


class ChromeOnCrosBisector(git_bisector.GitBisector):
  """Bisects offending commit in Chromium repository.

  Before bisect, it extracts metric scores for both last-know-good and bad
  commits, for verifying regression and for setting threshold telling good from
  bad commit. If last-known-good and last-known-bad CrOS version is given, it
  first checks if offending commit is in Chrome by deploying last-known-bad
  CrOS version's Chrome to DUT with last-known-good CrOS image installed. If it
  doesn't have regression, then the offending commit is not on Chrome side.

  It finds first bad commit within given good and bad commit using "git bisect"
  command. For each commit, it uses builder to build package to verify and
  deploy it to DUT (device under test). And asks evaluator to extract score
  of the commit. It is treated as good commit i the score is closer to user
  specified good commit.

  Finally, it outputs git bisect result.
  """

  def __init__(self, options, builder, evaluator):
    """Constructor.

    Args:
      options: An argparse.Namespace to hold command line arguments. Should
        contain:
        * cros_flash_retry: Max retry for "cros flash" command.
        * cros_flash_sleep: #seconds to wait between retry.
        * cros_flash_backoff: backoff factor. Must be >=1. If backoff factor
            is 1, sleep_duration = sleep * num_retry. Otherwise,
            sleep_duration = sleep * (backoff_factor) ** (num_retry - 1)
      builder: Builder to build/deploy image. Should contain repo_dir.
      evaluator: Evaluator to get score
    """
    super(ChromeOnCrosBisector, self).__init__(options, builder, evaluator)
    self.cros_flash_retry = max(0, options.cros_flash_retry)
    self.cros_flash_sleep = max(0, options.cros_flash_sleep)
    self.cros_flash_backoff = max(1, options.cros_flash_backoff)

    self.good_cros_version = None
    self.bad_cros_version = None
    self.bisect_between_cros_version = False
    if not (git.IsSHA1(options.good, full=False) and
            git.IsSHA1(options.bad, full=False)):
      # Postpone commit resolution to Run().
      self.good_commit = None
      self.bad_commit = None
      self.good_cros_version = options.good
      self.bad_cros_version = options.bad
      self.bisect_between_cros_version = True

    # Used to access gs://. Lazy initialization.
    self.gs_ctx = None

  @staticmethod
  def CheckCommitFormat(commit):
    """Checks if commit is the acceptable format.

    It accepts either SHA1 or CrOS version.

    Args:
      commit: commit string.

    Returns:
      Normalized commit. None if the format is unacceptable.
    """
    if git_bisector.GitBisector.CheckCommitFormat(commit):
      return commit

    match_obj = REGEX_CROS_VERSION.match(commit)
    if match_obj:
      return 'R%s-%s.%s.%s' % match_obj.groups()
    return None

  def ObtainBisectBoundaryScoreImpl(self, good_side):
    """The worker of obtaining score of either last-known-good or bad commit.

    Instead of deploying Chrome for good/bad commit, it deploys good/bad
    CrOS image if self.bisect_between_cros_version is set.

    Args:
      good_side: True if it evaluates score for last-known-good. False for
          last-known-bad commit.

    Returns:
      Evaluated score.
    """
    commit = self.good_commit if good_side else self.bad_commit
    commit_label = 'good' if good_side else 'bad'
    # Though bisect_between_cros_version uses archived image directly without
    # building Chrome, it is necessary because BuildDeployEval() will update
    # self.current_commit.
    self.Git(['checkout', commit])
    eval_label = None
    customize_build_deploy = None
    if self.bisect_between_cros_version:
      cros_version = (self.good_cros_version if good_side else
                      self.bad_cros_version)
      logging.notice('Obtaining score of %s CrOS version: %s', commit_label,
                     cros_version)
      eval_label = 'cros_%s' % cros_version
      customize_build_deploy = lambda: self.FlashCrosImage(
          self.GetCrosXbuddyPath(cros_version))
    else:
      logging.notice('Obtaining score of %s commit: %s', commit_label, commit)

    return self.BuildDeployEval(eval_label=eval_label,
                                customize_build_deploy=customize_build_deploy)

  def GetCrosXbuddyPath(self, version):
    """Composes xbuddy path.

    Args:
      version: CrOS version to get.

    Returns:
      xbuddy path of the CrOS image for board.
    """
    return 'xbuddy://remote/%s/%s/test' % (self.board, version)

  def ExchangeChromeSanityCheck(self):
    """Exchanges Chrome between good and bad CrOS.

    It deploys last-known-good Chrome to last-known-bad CrOS DUT and vice
    versa to see if regression culprit is in Chrome.
    """
    def FlashBuildDeploy(cros_version):
      """Flashes DUT first then builds/deploys Chrome."""
      self.FlashCrosImage(self.GetCrosXbuddyPath(cros_version))
      return self.BuildDeploy()

    def Evaluate(cros_version, chromium_commit):
      self.Git(['checkout', chromium_commit])
      score = self.BuildDeployEval(
          eval_label='cros_%s_cr_%s' % (cros_version, chromium_commit),
          customize_build_deploy=lambda: FlashBuildDeploy(cros_version))
      label = self.LabelBuild(score)
      logging.notice('Score(mean: %.3f std: %.3f). Marked as %s',
                     score.mean, score.std, label)
      return label

    logging.notice('Sanity check: exchange Chrome between good and bad CrOS '
                   'version.')
    # Expect bad result if culprit commit is inside Chrome.
    logging.notice('Obtaining score of good CrOS %s with bad Chrome %s',
                   self.good_cros_version, self.bad_commit)
    bad_chrome_on_good_cros_label = Evaluate(self.good_cros_version,
                                             self.bad_commit)
    self.current_commit.label = 'good_cros_bad_chrome'

    # Expect bad result if culprit commit is inside Chrome.
    logging.notice('Obtaining score of bad CrOS %s with good Chrome %s',
                   self.bad_cros_version, self.good_commit)
    good_chrome_on_bad_cros_label = Evaluate(self.bad_cros_version,
                                             self.good_commit)
    self.current_commit.label = 'bad_cros_good_chrome'

    if (bad_chrome_on_good_cros_label != 'bad' or
        good_chrome_on_bad_cros_label != 'good'):
      logging.error(
          'After exchanging Chrome between good/bad CrOS image, found that '
          'culprit commit should not be in Chrome repository.')
      logging.notice(
          'Bisect log:\n' +
          '\n'.join(self.CommitInfoToStr(x) for x in self.bisect_log))
      return False
    return True

  def FlashCrosImage(self, xbuddy_path):
    """Flashes CrOS image to DUT.

    It returns True when it successfully flashes image to DUT. Raises exception
    when it fails after retry.

    Args:
      xbuddy_path: xbuddy path to CrOS image to flash.

    Returns:
      True

    Raises:
      FlashError: An unrecoverable error occured.
    """
    logging.notice('cros flash %s', xbuddy_path)
    @retry_util.WithRetry(
        self.cros_flash_retry, log_all_retries=True,
        sleep=self.cros_flash_sleep,
        backoff_factor=self.cros_flash_backoff)
    def flash_with_retry():
      flash.Flash(self.remote, xbuddy_path, board=self.board,
                  clobber_stateful=True, clear_tpm_owner=True,
                  disable_rootfs_verification=True)

    flash_with_retry()
    return True

  def CrosVersionToChromeCommit(self, cros_version):
    """Resolves head commit of the Chrome used by the CrOS version.

    Args:
      cros_version: ChromeOS version, e.g. R60-9531.0.0.

    Returns:
      Chrome SHA. None if the ChromeOS version is not found.
    """
    metadata_url = ('gs://chromeos-image-archive/%s-release/%s/'
                    'partial-metadata.json') % (self.board, cros_version)
    try:
      metadata_content = self.gs_ctx.Cat(metadata_url)
    except gs.GSCommandError as e:
      logging.error('Cannot load %s: %s', metadata_url, e)
      return None

    try:
      metadata = json.loads(metadata_content)
    except ValueError:
      logging.error('Unable to parse %s', metadata_url)
      return None
    if (not metadata or 'version' not in metadata or
        'chrome' not in metadata['version']):
      logging.error('metadata["version"]["chrome"] does not exist in %s',
                    metadata_url)
      return None

    chrome_version = metadata['version']['chrome']

    # Commit just before the branch point.
    # Second line, first field.
    result = self.Git(['log', '--oneline', '-n', '2', chrome_version])
    if result.returncode != 0:
      logging.error('Failed to run "git log %s": error: %s  returncode:%s',
                    chrome_version, result.error, result.returncode)
      return None

    return result.output.splitlines()[1].split()[0]

  def ResolveChromeBisectRangeFromCrosVersion(self):
    """Resolves Chrome bisect range given good and bad CrOS versions.

    It sets up self.good_commit and self.bad_commit, which are derived from
    self.good_cros_version and self.bad_cros_version, respectively.

    Returns:
      False if either good_commit or bad_commit failed to resolve. Otherwise,
      True.
    """
    self.good_commit = self.CrosVersionToChromeCommit(self.good_cros_version)
    if self.good_commit:
      logging.info('Latest Chrome commit of good CrOS version %s: %s',
                   self.good_cros_version, self.good_commit)
    else:
      logging.error('Cannot find metadata for CrOS version: %s',
                    self.good_cros_version)
      return False

    self.bad_commit = self.CrosVersionToChromeCommit(self.bad_cros_version)
    if self.bad_commit:
      logging.info('Latest Chrome commit of bad CrOS version %s: %s',
                   self.bad_cros_version, self.bad_commit)
    else:
      logging.error('Cannot find metadata for CrOS version: %s',
                    self.bad_cros_version)
      return False
    return True

  def PrepareBisect(self):
    """Performs sanity checks and obtains bisect boundary score before bisect.

    Returns:
      False if there's something wrong.
    """
    if self.bisect_between_cros_version:
      # Lazy initialization.
      self.gs_ctx = gs.GSContext()
      self.builder.SyncToHead(fetch_tags=True)
      if not self.ResolveChromeBisectRangeFromCrosVersion():
        return None

    if not (self.SanityCheck() and
            self.ObtainBisectBoundaryScore() and
            self.GetThresholdFromUser()):
      return False

    if self.bisect_between_cros_version:
      if not self.ExchangeChromeSanityCheck():
        return False
    return True
