| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # Copyright 2020 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Tests for rust_uprev.py""" |
| |
| import os |
| from pathlib import Path |
| import shutil |
| import subprocess |
| import tempfile |
| import unittest |
| from unittest import mock |
| |
| from llvm_tools import git |
| import rust_uprev |
| from rust_uprev import RustVersion |
| |
| |
| def _fail_command(cmd, *_args, **_kwargs): |
| err = subprocess.CalledProcessError(returncode=1, cmd=cmd) |
| err.stderr = b"mock failure" |
| raise err |
| |
| |
| class FetchDistfileTest(unittest.TestCase): |
| """Tests rust_uprev.fetch_distfile_from_mirror()""" |
| |
| @mock.patch.object( |
| rust_uprev, "get_distdir", return_value="/fake/distfiles" |
| ) |
| @mock.patch.object(subprocess, "call", side_effect=_fail_command) |
| def test_fetch_difstfile_fail(self, *_args) -> None: |
| with self.assertRaises(subprocess.CalledProcessError): |
| rust_uprev.fetch_distfile_from_mirror("test_distfile.tar.gz") |
| |
| @mock.patch.object( |
| rust_uprev, |
| "get_command_output_unchecked", |
| return_value="AccessDeniedException: Access denied.", |
| ) |
| @mock.patch.object( |
| rust_uprev, "get_distdir", return_value="/fake/distfiles" |
| ) |
| @mock.patch.object(subprocess, "call", return_value=0) |
| def test_fetch_distfile_acl_access_denied(self, *_args) -> None: |
| rust_uprev.fetch_distfile_from_mirror("test_distfile.tar.gz") |
| |
| @mock.patch.object( |
| rust_uprev, |
| "get_command_output_unchecked", |
| return_value='[ { "entity": "allUsers", "role": "READER" } ]', |
| ) |
| @mock.patch.object( |
| rust_uprev, "get_distdir", return_value="/fake/distfiles" |
| ) |
| @mock.patch.object(subprocess, "call", return_value=0) |
| def test_fetch_distfile_acl_ok(self, *_args) -> None: |
| rust_uprev.fetch_distfile_from_mirror("test_distfile.tar.gz") |
| |
| @mock.patch.object( |
| rust_uprev, |
| "get_command_output_unchecked", |
| return_value='[ { "entity": "___fake@google.com", "role": "OWNER" } ]', |
| ) |
| @mock.patch.object( |
| rust_uprev, "get_distdir", return_value="/fake/distfiles" |
| ) |
| @mock.patch.object(subprocess, "call", return_value=0) |
| def test_fetch_distfile_acl_wrong(self, *_args) -> None: |
| with self.assertRaisesRegex(Exception, "allUsers.*READER"): |
| with self.assertLogs(level="ERROR") as log: |
| rust_uprev.fetch_distfile_from_mirror("test_distfile.tar.gz") |
| self.assertIn( |
| '[ { "entity": "___fake@google.com", "role": "OWNER" } ]', |
| "\n".join(log.output), |
| ) |
| |
| |
| class FindEbuildPathTest(unittest.TestCase): |
| """Tests for rust_uprev.find_ebuild_path()""" |
| |
| def test_exact_version(self): |
| with tempfile.TemporaryDirectory() as t: |
| tmpdir = Path(t) |
| ebuild = tmpdir / "test-1.3.4.ebuild" |
| ebuild.touch() |
| (tmpdir / "test-1.2.3.ebuild").touch() |
| result = rust_uprev.find_ebuild_path( |
| tmpdir, "test", rust_uprev.RustVersion(1, 3, 4) |
| ) |
| self.assertEqual(result, ebuild) |
| |
| def test_no_version(self): |
| with tempfile.TemporaryDirectory() as t: |
| tmpdir = Path(t) |
| ebuild = tmpdir / "test-1.2.3.ebuild" |
| ebuild.touch() |
| result = rust_uprev.find_ebuild_path(tmpdir, "test") |
| self.assertEqual(result, ebuild) |
| |
| def test_patch_version(self): |
| with tempfile.TemporaryDirectory() as t: |
| tmpdir = Path(t) |
| ebuild = tmpdir / "test-1.3.4-r3.ebuild" |
| ebuild.touch() |
| (tmpdir / "test-1.2.3.ebuild").touch() |
| result = rust_uprev.find_ebuild_path( |
| tmpdir, "test", rust_uprev.RustVersion(1, 3, 4) |
| ) |
| self.assertEqual(result, ebuild) |
| |
| def test_multiple_versions(self): |
| with tempfile.TemporaryDirectory() as t: |
| tmpdir = Path(t) |
| (tmpdir / "test-1.3.4-r3.ebuild").touch() |
| (tmpdir / "test-1.3.5.ebuild").touch() |
| with self.assertRaises(AssertionError): |
| rust_uprev.find_ebuild_path(tmpdir, "test") |
| |
| def test_selected_version(self): |
| with tempfile.TemporaryDirectory() as t: |
| tmpdir = Path(t) |
| ebuild = tmpdir / "test-1.3.4-r3.ebuild" |
| ebuild.touch() |
| (tmpdir / "test-1.3.5.ebuild").touch() |
| result = rust_uprev.find_ebuild_path( |
| tmpdir, "test", rust_uprev.RustVersion(1, 3, 4) |
| ) |
| self.assertEqual(result, ebuild) |
| |
| def test_symlink(self): |
| # Symlinks to ebuilds in the same directory are allowed, and the return |
| # value is the regular file. |
| with tempfile.TemporaryDirectory() as t: |
| tmpdir = Path(t) |
| ebuild = tmpdir / "test-1.3.4.ebuild" |
| ebuild.touch() |
| (tmpdir / "test-1.3.4-r1.ebuild").symlink_to("test-1.3.4.ebuild") |
| result = rust_uprev.find_ebuild_path(tmpdir, "test") |
| self.assertEqual(result, ebuild) |
| |
| |
| class RemoveEbuildVersionTest(unittest.TestCase): |
| """Tests for rust_uprev.remove_ebuild_version()""" |
| |
| @mock.patch.object(subprocess, "check_call") |
| def test_single(self, check_call): |
| with tempfile.TemporaryDirectory() as tmpdir: |
| ebuild_dir = Path(tmpdir, "test-ebuilds") |
| ebuild_dir.mkdir() |
| ebuild = Path(ebuild_dir, "test-3.1.4.ebuild") |
| ebuild.touch() |
| Path(ebuild_dir, "unrelated-1.0.0.ebuild").touch() |
| rust_uprev.remove_ebuild_version( |
| ebuild_dir, "test", rust_uprev.RustVersion(3, 1, 4) |
| ) |
| check_call.assert_called_once_with( |
| ["git", "rm", "test-3.1.4.ebuild"], cwd=ebuild_dir |
| ) |
| |
| @mock.patch.object(subprocess, "check_call") |
| def test_symlink(self, check_call): |
| with tempfile.TemporaryDirectory() as tmpdir: |
| ebuild_dir = Path(tmpdir, "test-ebuilds") |
| ebuild_dir.mkdir() |
| ebuild = Path(ebuild_dir, "test-3.1.4.ebuild") |
| ebuild.touch() |
| symlink = Path(ebuild_dir, "test-3.1.4-r5.ebuild") |
| symlink.symlink_to(ebuild.name) |
| Path(ebuild_dir, "unrelated-1.0.0.ebuild").touch() |
| rust_uprev.remove_ebuild_version( |
| ebuild_dir, "test", rust_uprev.RustVersion(3, 1, 4) |
| ) |
| check_call.assert_has_calls( |
| [ |
| mock.call( |
| ["git", "rm", "test-3.1.4.ebuild"], cwd=ebuild_dir |
| ), |
| mock.call( |
| ["git", "rm", "test-3.1.4-r5.ebuild"], cwd=ebuild_dir |
| ), |
| ], |
| any_order=True, |
| ) |
| |
| |
| class RustVersionTest(unittest.TestCase): |
| """Tests for RustVersion class""" |
| |
| def test_str(self): |
| obj = rust_uprev.RustVersion(major=1, minor=2, patch=3) |
| self.assertEqual(str(obj), "1.2.3") |
| |
| def test_parse_version_only(self): |
| expected = rust_uprev.RustVersion(major=1, minor=2, patch=3) |
| actual = rust_uprev.RustVersion.parse("1.2.3") |
| self.assertEqual(expected, actual) |
| |
| def test_parse_ebuild_name(self): |
| expected = rust_uprev.RustVersion(major=1, minor=2, patch=3) |
| actual = rust_uprev.RustVersion.parse_from_ebuild("rust-1.2.3.ebuild") |
| self.assertEqual(expected, actual) |
| |
| actual = rust_uprev.RustVersion.parse_from_ebuild( |
| "rust-1.2.3-r1.ebuild" |
| ) |
| self.assertEqual(expected, actual) |
| |
| def test_parse_fail(self): |
| with self.assertRaises(AssertionError) as context: |
| rust_uprev.RustVersion.parse("invalid-rust-1.2.3") |
| self.assertEqual( |
| "failed to parse 'invalid-rust-1.2.3'", str(context.exception) |
| ) |
| |
| |
| class PrepareUprevTest(unittest.TestCase): |
| """Tests for prepare_uprev step in rust_uprev""" |
| |
| def setUp(self): |
| self.bootstrap_version = rust_uprev.RustVersion(1, 1, 0) |
| self.version_old = rust_uprev.RustVersion(1, 2, 3) |
| self.version_new = rust_uprev.RustVersion(1, 3, 5) |
| |
| @mock.patch.object( |
| rust_uprev, |
| "find_ebuild_for_rust_version", |
| return_value="/path/to/ebuild", |
| ) |
| @mock.patch.object(rust_uprev, "find_ebuild_path") |
| @mock.patch.object(rust_uprev, "get_command_output") |
| def test_success_with_template( |
| self, mock_command, mock_find_ebuild, _ebuild_for_version |
| ): |
| bootstrap_ebuild_path = Path( |
| "/path/to/rust-bootstrap/", |
| f"rust-bootstrap-{self.bootstrap_version}.ebuild", |
| ) |
| mock_find_ebuild.return_value = bootstrap_ebuild_path |
| expected = (self.version_old, "/path/to/ebuild", self.bootstrap_version) |
| actual = rust_uprev.prepare_uprev( |
| rust_version=self.version_new, template=self.version_old |
| ) |
| self.assertEqual(expected, actual) |
| mock_command.assert_not_called() |
| |
| @mock.patch.object( |
| rust_uprev, |
| "find_ebuild_for_rust_version", |
| return_value="/path/to/ebuild", |
| ) |
| @mock.patch.object( |
| rust_uprev, |
| "get_rust_bootstrap_version", |
| return_value=RustVersion(0, 41, 12), |
| ) |
| @mock.patch.object(rust_uprev, "get_command_output") |
| def test_return_none_with_template_larger_than_input( |
| self, mock_command, *_args |
| ): |
| ret = rust_uprev.prepare_uprev( |
| rust_version=self.version_old, template=self.version_new |
| ) |
| self.assertIsNone(ret) |
| mock_command.assert_not_called() |
| |
| @mock.patch.object(rust_uprev, "find_ebuild_path") |
| @mock.patch.object(os.path, "exists") |
| @mock.patch.object(rust_uprev, "get_command_output") |
| def test_success_without_template( |
| self, mock_command, mock_exists, mock_find_ebuild |
| ): |
| rust_ebuild_path = f"/path/to/rust/rust-{self.version_old}-r3.ebuild" |
| mock_command.return_value = rust_ebuild_path |
| bootstrap_ebuild_path = Path( |
| "/path/to/rust-bootstrap", |
| f"rust-bootstrap-{self.bootstrap_version}.ebuild", |
| ) |
| mock_find_ebuild.return_value = bootstrap_ebuild_path |
| expected = (self.version_old, rust_ebuild_path, self.bootstrap_version) |
| actual = rust_uprev.prepare_uprev( |
| rust_version=self.version_new, template=None |
| ) |
| self.assertEqual(expected, actual) |
| mock_command.assert_called_once_with(["equery", "w", "rust"]) |
| mock_exists.assert_not_called() |
| |
| @mock.patch.object( |
| rust_uprev, |
| "get_rust_bootstrap_version", |
| return_value=RustVersion(0, 41, 12), |
| ) |
| @mock.patch.object(os.path, "exists") |
| @mock.patch.object(rust_uprev, "get_command_output") |
| def test_return_none_with_ebuild_larger_than_input( |
| self, mock_command, mock_exists, *_args |
| ): |
| mock_command.return_value = ( |
| f"/path/to/rust/rust-{self.version_new}.ebuild" |
| ) |
| ret = rust_uprev.prepare_uprev( |
| rust_version=self.version_old, template=None |
| ) |
| self.assertIsNone(ret) |
| mock_exists.assert_not_called() |
| |
| def test_prepare_uprev_from_json(self): |
| ebuild_path = "/path/to/the/ebuild" |
| json_result = ( |
| list(self.version_new), |
| ebuild_path, |
| list(self.bootstrap_version), |
| ) |
| expected = (self.version_new, ebuild_path, self.bootstrap_version) |
| actual = rust_uprev.prepare_uprev_from_json(json_result) |
| self.assertEqual(expected, actual) |
| |
| |
| class UpdateBootstrapVersionTest(unittest.TestCase): |
| """Tests for update_bootstrap_version step in rust_uprev""" |
| |
| ebuild_file_before = """ |
| BOOTSTRAP_VERSION="1.2.0" |
| """ |
| ebuild_file_after = """ |
| BOOTSTRAP_VERSION="1.3.6" |
| """ |
| |
| def test_success(self): |
| mock_open = mock.mock_open(read_data=self.ebuild_file_before) |
| # ebuild_file and new bootstrap version are deliberately different |
| ebuild_file = "/path/to/rust/cros-rustc.eclass" |
| with mock.patch("builtins.open", mock_open): |
| rust_uprev.update_bootstrap_version( |
| ebuild_file, rust_uprev.RustVersion.parse("1.3.6") |
| ) |
| mock_open.return_value.__enter__().write.assert_called_once_with( |
| self.ebuild_file_after |
| ) |
| |
| def test_fail_when_ebuild_misses_a_variable(self): |
| mock_open = mock.mock_open(read_data="") |
| ebuild_file = "/path/to/rust/rust-1.3.5.ebuild" |
| with mock.patch("builtins.open", mock_open): |
| with self.assertRaises(RuntimeError) as context: |
| rust_uprev.update_bootstrap_version( |
| ebuild_file, rust_uprev.RustVersion.parse("1.2.0") |
| ) |
| self.assertEqual( |
| "BOOTSTRAP_VERSION not found in /path/to/rust/rust-1.3.5.ebuild", |
| str(context.exception), |
| ) |
| |
| |
| class UpdateManifestTest(unittest.TestCase): |
| """Tests for update_manifest step in rust_uprev""" |
| |
| @mock.patch.object(rust_uprev, "ebuild_actions") |
| def test_update_manifest(self, mock_run): |
| ebuild_file = Path("/path/to/rust/rust-1.1.1.ebuild") |
| rust_uprev.update_manifest(ebuild_file) |
| mock_run.assert_called_once_with("rust", ["manifest"]) |
| |
| |
| class UpdateBootstrapEbuildTest(unittest.TestCase): |
| """Tests for rust_uprev.update_bootstrap_ebuild()""" |
| |
| def test_update_bootstrap_ebuild(self): |
| # The update should do two things: |
| # 1. Create a copy of rust-bootstrap's ebuild with the new version number. |
| # 2. Add the old PV to RUSTC_RAW_FULL_BOOTSTRAP_SEQUENCE. |
| with tempfile.TemporaryDirectory() as tmpdir_str, mock.patch.object( |
| rust_uprev, "find_ebuild_path" |
| ) as mock_find_ebuild: |
| tmpdir = Path(tmpdir_str) |
| bootstrapdir = Path.joinpath(tmpdir, "rust-bootstrap") |
| bootstrapdir.mkdir() |
| old_ebuild = bootstrapdir.joinpath("rust-bootstrap-1.45.2.ebuild") |
| old_ebuild.write_text( |
| encoding="utf-8", |
| data=""" |
| some text |
| RUSTC_RAW_FULL_BOOTSTRAP_SEQUENCE=( |
| \t1.43.1 |
| \t1.44.1 |
| ) |
| some more text |
| """, |
| ) |
| mock_find_ebuild.return_value = old_ebuild |
| rust_uprev.update_bootstrap_ebuild(rust_uprev.RustVersion(1, 46, 0)) |
| new_ebuild = bootstrapdir.joinpath("rust-bootstrap-1.46.0.ebuild") |
| self.assertTrue(new_ebuild.exists()) |
| text = new_ebuild.read_text() |
| self.assertEqual( |
| text, |
| """ |
| some text |
| RUSTC_RAW_FULL_BOOTSTRAP_SEQUENCE=( |
| \t1.43.1 |
| \t1.44.1 |
| \t1.45.2 |
| ) |
| some more text |
| """, |
| ) |
| |
| |
| class UpdateRustPackagesTests(unittest.TestCase): |
| """Tests for update_rust_packages step.""" |
| |
| def setUp(self): |
| self.old_version = rust_uprev.RustVersion(1, 1, 0) |
| self.current_version = rust_uprev.RustVersion(1, 2, 3) |
| self.new_version = rust_uprev.RustVersion(1, 3, 5) |
| self.ebuild_file = os.path.join( |
| rust_uprev.RUST_PATH, "rust-{self.new_version}.ebuild" |
| ) |
| |
| def test_add_new_rust_packages(self): |
| package_before = ( |
| f"dev-lang/rust-{self.old_version}\n" |
| f"dev-lang/rust-{self.current_version}" |
| ) |
| package_after = ( |
| f"dev-lang/rust-{self.old_version}\n" |
| f"dev-lang/rust-{self.current_version}\n" |
| f"dev-lang/rust-{self.new_version}" |
| ) |
| mock_open = mock.mock_open(read_data=package_before) |
| with mock.patch("builtins.open", mock_open): |
| rust_uprev.update_rust_packages( |
| "dev-lang/rust", self.new_version, add=True |
| ) |
| mock_open.return_value.__enter__().write.assert_called_once_with( |
| package_after |
| ) |
| |
| def test_remove_old_rust_packages(self): |
| package_before = ( |
| f"dev-lang/rust-{self.old_version}\n" |
| f"dev-lang/rust-{self.current_version}\n" |
| f"dev-lang/rust-{self.new_version}" |
| ) |
| package_after = ( |
| f"dev-lang/rust-{self.current_version}\n" |
| f"dev-lang/rust-{self.new_version}" |
| ) |
| mock_open = mock.mock_open(read_data=package_before) |
| with mock.patch("builtins.open", mock_open): |
| rust_uprev.update_rust_packages( |
| "dev-lang/rust", self.old_version, add=False |
| ) |
| mock_open.return_value.__enter__().write.assert_called_once_with( |
| package_after |
| ) |
| |
| |
| class RustUprevOtherStagesTests(unittest.TestCase): |
| """Tests for other steps in rust_uprev""" |
| |
| def setUp(self): |
| self.old_version = rust_uprev.RustVersion(1, 1, 0) |
| self.current_version = rust_uprev.RustVersion(1, 2, 3) |
| self.new_version = rust_uprev.RustVersion(1, 3, 5) |
| self.ebuild_file = os.path.join( |
| rust_uprev.RUST_PATH, "rust-{self.new_version}.ebuild" |
| ) |
| |
| @mock.patch.object(shutil, "copyfile") |
| @mock.patch.object(subprocess, "check_call") |
| def test_create_rust_ebuild(self, mock_call, mock_copy): |
| template_ebuild = f"/path/to/rust-{self.current_version}-r2.ebuild" |
| rust_uprev.create_ebuild( |
| template_ebuild, "dev-lang/rust", self.new_version |
| ) |
| mock_copy.assert_called_once_with( |
| template_ebuild, |
| rust_uprev.RUST_PATH.joinpath(f"rust-{self.new_version}.ebuild"), |
| ) |
| mock_call.assert_called_once_with( |
| ["git", "add", f"rust-{self.new_version}.ebuild"], |
| cwd=rust_uprev.RUST_PATH, |
| ) |
| |
| @mock.patch.object(shutil, "copyfile") |
| @mock.patch.object(subprocess, "check_call") |
| def test_create_rust_host_ebuild(self, mock_call, mock_copy): |
| template_ebuild = f"/path/to/rust-host-{self.current_version}-r2.ebuild" |
| rust_uprev.create_ebuild( |
| template_ebuild, "dev-lang/rust-host", self.new_version |
| ) |
| mock_copy.assert_called_once_with( |
| template_ebuild, |
| rust_uprev.EBUILD_PREFIX.joinpath( |
| f"dev-lang/rust-host/rust-host-{self.new_version}.ebuild" |
| ), |
| ) |
| mock_call.assert_called_once_with( |
| ["git", "add", f"rust-host-{self.new_version}.ebuild"], |
| cwd=rust_uprev.EBUILD_PREFIX.joinpath("dev-lang/rust-host"), |
| ) |
| |
| @mock.patch.object(rust_uprev, "find_ebuild_for_package") |
| @mock.patch.object(subprocess, "check_call") |
| def test_remove_rust_bootstrap_version(self, mock_call, *_args): |
| bootstrap_path = os.path.join( |
| rust_uprev.RUST_PATH, "..", "rust-bootstrap" |
| ) |
| rust_uprev.remove_rust_bootstrap_version( |
| self.old_version, lambda *x: () |
| ) |
| mock_call.has_calls( |
| [ |
| [ |
| "git", |
| "rm", |
| os.path.join( |
| bootstrap_path, |
| "files", |
| f"rust-bootstrap-{self.old_version}-*.patch", |
| ), |
| ], |
| [ |
| "git", |
| "rm", |
| os.path.join( |
| bootstrap_path, |
| f"rust-bootstrap-{self.old_version}.ebuild", |
| ), |
| ], |
| ] |
| ) |
| |
| @mock.patch.object(subprocess, "check_call") |
| def test_remove_virtual_rust(self, mock_call): |
| with tempfile.TemporaryDirectory() as tmpdir: |
| ebuild_path = Path( |
| tmpdir, f"virtual/rust/rust-{self.old_version}.ebuild" |
| ) |
| os.makedirs(ebuild_path.parent) |
| ebuild_path.touch() |
| with mock.patch("rust_uprev.EBUILD_PREFIX", Path(tmpdir)): |
| rust_uprev.remove_virtual_rust(self.old_version) |
| mock_call.assert_called_once_with( |
| ["git", "rm", str(ebuild_path.name)], cwd=ebuild_path.parent |
| ) |
| |
| @mock.patch.object(subprocess, "check_call") |
| def test_remove_virtual_rust_with_symlink(self, mock_call): |
| with tempfile.TemporaryDirectory() as tmpdir: |
| ebuild_path = Path( |
| tmpdir, f"virtual/rust/rust-{self.old_version}.ebuild" |
| ) |
| symlink_path = Path( |
| tmpdir, f"virtual/rust/rust-{self.old_version}-r14.ebuild" |
| ) |
| os.makedirs(ebuild_path.parent) |
| ebuild_path.touch() |
| symlink_path.symlink_to(ebuild_path.name) |
| with mock.patch("rust_uprev.EBUILD_PREFIX", Path(tmpdir)): |
| rust_uprev.remove_virtual_rust(self.old_version) |
| mock_call.assert_has_calls( |
| [ |
| mock.call( |
| ["git", "rm", ebuild_path.name], |
| cwd=ebuild_path.parent, |
| ), |
| mock.call( |
| ["git", "rm", symlink_path.name], |
| cwd=ebuild_path.parent, |
| ), |
| ], |
| any_order=True, |
| ) |
| |
| @mock.patch.object(rust_uprev, "find_ebuild_path") |
| @mock.patch.object(shutil, "copyfile") |
| @mock.patch.object(subprocess, "check_call") |
| def test_update_virtual_rust(self, mock_call, mock_copy, mock_find_ebuild): |
| ebuild_path = Path( |
| f"/some/dir/virtual/rust/rust-{self.current_version}.ebuild" |
| ) |
| mock_find_ebuild.return_value = Path(ebuild_path) |
| rust_uprev.update_virtual_rust(self.current_version, self.new_version) |
| mock_call.assert_called_once_with( |
| ["git", "add", f"rust-{self.new_version}.ebuild"], |
| cwd=ebuild_path.parent, |
| ) |
| mock_copy.assert_called_once_with( |
| ebuild_path.parent.joinpath(f"rust-{self.current_version}.ebuild"), |
| ebuild_path.parent.joinpath(f"rust-{self.new_version}.ebuild"), |
| ) |
| |
| @mock.patch.object(os, "listdir") |
| def test_find_oldest_rust_version_in_chroot_pass(self, mock_ls): |
| oldest_version_name = f"rust-{self.old_version}.ebuild" |
| mock_ls.return_value = [ |
| oldest_version_name, |
| f"rust-{self.current_version}.ebuild", |
| f"rust-{self.new_version}.ebuild", |
| ] |
| actual = rust_uprev.find_oldest_rust_version_in_chroot() |
| expected = self.old_version |
| self.assertEqual(expected, actual) |
| |
| @mock.patch.object(os, "listdir") |
| def test_find_oldest_rust_version_in_chroot_fail_with_only_one_ebuild( |
| self, mock_ls |
| ): |
| mock_ls.return_value = [f"rust-{self.new_version}.ebuild"] |
| with self.assertRaises(RuntimeError) as context: |
| rust_uprev.find_oldest_rust_version_in_chroot() |
| self.assertEqual( |
| "Expect to find more than one Rust versions", str(context.exception) |
| ) |
| |
| @mock.patch.object(rust_uprev, "get_command_output") |
| @mock.patch.object(git, "CreateBranch") |
| def test_create_new_repo(self, mock_branch, mock_output): |
| mock_output.return_value = "" |
| rust_uprev.create_new_repo(self.new_version) |
| mock_branch.assert_called_once_with( |
| rust_uprev.EBUILD_PREFIX, f"rust-to-{self.new_version}" |
| ) |
| |
| @mock.patch.object(rust_uprev, "get_command_output") |
| @mock.patch.object(subprocess, "check_call") |
| def test_build_cross_compiler(self, mock_call, mock_output): |
| mock_output.return_value = f"rust-{self.new_version}.ebuild" |
| cros_targets = [ |
| "x86_64-cros-linux-gnu", |
| "armv7a-cros-linux-gnueabihf", |
| "aarch64-cros-linux-gnu", |
| ] |
| all_triples = ["x86_64-pc-linux-gnu"] + cros_targets |
| rust_ebuild = "RUSTC_TARGET_TRIPLES=(" + "\n\t".join(all_triples) + ")" |
| mock_open = mock.mock_open(read_data=rust_ebuild) |
| with mock.patch("builtins.open", mock_open): |
| rust_uprev.build_cross_compiler() |
| |
| mock_call.assert_called_once_with( |
| ["sudo", "emerge", "-j", "-G"] |
| + [f"cross-{x}/gcc" for x in cros_targets + ["arm-none-eabi"]] |
| ) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |