depgraph: fix and test depth control for virtuals
[portage.git] / pym / portage / tests / resolver / test_depth.py
1 # Copyright 2011 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3
4 from portage.tests import TestCase
5 from portage.tests.resolver.ResolverPlayground import (ResolverPlayground,
6         ResolverPlaygroundTestCase)
7
8 class ResolverDepthTestCase(TestCase):
9
10         def testResolverDepth(self):
11
12                 ebuilds = {
13                         "dev-libs/A-1": {"RDEPEND" : "dev-libs/B"},
14                         "dev-libs/A-2": {"RDEPEND" : "dev-libs/B"},
15                         "dev-libs/B-1": {"RDEPEND" : "dev-libs/C"},
16                         "dev-libs/B-2": {"RDEPEND" : "dev-libs/C"},
17                         "dev-libs/C-1": {},
18                         "dev-libs/C-2": {},
19
20                         "virtual/jre-1.5.0"        : {"SLOT" : "1.5", "RDEPEND" : "|| ( =dev-java/sun-jre-bin-1.5.0* =virtual/jdk-1.5.0* )"},
21                         "virtual/jre-1.5.0-r1"     : {"SLOT" : "1.5", "RDEPEND" : "|| ( =dev-java/sun-jre-bin-1.5.0* =virtual/jdk-1.5.0* )"},
22                         "virtual/jre-1.6.0"        : {"SLOT" : "1.6", "RDEPEND" : "|| ( =dev-java/sun-jre-bin-1.6.0* =virtual/jdk-1.6.0* )"},
23                         "virtual/jre-1.6.0-r1"     : {"SLOT" : "1.6", "RDEPEND" : "|| ( =dev-java/sun-jre-bin-1.6.0* =virtual/jdk-1.6.0* )"},
24                         "virtual/jdk-1.5.0"        : {"SLOT" : "1.5", "RDEPEND" : "|| ( =dev-java/sun-jdk-1.5.0* dev-java/gcj-jdk )"},
25                         "virtual/jdk-1.5.0-r1"     : {"SLOT" : "1.5", "RDEPEND" : "|| ( =dev-java/sun-jdk-1.5.0* dev-java/gcj-jdk )"},
26                         "virtual/jdk-1.6.0"        : {"SLOT" : "1.6", "RDEPEND" : "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"},
27                         "virtual/jdk-1.6.0-r1"     : {"SLOT" : "1.6", "RDEPEND" : "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"},
28                         "dev-java/gcj-jdk-4.5"     : {},
29                         "dev-java/gcj-jdk-4.5-r1"  : {},
30                         "dev-java/icedtea-6.1"     : {},
31                         "dev-java/icedtea-6.1-r1"  : {},
32                         "dev-java/sun-jdk-1.5"     : {"SLOT" : "1.5"},
33                         "dev-java/sun-jdk-1.6"     : {"SLOT" : "1.6"},
34                         "dev-java/sun-jre-bin-1.5" : {"SLOT" : "1.5"},
35                         "dev-java/sun-jre-bin-1.6" : {"SLOT" : "1.6"},
36
37                         "dev-java/ant-core-1.8"   : {"DEPEND"  : ">=virtual/jdk-1.4"},
38                         "dev-db/hsqldb-1.8"       : {"RDEPEND" : ">=virtual/jre-1.6"},
39                         }
40
41                 installed = {
42                         "dev-libs/A-1": {"RDEPEND" : "dev-libs/B"},
43                         "dev-libs/B-1": {"RDEPEND" : "dev-libs/C"},
44                         "dev-libs/C-1": {},
45
46                         "virtual/jre-1.5.0"       : {"SLOT" : "1.5", "RDEPEND" : "|| ( =virtual/jdk-1.5.0* =dev-java/sun-jre-bin-1.5.0* )"},
47                         "virtual/jre-1.6.0"       : {"SLOT" : "1.6", "RDEPEND" : "|| ( =virtual/jdk-1.6.0* =dev-java/sun-jre-bin-1.6.0* )"},
48                         "virtual/jdk-1.5.0"       : {"SLOT" : "1.5", "RDEPEND" : "|| ( =dev-java/sun-jdk-1.5.0* dev-java/gcj-jdk )"},
49                         "virtual/jdk-1.6.0"       : {"SLOT" : "1.6", "RDEPEND" : "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"},
50                         "dev-java/gcj-jdk-4.5"    : {},
51                         "dev-java/icedtea-6.1"    : {},
52                         }
53
54                 world = ["dev-libs/A"]
55
56                 test_cases = (
57                         ResolverPlaygroundTestCase(
58                                 ["dev-libs/A"],
59                                 options = {"--update": True, "--deep": 0},
60                                 success = True,
61                                 mergelist = ["dev-libs/A-2"]),
62
63                         ResolverPlaygroundTestCase(
64                                 ["dev-libs/A"],
65                                 options = {"--update": True, "--deep": 1},
66                                 success = True,
67                                 mergelist = ["dev-libs/B-2", "dev-libs/A-2"]),
68
69                         ResolverPlaygroundTestCase(
70                                 ["dev-libs/A"],
71                                 options = {"--update": True, "--deep": 2},
72                                 success = True,
73                                 mergelist = ["dev-libs/C-2", "dev-libs/B-2", "dev-libs/A-2"]),
74
75                         ResolverPlaygroundTestCase(
76                                 ["@world"],
77                                 options = {"--update": True, "--deep": True},
78                                 success = True,
79                                 mergelist = ["dev-libs/C-2", "dev-libs/B-2", "dev-libs/A-2"]),
80
81                         ResolverPlaygroundTestCase(
82                                 ["@world"],
83                                 options = {"--emptytree": True},
84                                 success = True,
85                                 mergelist = ["dev-libs/C-2", "dev-libs/B-2", "dev-libs/A-2"]),
86
87                         ResolverPlaygroundTestCase(
88                                 ["@world"],
89                                 options = {"--selective": True, "--deep": True},
90                                 success = True,
91                                 mergelist = []),
92
93                         ResolverPlaygroundTestCase(
94                                 ["dev-libs/A"],
95                                 options = {"--deep": 2},
96                                 success = True,
97                                 mergelist = ["dev-libs/A-2"]),
98
99                         ResolverPlaygroundTestCase(
100                                 ["virtual/jre"],
101                                 options = {},
102                                 success = True,
103                                 mergelist = ['virtual/jre-1.6.0-r1']),
104
105                         ResolverPlaygroundTestCase(
106                                 ["virtual/jre"],
107                                 options = {"--deep" : True},
108                                 success = True,
109                                 mergelist = ['virtual/jre-1.6.0-r1']),
110
111                         # Test bug #141118, where we avoid pulling in
112                         # redundant deps, satisfying nested virtuals
113                         # as efficiently as possible.
114                         ResolverPlaygroundTestCase(
115                                 ["virtual/jre"],
116                                 options = {"--selective" : True, "--deep" : True},
117                                 success = True,
118                                 mergelist = []),
119
120                         # Test bug #150361, where depgraph._greedy_slots()
121                         # is triggered by --update with AtomArg.
122                         ResolverPlaygroundTestCase(
123                                 ["virtual/jre"],
124                                 options = {"--update" : True},
125                                 success = True,
126                                 mergelist = ['virtual/jre-1.6.0-r1', 'virtual/jre-1.5.0-r1']),
127
128                         # Recursively traversed virtual dependencies, and their
129                         # direct dependencies, are considered to have the same
130                         # depth as direct dependencies.
131                         ResolverPlaygroundTestCase(
132                                 ["virtual/jre"],
133                                 options = {"--update" : True, "--deep" : 1},
134                                 success = True,
135                                 mergelist = ['dev-java/icedtea-6.1-r1', 'dev-java/gcj-jdk-4.5-r1', 'virtual/jdk-1.6.0-r1', 'virtual/jdk-1.5.0-r1', 'virtual/jre-1.6.0-r1', 'virtual/jre-1.5.0-r1']),
136
137                         ResolverPlaygroundTestCase(
138                                 ["virtual/jre:1.5"],
139                                 options = {"--update" : True},
140                                 success = True,
141                                 mergelist = ['virtual/jre-1.5.0-r1']),
142
143                         ResolverPlaygroundTestCase(
144                                 ["virtual/jre:1.6"],
145                                 options = {"--update" : True},
146                                 success = True,
147                                 mergelist = ['virtual/jre-1.6.0-r1']),
148
149                         # Test that we don't pull in any unnecessary updates
150                         # when --update is not specified, even though we
151                         # specified --deep.
152                         ResolverPlaygroundTestCase(
153                                 ["dev-java/ant-core"],
154                                 options = {"--deep" : True},
155                                 success = True,
156                                 mergelist = ["dev-java/ant-core-1.8"]),
157
158                         ResolverPlaygroundTestCase(
159                                 ["dev-java/ant-core"],
160                                 options = {"--update" : True},
161                                 success = True,
162                                 mergelist = ["dev-java/ant-core-1.8"]),
163
164                         # Recursively traversed virtual dependencies, and their
165                         # direct dependencies, are considered to have the same
166                         # depth as direct dependencies.
167                         ResolverPlaygroundTestCase(
168                                 ["dev-java/ant-core"],
169                                 options = {"--update" : True, "--deep" : 1},
170                                 success = True,
171                                 mergelist = ['dev-java/icedtea-6.1-r1', 'virtual/jdk-1.6.0-r1', 'dev-java/ant-core-1.8']),
172
173                         ResolverPlaygroundTestCase(
174                                 ["dev-db/hsqldb"],
175                                 options = {"--deep" : True},
176                                 success = True,
177                                 mergelist = ["dev-db/hsqldb-1.8"]),
178                         )
179
180                 playground = ResolverPlayground(ebuilds=ebuilds, installed=installed,
181                         world=world)
182                 try:
183                         for test_case in test_cases:
184                                 playground.run_TestCase(test_case)
185                                 self.assertEqual(test_case.test_success, True, test_case.fail_msg)
186                 finally:
187                         playground.cleanup()