mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 10:02:01 +00:00
* Fixing uexpect.py close() method and forcing to close the process
by default * Updating tests to be more robust
This commit is contained in:
parent
1ebe3047ff
commit
79989a766c
@ -17,7 +17,7 @@ import time
|
||||
import sys
|
||||
import re
|
||||
|
||||
from threading import Thread
|
||||
from threading import Thread, Event
|
||||
from subprocess import Popen
|
||||
from Queue import Queue, Empty
|
||||
|
||||
@ -61,7 +61,7 @@ class IO(object):
|
||||
def flush(self):
|
||||
self._logger.flush()
|
||||
|
||||
def __init__(self, process, master, queue):
|
||||
def __init__(self, process, master, queue, reader):
|
||||
self.process = process
|
||||
self.master = master
|
||||
self.queue = queue
|
||||
@ -70,6 +70,7 @@ class IO(object):
|
||||
self.after = None
|
||||
self.match = None
|
||||
self.pattern = None
|
||||
self.reader = reader
|
||||
self._timeout = None
|
||||
self._logger = None
|
||||
self._eol = ''
|
||||
@ -95,8 +96,12 @@ class IO(object):
|
||||
self._eol = eol
|
||||
return self._eol
|
||||
|
||||
def close(self):
|
||||
self.process.terminate()
|
||||
def close(self, force=True):
|
||||
self.reader['kill_event'].set()
|
||||
if force:
|
||||
self.process.kill()
|
||||
else:
|
||||
self.process.terminate()
|
||||
os.close(self.master)
|
||||
if self._logger:
|
||||
self._logger.write('\n')
|
||||
@ -133,9 +138,9 @@ class IO(object):
|
||||
raise exception
|
||||
timeleft -= (time.time() - start_time)
|
||||
if data:
|
||||
self.buffer = self.buffer + data if self.buffer else data
|
||||
self.buffer = (self.buffer + data) if self.buffer else data
|
||||
self.match = pattern.search(self.buffer, 0)
|
||||
if self.match:
|
||||
if self.match is not None:
|
||||
self.after = self.buffer[self.match.start():self.match.end()]
|
||||
self.before = self.buffer[:self.match.start()]
|
||||
self.buffer = self.buffer[self.match.end():]
|
||||
@ -163,11 +168,9 @@ class IO(object):
|
||||
if data:
|
||||
return data
|
||||
if raise_exception:
|
||||
print 'DEBUG...', timeleft, repr(data),
|
||||
raise TimeoutError(timeout)
|
||||
pass
|
||||
if not data and raise_exception:
|
||||
print 'DEBUG.... here'
|
||||
raise TimeoutError(timeout)
|
||||
|
||||
return data
|
||||
@ -178,20 +181,21 @@ def spawn(command):
|
||||
os.close(slave)
|
||||
|
||||
queue = Queue()
|
||||
thread = Thread(target=reader, args=(process, master, queue))
|
||||
thread.daemon = True
|
||||
reader_kill_event = Event()
|
||||
thread = Thread(target=reader, args=(process, master, queue, reader_kill_event))
|
||||
thread.start()
|
||||
|
||||
return IO(process, master, queue)
|
||||
return IO(process, master, queue, reader={'thread':thread, 'kill_event':reader_kill_event})
|
||||
|
||||
def reader(process, out, queue):
|
||||
def reader(process, out, queue, kill_event):
|
||||
while True:
|
||||
if process.poll() is not None:
|
||||
data = os.read(out)
|
||||
try:
|
||||
data = os.read(out, 65536)
|
||||
queue.put(data)
|
||||
break
|
||||
data = os.read(out, 65536)
|
||||
queue.put(data)
|
||||
except OSError, e:
|
||||
if e.errno == 5 and kill_event.is_set():
|
||||
break
|
||||
raise
|
||||
|
||||
if __name__ == '__main__':
|
||||
io = spawn(['/bin/bash','--noediting'])
|
||||
|
@ -17,7 +17,7 @@ def client(name=''):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>') as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -17,7 +17,7 @@ def client(name=''):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>') as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -17,7 +17,7 @@ def client(name=''):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>') as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -17,7 +17,7 @@ def client(name=''):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>') as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -17,7 +17,7 @@ def client(name=''):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>') as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -17,7 +17,7 @@ def client(name=''):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>') as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -20,7 +20,7 @@ def client(name='', command=None):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>', ['bash', '--noediting']) as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -20,7 +20,7 @@ def client(name='', command=None):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>', ['bash', '--noediting']) as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -20,7 +20,7 @@ def client(name='', command=None):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>', ['bash', '--noediting']) as client2:
|
||||
client1.expect(prompt)
|
||||
|
@ -20,7 +20,7 @@ def client(name='', command=None):
|
||||
return client
|
||||
|
||||
prompt = ':\) '
|
||||
end_of_block = r'.*\xe2\x94\x82\r\n.*\xe2\x94\x98\r\n'
|
||||
end_of_block = r'.*\r\n.*\r\n'
|
||||
|
||||
with client('client1>') as client1, client('client2>', ['bash', '--noediting']) as client2:
|
||||
client1.expect(prompt)
|
||||
@ -49,7 +49,7 @@ with client('client1>') as client1, client('client2>', ['bash', '--noediting'])
|
||||
client2.expect('{"row":{"sum(a)":"6","_version":"2"}}\r\n', escape=True)
|
||||
|
||||
## send Ctrl-C
|
||||
os.kill(client2.process.pid,signal.SIGINT)
|
||||
os.kill(client2.process.pid, signal.SIGINT)
|
||||
|
||||
client1.send('DROP TABLE test.lv')
|
||||
client1.expect(prompt)
|
||||
|
Loading…
Reference in New Issue
Block a user