diff --git a/folly/io/async/AsyncSocket.h b/folly/io/async/AsyncSocket.h index fca560bbc31..f8aa27f6019 100644 --- a/folly/io/async/AsyncSocket.h +++ b/folly/io/async/AsyncSocket.h @@ -473,28 +473,28 @@ class AsyncSocket : virtual public AsyncTransportWrapper { * ) * */ - void setErrMessageCB(ErrMessageCallback* callback); + virtual void setErrMessageCB(ErrMessageCallback* callback); /** * Get a pointer to ErrMessageCallback implementation currently * registered with this socket. * */ - ErrMessageCallback* getErrMessageCallback() const; + virtual ErrMessageCallback* getErrMessageCallback() const; /** * Set a pointer to SendMsgParamsCallback implementation which * will be used to form ::sendmsg() system call parameters * */ - void setSendMsgParamCB(SendMsgParamsCallback* callback); + virtual void setSendMsgParamCB(SendMsgParamsCallback* callback); /** * Get a pointer to SendMsgParamsCallback implementation currently * registered with this socket. * */ - SendMsgParamsCallback* getSendMsgParamsCB() const; + virtual SendMsgParamsCallback* getSendMsgParamsCB() const; // Read and write methods void setReadCB(ReadCallback* callback) override; @@ -698,6 +698,41 @@ class AsyncSocket : virtual public AsyncTransportWrapper { return setsockopt(fd_, level, optname, optval, sizeof(T)); } + /** + * Virtual method for reading a socket option returning integer + * value, which is the most typical case. Convenient for overriding + * and mocking. + * + * @param level same as the "level" parameter in getsockopt(). + * @param optname same as the "optname" parameter in getsockopt(). + * @param optval same as "optval" parameter in getsockopt(). + * @param optlen same as "optlen" parameter in getsockopt(). + * @return same as the return value of getsockopt(). + */ + virtual int + getSockOptVirtual(int level, int optname, void* optval, socklen_t* optlen) { + return getsockopt(fd_, level, optname, optval, optlen); + } + + /** + * Virtual method for setting a socket option accepting integer + * value, which is the most typical case. Convenient for overriding + * and mocking. + * + * @param level same as the "level" parameter in setsockopt(). + * @param optname same as the "optname" parameter in setsockopt(). + * @param optval same as "optval" parameter in setsockopt(). + * @param optlen same as "optlen" parameter in setsockopt(). + * @return same as the return value of setsockopt(). + */ + virtual int setSockOptVirtual( + int level, + int optname, + void const* optval, + socklen_t optlen) { + return setsockopt(fd_, level, optname, optval, optlen); + } + /** * Set pre-received data, to be returned to read callback before any data * from the socket. diff --git a/folly/io/async/test/MockAsyncSocket.h b/folly/io/async/test/MockAsyncSocket.h index d6cb3da2fd5..c4b9dcacf49 100644 --- a/folly/io/async/test/MockAsyncSocket.h +++ b/folly/io/async/test/MockAsyncSocket.h @@ -47,6 +47,10 @@ class MockAsyncSocket : public AsyncSocket { MOCK_CONST_METHOD0(hangup, bool()); MOCK_METHOD1(setReadCB, void(ReadCallback*)); MOCK_METHOD1(_setPreReceivedData, void(std::unique_ptr&)); + MOCK_CONST_METHOD0(getRawBytesWritten, size_t()); + MOCK_METHOD4(setSockOptVirtual, int(int, int, void const*, socklen_t)); + MOCK_METHOD1(setErrMessageCB, void(AsyncSocket::ErrMessageCallback*)); + MOCK_METHOD1(setSendMsgParamCB, void(AsyncSocket::SendMsgParamsCallback*)); void setPreReceivedData(std::unique_ptr data) override { return _setPreReceivedData(data); }