@@ -138,38 +138,31 @@ std::vector<NodeEvictionCandidate> GetRandomNodeEvictionCandidates(int n_candida
138
138
return candidates;
139
139
}
140
140
141
- StaticContentsSock::StaticContentsSock ( const std::string& contents)
142
- : Sock{INVALID_SOCKET}, m_contents{contents}
143
- {
144
- }
141
+ // Have different ZeroSock (or others that inherit from it) objects have different
142
+ // m_socket because EqualSharedPtrSock compares m_socket and we want to avoid two
143
+ // different objects comparing as equal.
144
+ static std::atomic<SOCKET> g_mocked_sock_fd{ 0 };
145
145
146
- StaticContentsSock::~StaticContentsSock () { m_socket = INVALID_SOCKET; }
146
+ ZeroSock::ZeroSock () : Sock{g_mocked_sock_fd++} { }
147
147
148
- StaticContentsSock& StaticContentsSock::operator =(Sock&& other)
149
- {
150
- assert (false && " Move of Sock into MockSock not allowed." );
151
- return *this ;
152
- }
148
+ // Sock::~Sock() would try to close(2) m_socket if it is not INVALID_SOCKET, avoid that.
149
+ ZeroSock::~ZeroSock () { m_socket = INVALID_SOCKET; }
153
150
154
- ssize_t StaticContentsSock ::Send (const void *, size_t len, int ) const { return len; }
151
+ ssize_t ZeroSock ::Send (const void *, size_t len, int ) const { return len; }
155
152
156
- ssize_t StaticContentsSock ::Recv (void * buf, size_t len, int flags) const
153
+ ssize_t ZeroSock ::Recv (void * buf, size_t len, int flags) const
157
154
{
158
- const size_t consume_bytes{std::min (len, m_contents.size () - m_consumed)};
159
- std::memcpy (buf, m_contents.data () + m_consumed, consume_bytes);
160
- if ((flags & MSG_PEEK) == 0 ) {
161
- m_consumed += consume_bytes;
162
- }
163
- return consume_bytes;
155
+ memset (buf, 0x0 , len);
156
+ return len;
164
157
}
165
158
166
- int StaticContentsSock ::Connect (const sockaddr*, socklen_t ) const { return 0 ; }
159
+ int ZeroSock ::Connect (const sockaddr*, socklen_t ) const { return 0 ; }
167
160
168
- int StaticContentsSock ::Bind (const sockaddr*, socklen_t ) const { return 0 ; }
161
+ int ZeroSock ::Bind (const sockaddr*, socklen_t ) const { return 0 ; }
169
162
170
- int StaticContentsSock ::Listen (int ) const { return 0 ; }
163
+ int ZeroSock ::Listen (int ) const { return 0 ; }
171
164
172
- std::unique_ptr<Sock> StaticContentsSock ::Accept (sockaddr* addr, socklen_t * addr_len) const
165
+ std::unique_ptr<Sock> ZeroSock ::Accept (sockaddr* addr, socklen_t * addr_len) const
173
166
{
174
167
if (addr != nullptr ) {
175
168
// Pretend all connections come from 5.5.5.5:6789
@@ -183,38 +176,36 @@ std::unique_ptr<Sock> StaticContentsSock::Accept(sockaddr* addr, socklen_t* addr
183
176
addr_in->sin_port = htons (6789 );
184
177
}
185
178
}
186
- return std::make_unique<StaticContentsSock>( " " );
187
- };
179
+ return std::make_unique<ZeroSock>( );
180
+ }
188
181
189
- int StaticContentsSock ::GetSockOpt (int level, int opt_name, void * opt_val, socklen_t * opt_len) const
182
+ int ZeroSock ::GetSockOpt (int level, int opt_name, void * opt_val, socklen_t * opt_len) const
190
183
{
191
184
std::memset (opt_val, 0x0 , *opt_len);
192
185
return 0 ;
193
186
}
194
187
195
- int StaticContentsSock ::SetSockOpt (int , int , const void *, socklen_t ) const { return 0 ; }
188
+ int ZeroSock ::SetSockOpt (int , int , const void *, socklen_t ) const { return 0 ; }
196
189
197
- int StaticContentsSock ::GetSockName (sockaddr* name, socklen_t * name_len) const
190
+ int ZeroSock ::GetSockName (sockaddr* name, socklen_t * name_len) const
198
191
{
199
192
std::memset (name, 0x0 , *name_len);
200
193
return 0 ;
201
194
}
202
195
203
- bool StaticContentsSock ::SetNonBlocking () const { return true ; }
196
+ bool ZeroSock ::SetNonBlocking () const { return true ; }
204
197
205
- bool StaticContentsSock ::IsSelectable () const { return true ; }
198
+ bool ZeroSock ::IsSelectable () const { return true ; }
206
199
207
- bool StaticContentsSock::Wait (std::chrono::milliseconds timeout,
208
- Event requested,
209
- Event* occurred) const
200
+ bool ZeroSock::Wait (std::chrono::milliseconds timeout, Event requested, Event* occurred) const
210
201
{
211
202
if (occurred != nullptr ) {
212
203
*occurred = requested;
213
204
}
214
205
return true ;
215
206
}
216
207
217
- bool StaticContentsSock ::WaitMany (std::chrono::milliseconds timeout, EventsPerSock& events_per_sock) const
208
+ bool ZeroSock ::WaitMany (std::chrono::milliseconds timeout, EventsPerSock& events_per_sock) const
218
209
{
219
210
for (auto & [sock, events] : events_per_sock) {
220
211
(void )sock;
@@ -223,7 +214,29 @@ bool StaticContentsSock::WaitMany(std::chrono::milliseconds timeout, EventsPerSo
223
214
return true ;
224
215
}
225
216
226
- bool StaticContentsSock::IsConnected (std::string&) const
217
+ ZeroSock& ZeroSock:: operator =(Sock&& other)
227
218
{
228
- return true ;
219
+ assert (false && " Move of Sock into ZeroSock not allowed." );
220
+ return *this ;
221
+ }
222
+
223
+ StaticContentsSock::StaticContentsSock (const std::string& contents)
224
+ : m_contents{contents}
225
+ {
226
+ }
227
+
228
+ ssize_t StaticContentsSock::Recv (void * buf, size_t len, int flags) const
229
+ {
230
+ const size_t consume_bytes{std::min (len, m_contents.size () - m_consumed)};
231
+ std::memcpy (buf, m_contents.data () + m_consumed, consume_bytes);
232
+ if ((flags & MSG_PEEK) == 0 ) {
233
+ m_consumed += consume_bytes;
234
+ }
235
+ return consume_bytes;
236
+ }
237
+
238
+ StaticContentsSock& StaticContentsSock::operator =(Sock&& other)
239
+ {
240
+ assert (false && " Move of Sock into StaticContentsSock not allowed." );
241
+ return *this ;
229
242
}
0 commit comments