Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / test.py @ 98093aac

History | View | Annotate | Download (7.2 kB)

1 2fde8651 Stavros Sachtouris
# Copyright 2013 GRNET S.A. All rights reserved.
2 2fde8651 Stavros Sachtouris
#
3 2fde8651 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 2fde8651 Stavros Sachtouris
# without modification, are permitted provided that the following
5 2fde8651 Stavros Sachtouris
# conditions are met:
6 2fde8651 Stavros Sachtouris
#
7 2fde8651 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 2fde8651 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 2fde8651 Stavros Sachtouris
#      disclaimer.
10 2fde8651 Stavros Sachtouris
#
11 2fde8651 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 2fde8651 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 2fde8651 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 2fde8651 Stavros Sachtouris
#      provided with the distribution.
15 2fde8651 Stavros Sachtouris
#
16 2fde8651 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 2fde8651 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 2fde8651 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 2fde8651 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 2fde8651 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 2fde8651 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 2fde8651 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 2fde8651 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 2fde8651 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 2fde8651 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 2fde8651 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 2fde8651 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 2fde8651 Stavros Sachtouris
#
29 2fde8651 Stavros Sachtouris
# The views and conclusions contained in the software and
30 2fde8651 Stavros Sachtouris
# documentation are those of the authors and should not be
31 2fde8651 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 2fde8651 Stavros Sachtouris
# or implied, of GRNET S.A.
33 2fde8651 Stavros Sachtouris
34 2fde8651 Stavros Sachtouris
from unittest import makeSuite, TestSuite, TextTestRunner, TestCase
35 2fde8651 Stavros Sachtouris
from inspect import getmembers, isclass
36 98093aac Stavros Sachtouris
from tempfile import NamedTemporaryFile
37 2fde8651 Stavros Sachtouris
38 0962adb7 Stavros Sachtouris
from kamaki.cli.command_tree.test import Command, CommandTree
39 3a5b1ceb Stavros Sachtouris
from kamaki.cli.argument.test import (
40 3a5b1ceb Stavros Sachtouris
    Argument, ConfigArgument, RuntimeConfigArgument, FlagArgument,
41 8d427cb9 Stavros Sachtouris
    ValueArgument, IntArgument, DateArgument, VersionArgument,
42 631b7c35 Stavros Sachtouris
    KeyValueArgument, ProgressBarArgument, ArgumentParseManager)
43 2fde8651 Stavros Sachtouris
44 2fde8651 Stavros Sachtouris
45 98093aac Stavros Sachtouris
class History(TestCase):
46 98093aac Stavros Sachtouris
47 98093aac Stavros Sachtouris
    def setUp(self):
48 98093aac Stavros Sachtouris
        from kamaki.cli.history import History as HClass
49 98093aac Stavros Sachtouris
        self.HCLASS = HClass
50 98093aac Stavros Sachtouris
        self.file = NamedTemporaryFile()
51 98093aac Stavros Sachtouris
52 98093aac Stavros Sachtouris
    def tearDown(self):
53 98093aac Stavros Sachtouris
        self.file.close()
54 98093aac Stavros Sachtouris
55 98093aac Stavros Sachtouris
    def test__match(self):
56 98093aac Stavros Sachtouris
        self.assertRaises(AttributeError, self.HCLASS._match, 'ok', 42)
57 98093aac Stavros Sachtouris
        self.assertRaises(TypeError, self.HCLASS._match, 2.71, 'ok')
58 98093aac Stavros Sachtouris
        for args, expected in (
59 98093aac Stavros Sachtouris
                (('XXX', None), True),
60 98093aac Stavros Sachtouris
                ((None, None), True),
61 98093aac Stavros Sachtouris
                (('this line has some terms', 'some terms'), True),
62 98093aac Stavros Sachtouris
                (('this line has some terms', 'some bad terms'), False),
63 98093aac Stavros Sachtouris
                (('small line', 'not so small line terms'), False),
64 98093aac Stavros Sachtouris
                ((['line', 'with', 'some', 'terms'], 'some terms'), True),
65 98093aac Stavros Sachtouris
                ((['line', 'with', 'some terms'], 'some terms'), False)):
66 98093aac Stavros Sachtouris
            self.assertEqual(self.HCLASS._match(*args), expected)
67 98093aac Stavros Sachtouris
68 98093aac Stavros Sachtouris
    def test_get(self):
69 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
70 98093aac Stavros Sachtouris
        self.assertEqual(history.get(), [])
71 98093aac Stavros Sachtouris
72 98093aac Stavros Sachtouris
        sample_history = (
73 98093aac Stavros Sachtouris
            'kamaki history show\n',
74 98093aac Stavros Sachtouris
            'kamaki file list\n',
75 98093aac Stavros Sachtouris
            'kamaki touch pithos:f1\n',
76 98093aac Stavros Sachtouris
            'kamaki file info pithos:f1\n')
77 98093aac Stavros Sachtouris
        self.file.write(''.join(sample_history))
78 98093aac Stavros Sachtouris
        self.file.flush()
79 98093aac Stavros Sachtouris
80 98093aac Stavros Sachtouris
        expected = ['%s.  \t%s' % (
81 98093aac Stavros Sachtouris
            i + 1, event) for i, event in enumerate(sample_history)]
82 98093aac Stavros Sachtouris
        self.assertEqual(history.get(), expected)
83 98093aac Stavros Sachtouris
        self.assertEqual(history.get('kamaki'), expected)
84 98093aac Stavros Sachtouris
        self.assertEqual(history.get('file kamaki'), expected[1::2])
85 98093aac Stavros Sachtouris
        self.assertEqual(history.get('pithos:f1'), expected[2:])
86 98093aac Stavros Sachtouris
        self.assertEqual(history.get('touch pithos:f1'), expected[2:3])
87 98093aac Stavros Sachtouris
88 98093aac Stavros Sachtouris
        for limit in range(len(sample_history)):
89 98093aac Stavros Sachtouris
            self.assertEqual(history.get(limit=limit), expected[-limit:])
90 98093aac Stavros Sachtouris
            self.assertEqual(
91 98093aac Stavros Sachtouris
                history.get('kamaki', limit=limit), expected[-limit:])
92 98093aac Stavros Sachtouris
93 98093aac Stavros Sachtouris
    def test_add(self):
94 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
95 98093aac Stavros Sachtouris
        some_strings = ('a brick', 'two bricks', 'another brick', 'A wall!')
96 98093aac Stavros Sachtouris
        for i, line in enumerate(some_strings):
97 98093aac Stavros Sachtouris
            history.add(line)
98 98093aac Stavros Sachtouris
            self.file.seek(0)
99 98093aac Stavros Sachtouris
            self.assertEqual(
100 98093aac Stavros Sachtouris
                self.file.read(), '\n'.join(some_strings[:(i + 1)]) + '\n')
101 98093aac Stavros Sachtouris
102 98093aac Stavros Sachtouris
    def test_clean(self):
103 98093aac Stavros Sachtouris
        content = 'a brick\ntwo bricks\nanother brick\nA wall!\n'
104 98093aac Stavros Sachtouris
        self.file.write(content)
105 98093aac Stavros Sachtouris
        self.file.flush()
106 98093aac Stavros Sachtouris
        self.file.seek(0)
107 98093aac Stavros Sachtouris
        self.assertEqual(self.file.read(), content)
108 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
109 98093aac Stavros Sachtouris
        history.clean()
110 98093aac Stavros Sachtouris
        self.file.seek(0)
111 98093aac Stavros Sachtouris
        self.assertEqual(self.file.read(), '')
112 98093aac Stavros Sachtouris
113 98093aac Stavros Sachtouris
    def test_retrieve(self):
114 98093aac Stavros Sachtouris
        sample_history = (
115 98093aac Stavros Sachtouris
            'kamaki history show\n',
116 98093aac Stavros Sachtouris
            'kamaki file list\n',
117 98093aac Stavros Sachtouris
            'kamaki touch pithos:f1\n',
118 98093aac Stavros Sachtouris
            'kamaki file info pithos:f1\n',
119 98093aac Stavros Sachtouris
            'current / last command is always excluded')
120 98093aac Stavros Sachtouris
        self.file.write(''.join(sample_history))
121 98093aac Stavros Sachtouris
        self.file.flush()
122 98093aac Stavros Sachtouris
123 98093aac Stavros Sachtouris
        history = self.HCLASS(self.file.name)
124 98093aac Stavros Sachtouris
        self.assertRaises(ValueError, history.retrieve, 'must be number')
125 98093aac Stavros Sachtouris
        self.assertRaises(TypeError, history.retrieve, [1, 2, 3])
126 98093aac Stavros Sachtouris
127 98093aac Stavros Sachtouris
        for i in (0, len(sample_history), -len(sample_history)):
128 98093aac Stavros Sachtouris
            self.assertEqual(history.retrieve(i), None)
129 98093aac Stavros Sachtouris
        for i in range(1, len(sample_history)):
130 98093aac Stavros Sachtouris
            self.assertEqual(history.retrieve(i), sample_history[i - 1])
131 98093aac Stavros Sachtouris
            self.assertEqual(history.retrieve(- i), sample_history[- i - 1])
132 98093aac Stavros Sachtouris
133 98093aac Stavros Sachtouris
134 2fde8651 Stavros Sachtouris
#  TestCase auxiliary methods
135 2fde8651 Stavros Sachtouris
136 2fde8651 Stavros Sachtouris
def runTestCase(cls, test_name, args=[], failure_collector=[]):
137 2fde8651 Stavros Sachtouris
    """
138 2fde8651 Stavros Sachtouris
    :param cls: (TestCase) a set of Tests
139 2fde8651 Stavros Sachtouris

140 2fde8651 Stavros Sachtouris
    :param test_name: (str)
141 2fde8651 Stavros Sachtouris

142 2fde8651 Stavros Sachtouris
    :param args: (list) these are prefixed with test_ and used as params when
143 2fde8651 Stavros Sachtouris
        instantiating cls
144 2fde8651 Stavros Sachtouris

145 2fde8651 Stavros Sachtouris
    :param failure_collector: (list) collects info of test failures
146 2fde8651 Stavros Sachtouris

147 2fde8651 Stavros Sachtouris
    :returns: (int) total # of run tests
148 2fde8651 Stavros Sachtouris
    """
149 2fde8651 Stavros Sachtouris
    suite = TestSuite()
150 2fde8651 Stavros Sachtouris
    if args:
151 2fde8651 Stavros Sachtouris
        suite.addTest(cls('_'.join(['test'] + args)))
152 2fde8651 Stavros Sachtouris
    else:
153 2fde8651 Stavros Sachtouris
        suite.addTest(makeSuite(cls))
154 2fde8651 Stavros Sachtouris
    print('* Test * %s *' % test_name)
155 2fde8651 Stavros Sachtouris
    r = TextTestRunner(verbosity=2).run(suite)
156 2fde8651 Stavros Sachtouris
    failure_collector += r.failures
157 2fde8651 Stavros Sachtouris
    return r.testsRun
158 2fde8651 Stavros Sachtouris
159 2fde8651 Stavros Sachtouris
160 2fde8651 Stavros Sachtouris
def get_test_classes(module=__import__(__name__), name=''):
161 2fde8651 Stavros Sachtouris
    module_stack = [module]
162 2fde8651 Stavros Sachtouris
    while module_stack:
163 2fde8651 Stavros Sachtouris
        module = module_stack[-1]
164 2fde8651 Stavros Sachtouris
        module_stack = module_stack[:-1]
165 2fde8651 Stavros Sachtouris
        for objname, obj in getmembers(module):
166 2fde8651 Stavros Sachtouris
            if (objname == name or not name):
167 2fde8651 Stavros Sachtouris
                if isclass(obj) and objname != 'TestCase' and (
168 2fde8651 Stavros Sachtouris
                        issubclass(obj, TestCase)):
169 2fde8651 Stavros Sachtouris
                    yield (obj, objname)
170 2fde8651 Stavros Sachtouris
171 2fde8651 Stavros Sachtouris
172 2fde8651 Stavros Sachtouris
def main(argv):
173 2fde8651 Stavros Sachtouris
    found = False
174 2fde8651 Stavros Sachtouris
    failure_collector = list()
175 2fde8651 Stavros Sachtouris
    num_of_tests = 0
176 2fde8651 Stavros Sachtouris
    for cls, name in get_test_classes(name=argv[1] if len(argv) > 1 else ''):
177 2fde8651 Stavros Sachtouris
        found = True
178 2fde8651 Stavros Sachtouris
        num_of_tests += runTestCase(cls, name, argv[2:], failure_collector)
179 2fde8651 Stavros Sachtouris
    if not found:
180 2fde8651 Stavros Sachtouris
        print('Test "%s" not found' % ' '.join(argv[1:]))
181 2fde8651 Stavros Sachtouris
    else:
182 2fde8651 Stavros Sachtouris
        for i, failure in enumerate(failure_collector):
183 2fde8651 Stavros Sachtouris
            print('Failure %s: ' % (i + 1))
184 2fde8651 Stavros Sachtouris
            for field in failure:
185 2fde8651 Stavros Sachtouris
                print('\t%s' % field)
186 2fde8651 Stavros Sachtouris
        print('\nTotal tests run: %s' % num_of_tests)
187 2fde8651 Stavros Sachtouris
        print('Total failures: %s' % len(failure_collector))
188 2fde8651 Stavros Sachtouris
189 2fde8651 Stavros Sachtouris
190 2fde8651 Stavros Sachtouris
if __name__ == '__main__':
191 2fde8651 Stavros Sachtouris
    from sys import argv
192 2fde8651 Stavros Sachtouris
    main(argv)