import repository from arizona
[raven.git] / 2.0 / python / test / arizonaconfigTest.py
1 #! /usr/bin/env python
2 """
3 <Module>
4    arizonaconfigTest
5 <Author>
6    Jeffry Johnston, under the direction of Justin Cappos
7 <Started>
8    July 23, 2005
9 <Purpose>
10    Test module for arizonaconfig.  See arizonaconfig.py for more details.
11 """
12
13 # testing TODO:
14
15 # What happens when __build_options_block has to read a file that cannot
16 # be read? (disk failure, insufficient permissions, etc).  Not sure how to
17 # test for this situation.
18
19
20 import atexit
21 import os
22 import arizonaconfig
23 import arizonaunittest
24
25 # these variables define the python source that will be read by arizonaconfig
26 # and the .conf file that will be used.
27 TEST_FILE = "test/arizonaconfigTest_testfile.py"
28 TEST_CONFIG_FILE = "arizonaconfigTest.conf"
29 TEST_CONFIG_DIR = "arizonaconfigTest.d"
30
31 def create_config_files():
32       # build new config file
33       out = file(TEST_CONFIG_FILE, "w")
34       out.write("""packagetype rpm
35 digest= sha1
36 username =  PlanetLab
37 packagerepository =  ftp://quadrus.cs.arizona.edu/PlanetLab/V3|dist, stable
38 packageinforepository =  ftp://quadrus.cs.arizona.edu/PlanetLab/V3/stork.info
39 keyrepository =  ftp://quadrus.cs.arizona.edu/keyfile
40 noupdatekeyfiles
41 disablekeyfiles
42 transfermethod slice
43 rv0=0
44 rv1=1
45 rv2=2
46 repository=rep1
47 rv1=1001
48 rv3=1003
49 repositoryend
50 repository=rep2
51 rv2=2002
52 rv3=2003
53 rv4=2004
54 repositoryend
55 include=arizonaconfigTest.d/*.conf
56 """)
57       out.close()
58
59       try:
60          os.mkdir(TEST_CONFIG_DIR)
61       except OSError:
62          pass
63
64       out = file(os.path.join(TEST_CONFIG_DIR, "1.conf"), "w")
65       out.write("""
66 repository=rep3
67 rv1=3001
68 repositoryend
69 """)
70       out.close()
71
72 def cleanup():
73    os.system("rm " + TEST_CONFIG_FILE)
74    os.system("rm " + os.path.join(TEST_CONFIG_DIR, "1.conf"))
75    os.system("rmdir " + TEST_CONFIG_DIR)
76
77 # Unit tests for each function, listed in code order
78 class test(arizonaunittest.TestCase):
79    def setUp(self):
80       arizonaunittest.TestCase.setUp(self)
81       #atexit.register(cleanup)
82       create_config_files()
83
84    def tearDown(self):
85       arizonaunittest.TestCase.tearDown(self)
86       cleanup()
87
88    #------------------------------------------------------------------
89    # init_options(module="*", usage=None, version=None, configfile=True)
90    #------------------------------------------------------------------
91    def test_init_options(self):
92       # test bad input params
93       self.assertException(TypeError, arizonaconfig.init_options, 100)
94       self.assertException(TypeError, arizonaconfig.init_options, "*", True)
95       self.assertException(TypeError, arizonaconfig.init_options, "arizonaconfigTest.py", 100)
96       self.assertException(TypeError, arizonaconfig.init_options, "*", None, 100)
97       # FIXME self.assertException(TypeError, arizonaconfig.init_options, "*", None, None, 100)
98     
99       # test default usage statement
100       self.set_cmdline(["--help"])
101       self.assertException(SystemExit, arizonaconfig.init_options, "*", "arizonaconfigTest.py")
102       self.assertTrue(self.stdout().startswith("usage: * [options]\n\noptions:\n  -h"))
103
104       # test custom usage statement
105       self.reset_stdout()
106       self.assertException(SystemExit, arizonaconfig.init_options,"*", "arizonaconfigTest.py", [], """line1
107   line2""")
108       self.assertTrue(self.stdout().startswith("""usage: line1
109   line2"""))
110
111       # test default version (there isn't one, so --version should give usage)
112       self.set_cmdline(["--version"])
113       self.reset_stderr()
114       self.assertException(SystemExit, arizonaconfig.init_options)
115       self.assertTrue(self.stderr().startswith("""no such option: --version
116 Try '--help' for an informative help message"""))
117
118       # test custom version
119       self.reset_stdout()
120       self.assertException(SystemExit, arizonaconfig.init_options, "arizonaconfigTest.py", ".", [], None, "1.00")
121       self.assertTrue(self.stdout().startswith("storktests.py 1.00"))
122
123       # test --debug-help
124       self.set_cmdline([""])
125       self.reset_stdout()
126 # SMB: I'm not sure what this is supposed to do -- investigate what debug=True means
127 #  to arizonaconfig.init_options and write an appropriate test
128 #      self.assertException(SystemExit, arizonaconfig.init_options, "arizonatransfer.py", ".", [], None, "1.00", None, True)
129 #      self.assertStdout( ??? )
130
131       return # XXX finishme
132
133       # test --help plain
134       self.set_cmdline(["--help"])
135       self.reset_stdout()
136       self.assertException(SystemExit, arizonaconfig.init_options, TEST_FILE)
137       self.assertStdout(
138 """usage: test/arizonaconfigTest_testfile.py [options]
139 \r
140 options:\r
141   -h, --help            show this help message and exit\r
142   -CFILE, --configfile=FILE\r
143                         use a different config file (arizonaconfigTest.conf is\r
144                         the default)\r
145   --listenport=PORT     bind to this port (default 648)\r
146   --bindfiles=DIRECTORY\r
147                         location of the files to copy to the client upon\r
148                         binding\r
149   --retrievedir=DIRECTORY\r
150                         location to put retrieved files (default\r
151                         /usr/local/stork/var/packages)\r
152   --not-daemon          specify that program should not attempt to detach from\r
153                         the terminal\r
154   --localoutput         display output locally, do not send to client\r
155   --sliceport=PORT      unknown (default 640)\r
156   --nesttype=NAME       the type of nest to be used (default planetlab)\r
157   --transfermethod=program\r
158                         use this method to transfer files (default ftp, http)\r
159   --transfertempdir=PATH\r
160                         use this path to save transferd files temporary\r
161                         (default is /tmp/stork_trans_tmp)\r
162   --metafilecachetime=METAFILECACHETIME\r
163                         seconds to cache metafile without re-requesting\r
164   -Q, --veryquiet       be very quiet\r
165   -q, --quiet           be quiet\r
166   -v, --verbose         be verbose (default)\r
167   -V, --veryverbose     be very verbose (useful for debugging)\r
168   --ultraverbose        be extremely verbose (might be useful for debugging)
169 """)
170
171       # test --help usage
172       self.set_cmdline(["--help"])
173       self.reset_stdout()
174       self.assertException(SystemExit, arizonaconfig.init_options, "*", None, "ABCDEF")
175       self.debug_print(self.stdout())
176       self.assertTrue(self.stdout().startswith("usage: ABCDEF"))
177
178       # test --help version
179       self.set_cmdline(["--version"])
180       self.reset_stdout()
181       self.assertException(SystemExit, arizonaconfig.init_options, "*", None, None, "1.00")
182       self.assertStdout("""arizonaconfigTest.py 1.00
183 """)
184
185       # test returned args
186       self.set_cmdline(["not options"])
187       self.assertEqual(arizonaconfig.init_options(), ["not options"])
188
189
190
191
192
193    #------------------------------------------------------------------
194    # get_option(variable)
195    #------------------------------------------------------------------
196    def test_get_option(self):
197       # try to get option when arizonaconfig hasn't been initialized
198       reload(arizonaconfig)
199       self.assertEqual(arizonaconfig.get_option("digest"), None)
200       self.assertEqual(arizonaconfig.get_option("xyz"), None)
201
202       # pass bad/missing params (string expected)
203       self.assertException(TypeError, arizonaconfig.get_option)
204       self.assertException(TypeError, arizonaconfig.get_option, None)
205       self.assertException(TypeError, arizonaconfig.get_option, True)
206       self.assertException(TypeError, arizonaconfig.get_option, ["digest"])
207
208       # empty string should be okay
209       self.assertEqual(arizonaconfig.get_option(""), None)
210
211       # with config file, no command line
212       self.set_cmdline([])
213       arizonaconfig.init_options(TEST_FILE, configfile_optvar='configfile')
214
215       # test when config file == default, result = config file/default
216       self.assertEqual(arizonaconfig.get_option("nesttype"), "planetlab")
217
218       # test when config file != default, result = config file
219       self.assertEqual(arizonaconfig.get_option("transfermethod"), ["slice"])
220
221       # test when no option in config file but there is default, result = default
222       self.assertEqual(arizonaconfig.get_option("configfile"), TEST_CONFIG_FILE)
223       self.assertEqual(arizonaconfig.get_option("verbose"), 2)
224       self.assertEqual(arizonaconfig.get_option("sliceport"), "640")
225
226       # test when there is no option in config file or default, result = None
227       self.assertEqual(arizonaconfig.get_option("xyz"), None)
228
229       # sectioned variables - check those not in sections
230       self.assertEqual(arizonaconfig.get_option("rv0"), "0")
231       self.assertEqual(arizonaconfig.get_option("rv1"), "1")
232       self.assertEqual(arizonaconfig.get_option("rv2"), "2")
233       self.assertEqual(arizonaconfig.get_option("rv3"), "643")
234       self.assertEqual(arizonaconfig.get_option("rv4"), "644")
235
236       # the list of sections
237       self.assertEqual(arizonaconfig.get_option("repository"), ["rep1", "rep2", "rep3"])
238
239       # sectioned variables
240       self.assertEqual(arizonaconfig.get_option("rep1.rv1"), "1001")
241       self.assertEqual(arizonaconfig.get_option("rep1.rv3"), "1003")
242       self.assertEqual(arizonaconfig.get_option("rep2.rv2"), "2002")
243       self.assertEqual(arizonaconfig.get_option("rep2.rv3"), "2003")
244       self.assertEqual(arizonaconfig.get_option("rep2.rv4"), "2004")
245
246
247
248       # with config file and command line
249       self.set_cmdline(["--quiet", "--sliceport=30000"])
250       arizonaconfig.init_options(TEST_FILE, configfile_optvar='configfile')
251
252       # test when config file == default, result = config file (or) default
253       self.assertEqual(arizonaconfig.get_option("nesttype"), "planetlab")
254
255       # test when config file != default, result = config file
256       self.assertEqual(arizonaconfig.get_option("transfermethod"), ["slice"])
257
258       # test when no option in config file but there is on cmdline, result = cmdline
259       self.assertEqual(arizonaconfig.get_option("verbose"), 1)
260       self.assertEqual(arizonaconfig.get_option("sliceport"), "30000")
261
262       # test when no option in config file, or cmdline, result = default
263       self.assertEqual(arizonaconfig.get_option("configfile"), TEST_CONFIG_FILE)
264
265       # test when there is no option in config file or default, result = None
266       self.assertEqual(arizonaconfig.get_option("xyz"), None)
267
268
269
270       # without config file, no command line
271       self.set_cmdline([])
272       arizonaconfig.init_options(TEST_FILE)
273
274       # there is default, result = default
275       self.assertEqual(arizonaconfig.get_option("nesttype"), "planetlab")
276       self.assertEqual(arizonaconfig.get_option("configfile"), TEST_CONFIG_FILE)
277       self.assertEqual(arizonaconfig.get_option("transfermethod"), ["ftp", "http"])
278
279       # test when there is no option, result = None
280       self.assertEqual(arizonaconfig.get_option("xyz"), None)
281
282
283
284       # without config file, with command line
285       self.set_cmdline(["--quiet", "--nesttype=vserver"])
286       arizonaconfig.init_options(TEST_FILE)
287
288       # test there is on cmdline, result = cmdline
289       self.assertEqual(arizonaconfig.get_option("verbose"), 1)
290       self.assertEqual(arizonaconfig.get_option("nesttype"), "vserver")
291
292       # test when no option on cmdline, result = default
293       self.assertEqual(arizonaconfig.get_option("configfile"), TEST_CONFIG_FILE)
294       self.assertEqual(arizonaconfig.get_option("transfermethod"), ["ftp", "http"])
295
296       # test when there is no option, result = None
297       self.assertEqual(arizonaconfig.get_option("xyz"), None)
298
299
300    #------------------------------------------------------------------
301    # get_option_section(variable, section)
302    #------------------------------------------------------------------
303    def test_get_option_section(self):
304       # try to get option when arizonaconfig hasn't been initialized
305       reload(arizonaconfig)
306       self.assertEqual(arizonaconfig.get_option_section("digest"), None)
307
308       # pass bad/missing params (string expected)
309       self.assertException(TypeError, arizonaconfig.get_option_section)
310       self.assertException(TypeError, arizonaconfig.get_option_section, None)
311       self.assertException(TypeError, arizonaconfig.get_option_section, True)
312       self.assertException(TypeError, arizonaconfig.get_option_section, ["digest"])
313
314       # empty string should be okay
315       self.assertEqual(arizonaconfig.get_option_section(""), None)
316
317       # with config file, no command line
318       self.set_cmdline([])
319       arizonaconfig.init_options(TEST_FILE, configfile_optvar='configfile')
320
321       self.assertEqual(arizonaconfig.get_option_section("rv0"), "0")
322       self.assertEqual(arizonaconfig.get_option_section("rv1", "rep1"), "1001")
323       self.assertEqual(arizonaconfig.get_option_section("rv2", "rep1"), "2")
324       self.assertEqual(arizonaconfig.get_option_section("rv4", "rep1"), "644")
325       self.assertEqual(arizonaconfig.get_option_section("rv1", "rep2"), "1")
326       self.assertEqual(arizonaconfig.get_option_section("rv2", "rep2"), "2002")
327
328
329
330
331    #------------------------------------------------------------------
332    # get_sections(variable)
333    #------------------------------------------------------------------
334    def test_get_sections(self):
335       # try to get option when arizonaconfig hasn't been initialized
336       reload(arizonaconfig)
337       self.assertEqual(arizonaconfig.get_sections("digest"), [])
338
339       # pass bad/missing params (string expected)
340       self.assertException(TypeError, arizonaconfig.get_sections)
341       self.assertException(TypeError, arizonaconfig.get_sections, None)
342       self.assertException(TypeError, arizonaconfig.get_sections, True)
343       self.assertException(TypeError, arizonaconfig.get_sections, ["digest"])
344
345       # empty string should be okay
346       self.assertEqual(arizonaconfig.get_sections(""), [])
347
348       # with config file, no command line
349       self.set_cmdline([])
350       arizonaconfig.init_options(TEST_FILE, configfile_optvar='configfile')
351
352       self.assertEqual(arizonaconfig.get_sections("rv0"), [])
353       self.assertEqual(arizonaconfig.get_sections("rv1"), ["rep1", "rep3"])
354       self.assertEqual(arizonaconfig.get_sections("rv2"), ["rep2"])
355       self.assertEqual(arizonaconfig.get_sections("rv3"), ["rep1", "rep2"])
356
357
358
359
360    #------------------------------------------------------------------
361    # set_option(variable, value)
362    #------------------------------------------------------------------
363    def test_set_option(self):
364       # try to set option when arizonaconfig hasn't been initialized
365       reload(arizonaconfig)
366       self.assertException(UnboundLocalError, arizonaconfig.set_option, "xyz", "abc")
367
368       self.set_cmdline([])
369       arizonaconfig.init_options()
370
371       # test invalid/missing params
372       self.assertException(TypeError, arizonaconfig.set_option, True, "123")
373       self.assertException(TypeError, arizonaconfig.set_option, "missing")
374
375       # try setting option which does not yet exist (create new option)
376       arizonaconfig.set_option("xyz", "abc")
377       self.assertEqual(arizonaconfig.get_option("xyz"), "abc")
378
379       # change existing option
380       self.assertEqual(arizonaconfig.get_option("digest"), "sha1")
381       arizonaconfig.set_option("digest", "pgp")
382       self.assertEqual(arizonaconfig.get_option("digest"), "pgp")
383
384
385
386
387    
388    #------------------------------------------------------------------
389    # get_version()
390    #------------------------------------------------------------------
391    def test_get_version(self):
392       # test version not set, result = None
393       arizonaconfig.init_options()
394       self.assertEqual(arizonaconfig.get_version(), None)
395       
396       # test setting the version
397       arizonaconfig.init_options(version="1.2.3")
398       self.assertEqual(arizonaconfig.get_version(), "1.2.3")
399
400
401
402 # Run tests
403 if __name__=='__main__':
404    arizonaunittest.main()