From: Maxim Georgiev Date: Tue, 4 Apr 2017 19:16:07 +0000 (-0700) Subject: Make some AsyncTest methods virtual to allow mocking them using gtest/gmock X-Git-Tag: v2017.04.10.00~17 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=96791c4516497b4ea2ad08af12e4267bd1c4e796;p=folly.git Make some AsyncTest methods virtual to allow mocking them using gtest/gmock Summary: GMock can't mock class methods that are not virtual. This way classes relying on the non-virtual methods of AsyncSocket can't be efficiently tested using gtest/gmock. Reviewed By: yfeldblum Differential Revision: D4806838 fbshipit-source-id: fde852b75f7ac1d468c177e317c516cb0dc333b5 --- diff --git a/folly/io/async/AsyncSocket.h b/folly/io/async/AsyncSocket.h index fca560bb..f8aa27f6 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 d6cb3da2..c4b9dcac 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); }