Statistics
| Branch: | Tag: | Revision:

root / kamaki / clients / livetest / __init__.py @ c6ebe715

History | View | Annotate | Download (7 kB)

1 6d192774 Stavros Sachtouris
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2 6d192774 Stavros Sachtouris
#
3 6d192774 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 6d192774 Stavros Sachtouris
# without modification, are permitted provided that the following
5 6d192774 Stavros Sachtouris
# conditions are met:
6 6d192774 Stavros Sachtouris
#
7 6d192774 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 6d192774 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 6d192774 Stavros Sachtouris
#      disclaimer.
10 6d192774 Stavros Sachtouris
#
11 6d192774 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 6d192774 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 6d192774 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 6d192774 Stavros Sachtouris
#      provided with the distribution.
15 6d192774 Stavros Sachtouris
#
16 6d192774 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 6d192774 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 6d192774 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 6d192774 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 6d192774 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 6d192774 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 6d192774 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 6d192774 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 6d192774 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 6d192774 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 6d192774 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 6d192774 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 6d192774 Stavros Sachtouris
#
29 6d192774 Stavros Sachtouris
# The views and conclusions contained in the software and
30 6d192774 Stavros Sachtouris
# documentation are those of the authors and should not be
31 6d192774 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 6d192774 Stavros Sachtouris
# or implied, of GRNET S.A.
33 6d192774 Stavros Sachtouris
34 5207c784 Stavros Sachtouris
import inspect
35 5207c784 Stavros Sachtouris
from unittest import TestCase, TestSuite, TextTestRunner
36 1f0370c9 Stavros Sachtouris
from argparse import ArgumentParser
37 54d7c02a Stavros Sachtouris
from sys import stdout
38 1f0370c9 Stavros Sachtouris
39 6d192774 Stavros Sachtouris
from kamaki.cli.config import Config
40 6d192774 Stavros Sachtouris
41 6d192774 Stavros Sachtouris
42 6d192774 Stavros Sachtouris
def _add_value(foo, value):
43 6d192774 Stavros Sachtouris
    def wrap(self):
44 6d192774 Stavros Sachtouris
        return foo(self, value)
45 6d192774 Stavros Sachtouris
    return wrap
46 6d192774 Stavros Sachtouris
47 5207c784 Stavros Sachtouris
48 1f0370c9 Stavros Sachtouris
class Generic(TestCase):
49 6d192774 Stavros Sachtouris
50 02846a75 Stavros Sachtouris
    _waits = []
51 6d192774 Stavros Sachtouris
    _cnf = None
52 1f0370c9 Stavros Sachtouris
    _grp = None
53 1f0370c9 Stavros Sachtouris
    _fetched = {}
54 6d192774 Stavros Sachtouris
55 d1f78278 Stavros Sachtouris
    def __init__(self, specific=None, config=None, group=None):
56 1f0370c9 Stavros Sachtouris
        super(Generic, self).__init__(specific)
57 d1f78278 Stavros Sachtouris
        self._cnf = config or Config()
58 1f0370c9 Stavros Sachtouris
        self._grp = group
59 02846a75 Stavros Sachtouris
        self._waits.append(0.71828)
60 02846a75 Stavros Sachtouris
        for i in range(10):
61 02846a75 Stavros Sachtouris
            self._waits.append(self._waits[-1] * 2.71828)
62 1f0370c9 Stavros Sachtouris
63 1f0370c9 Stavros Sachtouris
    def __getitem__(self, key):
64 1f0370c9 Stavros Sachtouris
        key = self._key(key)
65 1f0370c9 Stavros Sachtouris
        try:
66 f5f2dc53 Stavros Sachtouris
            r = self._fetched[key]
67 f5f2dc53 Stavros Sachtouris
            return r
68 1f0370c9 Stavros Sachtouris
            return self._fetched[key]
69 1f0370c9 Stavros Sachtouris
        except KeyError:
70 f5f2dc53 Stavros Sachtouris
            r = self._get_from_cnf(key)
71 f5f2dc53 Stavros Sachtouris
            return r
72 1f0370c9 Stavros Sachtouris
            return self._get_from_cnf(key)
73 1f0370c9 Stavros Sachtouris
74 1f0370c9 Stavros Sachtouris
    def _key(self, key):
75 1f0370c9 Stavros Sachtouris
        return ('', key) if isinstance(key, str)\
76 1f0370c9 Stavros Sachtouris
            else ('', key[0]) if len(key) == 1\
77 1f0370c9 Stavros Sachtouris
            else key
78 1f0370c9 Stavros Sachtouris
79 1f0370c9 Stavros Sachtouris
    def _get_from_cnf(self, key):
80 420598d0 Stavros Sachtouris
        val = 0
81 420598d0 Stavros Sachtouris
        if key[0]:
82 f5f2dc53 Stavros Sachtouris
            keystr = '%s_%s' % key
83 f5f2dc53 Stavros Sachtouris
            val = self._cnf.get('livetest', keystr) or self._cnf.get(*key)
84 420598d0 Stavros Sachtouris
        if not val:
85 f5f2dc53 Stavros Sachtouris
            val = self._cnf.get('livetest', key[1]) or self._cnf.get(
86 a2ba4204 Stavros Sachtouris
                'global',
87 a2ba4204 Stavros Sachtouris
                key[1])
88 1f0370c9 Stavros Sachtouris
        self._fetched[key] = val
89 1f0370c9 Stavros Sachtouris
        return val
90 1f0370c9 Stavros Sachtouris
91 b482315a Stavros Sachtouris
    def _safe_progress_bar(self, msg):
92 b482315a Stavros Sachtouris
        """Try to get a progress bar, but do not raise errors"""
93 b482315a Stavros Sachtouris
        try:
94 b4a7aa1f Stavros Sachtouris
            from progress.bar import ShadyBar
95 02846a75 Stavros Sachtouris
            wait_bar = ShadyBar(msg)
96 02846a75 Stavros Sachtouris
97 02846a75 Stavros Sachtouris
            def wait_gen(n):
98 02846a75 Stavros Sachtouris
                for i in wait_bar.iter(range(int(n))):
99 02846a75 Stavros Sachtouris
                    yield
100 02846a75 Stavros Sachtouris
                yield
101 02846a75 Stavros Sachtouris
            wait_cb = wait_gen
102 b482315a Stavros Sachtouris
        except Exception:
103 02846a75 Stavros Sachtouris
            stdout.write('%s:' % msg)
104 2bd23362 Stavros Sachtouris
            (wait_bar, wait_cb) = None, None
105 02846a75 Stavros Sachtouris
        return (wait_bar, wait_cb)
106 b482315a Stavros Sachtouris
107 b482315a Stavros Sachtouris
    def _safe_progress_bar_finish(self, progress_bar):
108 b482315a Stavros Sachtouris
        try:
109 b482315a Stavros Sachtouris
            progress_bar.finish()
110 b482315a Stavros Sachtouris
        except Exception:
111 b58c1078 Stavros Sachtouris
            print('\b DONE')
112 02846a75 Stavros Sachtouris
113 02846a75 Stavros Sachtouris
    def do_with_progress_bar(self, action, msg, items):
114 02846a75 Stavros Sachtouris
        if not items:
115 02846a75 Stavros Sachtouris
            print('%s: DONE' % msg)
116 02846a75 Stavros Sachtouris
            return
117 02846a75 Stavros Sachtouris
        (action_bar, action_cb) = self._safe_progress_bar(msg)
118 02846a75 Stavros Sachtouris
        action_gen = action_cb(len(items))
119 d1f78278 Stavros Sachtouris
        try:
120 d1f78278 Stavros Sachtouris
            action_gen.next()
121 d1f78278 Stavros Sachtouris
        except Exception:
122 d1f78278 Stavros Sachtouris
            pass
123 02846a75 Stavros Sachtouris
        for item in items:
124 02846a75 Stavros Sachtouris
            action(item)
125 02846a75 Stavros Sachtouris
            action_gen.next()
126 02846a75 Stavros Sachtouris
        self._safe_progress_bar_finish(action_bar)
127 b482315a Stavros Sachtouris
128 114e19da Stavros Sachtouris
    def assert_dicts_are_equal(self, d1, d2):
129 114e19da Stavros Sachtouris
        self.assertTrue(set(d1) == set(d2))
130 114e19da Stavros Sachtouris
        for k, v in d1.items():
131 114e19da Stavros Sachtouris
            if isinstance(v, dict):
132 114e19da Stavros Sachtouris
                self.assert_dicts_are_equal(d1[k], d2[k])
133 114e19da Stavros Sachtouris
            else:
134 114e19da Stavros Sachtouris
                self.assertEqual(v, d2[k])
135 114e19da Stavros Sachtouris
136 b482315a Stavros Sachtouris
    def assert_dicts_are_deeply_equal(self, d1, d2):
137 c088076b Stavros Sachtouris
        st1 = set([unicode(k) for k in d1])
138 c088076b Stavros Sachtouris
        st2 = set([unicode(k) for k in d2])
139 24ff0a35 Stavros Sachtouris
        diff1 = st1.difference(st2)
140 24ff0a35 Stavros Sachtouris
        diff2 = st2.difference(st1)
141 24ff0a35 Stavros Sachtouris
        self.assertTrue(
142 24ff0a35 Stavros Sachtouris
            not (diff1 or diff2),
143 24ff0a35 Stavros Sachtouris
            'Key differences:\n\td1-d2=%s\n\td2-d1=%s' % (diff1, diff2))
144 b482315a Stavros Sachtouris
        for k, v in d1.items():
145 b482315a Stavros Sachtouris
            if isinstance(v, dict):
146 b482315a Stavros Sachtouris
                self.assert_dicts_are_deeply_equal(v, d2[k])
147 b482315a Stavros Sachtouris
            else:
148 b482315a Stavros Sachtouris
                self.assertEqual(unicode(v), unicode(d2[k]))
149 b482315a Stavros Sachtouris
150 54d7c02a Stavros Sachtouris
    def test_000(self):
151 5207c784 Stavros Sachtouris
        print('')
152 54d7c02a Stavros Sachtouris
        methods = [method for method in inspect.getmembers(
153 54d7c02a Stavros Sachtouris
            self,
154 24ff0a35 Stavros Sachtouris
            predicate=inspect.ismethod) if method[0].startswith('_test_')]
155 d2e1b032 Stavros Sachtouris
        failures = 0
156 54d7c02a Stavros Sachtouris
        for method in methods:
157 a3bca46c Stavros Sachtouris
            stdout.write('Test %s ' % method[0][6:])
158 a3bca46c Stavros Sachtouris
            stdout.flush()
159 54d7c02a Stavros Sachtouris
            try:
160 54d7c02a Stavros Sachtouris
                method[1]()
161 54d7c02a Stavros Sachtouris
                print(' ...ok')
162 54d7c02a Stavros Sachtouris
            except AssertionError:
163 54d7c02a Stavros Sachtouris
                print('  FAIL: %s (%s)' % (method[0], method[1]))
164 d2e1b032 Stavros Sachtouris
                failures += 1
165 d2e1b032 Stavros Sachtouris
        if failures:
166 d2e1b032 Stavros Sachtouris
            raise AssertionError('%s failures' % failures)
167 54d7c02a Stavros Sachtouris
168 1f0370c9 Stavros Sachtouris
169 1f0370c9 Stavros Sachtouris
def init_parser():
170 1f0370c9 Stavros Sachtouris
    parser = ArgumentParser(add_help=False)
171 24ff0a35 Stavros Sachtouris
    parser.add_argument(
172 24ff0a35 Stavros Sachtouris
        '-h', '--help',
173 1f0370c9 Stavros Sachtouris
        dest='help',
174 1f0370c9 Stavros Sachtouris
        action='store_true',
175 1f0370c9 Stavros Sachtouris
        default=False,
176 1f0370c9 Stavros Sachtouris
        help="Show this help message and exit")
177 1f0370c9 Stavros Sachtouris
    return parser
178 1f0370c9 Stavros Sachtouris
179 1f0370c9 Stavros Sachtouris
180 e7e7dbbd Stavros Sachtouris
def main(argv, config=None):
181 1f0370c9 Stavros Sachtouris
    suiteFew = TestSuite()
182 1f0370c9 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'pithos':
183 f5f2dc53 Stavros Sachtouris
        from kamaki.clients.livetest.pithos import Pithos
184 a3bca46c Stavros Sachtouris
        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
185 a3bca46c Stavros Sachtouris
        suiteFew.addTest(Pithos(test_method, config))
186 02846a75 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'cyclades':
187 f5f2dc53 Stavros Sachtouris
        from kamaki.clients.livetest.cyclades import Cyclades
188 02846a75 Stavros Sachtouris
        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
189 d1f78278 Stavros Sachtouris
        suiteFew.addTest(Cyclades(test_method, config))
190 1f0370c9 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'image':
191 f5f2dc53 Stavros Sachtouris
        from kamaki.clients.livetest.image import Image
192 54d7c02a Stavros Sachtouris
        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
193 d1f78278 Stavros Sachtouris
        suiteFew.addTest(Image(test_method, config))
194 1f0370c9 Stavros Sachtouris
    if len(argv) == 0 or argv[0] == 'astakos':
195 f5f2dc53 Stavros Sachtouris
        from kamaki.clients.livetest.astakos import Astakos
196 5207c784 Stavros Sachtouris
        test_method = 'test_%s' % (argv[1] if len(argv) > 1 else '000')
197 5207c784 Stavros Sachtouris
        suiteFew.addTest(Astakos(test_method, config))
198 1f0370c9 Stavros Sachtouris
199 1f0370c9 Stavros Sachtouris
    TextTestRunner(verbosity=2).run(suiteFew)
200 1f0370c9 Stavros Sachtouris
201 1f0370c9 Stavros Sachtouris
if __name__ == '__main__':
202 1f0370c9 Stavros Sachtouris
    parser = init_parser()
203 1f0370c9 Stavros Sachtouris
    args, argv = parser.parse_known_args()
204 1f0370c9 Stavros Sachtouris
    if len(argv) > 2 or getattr(args, 'help') or len(argv) < 1:
205 f5f2dc53 Stavros Sachtouris
        raise Exception('\tusage: livetest <group> [command]')
206 1f0370c9 Stavros Sachtouris
    main(argv)