def system_package_tool_try_multiple_test(self): class RunnerMultipleMock(object): def __init__(self, expected=None): self.calls = 0 self.expected = expected def __call__(self, command, output): # @UnusedVariable self.calls += 1 return 0 if command in self.expected else 1 packages = ["a_package", "another_package", "yet_another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(['dpkg-query -W -f=\'${Status}\' another_package | ' 'grep -q "ok installed"']) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install(packages) self.assertEqual(2, runner.calls) runner = RunnerMultipleMock(["sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " yet_another_package"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install(packages) self.assertEqual(7, runner.calls) runner = RunnerMultipleMock(["sudo -A apt-get update"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) with self.assertRaises(ConanException): spt.install(packages) self.assertEqual(7, runner.calls)
def test_system_package_tool_try_multiple(self): packages = ["a_package", "another_package", "yet_another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock([ 'dpkg-query -W -f=\'${Status}\' another_package | ' 'grep -q "ok installed"' ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install(packages) self.assertEqual(2, runner.calls) runner = RunnerMultipleMock([ "sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " yet_another_package" ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install(packages) self.assertEqual(7, runner.calls) runner = RunnerMultipleMock(["sudo -A apt-get update"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) with self.assertRaises(ConanException): spt.install(packages) self.assertEqual(7, runner.calls)
def test_empty_variants_and_packages(self): packages = [(),] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock() spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(0, runner.calls)
def test_install_all_multiple_package_list(self): """ Separated string list must be treated as full package list to be installed """ packages = "varianta variantb", "variantc variantd" runner = RunnerMultipleMock([]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) with self.assertRaises(ConanException) as error: spt.install_packages(packages) self.assertEqual("Each string must contain only one package to be installed." " Use a list instead e.g. ['foo', 'bar'].", str(error.exception))
def test_install_all_packages(self): """ SystemPackageTool must install all packages """ # No packages installed packages = ["a_package", "another_package", "yet_another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(["sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " a_package another_package yet_another_package", ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(5, runner.calls)
def test_installed_variant_and_install_packages(self): """ Only packages must be installed. Variants are already installed """ packages = [("varianta", "variantb", "variantc"), "a_package", "another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(['dpkg-query -W -f=\'${Status}\' varianta | ' 'grep -q "ok installed"', "sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " a_package another_package", ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(5, runner.calls)
def test_install_few_packages(self): """ SystemPackageTool must install 2 packages only """ packages = ["a_package", "another_package", "yet_another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(['dpkg-query -W -f=\'${Status}\' a_package | ' 'grep -q "ok installed"', "sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " another_package yet_another_package", ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(5, runner.calls)
def test_variants_and_packages_installed(self): """ Install nothing, all is already installed """ packages = [("varianta", "variantb", "variantc"), "a_package", "another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(['dpkg-query -W -f=\'${Status}\' varianta | ' 'grep -q "ok installed"', 'dpkg-query -W -f=\'${Status}\' a_package | ' 'grep -q "ok installed"', 'dpkg-query -W -f=\'${Status}\' another_package | ' 'grep -q "ok installed"', ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(3, runner.calls)
def test_install_variants_and_packages(self): """ SystemPackageTool must install one of variants and all packages at same list """ packages = [("varianta", "variantb", "variantc"), "a_package", "another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(["sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " varianta", "sudo -A apt-get update", "sudo -A apt-get install -y --no-install-recommends" " a_package another_package", ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(8, runner.calls)
def test_packages_installed(self): """ SystemPackageTool must not install. All packages are installed. """ packages = ["a_package", "another_package", "yet_another_package"] with tools.environment_append({"CONAN_SYSREQUIRES_SUDO": "True"}): runner = RunnerMultipleMock(['dpkg-query -W -f=\'${Status}\' a_package | ' 'grep -q "ok installed"', 'dpkg-query -W -f=\'${Status}\' another_package | ' 'grep -q "ok installed"', 'dpkg-query -W -f=\'${Status}\' yet_another_package | ' 'grep -q "ok installed"', ]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install_packages(packages) self.assertEqual(3, runner.calls)
def system_package_tool_mode_test(self): """ System Package Tool mode is defined by CONAN_SYSREQUIRES_MODE env variable. Allowed values: (enabled, verify, disabled). Parser accepts it in lower/upper case or any combination. """ class RunnerMultipleMock(object): def __init__(self, expected=None): self.calls = 0 self.expected = expected def __call__(self, command, *args, **kwargs): # @UnusedVariable self.calls += 1 return 0 if command in self.expected else 1 packages = ["a_package", "another_package", "yet_another_package"] # Check invalid mode raises ConanException with tools.environment_append({ "CONAN_SYSREQUIRES_MODE": "test_not_valid_mode", "CONAN_SYSREQUIRES_SUDO": "True" }): runner = RunnerMultipleMock([]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) with self.assertRaises(ConanException) as exc: spt.install(packages) self.assertIn( "CONAN_SYSREQUIRES_MODE=test_not_valid_mode is not allowed", str(exc.exception)) self.assertEqual(0, runner.calls) # Check verify mode, a package report should be shown in output and ConanException raised. # No system packages are installed with tools.environment_append({ "CONAN_SYSREQUIRES_MODE": "VeRiFy", "CONAN_SYSREQUIRES_SUDO": "True" }): packages = [ "verify_package", "verify_another_package", "verify_yet_another_package" ] runner = RunnerMultipleMock(["sudo -A apt-get update"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) with self.assertRaises(ConanException) as exc: spt.install(packages) self.assertIn("Aborted due to CONAN_SYSREQUIRES_MODE=", str(exc.exception)) self.assertIn('\n'.join(packages), self.out) self.assertEqual(3, runner.calls) # Check disabled mode, a package report should be displayed in output. # No system packages are installed with tools.environment_append({ "CONAN_SYSREQUIRES_MODE": "DiSaBlEd", "CONAN_SYSREQUIRES_SUDO": "True" }): packages = [ "disabled_package", "disabled_another_package", "disabled_yet_another_package" ] runner = RunnerMultipleMock(["sudo -A apt-get update"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) spt.install(packages) self.assertIn('\n'.join(packages), self.out) self.assertEqual(0, runner.calls) # Check enabled, default mode, system packages must be installed. with tools.environment_append({ "CONAN_SYSREQUIRES_MODE": "EnAbLeD", "CONAN_SYSREQUIRES_SUDO": "True" }): runner = RunnerMultipleMock(["sudo -A apt-get update"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out) with self.assertRaises(ConanException) as exc: spt.install(packages) self.assertNotIn("CONAN_SYSREQUIRES_MODE", str(exc.exception)) self.assertEqual(7, runner.calls) # Check default_mode. The environment variable is not set and should behave like # the default_mode with tools.environment_append({ "CONAN_SYSREQUIRES_MODE": None, "CONAN_SYSREQUIRES_SUDO": "True" }): packages = [ "verify_package", "verify_another_package", "verify_yet_another_package" ] runner = RunnerMultipleMock(["sudo -A apt-get update"]) spt = SystemPackageTool(runner=runner, tool=AptTool(output=self.out), output=self.out, default_mode="verify") with self.assertRaises(ConanException) as exc: spt.install(packages) self.assertIn("Aborted due to CONAN_SYSREQUIRES_MODE=", str(exc.exception)) self.assertIn('\n'.join(packages), self.out) self.assertEqual(3, runner.calls)