diff --git a/tests/host/common/UdpContextSocket.cpp b/tests/host/common/UdpContextSocket.cpp index c59846018..2ffa4eb22 100644 --- a/tests/host/common/UdpContextSocket.cpp +++ b/tests/host/common/UdpContextSocket.cpp @@ -166,14 +166,14 @@ size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& a return ccinbufsize += ret; } -size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, - size_t& ccinbufsize) +size_t mockUDPPeekBytes(int sock, char* dst, size_t offset, size_t usersize, int timeout_ms, + char* ccinbuf, size_t& ccinbufsize) { (void)sock; (void)timeout_ms; - if (usersize > CCBUFSIZE) + if (offset + usersize > CCBUFSIZE) fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, - usersize - CCBUFSIZE, usersize); + offset + usersize - CCBUFSIZE, offset + usersize); size_t retsize = 0; if (ccinbufsize) @@ -183,25 +183,10 @@ size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, ch if (retsize > ccinbufsize) retsize = ccinbufsize; } - memcpy(dst, ccinbuf, retsize); + memcpy(dst, ccinbuf + offset, retsize); return retsize; } -void mockUDPSwallow(size_t copied, char* ccinbuf, size_t& ccinbufsize) -{ - // poor man buffer - memmove(ccinbuf, ccinbuf + copied, ccinbufsize - copied); - ccinbufsize -= copied; -} - -size_t mockUDPRead(int sock, char* dst, size_t size, int timeout_ms, char* ccinbuf, - size_t& ccinbufsize) -{ - size_t copied = mockUDPPeekBytes(sock, dst, size, timeout_ms, ccinbuf, ccinbufsize); - mockUDPSwallow(copied, ccinbuf, ccinbufsize); - return copied; -} - size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4, uint16_t port) { diff --git a/tests/host/common/include/UdpContext.h b/tests/host/common/include/UdpContext.h index 88cb46f9a..e8ae9461e 100644 --- a/tests/host/common/include/UdpContext.h +++ b/tests/host/common/include/UdpContext.h @@ -117,12 +117,12 @@ public: size_t getSize() { - return _inbufsize; + return _inbufsize - _inoffset; } size_t tell() const { - return 0; + return _inoffset; } void seek(const size_t pos) @@ -132,7 +132,7 @@ public: mockverbose("UDPContext::seek too far (%zd >= %zd)\n", pos, _inbufsize); exit(EXIT_FAILURE); } - mockUDPSwallow(pos, _inbuf, _inbufsize); + _inoffset = pos; } bool isValidOffset(const size_t pos) const @@ -165,6 +165,7 @@ public: bool next() { _inbufsize = 0; + _inoffset = 0; mockUDPFillInBuf(_sock, _inbuf, _inbufsize, addrsize, addr, _dstport); if (_inbufsize > 0) { @@ -182,13 +183,16 @@ public: size_t read(char* dst, size_t size) { - return mockUDPRead(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize); + //return mockUDPRead(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize); + auto ret = mockUDPPeekBytes(_sock, dst, _inoffset, size, _timeout_ms, _inbuf, _inbufsize); + _inoffset += ret; + return ret; } int peek() { char c; - return mockUDPPeekBytes(_sock, &c, 1, _timeout_ms, _inbuf, _inbufsize) ?: -1; + return mockUDPPeekBytes(_sock, &c, _inoffset, 1, _timeout_ms, _inbuf, _inbufsize) ?: -1; } void flush() @@ -280,6 +284,7 @@ private: char _inbuf[CCBUFSIZE]; size_t _inbufsize = 0; + size_t _inoffset = 0; char _outbuf[CCBUFSIZE]; size_t _outbufsize = 0; diff --git a/tests/host/common/mock.h b/tests/host/common/mock.h index dbcb1dbf3..b3308282f 100644 --- a/tests/host/common/mock.h +++ b/tests/host/common/mock.h @@ -160,13 +160,10 @@ int mockUDPSocket(); bool mockUDPListen(int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast = 0); size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& addrsize, uint8_t addr[16], uint16_t& port); -size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, - size_t& ccinbufsize); -size_t mockUDPRead(int sock, char* dst, size_t size, int timeout_ms, char* ccinbuf, - size_t& ccinbufsize); +size_t mockUDPPeekBytes(int sock, char* dst, size_t offset, size_t usersize, int timeout_ms, + char* ccinbuf, size_t& ccinbufsize); size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4, uint16_t port); -void mockUDPSwallow(size_t copied, char* ccinbuf, size_t& ccinbufsize); class UdpContext; void register_udp(int sock, UdpContext* udp = nullptr);