Completed
Push — master ( 2ae69e...39840a )
by Vincent
01:14
created

ActionTreeTestCase.setUp()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
1
# coding: utf8
2
3
# Copyright 2013-2015 Vincent Jacques <[email protected]>
4
5
from __future__ import division, absolute_import, print_function
6
7
import ctypes
8
import subprocess
9
import sys
10
import tempfile
11
import time
12
import unittest
13
14
try:
15
    import unittest.mock
16
except ImportError:
17
    import mock
18
    unittest.mock = mock
19
20
from ActionTree import *
21
22
libc = ctypes.CDLL(None)
23
24
25
class TestAction(Action):
26
    def __init__(
27
        self, name,
28
        exception, return_value, delay,
29
        events_file, end_event,
30
        print_on_stdout, print_on_stderr, puts_on_stdout, echo_on_stdout,
31
    ):
32
        super(TestAction, self).__init__(name)
33
        self.__exception = exception
34
        self.__return_value = return_value
35
        self.__delay = delay
36
        self.__events_file = events_file
37
        self.__end_event = end_event
38
        self.__print_on_stdout = print_on_stdout
39
        self.__print_on_stderr = print_on_stderr
40
        self.__puts_on_stdout = puts_on_stdout
41
        self.__echo_on_stdout = echo_on_stdout
42
43
    def do_execute(self):
44
        with open(self.__events_file, "a") as f:
45
            f.write("{}\n".format(self.label.lower()))
46
        if self.__delay:
47
            time.sleep(self.__delay)
48
        if self.__end_event:
49
            with open(self.__events_file, "a") as f:
50
                f.write("{}\n".format(self.label.upper()))
51
        if isinstance(self.__print_on_stdout, str):
52
            print(self.__print_on_stdout)
53
        elif isinstance(self.__print_on_stdout, list):
54
            for (p, d) in self.__print_on_stdout:
55
                print(p)
56
                sys.stdout.flush()
57
                time.sleep(d)
58
        if self.__print_on_stderr:
59
            print(self.__print_on_stderr, file=sys.stderr)
60
        if self.__puts_on_stdout:
61
            libc.puts(self.__puts_on_stdout)
62
        if self.__echo_on_stdout:
63
            subprocess.check_call(["echo", self.__echo_on_stdout])
64
        if self.__exception:
65
            raise self.__exception
66
        else:
67
            return self.__return_value
68
69
70
class ActionTreeTestCase(unittest.TestCase):
71
    def setUp(self):
72
        # print(self.id())
73
        (fd, events_file) = tempfile.mkstemp()
74
        os.close(fd)
75
        self.__events_file = events_file
76
77
    def tearDown(self):
78
        os.unlink(self.__events_file)
79
80
    def _action(
81
        self, name,
82
        exception=None, return_value=None, delay=None,
83
        end_event=False,
84
        print_on_stdout=None, print_on_stderr=None, puts_on_stdout=None, echo_on_stdout=None,
85
    ):
86
        return TestAction(
87
            name,
88
            exception, return_value, delay,
89
            self.__events_file, end_event,
90
            print_on_stdout, print_on_stderr, puts_on_stdout, echo_on_stdout
91
        )
92
93
    def assertEventsEqual(self, groups):
94
        with open(self.__events_file) as f:
95
            events = [line.strip() for line in f.readlines()]
96
        for group in groups.split(" "):
97
            self.assertEqual(sorted(group), sorted(events[:len(group)]))
98
            events = events[len(group):]
99
        self.assertEqual(events, [])
100
101
    def assertEventsIn(self, expected_events):
102
        with open(self.__events_file) as f:
103
            events = [line.strip() for line in f.readlines()]
104
        self.assertIn(events, expected_events)
105