packages feed

uniform-io-1.0.0.0: test/Targets.hs

{-# LANGUAGE OverloadedStrings #-}

module Targets (tests) where

import Distribution.TestSuite
import Base (simpleTest)
import Control.Concurrent(forkIO) 
import System.IO.Uniform
import System.IO.Uniform.Network
import System.IO.Uniform.File
--import System.IO.Uniform.Std
import System.IO.Uniform.ByteString
import System.Timeout (timeout)
import qualified Data.ByteString.Char8 as C8
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS

tests :: IO [Test]
tests = return [
  simpleTest "network" testNetwork,
  simpleTest "file" testFile,
  simpleTest "network TLS" testTls,
  simpleTest "byte string" testBS
  ]

testNetwork :: IO Progress
testNetwork = do
  recv <- bindPort 8888
  forkIO $ do
    s <- accept recv
    l <- uRead s 100
    uPut s l
    uClose s
    return ()
  r' <- timeout 1000000 $ do
    s <- connectToHost "127.0.0.1" 8888
    let l = "abcdef\n"
    uPut s l
    l' <- uRead s 100
    uClose s
    if l == l'
      then return . Finished $ Pass
      else return . Finished . Fail . C8.unpack $ l'
  closePort recv
  case r' of
    Just r -> return r
    Nothing -> return . Finished . Fail $ "Execution blocked"

testFile :: IO Progress
testFile = do
  let file = "test/testFile"
  s <- openFile file
  let l = "abcde\n"
  uPut s l
  uClose s
  s' <- openFile file
  l' <- uRead s' 100
  uClose s'
  if l == l'
    then return . Finished $ Pass
    else return . Finished . Fail . C8.unpack $ l'

testTls :: IO Progress
testTls = do
  recv <- bindPort 8888
  let set = TlsSettings "test/key.pem" "test/cert.pem" "test/dh.pem"
  forkIO $ do
    s' <- accept recv
    s <- startTls set s'
    l <- uRead s 100
    uPut s l
    uClose s
    return ()
  r' <- timeout 1000000 $ do
    s' <- connectToHost "127.0.0.1" 8888
    s <- startTls set s'
    let l = "abcdef\n"
    uPut s l
    l' <- uRead s 100
    uClose s
    if l == l'
      then return . Finished $ Pass
      else return . Finished . Fail . C8.unpack $ l'
  closePort recv
  case r' of
    Just r -> return r
    Nothing -> return . Finished . Fail $ "Execution blocked"

testBS :: IO Progress
testBS = do
  let dt = "Some data to test ByteString"
  (len, echo) <- withByteStringIO' dt (
    \io -> let
      count = countAndEcho io :: Int -> ByteString -> IO Int
      in mapOverInput io 2 count 0
    ) :: IO (Int, ByteString)
  if dt /= echo || BS.length dt /= len
    then return . Finished . Fail $ "Failure on ByteStringIO test"
    else return . Finished $ Pass
  where
    countAndEcho :: UniformIO io => io -> Int -> ByteString -> IO Int
    countAndEcho io initial dt = do
      uPut io dt
      return $ initial + BS.length dt