Gentoo Archives: gentoo-commits

From: "André Erdmann" <dywi@×××××××.de>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/R_overlay:gsoc13/next commit in: tests/, tests/static/
Date: Tue, 02 Jul 2013 21:09:33
Message-Id: 1372799128.067b4e7f942517bf1662e718d918948887b720ae.dywi@gentoo
1 commit: 067b4e7f942517bf1662e718d918948887b720ae
2 Author: André Erdmann <dywi <AT> mailerd <DOT> de>
3 AuthorDate: Tue Jul 2 21:05:28 2013 +0000
4 Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
5 CommitDate: Tue Jul 2 21:05:28 2013 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=067b4e7f
7
8 roverlay/tests
9
10 roverlay/tests contains unittests for roverlay's code.
11
12 This commit also add a test environment (plus a few test cases) for dependency
13 resolution.
14
15 ---
16 tests/__init__.py | 0
17 tests/base.py | 46 +++++++++++++++
18 tests/depres.py | 149 +++++++++++++++++++++++++++++++++++++++++++++++
19 tests/interface.py | 27 +++++++++
20 tests/static/__init__.py | 0
21 tests/static/depres.py | 61 +++++++++++++++++++
22 6 files changed, 283 insertions(+)
23
24 diff --git a/tests/__init__.py b/tests/__init__.py
25 new file mode 100644
26 index 0000000..e69de29
27
28 diff --git a/tests/base.py b/tests/base.py
29 new file mode 100644
30 index 0000000..a9d3f84
31 --- /dev/null
32 +++ b/tests/base.py
33 @@ -0,0 +1,46 @@
34 +# R overlay --
35 +# -*- coding: utf-8 -*-
36 +# Copyright (C) 2013 André Erdmann <dywi@×××××××.de>
37 +# Distributed under the terms of the GNU General Public License;
38 +# either version 2 of the License, or (at your option) any later version.
39 +
40 +import unittest
41 +
42 +import roverlay
43 +import roverlay.config.static
44 +
45 +
46 +
47 +class BasicRoverlayTestCase ( unittest.TestCase ):
48 + CONFIG_FILE = "R-overlay.conf.tests"
49 + CONFIG = None
50 +
51 + @classmethod
52 + def load_config ( cls ):
53 + # does nothing if already initialized
54 + if cls.CONFIG is None:
55 + roverlay.setup_initial_logger()
56 + cls.CONFIG = roverlay.load_config_file ( cls.CONFIG_FILE )
57 + # --- end of load_config (...) ---
58 +
59 +# @classmethod
60 +# def setUpClass ( cls ):
61 +# pass
62 +
63 +# @classmethod
64 +# def tearDownClass ( cls ):
65 +# pass
66 +
67 +class RoverlayTestCase ( BasicRoverlayTestCase ):
68 +
69 + @classmethod
70 + def setUpClass ( cls ):
71 + super ( RoverlayTestCase, cls ).setUpClass()
72 + cls.load_config()
73 +
74 +
75 +def make_testsuite ( testcase_cls ):
76 + return unittest.TestSuite (
77 + map ( lambda s: testcase_cls ( "test_" + s ), testcase_cls.TESTSUITE )
78 + )
79 +# --- end of make_testsuite (...) ---
80
81 diff --git a/tests/depres.py b/tests/depres.py
82 new file mode 100644
83 index 0000000..9be82a3
84 --- /dev/null
85 +++ b/tests/depres.py
86 @@ -0,0 +1,149 @@
87 +# R overlay --
88 +# -*- coding: utf-8 -*-
89 +# Copyright (C) 2013 André Erdmann <dywi@×××××××.de>
90 +# Distributed under the terms of the GNU General Public License;
91 +# either version 2 of the License, or (at your option) any later version.
92 +
93 +import random
94 +
95 +import roverlay.interface.depres
96 +
97 +import tests.base
98 +import tests.interface
99 +import tests.static.depres
100 +
101 +from tests.static.depres import DEPRES_DATA, DEPRES_RULES, DEPRES_INCLUDE
102 +
103 +
104 +
105 +def suite():
106 + return tests.base.make_testsuite ( DepresTestCase )
107 +
108 +
109 +as_iterable = lambda s : ( s, ) if isinstance ( s, str ) else s
110 +
111 +class DepresTestCase ( tests.interface.RoverlayInterfaceTestCase ):
112 +
113 + TESTSUITE = [
114 + 'sanity_checks',
115 + 'visualize',
116 + 'depres_static', 'depres_static_randomized',
117 + ]
118 +
119 + DEPRES_INTERFACE = None
120 +
121 + @classmethod
122 + def setUpClass ( cls ):
123 + super ( DepresTestCase, cls ).setUpClass()
124 + cls.ROOT_INTERFACE.register_interface (
125 + "depres", roverlay.interface.depres.DepresInterface, force=True
126 + )
127 + cls.DEPRES_INTERFACE = cls.ROOT_INTERFACE.spawn_interface ( "depres" )
128 +
129 + def setUp ( self ):
130 + #ref
131 + self.depres = self.__class__.DEPRES_INTERFACE
132 + self.depres.get_new_pool()
133 + # --- end of setUp (...) ---
134 +
135 + def tearDown ( self ):
136 + self.depres.discard_pool()
137 + self.depres.discard_empty_pools()
138 + self.depres.update()
139 + # --- end of tearDown (...) ---
140 +
141 + def do_depres_test ( self, rule_names, test_data ):
142 + unpacked = lambda T: T[0] if T and len ( T ) == 1 else T
143 +
144 + self.depres.compile_rules()
145 + self.tearDown()
146 + self.depres.get_new_pool()
147 + for rule_name in rule_names:
148 + self.assertTrue (
149 + self.depres.add_rule_list ( DEPRES_RULES [rule_name] )
150 + )
151 + self.assertTrue ( self.depres.compile_rules() )
152 +
153 + for depstr, t_expected_result in test_data:
154 + expected_result = unpacked ( t_expected_result )
155 + result = unpacked ( self.depres.resolve ( depstr ) )
156 +
157 +
158 + self.assertEquals (
159 + result, expected_result,
160 + "{!r} should be resolved as {!r} and not {!r}".format (
161 + depstr, expected_result, result
162 + )
163 + )
164 + # --- end of do_depres_test (...) ---
165 +
166 + def do_randomized_depres_test (
167 + self, rule_names, test_data, allow_modify=False
168 + ):
169 + if allow_modify and isinstance ( test_data, list ):
170 + rand_list = test_data
171 + else:
172 + rand_list = list ( test_data )
173 + random.shuffle ( rand_list )
174 + return self.do_depres_test ( rule_names, rand_list )
175 + # --- end of do_randomized_depres_test (...) ---
176 +
177 + def get_depres_include ( self, dataset_name ):
178 + if dataset_name in DEPRES_INCLUDE:
179 + return as_iterable ( DEPRES_INCLUDE [dataset_name] )
180 + else:
181 + return ( dataset_name, )
182 + # --- end of get_depres_include (...) ---
183 +
184 + def test_visualize ( self ):
185 + for name, ruleset in DEPRES_RULES.items():
186 + self.depres.compile_rules()
187 + self.tearDown()
188 + self.depres.get_new_pool()
189 +
190 + self.assertTrue ( self.depres.add_rule_list ( ruleset ) )
191 + self.assertTrue ( self.depres.compile_rules() )
192 +
193 + vis = self.depres.visualize_pool()
194 + self.assertIsInstance ( vis, str )
195 + self.assertEquals (
196 + bool ( not self.depres.get_pool().empty() ), bool ( vis )
197 + )
198 + # --- end of test_visualize (...) ---
199 +
200 + def test_sanity_checks ( self ):
201 + for dataset_name in DEPRES_DATA.keys():
202 + if dataset_name in DEPRES_INCLUDE:
203 + ruleset_list = as_iterable ( DEPRES_INCLUDE [dataset_name] )
204 + else:
205 + ruleset_list = ( dataset_name, )
206 +
207 + for ruleset_name in ruleset_list:
208 + self.assertIn (
209 + ruleset_name, DEPRES_RULES,
210 + "missing ruleset {!r} for depres test {!r}".format (
211 + ruleset_name, dataset_name
212 + )
213 + )
214 + # --- end of test_sanity_checks (...) ---
215 +
216 + def test_depres_static ( self ):
217 + for name, test_data in DEPRES_DATA.items():
218 + self.do_depres_test (
219 + self.get_depres_include ( name ),
220 + DEPRES_DATA [test_data] if isinstance ( test_data, str )
221 + else test_data
222 + )
223 + # --- end of test_depres_static (...) ---
224 +
225 + def test_depres_static_randomized ( self ):
226 + data_keys = list ( DEPRES_DATA.keys() )
227 + random.shuffle ( data_keys )
228 +
229 + for name in data_keys:
230 + test_data = DEPRES_DATA [name]
231 + self.do_randomized_depres_test (
232 + self.get_depres_include ( name ),
233 + DEPRES_DATA [test_data] if isinstance ( test_data, str )
234 + else test_data
235 + )
236
237 diff --git a/tests/interface.py b/tests/interface.py
238 new file mode 100644
239 index 0000000..44a5a31
240 --- /dev/null
241 +++ b/tests/interface.py
242 @@ -0,0 +1,27 @@
243 +# R overlay --
244 +# -*- coding: utf-8 -*-
245 +# Copyright (C) 2013 André Erdmann <dywi@×××××××.de>
246 +# Distributed under the terms of the GNU General Public License;
247 +# either version 2 of the License, or (at your option) any later version.
248 +
249 +import tests.base
250 +
251 +import roverlay.interface.root
252 +
253 +class RoverlayInterfaceTestCase ( tests.base.RoverlayTestCase ):
254 +
255 + ROOT_INTERFACE = None
256 +
257 + @classmethod
258 + def setUpClass ( cls ):
259 + super ( RoverlayInterfaceTestCase, cls ).setUpClass()
260 + if cls.ROOT_INTERFACE is None:
261 + cls.ROOT_INTERFACE = roverlay.interface.root.RootInterface (
262 + config=cls.CONFIG
263 + )
264 +
265 + @classmethod
266 + def tearDownClass ( cls ):
267 + super ( RoverlayInterfaceTestCase, cls ).tearDownClass()
268 + if cls.ROOT_INTERFACE is not None:
269 + cls.ROOT_INTERFACE.close()
270
271 diff --git a/tests/static/__init__.py b/tests/static/__init__.py
272 new file mode 100644
273 index 0000000..e69de29
274
275 diff --git a/tests/static/depres.py b/tests/static/depres.py
276 new file mode 100644
277 index 0000000..f72d3dd
278 --- /dev/null
279 +++ b/tests/static/depres.py
280 @@ -0,0 +1,61 @@
281 +# R overlay --
282 +# -*- coding: utf-8 -*-
283 +# Copyright (C) 2013 André Erdmann <dywi@×××××××.de>
284 +# Distributed under the terms of the GNU General Public License;
285 +# either version 2 of the License, or (at your option) any later version.
286 +
287 +# ready-to-use input for testing dependency resolution
288 +
289 +DONT_RESOLVE = lambda s: ( s, None )
290 +DONT_RESOLVE_TUPLE = lambda *S: tuple ( map ( DONT_RESOLVE, S ) )
291 +
292 +# dict <dataset name>, <tuple ( <dependency string>, <expected result> )>
293 +#
294 +DEPRES_DATA = {
295 + 'fftw': (
296 + ( "fftw", "sci-libs/fftw" ),
297 + ( "fftw 2", ">=sci-libs/fftw-2" ),
298 + ( "fftw 2.1.5", ">=sci-libs/fftw-2.1.5:2.1" ),
299 + ),
300 + 'slot0': (
301 + ( "p0", "cat/pkg:*" ),
302 + DONT_RESOLVE ( "p0 !=2" ),
303 + ( "p1", "cat/pkg:=" ),
304 + ( "p2", "cat/pkg" ),
305 + DONT_RESOLVE ( "p2 <3" ),
306 + ( "p2 =2.2.49", "=cat/pkg-2.2.49:2.2/49" ),
307 + DONT_RESOLVE ( "p2 5" ),
308 + DONT_RESOLVE ( "p2 5.4" ),
309 + DONT_RESOLVE ( "p2 !5" ),
310 + DONT_RESOLVE ( "p2 !=5" ),
311 + DONT_RESOLVE ( "p3 1." ),
312 + ( "p3 2.1.0", "cat/pkg:1" ),
313 + ( "p4 5.4.3.2.1", "cat/pkg:5=" ),
314 + ),
315 + 'empty': DONT_RESOLVE_TUPLE ( "fftw", ),
316 +}
317 +
318 +# dict <ruleset name>, <m-tuples>( <rule file line>^m )
319 +DEPRES_RULES = {
320 + 'fftw': (
321 + 'sci-libs/fftw {', 'fftw', '}',
322 + '~sci-libs/fftw:+v:s=..1 :: fftw',
323 + '~sci-libs/fftw :: fftw',
324 + ),
325 + 'slot0': (
326 + '~cat/pkg:open:* :: p0',
327 + '~cat/pkg:open: :: p1',
328 + '~cat/pkg:with_version:s=..1:/2 :: p2',
329 + '~cat/pkg:s=1 :: p3',
330 + '~cat/pkg:= :: p4',
331 + ),
332 + 'empty': (),
333 +}
334 +
335 +# dict <dataset name>, <iterable|str <ruleset name(s)>>
336 +# datasets not listed here default to <dataset name> as <ruleset name>
337 +DEPRES_INCLUDE = {
338 + #"fftw": "fftw",
339 +}
340 +
341 +#DEPRES_FAULTY_RULES=...