Coverage for tests/unit_tests/commands/test_apio_packages.py: 100%

53 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-11-06 10:20 +0000

1"""Test for the "apio packages" command.""" 

2 

3from os import listdir, rename 

4from tests.conftest import ApioRunner 

5from apio.commands.apio import apio_top_cli as apio 

6from apio.common.apio_console import cunstyle 

7 

8 

9def test_packages(apio_runner: ApioRunner): 

10 """Test "apio packages" with different parameters""" 

11 

12 with apio_runner.in_sandbox() as sb: 

13 

14 # -- Execute "apio packages" 

15 result = sb.invoke_apio_cmd(apio, ["packages"]) 

16 sb.assert_result_ok(result) 

17 assert "Subcommands:" in result.output 

18 assert "apio packages update" in cunstyle(result.output) 

19 assert "apio packages list" in cunstyle(result.output) 

20 assert result.output != cunstyle(result.output) # Colored. 

21 

22 # -- Execute "apio packages list" 

23 result = sb.invoke_apio_cmd(apio, ["packages", "list"]) 

24 sb.assert_result_ok(result) 

25 

26 

27def test_packages_slow(apio_runner: ApioRunner): 

28 """Tests listing, installation and uninstallation of packages.""" 

29 

30 # -- This is a slow test. Skip it if running with --fast-only flag. 

31 apio_runner.skip_test_if_fast_only() 

32 

33 with apio_runner.in_sandbox() as sb: 

34 

35 # -- Run 'apio packages list' 

36 result = sb.invoke_apio_cmd(apio, ["packages", "list"]) 

37 sb.assert_result_ok(result) 

38 assert "definitions" in result.output 

39 assert "examples" in result.output 

40 assert "oss-cad-suite" in result.output 

41 

42 # -- Run 'apio packages update'. 

43 # -- Both 'examples' and 'oss-cad-suite' should exist, and 

44 # -- possibly others, depending on the platform. 

45 result = sb.invoke_apio_cmd(apio, ["packages", "update"]) 

46 sb.assert_result_ok(result) 

47 assert "All Apio packages are installed OK" in result.output 

48 assert listdir(sb.packages_dir / "definitions") 

49 assert listdir(sb.packages_dir / "examples/alhambra-ii") 

50 assert listdir(sb.packages_dir / "oss-cad-suite/bin") 

51 

52 # -- Delete a file from the examples package, we will use it as an 

53 # -- indicator for the reinstallation of the package. 

54 marker_file = sb.packages_dir / "examples/alhambra-ii/ledon/ledon.v" 

55 assert marker_file.is_file() 

56 marker_file.unlink() 

57 assert not marker_file.exists() 

58 

59 # -- Run 'apio packages update'. 

60 # -- This should not do anything since it's considered to be installed. 

61 result = sb.invoke_apio_cmd(apio, ["packages", "update"]) 

62 sb.assert_result_ok(result) 

63 assert "Package 'examples' installed" not in result.output 

64 assert not marker_file.exists() 

65 

66 # -- Run 'apio packages update --force' 

67 # -- This should recover the file. 

68 result = sb.invoke_apio_cmd(apio, ["packages", "update", "--force"]) 

69 sb.assert_result_ok(result) 

70 assert "Package 'examples' installed" in result.output 

71 assert marker_file.is_file() 

72 

73 # -- Break the examples package by renaming it. This also creates an 

74 # -- orphan dir. 

75 example_package_dir = sb.packages_dir / "examples" 

76 bad_package_dir = sb.packages_dir / "unknown-package" 

77 rename(example_package_dir, bad_package_dir) 

78 assert not example_package_dir.exists() 

79 assert bad_package_dir.is_dir() 

80 

81 # -- Run 'apio packages update'. This should fix everything. 

82 result = sb.invoke_apio_cmd(apio, ["packages", "update"]) 

83 sb.assert_result_ok(result) 

84 assert "Uninstalling broken package 'examples'" in result.output 

85 assert ( 

86 "Deleting unknown package dir 'unknown-package'" in result.output 

87 ) 

88 assert "Package 'examples' installed successfully" in result.output 

89 assert example_package_dir.is_dir() 

90 assert marker_file.exists() 

91 assert not bad_package_dir.exists()