2
2
3
3
module Network.Socket.ByteStringSpec (main , spec ) where
4
4
5
+ import Control.Concurrent.MVar (newEmptyMVar , putMVar , takeMVar )
5
6
import Data.Bits
6
7
import Data.Maybe
7
8
import Control.Monad
@@ -235,10 +236,17 @@ spec = do
235
236
-- This test behaves strange on AppVeyor and I don't know why so skip
236
237
-- TOS for now.
237
238
isAppVeyor <- isJust <$> lookupEnv " APPVEYOR"
239
+
240
+ -- Avoid race condition between the client sending the message and
241
+ -- the server finishing its socket configuration. Otherwise the
242
+ -- message may be received with default socket options!
243
+ serverReady <- newEmptyMVar
244
+
238
245
let server sock = do
239
246
whenSupported RecvIPv4TTL $ setSocketOption sock RecvIPv4TTL 1
240
247
whenSupported RecvIPv4PktInfo $ setSocketOption sock RecvIPv4PktInfo 1
241
248
whenSupported RecvIPv4TOS $ setSocketOption sock RecvIPv4TOS 1
249
+ putMVar serverReady ()
242
250
243
251
(_, _, cmsgs, _) <- recvMsg sock 1024 128 mempty
244
252
@@ -249,39 +257,52 @@ spec = do
249
257
((lookupCmsg CmsgIdIPv4TTL cmsgs >>= decodeCmsg) :: Maybe IPv4TTL ) `shouldNotBe` Nothing
250
258
whenSupported RecvIPv4TOS $
251
259
((lookupCmsg CmsgIdIPv4TOS cmsgs >>= decodeCmsg) :: Maybe IPv4TOS ) `shouldNotBe` Nothing
252
- client sock addr = sendTo sock seg addr
260
+ client sock addr = takeMVar serverReady >> sendTo sock seg addr
253
261
254
262
seg = C. pack " This is a test message"
255
263
udpTest client server
256
264
257
265
it " receives control messages for IPv6" $ do
266
+ -- Avoid race condition between the client sending the message and
267
+ -- the server finishing its socket configuration. Otherwise the
268
+ -- message may be received with default socket options!
269
+ serverReady <- newEmptyMVar
270
+
258
271
let server sock = do
259
272
whenSupported RecvIPv6HopLimit $ setSocketOption sock RecvIPv6HopLimit 1
260
273
whenSupported RecvIPv6TClass $ setSocketOption sock RecvIPv6TClass 1
261
274
whenSupported RecvIPv6PktInfo $ setSocketOption sock RecvIPv6PktInfo 1
262
- (_, _, cmsgs, _) <- recvMsg sock 1024 128 mempty
275
+ putMVar serverReady ()
263
276
277
+ (_, _, cmsgs, _) <- recvMsg sock 1024 128 mempty
264
278
265
279
whenSupported RecvIPv6HopLimit $
266
280
((lookupCmsg CmsgIdIPv6HopLimit cmsgs >>= decodeCmsg) :: Maybe IPv6HopLimit ) `shouldNotBe` Nothing
267
281
whenSupported RecvIPv6TClass $
268
282
((lookupCmsg CmsgIdIPv6TClass cmsgs >>= decodeCmsg) :: Maybe IPv6TClass ) `shouldNotBe` Nothing
269
283
whenSupported RecvIPv6PktInfo $
270
284
((lookupCmsg CmsgIdIPv6PktInfo cmsgs >>= decodeCmsg) :: Maybe IPv6PktInfo ) `shouldNotBe` Nothing
271
- client sock addr = sendTo sock seg addr
285
+ client sock addr = takeMVar serverReady >> sendTo sock seg addr
272
286
273
287
seg = C. pack " This is a test message"
274
288
udpTest6 client server
275
289
276
290
it " receives truncated control messages" $ do
291
+ -- Avoid race condition between the client sending the message and
292
+ -- the server finishing its socket configuration. Otherwise the
293
+ -- message may be received with default socket options!
294
+ serverReady <- newEmptyMVar
295
+
277
296
let server sock = do
278
297
whenSupported RecvIPv4TTL $ setSocketOption sock RecvIPv4TTL 1
279
298
whenSupported RecvIPv4TOS $ setSocketOption sock RecvIPv4TOS 1
280
299
whenSupported RecvIPv4PktInfo $ setSocketOption sock RecvIPv4PktInfo 1
300
+ putMVar serverReady ()
301
+
281
302
(_, _, _, flags) <- recvMsg sock 1024 10 mempty
282
303
flags .&. MSG_CTRUNC `shouldBe` MSG_CTRUNC
283
304
284
- client sock addr = sendTo sock seg addr
305
+ client sock addr = takeMVar serverReady >> sendTo sock seg addr
285
306
286
307
seg = C. pack " This is a test message"
287
308
udpTest client server
0 commit comments