module Main where
import Control.Concurrent
import Control.Exception
import Control.Monad
import Control.Monad.Trans
import System.IO
import System.Posix.IO
import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit
import Control.Monad.BinaryProtocol
makePipe :: IO (Handle,Handle)
makePipe = do
(read_fd, write_fd) <- createPipe
read_handle <- fdToHandle read_fd
write_handle <- fdToHandle write_fd
return (read_handle, write_handle)
makeSendTest value = do
(read_handle,write_handle) <- makePipe
result <- runProtocol ( do
send value
flush
receive
) read_handle write_handle
assertEqual "Was the correct value received?" value result
test_send_unit = makeSendTest ()
test_send_number = makeSendTest (3 :: Int)
test_send_list_of_numbers = makeSendTest [(3 :: Int),4,5,6]
makeExchangeTest correct_result protocol1 protocol2 = do
result_mvar <- newEmptyMVar
(read_handle_1,write_handle_2) <- makePipe
(read_handle_2,write_handle_1) <- makePipe
forkIO $ runProtocol (protocol1 result_mvar) read_handle_1 write_handle_1
forkIO $ runProtocol (protocol2 result_mvar) read_handle_2 write_handle_2
result <- readMVar result_mvar
assertEqual "Was the correct result computed?" correct_result result
test_addition = makeExchangeTest (3 :: Int)
(\result_mvar -> do
send (1 :: Int)
flush
receive >>= liftIO . putMVar result_mvar
)
(\_ -> do
a <- receive
send (a + (2 :: Int))
)
tests =
[ testGroup "unidirectional communications"
[ testCase "send unit" test_send_unit
, testCase "send number" test_send_number
, testCase "send list of numbers" test_send_list_of_numbers
]
, testGroup "bidirectional communications"
[ testCase "addition" test_addition
]
]
main = defaultMain tests