#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2014 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Test translation of xbuddy names."""

from __future__ import print_function

import argparse
import sys

import download_images

# On May 1, 2014:
# latest         : lumpy-release/R34-5500.132.0
# latest-beta    : lumpy-release/R35-5712.43.0
# latest-official: lumpy-release/R36-5814.0.0
# latest-dev     : lumpy-release/R36-5814.0.0
# latest-canary  : lumpy-release/R36-5814.0.0


class ImageDownloaderBuildIDTest(object):
  """Test translation of xbuddy names."""

  def __init__(self):
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-c',
        '--chromeos_root',
        dest='chromeos_root',
        help='Directory containing ChromeOS root.')

    options = parser.parse_known_args(sys.argv[1:])[0]
    if options.chromeos_root is None:
      self._usage(parser, '--chromeos_root must be set')
    self.chromeos_root = options.chromeos_root
    self.tests_passed = 0
    self.tests_run = 0
    self.tests_failed = 0

  def _usage(self, parser, message):
    print('ERROR: ' + message)
    parser.print_help()
    sys.exit(0)

  def print_test_status(self):
    print('----------------------------------------\n')
    print('Tests attempted: %d' % self.tests_run)
    print('Tests passed:    %d' % self.tests_passed)
    print('Tests failed:    %d' % self.tests_failed)
    print('\n----------------------------------------')

  def assert_failure(self, msg):
    print('Assert failure: %s' % msg)
    self.print_test_status()
    sys.exit(1)

  def assertIsNotNone(self, arg, arg_name):
    if arg is None:
      self.tests_failed = self.tests_failed + 1
      self.assert_failure('%s is not None' % arg_name)

  def assertNotEqual(self, arg1, arg2, arg1_name, arg2_name):
    if arg1 == arg2:
      self.tests_failed = self.tests_failed + 1
      self.assert_failure('%s is not NotEqual to %s' % (arg1_name, arg2_name))

  def assertEqual(self, arg1, arg2, arg1_name, arg2_name):
    if arg1 != arg2:
      self.tests_failed = self.tests_failed + 1
      self.assert_failure('%s is not Equal to %s' % (arg1_name, arg2_name))

  def test_one_id(self, downloader, test_id, result_string, exact_match):
    print("Translating '%s'" % test_id)
    self.tests_run = self.tests_run + 1

    result = downloader.GetBuildID(self.chromeos_root, test_id)
    # Verify that we got a build id back.
    self.assertIsNotNone(result, 'result')

    # Verify that the result either contains or exactly matches the
    # result_string, depending on the exact_match argument.
    if exact_match:
      self.assertEqual(result, result_string, 'result', result_string)
    else:
      self.assertNotEqual(result.find(result_string), -1, 'result.find', '-1')
    self.tests_passed = self.tests_passed + 1

  def test_get_build_id(self):
    """Test that the actual translating of xbuddy names is working properly."""
    downloader = download_images.ImageDownloader(log_level='quiet')

    self.test_one_id(downloader, 'remote/lumpy/latest-dev', 'lumpy-release/R',
                     False)
    self.test_one_id(downloader,
                     'remote/trybot-lumpy-release-afdo-use/R35-5672.0.0-b86',
                     'trybot-lumpy-release-afdo-use/R35-5672.0.0-b86', True)
    self.test_one_id(downloader, 'remote/lumpy-release/R35-5672.0.0',
                     'lumpy-release/R35-5672.0.0', True)
    self.test_one_id(downloader, 'remote/lumpy/latest-dev', 'lumpy-release/R',
                     False)
    self.test_one_id(downloader, 'remote/lumpy/latest-official',
                     'lumpy-release/R', False)
    self.test_one_id(downloader, 'remote/lumpy/latest-beta', 'lumpy-release/R',
                     False)

    self.print_test_status()


if __name__ == '__main__':
  tester = ImageDownloaderBuildIDTest()
  tester.test_get_build_id()
