Exemplo n.º 1
0
 def test_connect_with_payload(self):
     giveup_event = win32event.CreateEvent(None, 0, 0, None)
     t = threading.Thread(target=self.connect_thread_runner,
                          args=(True, giveup_event))
     t.start()
     time.sleep(0.1)
     s2 = socket.socket()
     ol = pywintypes.OVERLAPPED()
     s2.bind(('0.0.0.0',
              0))  # connectex requires the socket be bound beforehand
     try:
         win32file.ConnectEx(s2, self.addr, ol,
                             str2bytes("some expected request"))
     except win32file.error as exc:
         win32event.SetEvent(giveup_event)
         if exc.winerror == 10022:  # WSAEINVAL
             raise TestSkipped(
                 "ConnectEx is not available on this platform")
         raise  # some error error we don't expect.
     win32file.GetOverlappedResult(s2.fileno(), ol, 1)
     ol = pywintypes.OVERLAPPED()
     buff = win32file.AllocateReadBuffer(1024)
     win32file.WSARecv(s2, buff, ol, 0)
     length = win32file.GetOverlappedResult(s2.fileno(), ol, 1)
     self.response = buff[:length]
     self.assertEqual(self.response, str2bytes('some expected response'))
     self.assertEqual(self.request, str2bytes('some expected request'))
     t.join(5)
     self.failIf(t.isAlive(), "worker thread didn't terminate")
Exemplo n.º 2
0
 def testAcceptEx(self):
     port = 4680
     running = threading.Event()
     stopped = threading.Event()
     t = threading.Thread(target=self.acceptWorker,
                          args=(port, running, stopped))
     t.start()
     running.wait(2)
     if not running.isSet():
         self.fail("AcceptEx Worker thread failed to start")
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.connect(('127.0.0.1', port))
     win32file.WSASend(s, str2bytes("hello"), None)
     overlapped = pywintypes.OVERLAPPED()
     overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None)
     # Like above - WSARecv used to allow strings as the receive buffer!!
     buffer = " " * 10
     self.assertRaises(TypeError, win32file.WSARecv, s, buffer, overlapped)
     # This one should work :)
     buffer = win32file.AllocateReadBuffer(10)
     win32file.WSARecv(s, buffer, overlapped)
     nbytes = win32file.GetOverlappedResult(s.fileno(), overlapped, True)
     got = buffer[:nbytes]
     self.failUnlessEqual(got, str2bytes("hello"))
     # thread should have stopped
     stopped.wait(2)
     if not stopped.isSet():
         self.fail("AcceptEx Worker thread failed to successfully stop")
Exemplo n.º 3
0
 def enqueue_recv(self, size):
     overlapped = win32file.OVERLAPPED()
     buf = win32file.AllocateReadBuffer(size)
     rc, _ = win32file.WSARecv(self.fileno(), buf, overlapped, 0)
     self._recv_buffers[overlapped] = buf
     overlapped.object = self.recv_done
     self.keep(overlapped.object)
     self.keep(overlapped)
Exemplo n.º 4
0
    def test_connect_without_payload(self):
        giveup_event = win32event.CreateEvent(None, 0, 0, None)
        t = threading.Thread(target=self.connect_thread_runner,
                             args=(False, giveup_event))
        t.start()
        time.sleep(0.1)
        s2 = socket.socket()
        ol = pywintypes.OVERLAPPED()
        s2.bind(("0.0.0.0",
                 0))  # connectex requires the socket be bound beforehand
        try:
            win32file.ConnectEx(s2, self.addr, ol)
        except win32file.error as exc:
            win32event.SetEvent(giveup_event)
            if exc.winerror == 10022:  # WSAEINVAL
                raise TestSkipped(
                    "ConnectEx is not available on this platform")
            raise  # some error error we don't expect.
        # We occasionally see ERROR_CONNECTION_REFUSED in automation
        try:
            win32file.GetOverlappedResult(s2.fileno(), ol, 1)
        except win32file.error as exc:
            win32event.SetEvent(giveup_event)
            if exc.winerror == winerror.ERROR_CONNECTION_REFUSED:
                raise TestSkipped(
                    "Assuming ERROR_CONNECTION_REFUSED is transient")
            raise

        ol = pywintypes.OVERLAPPED()
        buff = win32file.AllocateReadBuffer(1024)
        win32file.WSARecv(s2, buff, ol, 0)
        length = win32file.GetOverlappedResult(s2.fileno(), ol, 1)
        self.response = buff[:length]
        self.assertEqual(self.response, str2bytes("some expected response"))
        t.join(5)
        self.failIf(t.is_alive(), "worker thread didn't terminate")
Exemplo n.º 5
0
class TestConnect(unittest.TestCase):
    def connect_thread_runner(self, expect_payload, giveup_event):
        # As Windows 2000 doesn't do ConnectEx, we need to use a non-blocking
        # accept, as our test connection may never come.  May as well use
        # AcceptEx for this...
        listener = socket.socket()
        self.addr = ('localhost', random.randint(10000, 64000))
        listener.bind(self.addr)
        listener.listen(1)

        # create accept socket
        accepter = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # An overlapped
        overlapped = pywintypes.OVERLAPPED()
        overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None)
        # accept the connection.
        if expect_payload:
            buf_size = 1024
        else:
            # when we don't expect data we must be careful to only pass the
            # exact number of bytes for the endpoint data...
            buf_size = win32file.CalculateSocketEndPointSize(listener)

        buffer = win32file.AllocateReadBuffer(buf_size)
        win32file.AcceptEx(listener, accepter, buffer, overlapped)
        # wait for the connection or our test to fail.
        events = giveup_event, overlapped.hEvent
        rc = win32event.WaitForMultipleObjects(events, False, 2000)
        if rc == win32event.WAIT_TIMEOUT:
            self.fail("timed out waiting for a connection")
        if rc == win32event.WAIT_OBJECT_0:
            # Our main thread running the test failed and will never connect.
            return
        # must be a connection.
        nbytes = win32file.GetOverlappedResult(listener.fileno(), overlapped,
                                               False)
        if expect_payload:
            self.request = buffer[:nbytes]
        accepter.send(str2bytes('some expected response'))

    def test_connect_with_payload(self):
        giveup_event = win32event.CreateEvent(None, 0, 0, None)
        t = threading.Thread(target=self.connect_thread_runner,
                             args=(True, giveup_event))
        t.start()
        time.sleep(0.1)
        s2 = socket.socket()
        ol = pywintypes.OVERLAPPED()
        s2.bind(('0.0.0.0',
                 0))  # connectex requires the socket be bound beforehand
        try:
            win32file.ConnectEx(s2, self.addr, ol,
                                str2bytes("some expected request"))
        except win32file.error, exc:
            win32event.SetEvent(giveup_event)
            if exc.winerror == 10022:  # WSAEINVAL
                raise TestSkipped(
                    "ConnectEx is not available on this platform")
            raise  # some error error we don't expect.
        win32file.GetOverlappedResult(s2.fileno(), ol, 1)
        ol = pywintypes.OVERLAPPED()
        buff = win32file.AllocateReadBuffer(1024)
        win32file.WSARecv(s2, buff, ol, 0)
        length = win32file.GetOverlappedResult(s2.fileno(), ol, 1)
        self.response = buff[:length]
        self.assertEqual(self.response, str2bytes('some expected response'))
        self.assertEqual(self.request, str2bytes('some expected request'))
        t.join(5)
        self.failIf(t.isAlive(), "worker thread didn't terminate")
Exemplo n.º 6
0
        s2 = socket.socket()
        ol = pywintypes.OVERLAPPED()
        s2.bind(('0.0.0.0',
                 0))  # connectex requires the socket be bound beforehand
        try:
            win32file.ConnectEx(s2, self.addr, ol)
        except win32file.error, exc:
            win32event.SetEvent(giveup_event)
            if exc.winerror == 10022:  # WSAEINVAL
                raise TestSkipped(
                    "ConnectEx is not available on this platform")
            raise  # some error error we don't expect.
        win32file.GetOverlappedResult(s2.fileno(), ol, 1)
        ol = pywintypes.OVERLAPPED()
        buff = win32file.AllocateReadBuffer(1024)
        win32file.WSARecv(s2, buff, ol, 0)
        length = win32file.GetOverlappedResult(s2.fileno(), ol, 1)
        self.response = buff[:length]
        self.assertEqual(self.response, str2bytes('some expected response'))
        t.join(5)
        self.failIf(t.isAlive(), "worker thread didn't terminate")


class TestTransmit(unittest.TestCase):
    def test_transmit(self):
        import binascii
        bytes = os.urandom(1024 * 1024)
        val = binascii.hexlify(bytes)
        val_length = len(val)
        f = tempfile.TemporaryFile()
        f.write(val)
Exemplo n.º 7
0
 def enqueue_recv(self, size):
     overlapped = win32file.OVERLAPPED()
     buf = win32file.AllocateReadBuffer(size)
     rc, buf = win32file.WSARecv(self.handle, buf, overlapped, 0)
     self._recv_buffer.append(buf)
     overlapped.object = self
Exemplo n.º 8
0
	def recv( self, fd, userdata = None ):
		self.fds[fd][1].object = [userdata, fd, self.fds[fd][2], 1 ]
		win32file.WSARecv( fd, self.fds[fd][2], self.fds[fd][1], 0 )