1try:
2    from configparser import RawConfigParser
3except ImportError:
4    from ConfigParser import RawConfigParser
5import logging
6import os
7import re
8import socket
9import threading
10
11from stomp.backward import *
12
13
14log = logging.getLogger('testutils.py')
15
16config = RawConfigParser()
17config.read(os.path.join(os.path.dirname(__file__), 'setup.ini'))
18
19header_re = re.compile(r'[^:]+:.*')
20
21
22def get_environ(name):
23    try:
24        return os.environ[name]
25    except:
26        return None
27
28
29def get_default_host():
30    host = config.get('default', 'host')
31    port = config.get('default', 'port')
32    return [(get_environ('STD_HOST') or host, int(get_environ('STD_PORT') or port))]
33
34
35def get_default_vhost():
36    try:
37        vhost = config.get('default', 'vhost')
38    except:
39        vhost = None
40    return get_environ('STD_VHOST') or vhost
41
42
43def get_default_user():
44    user = config.get('default', 'user')
45    return get_environ('STD_USER') or user
46
47
48def get_default_password():
49    password = config.get('default', 'password')
50    return get_environ('STD_PASSWORD') or password
51
52
53def get_ipv6_host():
54    host = config.get('ipv6', 'host')
55    port = config.get('ipv6', 'port')
56    return [(get_environ('IPV6_HOST') or host, int(get_environ('IPV6_PORT') or port))]
57
58
59def get_default_ssl_host():
60    host = config.get('default', 'host')
61    port = config.get('default', 'ssl_port')
62    return [(get_environ('STD_HOST') or host, int(get_environ('STD_SSL_PORT') or port))]
63
64
65def get_sni_ssl_host():
66    host = config.get('sni', 'host')
67    port = config.get('sni', 'ssl_port')
68    return [(get_environ('SNI_HOST') or host, int(get_environ('SNI_SSL_PORT') or port))]
69
70
71def get_rabbitmq_host():
72    host = config.get('rabbitmq', 'host')
73    port = config.get('rabbitmq', 'port')
74    return [(get_environ('RABBITMQ_HOST') or host, int(get_environ('RABBITMQ_PORT') or port))]
75
76
77def get_rabbitmq_user():
78    user = config.get('rabbitmq', 'user')
79    return get_environ('RABBITMQ_USER') or user
80
81
82def get_rabbitmq_password():
83    password = config.get('rabbitmq', 'password')
84    return get_environ('RABBITMQ_PASSWORD') or password
85
86
87def get_stompserver_host():
88    host = config.get('stompserver', 'host')
89    port = config.get('stompserver', 'port')
90    return [(get_environ('STOMPSERVER_HOST') or host, int(get_environ('STOMPSERVER_PORT') or port))]
91
92
93class TestStompServer(object):
94    def __init__(self, host, port):
95        self.host = host
96        self.port = port
97        self.frames = []
98
99    def start(self):
100        log.debug('Starting stomp server')
101        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
102        self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
103        self.s.bind((self.host, self.port))
104        self.s.listen(1)
105        self.running = True
106        thread = threading.Thread(None, self.run)
107        thread.daemon = True
108        thread.start()
109        self.stopped = False
110        log.debug('Stomp server started')
111
112    def stop(self):
113        log.debug('Stopping test server')
114        if self.conn:
115            try:
116                self.conn.shutdown(socket.SHUT_WR)
117            except Exception:
118                pass
119            self.conn.close()
120        if self.s:
121            self.s.close()
122        self.running = False
123        self.conn = None
124        self.s = None
125        self.stopped = True
126        log.debug('Connection stopped')
127
128    def get_next_frame(self):
129        if len(self.frames) > 0:
130            rtn = self.frames[0]
131            del self.frames[0]
132            return rtn
133        else:
134            return ''
135
136    def add_frame(self, frame):
137        self.frames.append(frame)
138
139    def run(self):
140        self.conn, _ = self.s.accept()
141        while self.running:
142            try:
143                _ = self.conn.recv(1024)
144                frame = self.get_next_frame()
145                if self.conn is None:
146                    break
147                if frame is not None:
148                    self.conn.send(encode(frame))
149            except Exception:
150                _, e, _ = sys.exc_info()
151                log.debug(e)
152                break
153        try:
154            self.conn.close()
155        except:
156            pass
157        self.stopped = True
158        log.debug('Run loop completed')
159
160
161class TestStdin(object):
162    pass
163
164
165class TestStdout(object):
166    def __init__(self, test):
167        self.test = test
168        self.expects = []
169
170    def expect(self, txt):
171        self.expects.insert(0, re.compile(txt))
172
173    def write(self, txt):
174        txt = txt.rstrip()
175        if txt != '':
176            print(txt)
177        if txt == '>' or txt == '' or header_re.match(txt):
178            return
179        if len(self.expects) == 0:
180            self.test.fail('No expectations - actual "%s"' % txt)
181            return
182
183        for x in range(0, len(self.expects)):
184            chk = self.expects[x]
185            if chk.match(txt):
186                del self.expects[x]
187                return
188
189        self.test.fail('"%s" was not expected' % txt)
190
191    def flush(self):
192        pass
193