blob: 2a65ddc71638a189e026edd1167687520fdd7efc [file] [log] [blame]
# Copyright 2019 The Chromium 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 os
import unittest
import mock
import version
def _ReplaceArgs(args, *replacements):
new_args = args[:]
for flag, val in replacements:
flag_index = args.index(flag)
new_args[flag_index + 1] = val
return new_args
class _VersionTest(unittest.TestCase):
"""Unittests for the version module.
"""
_CHROME_VERSION_FILE = os.path.join(
os.path.dirname(__file__), os.pardir, os.pardir, 'chrome', 'VERSION')
_SCRIPT = os.path.join(os.path.dirname(__file__), 'version.py')
_EXAMPLE_VERSION = {
'MAJOR': '74',
'MINOR': '0',
'BUILD': '3720',
'PATCH': '0',
}
_EXAMPLE_TEMPLATE = (
'full = "@MAJOR@.@MINOR@.@BUILD@.@PATCH@" '
'major = "@MAJOR@" minor = "@MINOR@" '
'build = "@BUILD@" patch = "@PATCH@" version_id = @VERSION_ID@ ')
_ANDROID_CHROME_VARS = [
'chrome_version_code',
'chrome_modern_version_code',
'monochrome_version_code',
'trichrome_version_code',
'webview_stable_version_code',
'webview_beta_version_code',
'webview_dev_version_code',
]
_EXAMPLE_ANDROID_TEMPLATE = (
_EXAMPLE_TEMPLATE + ''.join(
['%s = "@%s@" ' % (el, el.upper()) for el in _ANDROID_CHROME_VARS]))
_EXAMPLE_ARGS = [
'-f',
_CHROME_VERSION_FILE,
'-t',
_EXAMPLE_TEMPLATE,
]
_EXAMPLE_ANDROID_ARGS = _ReplaceArgs(_EXAMPLE_ARGS,
['-t', _EXAMPLE_ANDROID_TEMPLATE]) + [
'-a',
'arm',
'--os',
'android',
]
@staticmethod
def _RunBuildOutput(new_version_values={},
get_new_args=lambda old_args: old_args):
"""Parameterized helper method for running the main testable method in
version.py.
Keyword arguments:
new_version_values -- dict used to update _EXAMPLE_VERSION
get_new_args -- lambda for updating _EXAMPLE_ANDROID_ARGS
"""
with mock.patch('version.FetchValuesFromFile') as \
fetch_values_from_file_mock:
fetch_values_from_file_mock.side_effect = (lambda values, file :
values.update(
dict(_VersionTest._EXAMPLE_VERSION, **new_version_values)))
new_args = get_new_args(_VersionTest._EXAMPLE_ARGS)
return version.BuildOutput(new_args)
def testFetchValuesFromFile(self):
"""It returns a dict in correct format - { <str>: <str> }, to verify
assumption of other tests that mock this function
"""
result = {}
version.FetchValuesFromFile(result, self._CHROME_VERSION_FILE)
for key, val in result.iteritems():
self.assertIsInstance(key, str)
self.assertIsInstance(val, str)
def testBuildOutputAndroid(self):
"""Assert it gives includes assignments of expected variables"""
output = self._RunBuildOutput(
get_new_args=lambda args: self._EXAMPLE_ANDROID_ARGS)
contents = output['contents']
self.assertRegexpMatches(contents, r'\bchrome_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\bchrome_modern_version_code = "\d+"\s')
self.assertRegexpMatches(contents, r'\bmonochrome_version_code = "\d+"\s')
self.assertRegexpMatches(contents, r'\btrichrome_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\bwebview_stable_version_code = "\d+"\s')
self.assertRegexpMatches(contents, r'\bwebview_beta_version_code = "\d+"\s')
self.assertRegexpMatches(contents, r'\bwebview_dev_version_code = "\d+"\s')
def testBuildOutputAndroidArchVariantsArm64(self):
"""Assert 64-bit-specific version codes"""
new_template = (
self._EXAMPLE_ANDROID_TEMPLATE +
"monochrome_64_32_version_code = \"@MONOCHROME_64_32_VERSION_CODE@\" "
"monochrome_64_version_code = \"@MONOCHROME_64_VERSION_CODE@\" "
"trichrome_64_32_version_code = \"@TRICHROME_64_32_VERSION_CODE@\" "
"trichrome_64_version_code = \"@TRICHROME_64_VERSION_CODE@\" ")
args_with_template = _ReplaceArgs(self._EXAMPLE_ANDROID_ARGS,
['-t', new_template])
new_args = _ReplaceArgs(args_with_template, ['-a', 'arm64'])
output = self._RunBuildOutput(get_new_args=lambda args: new_args)
contents = output['contents']
self.assertRegexpMatches(contents,
r'\bmonochrome_64_32_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\bmonochrome_64_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\btrichrome_64_32_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\btrichrome_64_version_code = "\d+"\s')
def testBuildOutputAndroidArchVariantsX64(self):
"""Assert 64-bit-specific version codes"""
new_template = (
self._EXAMPLE_ANDROID_TEMPLATE +
"monochrome_64_32_version_code = \"@MONOCHROME_64_32_VERSION_CODE@\" "
"monochrome_64_version_code = \"@MONOCHROME_64_VERSION_CODE@\" "
"trichrome_64_32_version_code = \"@TRICHROME_64_32_VERSION_CODE@\" "
"trichrome_64_version_code = \"@TRICHROME_64_VERSION_CODE@\" ")
args_with_template = _ReplaceArgs(self._EXAMPLE_ANDROID_ARGS,
['-t', new_template])
new_args = _ReplaceArgs(args_with_template, ['-a', 'x64'])
output = self._RunBuildOutput(get_new_args=lambda args: new_args)
contents = output['contents']
self.assertRegexpMatches(contents,
r'\bmonochrome_64_32_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\bmonochrome_64_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\btrichrome_64_32_version_code = "\d+"\s')
self.assertRegexpMatches(contents,
r'\btrichrome_64_version_code = "\d+"\s')
def testBuildOutputAndroidChromeArchInput(self):
"""Assert it raises an exception when using an invalid architecture input"""
new_args = _ReplaceArgs(self._EXAMPLE_ANDROID_ARGS, ['-a', 'foobar'])
with self.assertRaises(SystemExit) as cm:
self._RunBuildOutput(get_new_args=lambda args: new_args)
self.assertEqual(cm.exception.code, 2)
if __name__ == '__main__':
unittest.main()