# queue.
with self._lock:
self._response_queue.append(('bad_command',))
- # In this case, we do not notify the main
- # thread about a response on the socket, as
- # we quit the main loop here anyway (and any
- # enclosing thread).
+
self._shutdown = True
break
+
+ # Notify (any main thread) on the socket about a
+ # response. Otherwise, the main thread may wait in its
+ # loop without knowing there was a problem.
+ if len(self._response_queue) > 0:
+ while self._sock.send(b'x') != 1:
+ continue
import unittest
import socket
+import select
import threading
import isc.log
self._builder_command_queue.append('bad_command')
self._builder_cv.notify_all()
+ # Wait 5 seconds to receive a notification on the socket from
+ # the builder.
+ (reads, _, _) = select.select([self._master_sock], [], [], 5)
+ self.assertTrue(self._master_sock in reads)
+
+ # Reading 1 byte should not block us here, especially as the
+ # socket is ready to read. It's a hack, but this is just a
+ # testcase.
+ got = self._master_sock.recv(1)
+ self.assertEqual(got, b'x')
+
# Wait 5 seconds at most for the main loop of the builder to
# exit.
self._builder_thread.join(5)