diff options
Diffstat (limited to 'tests/test_configfileprompt.py')
-rw-r--r-- | tests/test_configfileprompt.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/tests/test_configfileprompt.py b/tests/test_configfileprompt.py new file mode 100644 index 0000000..2f1ede4 --- /dev/null +++ b/tests/test_configfileprompt.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Tests the config file handling.""" + +import logging +import os +import time +import unittest + +import defer +import dbus + +import aptdaemon.client +import aptdaemon.loop +import aptdaemon.enums + +import aptdaemon.test + +DEBUG = True +REPO_PATH = os.path.join(aptdaemon.test.get_tests_dir(), "repo") + + +class ConfigFilePromptTestCase(aptdaemon.test.AptDaemonTestCase): + + """Test the replacement of config files.""" + + def setUp(self): + """Setup a chroot, run the aptdaemon and a fake PolicyKit daemon.""" + # Setup chroot + self.chroot = aptdaemon.test.Chroot() + self.chroot.setup() + self.addCleanup(self.chroot.remove) + self.chroot.add_test_repository() + # Start aptdaemon with the chroot on the session bus + self.start_dbus_daemon() + self.bus = dbus.bus.BusConnection(self.dbus_address) + self.start_session_aptd(self.chroot.path) + # Start the fake PolikcyKit daemon + self.start_fake_polkitd() + time.sleep(1) + self.called = False + # Create a fake config file which gets overwritten by silly-config + self.config_path = os.path.join(self.chroot.path, + "etc/silly-packages.cfg") + with open(self.config_path, "w") as config: + config.write("BliBlaBlub") + + @defer.inline_callbacks + def _on_config_file_conflict(self, trans, config_old, config_new, answer): + self.assertEqual(trans.config_file_conflict, (config_old, config_new)) + if answer == "urgs": + # Check if cancelling is forbidden + try: + yield trans.cancel() + except aptdaemon.errors.AptDaemonError as error: + self.assertTrue(str(error), + "org.debian.apt: Could not cancel transaction") + # Check if we fail correctly on wrong answers + try: + yield trans.resolve_config_file_conflict(config_old, + "a&&dasmk") + except aptdaemon.errors.AptDaemonError as error: + self.assertTrue(str(error).index("Invalid value")) + yield trans.resolve_config_file_conflict(config_old, "replace") + else: + self.fail("Failed to detect invalid answer") + else: + yield trans.resolve_config_file_conflict(config_old, answer) + + def _on_finished(self, trans, exit): + """Callback to stop the mainloop after a transaction is done.""" + aptdaemon.loop.mainloop.quit() + + def test_keep(self): + """Test keeping the current configuration file.""" + @defer.inline_callbacks + def run(): + self.client = aptdaemon.client.AptClient(self.bus) + trans = yield self.client.install_packages(["silly-config"]) + trans.connect("finished", self._on_finished) + trans.connect("config-file-conflict", + self._on_config_file_conflict, + "keep") + yield trans.run() + defer.return_value(trans) + deferred = run() + aptdaemon.loop.mainloop.run() + self.assertEqual(deferred.result.exit, aptdaemon.enums.EXIT_SUCCESS) + with open(self.config_path) as config: + self.assertEqual(config.read(), + "BliBlaBlub") + with open("%s.dpkg-dist" % self.config_path) as config_dist: + self.assertEqual(config_dist.read(), + "#Just another config file.\n") + + def test_replace(self): + """Test replacing the current configuration file.""" + @defer.inline_callbacks + def run(): + self.client = aptdaemon.client.AptClient(self.bus) + trans = yield self.client.install_packages(["silly-config"]) + trans.connect("finished", self._on_finished) + trans.connect("config-file-conflict", + self._on_config_file_conflict, + "replace") + yield trans.run() + defer.return_value(trans) + deferred = run() + aptdaemon.loop.mainloop.run() + self.assertEqual(deferred.result.exit, aptdaemon.enums.EXIT_SUCCESS) + with open(self.config_path) as config: + self.assertEqual(config.read(), + "#Just another config file.\n") + with open("%s.dpkg-old" % self.config_path) as config_old: + self.assertEqual(config_old.read(), + "BliBlaBlub") + + def test_fail(self): + """Test failing correctly.""" + @defer.inline_callbacks + def run(): + self.client = aptdaemon.client.AptClient(self.bus) + trans = yield self.client.install_packages(["silly-config"]) + yield trans.set_locale("C") + trans.connect("finished", self._on_finished) + trans.connect("config-file-conflict", + self._on_config_file_conflict, + "urgs") + yield trans.run() + defer.return_value(trans) + deferred = run() + aptdaemon.loop.mainloop.run() + self.assertEqual(deferred.result.exit, aptdaemon.enums.EXIT_SUCCESS) + with open(self.config_path) as config: + self.assertEqual(config.read(), + "#Just another config file.\n") + with open("%s.dpkg-old" % self.config_path) as config_old: + self.assertEqual(config_old.read(), + "BliBlaBlub") + + +if __name__ == "__main__": + if DEBUG: + logging.basicConfig(level=logging.DEBUG) + unittest.main() + +# vim: ts=4 et sts=4 |