[tests] adapt events tests to recent changes
[leap_pycommon.git] / src / leap / common / testing / basetest.py
1 # -*- coding: utf-8 -*-
2 # 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.check import leap_assert
31 from leap.common.events import server as events_server
32 from leap.common.events import client as events_client
33 from leap.common.events import flags, set_events_enabled
34 from leap.common.files import mkdir_p, check_and_fix_urw_only
35
36 set_events_enabled(False)
37
38
39 class BaseLeapTest(unittest.TestCase):
40     """
41     Base Leap TestCase
42     """
43     __name__ = "leap_test"
44     _system = platform.system()
45
46     @classmethod
47     def setUpClass(cls):
48         cls.setUpEnv()
49
50     @classmethod
51     def tearDownClass(cls):
52         cls.tearDownEnv()
53
54     @classmethod
55     def setUpEnv(cls, launch_events_server=True):
56         """
57         Sets up common facilities for testing this TestCase:
58         - custom PATH and HOME environmental variables
59         - creates a temporal folder to which those point.
60         It saves the old path and home vars so they can be restored later.
61         """
62         cls.old_path = os.environ['PATH']
63         cls.old_home = os.environ['HOME']
64         cls.old_xdg_config = None
65         if "XDG_CONFIG_HOME" in os.environ:
66             cls.old_xdg_config = os.environ["XDG_CONFIG_HOME"]
67         cls.tempdir = tempfile.mkdtemp(prefix="leap_tests-")
68         cls.home = cls.tempdir
69         bin_tdir = os.path.join(
70             cls.tempdir,
71             'bin')
72         os.environ["PATH"] = bin_tdir
73         os.environ["HOME"] = cls.tempdir
74         os.environ["XDG_CONFIG_HOME"] = os.path.join(cls.tempdir, ".config")
75         if launch_events_server:
76             cls._init_events()
77
78     @classmethod
79     def _init_events(cls):
80         if flags.EVENTS_ENABLED:
81             cls._server = events_server.ensure_server(
82                 emit_addr="tcp://127.0.0.1",
83                 reg_addr="tcp://127.0.0.1")
84             events_client.configure_client(
85                 emit_addr="tcp://127.0.0.1:%d" % cls._server.pull_port,
86                 reg_addr="tcp://127.0.0.1:%d" % cls._server.pub_port)
87
88     @classmethod
89     def tearDownEnv(cls):
90         """
91         Cleanup common facilities used for testing this TestCase:
92         - restores the default PATH and HOME variables
93         - removes the temporal folder
94         """
95         if flags.EVENTS_ENABLED:
96             events_client.shutdown()
97             cls._server.shutdown()
98
99         os.environ["PATH"] = cls.old_path
100         os.environ["HOME"] = cls.old_home
101         if cls.old_xdg_config is not None:
102             os.environ["XDG_CONFIG_HOME"] = cls.old_xdg_config
103         # safety check! please do not wipe my home...
104         # XXX needs to adapt to non-linuces
105         leap_assert(
106             cls.tempdir.startswith('/tmp/leap_tests-') or
107             (cls.tempdir.startswith('/tmp/') and
108              cls.tempdir.startswith(tempfile.gettempdir()) and
109              'leap_tests-' in cls.tempdir) or
110             cls.tempdir.startswith('/var/folder'),
111             "beware! tried to remove a dir which does not "
112             "live in temporal folder!")
113         shutil.rmtree(cls.tempdir)
114
115     # you have to override these methods
116     # this way we ensure we did not put anything
117     # here that you can forget to call.
118
119     def setUp(self):
120         """not implemented"""
121         raise NotImplementedError("abstract base class")
122
123     def tearDown(self):
124         """not implemented"""
125         raise NotImplementedError("abstract base class")
126
127     #
128     # helper methods
129     #
130
131     def _missing_test_for_plat(self, do_raise=False):
132         """
133         Raises NotImplementedError for this platform
134         if do_raise is True
135
136         :param do_raise: flag to actually raise exception
137         :type do_raise: bool
138         """
139         if do_raise:
140             raise NotImplementedError(
141                 "This test is not implemented "
142                 "for the running platform: %s" %
143                 self._system)
144
145     def get_tempfile(self, filename):
146         """
147         Returns the path of a given filename
148         prepending the temporal dir associated with this
149         TestCase
150
151         :param filename: the filename
152         :type filename: str
153         """
154         return os.path.join(self.tempdir, filename)
155
156     def touch(self, filepath):
157         """
158         Touches a filepath, creating folders along
159         the way if needed.
160
161         :param filepath: path to be touched
162         :type filepath: str
163         """
164         folder, filename = os.path.split(filepath)
165         if not os.path.isdir(folder):
166             mkdir_p(folder)
167         self.assertTrue(os.path.isdir(folder))
168         with open(filepath, 'w') as fp:
169             fp.write(' ')
170         self.assertTrue(os.path.isfile(filepath))
171
172     def chmod600(self, filepath):
173         """
174         Chmods 600 a file
175
176         :param filepath: filepath to be chmodded
177         :type filepath: str
178         """
179         check_and_fix_urw_only(filepath)