Tests: add resolver/test_output: Make sure we don't backtrace in the merge list printer
authorSebastian Luther <SebastianLuther@gmx.de>
Mon, 20 Sep 2010 11:29:42 +0000 (13:29 +0200)
committerZac Medico <zmedico@gentoo.org>
Mon, 20 Sep 2010 15:11:38 +0000 (08:11 -0700)
pym/_emerge/depgraph.py
pym/portage/tests/resolver/ResolverPlayground.py
pym/portage/tests/resolver/test_output.py [new file with mode: 0644]

index 29601562f82eadf0029a66c76a73414a91da8ad1..3670899de6f01468fc4d76dfa5b7446865f3a945 100644 (file)
@@ -411,7 +411,6 @@ class depgraph(object):
                if not missed_updates:
                        return
 
-               write = sys.stderr.write
                backtrack_masked = []
 
                for pkg, parent_atoms in missed_updates:
@@ -425,31 +424,29 @@ class depgraph(object):
                                backtrack_masked.append((pkg, parent_atoms))
                                continue
 
-                       write("\n!!! The following update has been skipped " + \
-                               "due to unsatisfied dependencies:\n\n")
+                       writemsg("\n!!! The following update has been skipped " + \
+                               "due to unsatisfied dependencies:\n\n", noiselevel=-1)
 
-                       write(str(pkg.slot_atom))
+                       writemsg(str(pkg.slot_atom), noiselevel=-1)
                        if pkg.root != '/':
-                               write(" for %s" % (pkg.root,))
-                       write("\n")
+                               writemsg(" for %s" % (pkg.root,), noiselevel=-1)
+                       writemsg("\n", noiselevel=-1)
 
                        for parent, root, atom in parent_atoms:
                                self._show_unsatisfied_dep(root, atom, myparent=parent)
-                               write("\n")
+                               writemsg("\n", noiselevel=-1)
 
                if backtrack_masked:
                        # These are shown in abbreviated form, in order to avoid terminal
                        # flooding from mask messages as reported in bug #285832.
-                       write("\n!!! The following update(s) have been skipped " + \
+                       writemsg("\n!!! The following update(s) have been skipped " + \
                                "due to unsatisfied dependencies\n" + \
-                               "!!! triggered by backtracking:\n\n")
+                               "!!! triggered by backtracking:\n\n", noiselevel=-1)
                        for pkg, parent_atoms in backtrack_masked:
-                               write(str(pkg.slot_atom))
+                               writemsg(str(pkg.slot_atom), noiselevel=-1)
                                if pkg.root != '/':
-                                       write(" for %s" % (pkg.root,))
-                               write("\n")
-
-               sys.stderr.flush()
+                                       writemsg(" for %s" % (pkg.root,), noiselevel=-1)
+                               writemsg("\n", noiselevel=-1)
 
        def _show_missed_update_slot_conflicts(self, missed_updates):
 
@@ -485,8 +482,7 @@ class depgraph(object):
                                msg.append("\n")
                        msg.append("\n")
 
-               sys.stderr.write("".join(msg))
-               sys.stderr.flush()
+               writemsg("".join(msg), noiselevel=-1)
 
        def _show_slot_collision_notice(self):
                """Show an informational message advising the user to mask one of the
index 8d2a9fd3b567b3ba43cd1f4a5e1260f8ecff9f79..be1c2947094d22fb6e488ae6423dc231bf6647f7 100644 (file)
@@ -410,7 +410,6 @@ class ResolverPlayground(object):
        def run(self, atoms, options={}, action=None):
                options = options.copy()
                options["--pretend"] = True
-               options["--quiet"] = True
                if self.debug:
                        options["--debug"] = True
 
@@ -432,6 +431,7 @@ class ResolverPlayground(object):
                                params = create_depgraph_params(options, action)
                                success, depgraph, favorites = backtrack_depgraph(
                                        self.settings, self.trees, options, params, action, atoms, None)
+                               depgraph._show_merge_list()
                                depgraph.display_problems()
                                result = ResolverPlaygroundResult(atoms, success, depgraph, favorites)
                finally:
diff --git a/pym/portage/tests/resolver/test_output.py b/pym/portage/tests/resolver/test_output.py
new file mode 100644 (file)
index 0000000..34efe9c
--- /dev/null
@@ -0,0 +1,88 @@
+# Copyright 2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from portage.tests import TestCase
+from portage.tests.resolver.ResolverPlayground import ResolverPlayground, ResolverPlaygroundTestCase
+
+class MergelistOutputTestCase(TestCase):
+
+       def testMergelistOutput(self):
+               """
+               This test doesn't check if the output is correct, but makes sure
+               that we don't backtrace somewhere in the output code.
+               """
+               ebuilds = {
+                       "dev-libs/A-1": { "DEPEND": "dev-libs/B dev-libs/C", "IUSE": "+foo", "EAPI": 1 },
+                       "dev-libs/B-1": { "DEPEND": "dev-libs/D", "IUSE": "foo +bar", "EAPI": 1 },
+                       "dev-libs/C-1": { "DEPEND": "dev-libs/E", "IUSE": "foo bar" },
+                       "dev-libs/D-1": { "IUSE": "" },
+                       "dev-libs/E-1": {},
+
+                       #reinstall for flags
+                       "dev-libs/Z-1": { "IUSE": "+foo", "EAPI": 1 },
+                       "dev-libs/Y-1": { "IUSE": "foo", "EAPI": 1 },
+                       "dev-libs/X-1": {},
+                       "dev-libs/W-1": { "IUSE": "+foo", "EAPI": 1 },
+                       }
+
+               installed = {
+                       "dev-libs/Z-1": { "USE": "", "IUSE": "foo" },
+                       "dev-libs/Y-1": { "USE": "foo", "IUSE": "+foo", "EAPI": 1 },
+                       "dev-libs/X-1": { "USE": "foo", "IUSE": "+foo", "EAPI": 1 },
+                       "dev-libs/W-1": { },
+               }
+
+               option_cobos = (
+                       (),
+                       ("verbose",),
+                       ("tree",),
+                       ("tree", "unordered-display",),
+                       ("verbose",),
+                       ("verbose", "tree",),
+                       ("verbose", "tree", "unordered-display",),
+               )
+
+               test_cases = []
+               for options in option_cobos:
+                       testcase_opts = {}
+                       for opt in options:
+                               testcase_opts["--" + opt] = True
+
+                       test_cases.append(ResolverPlaygroundTestCase(
+                               ["dev-libs/A"],
+                               options = testcase_opts,
+                               success = True,
+                               ignore_mergelist_order=True,
+                               mergelist = ["dev-libs/D-1", "dev-libs/E-1", "dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"]))
+
+                       test_cases.append(ResolverPlaygroundTestCase(
+                               ["dev-libs/Z"],
+                               options = testcase_opts,
+                               success = True,
+                               mergelist = ["dev-libs/Z-1"]))
+
+                       test_cases.append(ResolverPlaygroundTestCase(
+                               ["dev-libs/Y"],
+                               options = testcase_opts,
+                               success = True,
+                               mergelist = ["dev-libs/Y-1"]))
+
+                       test_cases.append(ResolverPlaygroundTestCase(
+                               ["dev-libs/X"],
+                               options = testcase_opts,
+                               success = True,
+                               mergelist = ["dev-libs/X-1"]))
+
+                       test_cases.append(ResolverPlaygroundTestCase(
+                               ["dev-libs/W"],
+                               options = testcase_opts,
+                               success = True,
+                               mergelist = ["dev-libs/W-1"]))
+
+               playground = ResolverPlayground(ebuilds=ebuilds, installed=installed)
+               try:
+                       for test_case in test_cases:
+                               playground.run_TestCase(test_case)
+                               self.assertEqual(test_case.test_success, True, test_case.fail_msg)
+               finally:
+                       playground.cleanup()