Skip to content

Commit

Permalink
Make some AsyncTest methods virtual to allow mocking them using gtest…
Browse files Browse the repository at this point in the history
…/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
  • Loading branch information
maxgeorg authored and facebook-github-bot committed Apr 4, 2017
1 parent 2218031 commit 96791c4
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 4 deletions.
43 changes: 39 additions & 4 deletions folly/io/async/AsyncSocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions folly/io/async/test/MockAsyncSocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<IOBuf>&));
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<IOBuf> data) override {
return _setPreReceivedData(data);
}
Expand Down

0 comments on commit 96791c4

Please sign in to comment.