def test_lifecycle_debug_shell(snapcraft_yaml, cmd, new_dir, mocker): """Adoptable fields shouldn't be empty after adoption.""" mocker.patch("craft_parts.executor.Executor.execute", side_effect=Exception) mock_shell = mocker.patch("subprocess.run") project = Project.unmarshal(snapcraft_yaml(base="core22")) with pytest.raises(errors.PartsLifecycleError): parts_lifecycle._run_command( cmd, project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, debug=True, destructive_mode=True, shell=False, shell_after=False, use_lxd=False, parts=["part1"], ), ) assert mock_shell.mock_calls == [call(["bash"], check=False, cwd=None)]
def test_lifecycle_clean_part_names(snapcraft_yaml, project_vars, new_dir, mocker): """Clean project inside provider if called with part names.""" project = Project.unmarshal(snapcraft_yaml(base="core22")) run_in_provider_mock = mocker.patch("snapcraft.parts.lifecycle._run_in_provider") parts_lifecycle._run_command( "clean", project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, destructive_mode=False, use_lxd=False, parts=["part1"], ), ) assert run_in_provider_mock.mock_calls == [ call( project, "clean", argparse.Namespace( directory=None, output=None, destructive_mode=False, use_lxd=False, parts=["part1"], ), ) ]
def test_lifecycle_clean_managed(snapcraft_yaml, project_vars, new_dir, mocker): project = Project.unmarshal(snapcraft_yaml(base="core22")) run_in_provider_mock = mocker.patch( "snapcraft.parts.lifecycle._run_in_provider") clean_mock = mocker.patch("snapcraft.parts.PartsLifecycle.clean") mocker.patch("snapcraft.utils.is_managed_mode", return_value=True) mocker.patch( "snapcraft.utils.get_managed_environment_home_path", return_value=new_dir / "home", ) parts_lifecycle._run_command( "clean", project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, destructive_mode=False, use_lxd=False, parts=["part1"], ), ) assert run_in_provider_mock.mock_calls == [] assert clean_mock.mock_calls == [call(part_names=["part1"])]
def test_lifecycle_run_command_clean(snapcraft_yaml, project_vars, new_dir, mocker): """Clean provider project when called without parts.""" project = Project.unmarshal(snapcraft_yaml(base="core22")) clean_mock = mocker.patch( "snapcraft.providers.LXDProvider.clean_project_environments", return_value=["instance-name"], ) parts_lifecycle._run_command( "clean", project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, destructive_mode=False, use_lxd=False, parts=None, ), ) assert clean_mock.mock_calls == [ call( project_name="mytest", project_path=new_dir, build_on=get_host_architecture(), build_for=get_host_architecture(), ) ]
def test_lifecycle_pack_managed(cmd, snapcraft_yaml, project_vars, new_dir, mocker): project = Project.unmarshal(snapcraft_yaml(base="core22")) run_in_provider_mock = mocker.patch( "snapcraft.parts.lifecycle._run_in_provider") run_mock = mocker.patch("snapcraft.parts.PartsLifecycle.run") pack_mock = mocker.patch("snapcraft.pack.pack_snap") mocker.patch("snapcraft.meta.snap_yaml.write") mocker.patch("snapcraft.utils.is_managed_mode", return_value=True) mocker.patch( "snapcraft.utils.get_managed_environment_home_path", return_value=new_dir / "home", ) parts_lifecycle._run_command( cmd, project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, debug=False, bind_ssh=False, enable_manifest=False, manifest_image_information=None, destructive_mode=False, shell=False, shell_after=False, use_lxd=False, parts=[], ), ) assert run_in_provider_mock.mock_calls == [] assert run_mock.mock_calls == [ call("prime", debug=False, shell=False, shell_after=False) ] assert pack_mock.mock_calls[:1] == [ call( new_dir / "home/prime", output=None, compression="xz", name="mytest", version="0.1", target_arch=get_host_architecture(), ) ]
def test_lifecycle_pack_metadata_error(cmd, snapcraft_yaml, new_dir, mocker): project = Project.unmarshal(snapcraft_yaml(base="core22")) run_mock = mocker.patch("snapcraft.parts.PartsLifecycle.run") mocker.patch("snapcraft.utils.is_managed_mode", return_value=True) mocker.patch( "snapcraft.utils.get_managed_environment_home_path", return_value=new_dir / "home", ) mocker.patch( "snapcraft.parts.PartsLifecycle.project_vars", new_callable=PropertyMock, return_value={ "version": "0.1", "grade": "invalid" }, # invalid value ) pack_mock = mocker.patch("snapcraft.pack.pack_snap") mocker.patch("snapcraft.meta.snap_yaml.write") with pytest.raises(errors.SnapcraftError) as raised: parts_lifecycle._run_command( cmd, project=project, assets_dir=Path(), start_time=datetime.now(), parse_info={}, parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, debug=False, destructive_mode=False, shell=False, shell_after=False, use_lxd=False, parts=[], ), ) assert str(raised.value) == ( "error setting grade: unexpected value; permitted: 'stable', 'devel'") assert run_mock.mock_calls == [ call("prime", debug=False, shell=False, shell_after=False) ] assert pack_mock.mock_calls == []
def test_lifecycle_shell_after(snapcraft_yaml, cmd, new_dir, mocker): """Adoptable fields shouldn't be empty after adoption.""" last_step = None def _fake_execute(_, action: Action, **kwargs): # pylint: disable=unused-argument nonlocal last_step last_step = action.step mocker.patch("craft_parts.executor.Executor.execute", new=_fake_execute) mock_shell = mocker.patch("subprocess.run") project = Project.unmarshal(snapcraft_yaml(base="core22")) parts_lifecycle._run_command( cmd, project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, debug=False, destructive_mode=True, shell=False, shell_after=True, use_lxd=False, parts=["part1"], ), ) expected_last_step = Step.PULL if cmd == "build": expected_last_step = Step.BUILD if cmd == "stage": expected_last_step = Step.STAGE if cmd == "prime": expected_last_step = Step.PRIME assert last_step == expected_last_step assert mock_shell.mock_calls == [call(["bash"], check=False, cwd=None)]
def test_lifecycle_run_command_pack(cmd, snapcraft_yaml, project_vars, new_dir, mocker): project = Project.unmarshal(snapcraft_yaml(base="core22")) run_mock = mocker.patch("snapcraft.parts.PartsLifecycle.run") pack_mock = mocker.patch("snapcraft.pack.pack_snap") parts_lifecycle._run_command( cmd, project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, debug=False, destructive_mode=True, enable_manifest=False, shell=False, shell_after=False, use_lxd=False, parts=[], ), ) assert run_mock.mock_calls == [ call("prime", debug=False, shell=False, shell_after=False) ] assert pack_mock.mock_calls[:1] == [ call( new_dir / "prime", output=None, compression="xz", name="mytest", version="0.1", target_arch=get_host_architecture(), ) ]
def test_lifecycle_clean_destructive_mode(snapcraft_yaml, project_vars, new_dir, mocker): """Clean local project if called in destructive mode.""" project = Project.unmarshal(snapcraft_yaml(base="core22")) clean_mock = mocker.patch("snapcraft.parts.PartsLifecycle.clean") parts_lifecycle._run_command( "clean", project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, destructive_mode=True, use_lxd=False, parts=None, ), ) assert clean_mock.mock_calls == [call(part_names=None)]
def test_lifecycle_pack_not_managed(cmd, snapcraft_yaml, new_dir, mocker): project = Project.unmarshal(snapcraft_yaml(base="core22")) run_in_provider_mock = mocker.patch( "snapcraft.parts.lifecycle._run_in_provider") run_mock = mocker.patch("snapcraft.parts.PartsLifecycle.run") mocker.patch("snapcraft.utils.is_managed_mode", return_value=False) parts_lifecycle._run_command( cmd, project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=argparse.Namespace( directory=None, output=None, destructive_mode=False, use_lxd=False, parts=[], ), ) assert run_mock.mock_calls == [] assert run_in_provider_mock.mock_calls == [ call( project, cmd, argparse.Namespace( directory=None, output=None, destructive_mode=False, use_lxd=False, parts=[], ), ) ]
def test_lifecycle_run_command_step( cmd, step, debug_shell, snapcraft_yaml, project_vars, new_dir, mocker ): project = Project.unmarshal(snapcraft_yaml(base="core22")) run_mock = mocker.patch("snapcraft.parts.PartsLifecycle.run") mocker.patch("snapcraft.meta.snap_yaml.write") pack_mock = mocker.patch("snapcraft.pack.pack_snap") parsed_args = argparse.Namespace( debug=False, destructive_mode=True, enable_manifest=False, shell=False, shell_after=False, use_lxd=False, parts=[], ) if debug_shell: setattr(parsed_args, debug_shell, True) parts_lifecycle._run_command( cmd, project=project, parse_info={}, assets_dir=Path(), start_time=datetime.now(), parallel_build_count=8, parsed_args=parsed_args, ) call_args = {"debug": False, "shell": False, "shell_after": False} if debug_shell: call_args[debug_shell] = True assert run_mock.mock_calls == [call(step, **call_args)] assert pack_mock.mock_calls == []