def test_condition(self): print() cv = threading.Condition() items = [] def produce(): print('start produce()') with cv: for i in range(10): items.append(i) print('yield from produce()') gyield() print('notify') cv.notify() print('done produce()') def consume(): print('start consume()') with cv: while not len(items) == 10: print('wait ({}/{})'.format(len(items), 10)) cv.wait() print('items: {}'.format(len(items))) print('done consume()') spawn(produce) spawn(consume) print('switch to hub') gyield(False) print('done test')
def test_send_timeout(self, gsock, server_sock): resize_buffer(server_sock, 1) evt = Event() def server(): client_sock, addr = server_sock.accept() resize_buffer(client_sock, 1) evt.wait() g = spawn(server) server_addr = server_sock.getsockname() resize_buffer(gsock, 1) gsock.connect(server_addr) gsock.settimeout(TIMEOUT_SMALL) with pytest.raises(socket.timeout): # large enough data to overwhelm most buffers msg_len = 10 ** 6 sent = 0 while sent < msg_len: sent += gsock.send(bytes(msg_len)) evt.send() g.wait()
def run(self): acceptors = [] for sock in self.sockets: gsock = gsocket(sock.FAMILY, socket.SOCK_STREAM, fileno=sock.fileno()) gsock.setblocking(1) hfun = partial(self.handle, gsock) acceptor = guv.spawn(_guv_serve, gsock, hfun, self.worker_connections) acceptors.append(acceptor) guv.gyield() try: while self.alive: self.notify() guv.sleep(self.timeout / 2) except (KeyboardInterrupt, SystemExit): log.debug('KeyboardInterrupt, exiting') self.notify() try: with guv.Timeout(self.cfg.graceful_timeout) as t: for a in acceptors: a.kill(guv.StopServe()) for a in acceptors: a.wait() except guv.Timeout as te: if te != t: raise for a in acceptors: a.kill() log.debug('GuvWorker exited')
def test_del_closes_socket(self, gsock, server_sock): def accept_once(sock): # delete/overwrite the original conn object, only keeping the file object around # closing the file object should close everything try: client_sock, addr = sock.accept() file = client_sock.makefile('wb') del client_sock file.write(b'hello\n') file.close() gc.collect() with pytest.raises(ValueError): file.write(b'a') finally: sock.close() killer = spawn(accept_once, server_sock) gsock.connect(('127.0.0.1', server_sock.getsockname()[1])) f = gsock.makefile('rb') gsock.close() assert f.read() == b'hello\n' assert f.read() == b'' killer.wait()
def test_del_closes_socket(self, gsock, server_sock): def accept_once(sock): # delete/overwrite the original conn object, only keeping the file object around # closing the file object should close everything try: client_sock, addr = sock.accept() file = client_sock.makefile("wb") del client_sock file.write(b"hello\n") file.close() gc.collect() with pytest.raises(ValueError): file.write(b"a") finally: sock.close() killer = spawn(accept_once, server_sock) gsock.connect(("127.0.0.1", server_sock.getsockname()[1])) f = gsock.makefile("rb") gsock.close() assert f.read() == b"hello\n" assert f.read() == b"" killer.wait()