Я преобразую модульный тест C ++ в функциональный тест Python, и он оказывается трудным.
Тест читает из сокета домена unix.Сначала он пишет простое сообщение (строку), затем читает из сокета.
В модульном тесте / скомпилированной программе на C ++ для чтения из сокета вызывается recvmmsg.Он использует парадигму «c message».Мой функциональный тест пытается сделать то же самое, но я понимаю, что мой функциональный тест / python в конечном итоге просто вызывает 'read'.
Я думаю, что часть трудностей заключается в том, что юнит-тест / сокет домена unixиспользует эту парадигму c сообщения.
Вот мой код для модульного теста / recvmmsg:
recvmmsg(3, {{
{msg_name(0)=NULL, msg_iov(1)=[{"\360", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [5]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\252", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [6]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\255", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [7]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\210", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [8]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\377", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [9]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\177", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [10]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [11]}], msg_flags=0}, 1}, {
{msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [12]}], msg_flags=0}, 1}}, 8, 0, NULL) = 8 (left NULL)
Фактические считываемые данные представляют собой некоторые файловые дескрипторы / целые числа.Изучив единственную строку ниже, [5] - это дескриптор файла, остальное - метаданные.
{msg_name(0)=NULL, msg_iov(1)=[{"\360", 1}], msg_controllen=20, [{cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, [5]}], msg_flags=0}, 1}
Однако, когда я пишу мою программу на python, кажется, что читается только msg_iov, не знаю, почему:
read(5, "\360", 8192) = 1
read(5, "\252", 8192) = 1
read(5, "\255", 8192) = 1
read(5, "\210", 8192) = 1
read(5, "\377", 8192) = 1
read(5, "\177", 8192) = 1
read(5, "\0", 8192) = 1
read(5, "\0", 8192) = 1
Существует гораздо больше, например, использование socat для преобразования сокета домена unix в сокет TCP.Я упустил возможность включить примеры кода, потому что они не предлагают намного больше, чем вывод strace.
Удивление на очень простом уровне, если возможно заменить вызов recvmmsg несколькими «read».Логично, я бы предположил, что если бы я не читал достаточно, мое следующее чтение было бы там, где остановился последний.Кажется, что это не так, и просто читает msg_iov каждый раз.Настройка размера буфера в python, похоже, ничего не меняет.
Я пытаюсь сделать невозможное?