module Test.Ganeti.Storage.Drbd.Types (testBlock_Drbd_Types) where
import Test.QuickCheck
import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon
import Text.JSON
import Text.Printf
import Ganeti.JSON
import Ganeti.Storage.Drbd.Types
$(genArbitrary ''ConnState)
$(genArbitrary ''Role)
$(genArbitrary ''DiskState)
$(genArbitrary ''SizeUnit)
$(genArbitrary ''TimeUnit)
natural :: Gen Int
natural = choose (0, maxBound :: Int)
percent :: Gen Double
percent = choose (0 :: Double, 100 :: Double)
wOrderFlag :: Gen Char
wOrderFlag = elements ['b', 'f', 'd', 'n']
prop_DeviceInfo :: Property
prop_DeviceInfo = do
minor <- natural
state <- arbitrary
locRole <- arbitrary
remRole <- arbitrary
locState <- arbitrary
remState <- arbitrary
alg <- choose ('A','C')
ns <- natural
nr <- natural
dw <- natural
dr <- natural
al <- natural
bm <- natural
lc <- natural
pe <- natural
ua <- natural
ap <- natural
ep <- genMaybe natural
wo <- genMaybe wOrderFlag
oos <- genMaybe natural
inst <- genMaybe arbitrary
let obtained =
showJSON $
DeviceInfo minor state (LocalRemote locRole remRole)
(LocalRemote locState remState) alg "r----" perfInd
Nothing
Nothing
Nothing
inst
perfInd =
PerfIndicators ns nr dw dr al bm lc pe ua ap ep wo oos
expected =
makeObj
[ ("minor", showJSON minor)
, ("connectionState", showJSON state)
, ("localRole", showJSON locRole)
, ("remoteRole", showJSON remRole)
, ("localState", showJSON locState)
, ("remoteState", showJSON remState)
, ("replicationProtocol", showJSON alg)
, ("ioFlags", showJSON "r----")
, ("perfIndicators", showJSON perfInd)
, ("instance", maybe JSNull showJSON inst)
]
obtained ==? expected
prop_PerfIndicators :: Property
prop_PerfIndicators = do
ns <- natural
nr <- natural
dw <- natural
dr <- natural
al <- natural
bm <- natural
lc <- natural
pe <- natural
ua <- natural
ap <- natural
ep <- genMaybe natural
wo <- genMaybe wOrderFlag
oos <- genMaybe natural
let expected =
showJSON $
PerfIndicators ns nr dw dr al bm lc pe ua ap ep wo oos
obtained =
optFieldsToObj
[ Just ("networkSend", showJSON ns)
, Just ("networkReceive", showJSON nr)
, Just ("diskWrite", showJSON dw)
, Just ("diskRead", showJSON dr)
, Just ("activityLog", showJSON al)
, Just ("bitMap", showJSON bm)
, Just ("localCount", showJSON lc)
, Just ("pending", showJSON pe)
, Just ("unacknowledged", showJSON ua)
, Just ("applicationPending", showJSON ap)
, optionalJSField "epochs" ep
, optionalJSField "writeOrder" wo
, optionalJSField "outOfSync" oos
]
obtained ==? expected
prop_SyncStatus :: Property
prop_SyncStatus = do
perc <- percent
numer <- natural
denom <- natural
sizeU1 <- arbitrary
h <- choose (0, 23)
m <- choose (0, 59)
s <- choose (0, 59)
sp <- natural
wa <- genMaybe natural
sizeU2 <- arbitrary
timeU <- arbitrary
let obtained = showJSON $
SyncStatus perc numer denom sizeU1 (Time h m s) sp wa sizeU2 timeU
expected = optFieldsToObj
[ Just ("percentage", showJSON perc)
, Just ("progress", showJSON $ show numer ++ "/" ++ show denom)
, Just ("progressUnit", showJSON sizeU1)
, Just ("timeToFinish", showJSON
(printf "%02d:%02d:%02d" h m s :: String))
, Just ("speed", showJSON sp)
, optionalJSField "want" wa
, Just ("speedUnit", showJSON $ show sizeU2 ++ "/" ++ show timeU)
]
obtained ==? expected
testSuite "Block/Drbd/Types"
[ 'prop_DeviceInfo
, 'prop_PerfIndicators
, 'prop_SyncStatus
]