{-# 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" [ ]