aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/fdReadBuf001.hs
diff options
context:
space:
mode:
authorGravatar Simon Marlow <marlowsd@gmail.com>2009-05-29 12:56:09 +0000
committerGravatar Simon Marlow <marlowsd@gmail.com>2009-05-29 12:56:09 +0000
commitdafb7b1cbd37403e1dcf02b6b47fff392aa2dc72 (patch)
treee372e4cd0fcf9021fc5f1d6e8e7823b4155a8571 /tests/fdReadBuf001.hs
parenta67dfb0a448100fefea33e58bbf77eaafdeb0c05 (diff)
add test for fdReadBuf/fdWriteBuf
Diffstat (limited to 'tests/fdReadBuf001.hs')
-rw-r--r--tests/fdReadBuf001.hs27
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/fdReadBuf001.hs b/tests/fdReadBuf001.hs
new file mode 100644
index 0000000..4c121a2
--- /dev/null
+++ b/tests/fdReadBuf001.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE NoMonomorphismRestriction #-}
+import System.Posix
+import Control.Monad
+import Foreign
+import Control.Concurrent
+import Data.Char
+import System.Exit
+
+size = 10000
+block = 512
+
+main = do
+ (rd,wr) <- createPipe
+ let bytes = take size (map (fromIntegral.ord) (cycle ['a'..'z']))
+ allocaBytes size $ \p -> do
+ pokeArray p bytes
+ forkIO $ do r <- fdWriteBuf wr p (fromIntegral size)
+ when (fromIntegral r /= size) $ error "fdWriteBuf failed"
+ allocaBytes block $ \p -> do
+ let loop text = do
+ r <- fdReadBuf rd p block
+ let (chunk,rest) = splitAt (fromIntegral r) text
+ chars <- peekArray (fromIntegral r) p
+ when (chars /= chunk) $ error "mismatch"
+ when (null rest) $ exitWith ExitSuccess
+ loop rest
+ loop bytes