initial commit
[leap_pycommon.git] / src / leap / common / testing / basetest.py
1 # -*- coding: utf-8 -*-
2 # leap.common.testing.basetest.py
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 """
18 Common testing facilities
19 """
20 import os
21 import platform
22 import shutil
23 import tempfile
24
25 try:
26     import unittest2 as unittest
27 except ImportError:
28     import unittest
29
30 from leap.common.files import mkdir_p, check_and_fix_urw_only
31
32 _system = platform.system()
33
34
35 class BaseLeapTest(unittest.TestCase):
36     """
37     Base Leap TestCase
38     """
39
40     __name__ = "leap_test"
41
42     @classmethod
43     def setUpClass(cls):
44         cls.old_path = os.environ['PATH']
45         cls.old_home = os.environ['HOME']
46         cls.tempdir = tempfile.mkdtemp(prefix="leap_tests-")
47         cls.home = cls.tempdir
48         bin_tdir = os.path.join(
49             cls.tempdir,
50             'bin')
51         os.environ["PATH"] = bin_tdir
52         os.environ["HOME"] = cls.tempdir
53
54     @classmethod
55     def tearDownClass(cls):
56         os.environ["PATH"] = cls.old_path
57         os.environ["HOME"] = cls.old_home
58         # safety check
59         assert cls.tempdir.startswith('/tmp/leap_tests-')
60         shutil.rmtree(cls.tempdir)
61
62     # you have to override these methods
63     # this way we ensure we did not put anything
64     # here that you can forget to call.
65
66     def setUp(self):
67         raise NotImplementedError("abstract base class")
68
69     def tearDown(self):
70         raise NotImplementedError("abstract base class")
71
72     #
73     # helper methods
74     #
75
76     def get_tempfile(self, filename):
77         return os.path.join(self.tempdir, filename)
78
79     def _missing_test_for_plat(self, do_raise=False):
80         if do_raise:
81             raise NotImplementedError(
82                 "This test is not implemented "
83                 "for the running platform: %s" %
84                 _system)
85
86     def touch(self, filepath):
87         folder, filename = os.path.split(filepath)
88         if not os.path.isdir(folder):
89             mkdir_p(folder)
90         # XXX should move to test_basetest
91         self.assertTrue(os.path.isdir(folder))
92
93         with open(filepath, 'w') as fp:
94             fp.write(' ')
95
96         # XXX should move to test_basetest
97         self.assertTrue(os.path.isfile(filepath))
98
99     def chmod600(self, filepath):
100         check_and_fix_urw_only(filepath)