#!/usr/bin/python
#
# Copyright 2014 Google Inc.  All Rights Reserved

import optparse
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):

  def __init__(self):
    parser = optparse.OptionParser()
    parser.add_option("-c", "--chromeos_root", dest="chromeos_root",
                      help="Directory containing ChromeOS root.")

    options = parser.parse_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 == 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()
