diff options
author | Tom Sydney Kerckhove <syd@cs-syd.eu> | 2018-12-21 12:41:13 +0200 |
---|---|---|
committer | Ben Gamari <ben@well-typed.com> | 2019-01-16 12:05:35 -0500 |
commit | ce2f77d5656e847e8411805906f736a4a0a1242e (patch) | |
tree | 917ada24325a38b864a88dadf39f2c89413366fc | |
parent | 36e3e7472fd138fca21e447cdb17d38525278e81 (diff) | |
download | haskell-ce2f77d5656e847e8411805906f736a4a0a1242e.tar.gz |
hWaitForInput-accurate-socket test
-rw-r--r-- | libraries/base/tests/all.T | 1 | ||||
-rw-r--r-- | libraries/base/tests/hWaitForInput-accurate-socket.hs | 48 | ||||
-rw-r--r-- | libraries/base/tests/hWaitForInput-accurate-socket.stdout | 1 |
3 files changed, 50 insertions, 0 deletions
diff --git a/libraries/base/tests/all.T b/libraries/base/tests/all.T index aaf4aa2789..457d9f424a 100644 --- a/libraries/base/tests/all.T +++ b/libraries/base/tests/all.T @@ -200,6 +200,7 @@ test('T9681', normal, compile_fail, ['']) test('T8089', [exit_code(99), run_timeout_multiplier(0.01)], compile_and_run, ['']) +test('hWaitForInput-accurate-socket', normal, compile_and_run, ['']) test('T8684', expect_broken(8684), compile_and_run, ['']) test('T9826',normal, compile_and_run,['']) test('T9848', diff --git a/libraries/base/tests/hWaitForInput-accurate-socket.hs b/libraries/base/tests/hWaitForInput-accurate-socket.hs new file mode 100644 index 0000000000..ea3580edea --- /dev/null +++ b/libraries/base/tests/hWaitForInput-accurate-socket.hs @@ -0,0 +1,48 @@ +import Control.Concurrent +import Control.Monad +import Foreign.C +import GHC.Clock +import GHC.IO.Device +import GHC.IO.Handle.FD +import System.IO +import System.Posix.IO +import System.Posix.Types +import System.Timeout + +main :: IO () +main = do + socketHandle <- makeTestSocketHandle + let nanoSecondsPerSecond = 1000 * 1000 * 1000 + let milliSecondsPerSecond = 1000 + let timeToSpend = 1 + let timeToSpendNano = timeToSpend * nanoSecondsPerSecond + let timeToSpendMilli = timeToSpend * milliSecondsPerSecond + start <- getMonotonicTimeNSec + b <- hWaitForInput socketHandle timeToSpendMilli + end <- getMonotonicTimeNSec + let timeSpentNano = fromIntegral $ end - start + let delta = timeSpentNano - timeToSpendNano + -- We can never wait for a shorter amount of time than specified + putStrLn $ "delta >= 0: " ++ show (delta >= 0) + +foreign import ccall unsafe "socket" c_socket :: + CInt -> CInt -> CInt -> IO CInt + +makeTestSocketHandle :: IO Handle +makeTestSocketHandle = do + sockNum <- + c_socket + 1 -- PF_LOCAL + 2 -- SOCK_DGRAM + 0 + let fd = fromIntegral sockNum :: Fd + h <- + fdToHandle' + (fromIntegral fd) + (Just GHC.IO.Device.Stream) + True + "testsocket" + ReadMode + True + hSetBuffering h NoBuffering + pure h diff --git a/libraries/base/tests/hWaitForInput-accurate-socket.stdout b/libraries/base/tests/hWaitForInput-accurate-socket.stdout new file mode 100644 index 0000000000..f1e939c51d --- /dev/null +++ b/libraries/base/tests/hWaitForInput-accurate-socket.stdout @@ -0,0 +1 @@ +delta >= 0: True |