hs-mesos-0.20.0.2: test/Main.hs
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main where
import Control.Applicative
import Control.Monad.Managed
import qualified Data.ByteString as ByteString
import Data.IORef
import Foreign.C.Types
import System.Mesos.Internal
import System.Mesos.Raw.Attribute
import System.Mesos.Raw.Environment
import System.Mesos.Raw.Parameter
import System.Mesos.Raw.Parameters
import System.Mesos.Scheduler
import System.Mesos.Types
import Test.Tasty
import qualified Test.Tasty.HUnit as Unit
import Test.Tasty.QuickCheck
import Test.QuickCheck
import Test.QuickCheck.Arbitrary
import Test.QuickCheck.Monadic
markCalled r = modifyIORef r (+1)
beforeAndAfter :: (Show a, CPPValue a) => a -> IO a
beforeAndAfter x = do
print x
x' <- with (cppValue x >>= unmarshal) return
print x'
return x'
main :: IO ()
main = defaultMain $ testGroup "Mesos" [testIDs, executorTests, schedulerTests]
instance Arbitrary CUInt where
arbitrary = CUInt <$> arbitrary
instance Arbitrary CULong where
arbitrary = CULong <$> arbitrary
instance Arbitrary ByteString.ByteString where
arbitrary = ByteString.pack <$> arbitrary
instance CoArbitrary ByteString.ByteString where
coarbitrary = coarbitrary . ByteString.unpack
deriving instance Arbitrary FrameworkID
deriving instance Arbitrary OfferID
deriving instance Arbitrary SlaveID
deriving instance Arbitrary TaskID
deriving instance Arbitrary ExecutorID
deriving instance Arbitrary ContainerID
instance Arbitrary FrameworkInfo where
arbitrary = FrameworkInfo
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary CommandURI where
arbitrary = CommandURI <$> arbitrary <*> arbitrary <*> arbitrary
instance Arbitrary CommandValue where
arbitrary = oneof
[ ShellCommand <$> arbitrary
, RawCommand <$> arbitrary <*> arbitrary
]
instance Arbitrary CommandInfo where
arbitrary = CommandInfo <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
instance Arbitrary ExecutorInfo where
arbitrary = ExecutorInfo
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary MasterInfo where
arbitrary = MasterInfo
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary SlaveInfo where
arbitrary = SlaveInfo
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary Value where
arbitrary = oneof
[ Scalar <$> arbitrary
, Ranges <$> listOf range
, Set <$> listOf arbitrary
, Text <$> arbitrary
]
where range = arbitrary >>= \l -> arbitrary >>= \r -> return (l, r)
instance Arbitrary Attribute where
arbitrary = Attribute <$> arbitrary <*> arbitrary
instance Arbitrary Resource where
arbitrary = Resource <$> arbitrary <*> arbitrary <*> arbitrary
instance Arbitrary PerformanceStatistics where
arbitrary = PerformanceStatistics
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary ResourceStatistics where
arbitrary = ResourceStatistics
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary ResourceUsage where
arbitrary = ResourceUsage
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary Request where
arbitrary = Request
<$> arbitrary
<*> arbitrary
instance Arbitrary Offer where
arbitrary = Offer
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary TaskExecutionInfo where
arbitrary = oneof
[ TaskCommand <$> arbitrary
, TaskExecutor <$> arbitrary
]
instance Arbitrary Mode where
arbitrary = oneof [pure ReadWrite, pure ReadOnly]
instance Arbitrary Volume where
arbitrary = Volume <$> arbitrary <*> arbitrary <*> arbitrary
instance Arbitrary ContainerType where
arbitrary = Docker <$> arbitrary
instance Arbitrary ContainerInfo where
arbitrary = ContainerInfo <$> arbitrary <*> arbitrary
instance Arbitrary HealthCheckStrategy where
arbitrary = oneof
[ CommandCheck <$> arbitrary
, HTTPCheck <$> arbitrary <*> arbitrary <*> arbitrary
]
instance Arbitrary HealthCheck where
arbitrary = HealthCheck
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary TaskInfo where
arbitrary = TaskInfo
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary TaskState where
arbitrary = elements [Staging, Starting, TaskRunning, Finished, Failed, Killed, Lost]
instance Arbitrary TaskStatus where
arbitrary = TaskStatus
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary Filters where
arbitrary = Filters <$> arbitrary
instance Arbitrary Environment where
arbitrary = Environment <$> arbitrary
instance Arbitrary Parameter where
arbitrary = Parameter <$> arbitrary <*> arbitrary
instance Arbitrary Parameters where
arbitrary = Parameters <$> arbitrary
instance Arbitrary Credential where
arbitrary = Credential <$> arbitrary <*> arbitrary
idempotentMarshalling :: (Show a, Eq a, CPPValue a) => a -> IO a
idempotentMarshalling x = with (cppValue x >>= unmarshal) return
prop_idempotentMarshalling :: (Show a, Eq a, CPPValue a) => Gen a -> Property
prop_idempotentMarshalling g = monadicIO $ forAllM g $ \x -> do
res <- Test.QuickCheck.Monadic.run $ idempotentMarshalling x
-- Test.QuickCheck.Monadic.run $ print x
if equalExceptDefaults x res
then assert True
else do
Test.QuickCheck.Monadic.run $ do
putStrLn "Original"
print x
putStrLn "Unmarshalled"
print res
assert False
qcIM :: (Show a, Eq a, CPPValue a) => String -> Gen a -> TestTree
qcIM n = testProperty n . prop_idempotentMarshalling
testIDs = testGroup "Marshalling"
[ qcIM "ExecutorInfo" (arbitrary :: Gen ExecutorInfo)
, qcIM "TaskInfo" (arbitrary :: Gen TaskInfo)
, qcIM "Volume" (arbitrary :: Gen Volume)
, qcIM "HealthCheck" (arbitrary :: Gen HealthCheck)
, qcIM "ContainerInfo" (arbitrary :: Gen ContainerInfo)
, qcIM "Value" (arbitrary :: Gen Value)
, qcIM "FrameworkInfo" (arbitrary :: Gen FrameworkID)
, qcIM "OfferID" (arbitrary :: Gen OfferID)
, qcIM "SlaveID" (arbitrary :: Gen SlaveID)
, qcIM "TaskID" (arbitrary :: Gen TaskID)
, qcIM "ExecutorID" (arbitrary :: Gen ExecutorID)
, qcIM "ContainerID" (arbitrary :: Gen ContainerID)
, qcIM "Filters" (arbitrary :: Gen Filters)
, qcIM "Environment" (arbitrary :: Gen Environment)
, qcIM "FrameworkInfo" (arbitrary :: Gen FrameworkInfo)
, qcIM "CommandURI" (arbitrary :: Gen CommandURI)
, qcIM "Credential" (arbitrary :: Gen Credential)
, qcIM "TaskStatus" (arbitrary :: Gen TaskStatus)
, qcIM "ResourceUsage" (arbitrary :: Gen ResourceUsage)
, qcIM "ResourceStatistics" (arbitrary :: Gen ResourceStatistics)
, qcIM "Parameters" (arbitrary :: Gen Parameters)
, qcIM "Attribute" (arbitrary :: Gen Attribute)
, qcIM "Resource" (arbitrary :: Gen Resource)
, qcIM "CommandInfo" (arbitrary :: Gen CommandInfo)
, qcIM "MasterInfo" (arbitrary :: Gen MasterInfo)
, qcIM "Request" (arbitrary :: Gen Request)
, qcIM "Offer" (arbitrary :: Gen Offer)
, qcIM "SlaveInfo" (arbitrary :: Gen SlaveInfo)
]
executorTests = testGroup "Executor"
[
]
schedulerTests = testGroup "Scheduler"
[
]