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

"""Unit tests for the auto_update_util module.
"""

from __future__ import print_function

import unittest

from chromite.lib import auto_update_util

class VersionMatchUnittest(unittest.TestCase):
  """Test version_match function."""

  def testVersionMatch(self):
    """Test version_match function."""
    canary_build = 'lumpy-release/R43-6803.0.0'
    canary_release = '6803.0.0'
    cq_build = 'lumpy-release/R43-6803.0.0-rc1'
    cq_release = '6803.0.0-rc1'
    trybot_paladin_build = 'trybot-lumpy-paladin/R43-6803.0.0-b123'
    trybot_paladin_release = '6803.0.2015_03_12_2103'
    trybot_pre_cq_build = 'trybot-wifi-pre-cq/R43-7000.0.0-b36'
    trybot_pre_cq_release = '7000.0.2016_03_12_2103'
    trybot_toolchain_build = 'trybot-sentry-llvm-toolchain/R56-8885.0.0-b943'
    trybot_toolchain_release = '8885.0.2016_10_10_1432'


    builds = [canary_build, cq_build, trybot_paladin_build,
              trybot_pre_cq_build, trybot_toolchain_build]
    releases = [canary_release, cq_release, trybot_paladin_release,
                trybot_pre_cq_release, trybot_toolchain_release]
    for i, build in enumerate(builds):
      for j, release in enumerate(releases):
        self.assertEqual(
            auto_update_util.VersionMatch(build, release), i == j,
            'Build version %s should%s match release version %s.' %
            (build, '' if i == j else ' not', release))
