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