blob: 17a094b4a17067f8f88bdbce1991fc78bb49a1c8 [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for retrieving the LLVM hash."""
import subprocess
import unittest
import unittest.mock as mock
import get_llvm_hash
from get_llvm_hash import LLVMHash
# We grab protected stuff from get_llvm_hash. That's OK.
# pylint: disable=protected-access
def MakeMockPopen(return_code):
def MockPopen(*_args, **_kwargs):
result = mock.MagicMock()
result.returncode = return_code
communicate_result = result.communicate.return_value
# Communicate returns stdout, stderr.
communicate_result.__iter__.return_value = (None, "some stderr")
return result
return MockPopen
class TestGetLLVMHash(unittest.TestCase):
"""The LLVMHash test class."""
@mock.patch.object(subprocess, "Popen")
def testCloneRepoSucceedsWhenGitSucceeds(self, popen_mock):
popen_mock.side_effect = MakeMockPopen(return_code=0)
llvm_hash = LLVMHash()
into_tempdir = "/tmp/tmpTest"
llvm_hash.CloneLLVMRepo(into_tempdir)
popen_mock.assert_called_with(
["git", "clone", get_llvm_hash._LLVM_GIT_URL, into_tempdir],
stderr=subprocess.PIPE,
)
@mock.patch.object(subprocess, "Popen")
def testCloneRepoFailsWhenGitFails(self, popen_mock):
popen_mock.side_effect = MakeMockPopen(return_code=1)
with self.assertRaises(ValueError) as err:
LLVMHash().CloneLLVMRepo("/tmp/tmp1")
self.assertIn("Failed to clone", str(err.exception.args))
self.assertIn("some stderr", str(err.exception.args))
@mock.patch.object(get_llvm_hash, "GetGitHashFrom")
def testGetGitHashWorks(self, mock_get_git_hash):
mock_get_git_hash.return_value = "a13testhash2"
self.assertEqual(
get_llvm_hash.GetGitHashFrom("/tmp/tmpTest", 100), "a13testhash2"
)
mock_get_git_hash.assert_called_once()
@mock.patch.object(LLVMHash, "GetLLVMHash")
@mock.patch.object(get_llvm_hash, "GetGoogle3LLVMVersion")
def testReturnGoogle3LLVMHash(
self, mock_google3_llvm_version, mock_get_llvm_hash
):
mock_get_llvm_hash.return_value = "a13testhash3"
mock_google3_llvm_version.return_value = 1000
self.assertEqual(LLVMHash().GetGoogle3LLVMHash(), "a13testhash3")
mock_get_llvm_hash.assert_called_once_with(1000)
@mock.patch.object(LLVMHash, "GetLLVMHash")
@mock.patch.object(get_llvm_hash, "GetGoogle3LLVMVersion")
def testReturnGoogle3UnstableLLVMHash(
self, mock_google3_llvm_version, mock_get_llvm_hash
):
mock_get_llvm_hash.return_value = "a13testhash3"
mock_google3_llvm_version.return_value = 1000
self.assertEqual(
LLVMHash().GetGoogle3UnstableLLVMHash(), "a13testhash3"
)
mock_get_llvm_hash.assert_called_once_with(1000)
@mock.patch.object(subprocess, "check_output")
def testSuccessfullyGetGitHashFromToTOfLLVM(self, mock_check_output):
mock_check_output.return_value = "a123testhash1 path/to/main\n"
self.assertEqual(LLVMHash().GetTopOfTrunkGitHash(), "a123testhash1")
mock_check_output.assert_called_once()
@mock.patch.object(subprocess, "Popen")
def testCheckoutBranch(self, mock_popen):
mock_popen.return_value = mock.MagicMock(
communicate=lambda: (None, None), returncode=0
)
get_llvm_hash.CheckoutBranch("fake/src_dir", "fake_branch")
self.assertEqual(
mock_popen.call_args_list[0][0],
(["git", "-C", "fake/src_dir", "checkout", "fake_branch"],),
)
self.assertEqual(
mock_popen.call_args_list[1][0],
(["git", "-C", "fake/src_dir", "pull"],),
)
def testParseLLVMMajorVersion(self):
cmakelist_42 = (
"set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)\n"
"if(NOT DEFINED LLVM_VERSION_MAJOR)\n"
" set(LLVM_VERSION_MAJOR 42)\n"
"endif()"
)
self.assertEqual(
get_llvm_hash.ParseLLVMMajorVersion(cmakelist_42), "42"
)
def testParseLLVMMajorVersionInvalid(self):
invalid_cmakelist = "invalid cmakelist.txt contents"
with self.assertRaises(ValueError):
get_llvm_hash.ParseLLVMMajorVersion(invalid_cmakelist)
@mock.patch.object(get_llvm_hash, "GetAndUpdateLLVMProjectInLLVMTools")
@mock.patch.object(get_llvm_hash, "ParseLLVMMajorVersion")
@mock.patch.object(get_llvm_hash, "CheckCommand")
@mock.patch.object(get_llvm_hash, "CheckoutBranch")
@mock.patch(
"get_llvm_hash.open",
mock.mock_open(read_data="mock contents"),
create=True,
)
def testGetLLVMMajorVersion(
self,
mock_checkout_branch,
mock_git_checkout,
mock_major_version,
mock_llvm_project_path,
):
mock_llvm_project_path.return_value = "path/to/llvm-project"
mock_major_version.return_value = "1234"
self.assertEqual(get_llvm_hash.GetLLVMMajorVersion("314159265"), "1234")
# Second call should be memoized
self.assertEqual(get_llvm_hash.GetLLVMMajorVersion("314159265"), "1234")
mock_llvm_project_path.assert_called_once()
mock_major_version.assert_called_with("mock contents")
mock_git_checkout.assert_called_once_with(
["git", "-C", "path/to/llvm-project", "checkout", "314159265"]
)
mock_checkout_branch.assert_called_once_with(
"path/to/llvm-project", "main"
)
if __name__ == "__main__":
unittest.main()