async def METHOD_NAME(self, request: bytes, timeout=0.1):
    """Send request bytes, expect that the server sends CSM and does not
    close the connection, awaiting more from the client.
    Returns all messages received until the timeout."""
    self.mock_w.write(request)
    triggered_eof = False
    async def kill_read():
        """After a timeout, synthesize an end-of-file condition into the
        reader, hoping this doesn't beak too much."""
        nonlocal triggered_eof
        await asyncio.sleep(timeout)
        triggered_eof = True
        self.mock_r.feed_eof()
    self.loop.create_task(kill_read())
    r = await self.mock_r.read() # timing out would be a typical failure case here too
    self.assertEqual(triggered_eof, True, "Server closed connection prematurely")
    parsed, trail = self._read_as_messages(r)
    # if this happens, the server is either sending garbage (announcing
    # something long and not following up), or the timeout should be
    # increased
    self.assertEqual(trail, b"", "Leftover data after reading timeout")
    if parsed[0].code == aiocoap.CSM:
        # don't discard the CSM unconditionallly: the server might have
        # read the request data before sending its own initial CSM.
        parsed.pop(0)
    return parsed