packages feed

pthread-0.1.2: tests/System/Posix/ThreadSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}

module System.Posix.ThreadSpec (spec) where

import Control.Monad (forM_, replicateM, replicateM_)
import Foreign.Ptr (Ptr)
import Foreign.Marshal.Alloc (alloca)
import qualified System.Posix.Thread as Posix
import Test.Hspec

spec :: Spec
spec = do
    describe "create" $ do
      it "creates 1 threads successfully" $ do
        tid <- Posix.create_ (return ())
        Posix.detach tid
      it "creates 1000 threads successfully" $ do
        replicateM_ 1000 $ do
          tid <- Posix.create_ (return ())
          Posix.detach tid
    describe "join" $ do
      it "Joins 1000 threads successfully" $ do
        alloca $ \(ptr :: Ptr Int) -> do
          tids <- replicateM 1000 $ Posix.create (return ptr)
          forM_ tids $ \tid -> Posix.join tid `shouldReturn` ptr
    describe "exit" $ do
      it "Exits 1000 threads successfully" $ do
        replicateM_ 1000 $ do
          tid <- Posix.create_ Posix.exit_
          Posix.detach tid