Safe Haskell | Safe-Infered |
---|
Common helper functions and instances for all Ganeti tests.
- maxMem :: Int
- maxDsk :: Int
- maxCpu :: Int
- maxSpindles :: Int
- maxVcpuRatio :: Double
- maxSpindleRatio :: Double
- maxMemoryRatio :: Double
- maxNodes :: Int
- maxOpCodes :: Int
- (==?) :: (Show a, Eq a) => a -> a -> Property
- (/=?) :: (Show a, Eq a) => a -> a -> Property
- failTest :: String -> Property
- passTest :: Property
- stableCover :: Testable prop => Bool -> Int -> String -> prop -> Property
- pythonCmd :: IO String
- runPython :: String -> String -> IO (ExitCode, String, String)
- checkPythonResult :: (ExitCode, String, String) -> IO String
- newtype DNSChar = DNSChar {
- dnsGetChar :: Char
- genPrintableAsciiChar :: Gen Char
- genPrintableAsciiString :: Gen String
- genPrintableAsciiStringNE :: Gen NonEmptyString
- genName :: Gen String
- genFQDN :: Gen String
- genUUID :: Gen String
- genMaybe :: Gen a -> Gen (Maybe a)
- genSublist :: [a] -> Gen [a]
- genMap :: (Ord k, Ord v) => Gen k -> Gen v -> Gen (Map k v)
- newtype TagChar = TagChar {
- tagGetChar :: Char
- tagChar :: String
- genTag :: Gen [TagChar]
- genTags :: Gen [String]
- genFields :: Gen [String]
- genUniquesList :: (Eq a, Arbitrary a, Ord a) => Int -> Gen a -> Gen [a]
- newtype SmallRatio = SmallRatio Double
- genSetHelper :: Ord a => [a] -> Maybe Int -> Gen (Set a)
- genSet :: (Ord a, Bounded a, Enum a) => Maybe Int -> Gen (Set a)
- genListSet :: (Ord a, Bounded a, Enum a) => Maybe Int -> Gen (ListSet a)
- genAndRestArguments :: Gen (Map String JSValue)
- genIPv4 :: Gen String
- genIPv4Address :: Gen IPv4Address
- genIPv4AddrRange :: Gen String
- genIPv4Network :: Gen IPv4Network
- netmask2NumHosts :: Word8 -> Int
- genIp6Addr :: Gen String
- genIp6Net :: Gen String
- genOpCodesTagName :: TagKind -> Gen (Maybe String)
- genLuxiTagName :: TagKind -> Gen String
- testSerialisation :: (Eq a, Show a, JSON a) => a -> Property
- testArraySerialisation :: (Eq a, Show a, ArrayObject a) => a -> Property
- testDeserialisationFail :: (Eq a, Show a, JSON a) => a -> JSValue -> Property
- resultProp :: Show a => GenericResult a b -> PropertyM IO b
- getSourceDir :: IO FilePath
- testDataFilename :: String -> String -> IO FilePath
- readTestData :: String -> IO String
- genSample :: Gen a -> IO a
- testParser :: (Show a, Eq a) => Parser a -> String -> a -> Assertion
- genPropParser :: (Show a, Eq a) => Parser a -> String -> a -> Property
- genNonNegative :: Gen Int
- relativeError :: Double -> Double -> Double
- getTempFileName :: String -> IO FilePath
- listOfUniqueBy :: Ord b => Gen a -> (a -> b) -> [a] -> Gen [a]
- counterexample :: Testable prop => String -> prop -> Property
Arbitrary orphan instances
Constants
maxSpindles :: IntSource
Max spindles (1024, somewhat random value).
maxVcpuRatio :: DoubleSource
Max vcpu ratio (random value).
maxSpindleRatio :: DoubleSource
Max spindle ratio (random value).
maxMemoryRatio :: DoubleSource
Max memory ratio (random value).
Max nodes, used just to limit arbitrary instances for smaller opcode definitions (e.g. list of nodes in OpTestDelay).
maxOpCodes :: IntSource
Max opcodes or jobs in a submit job and submit many jobs.
Helper functions
(==?) :: (Show a, Eq a) => a -> a -> PropertySource
Checks for equality with proper annotation. The first argument is the computed value, the second one the expected value.
(/=?) :: (Show a, Eq a) => a -> a -> PropertySource
Checks for inequality with proper annotation. The first argument is the computed value, the second one the expected (not equal) value.
stableCover :: Testable prop => Bool -> Int -> String -> prop -> PropertySource
A stable version of QuickCheck's cover
. In its current implementation,
cover will not detect insufficient coverage if the actual coverage in the
sample is 0. Work around this by lifting the probability to at least
10 percent.
The underlying issue is tracked at
https:github.comnick8325quickcheckissues26
Return the python binary to use. If the PYTHON environment variable is defined, use its value, otherwise use just "python".
runPython :: String -> String -> IO (ExitCode, String, String)Source
Run Python with an expression, returning the exit code, standard output and error.
checkPythonResult :: (ExitCode, String, String) -> IO StringSource
Check python exit code, and fail via HUnit assertions if non-zero. Otherwise, return the standard output.
Arbitrary instances
Generators
genPrintableAsciiChar :: Gen CharSource
Generates printable ASCII characters (from ' ' to '~').
genPrintableAsciiString :: Gen StringSource
Generates a short string (0 <= n <= 40 chars) from printable ASCII.
genPrintableAsciiStringNE :: Gen NonEmptyStringSource
Generates a short string (1 <= n <= 40 chars) from printable ASCII.
Generates a UUID-like string.
Only to be used for QuickCheck testing. For obtaining actual UUIDs use the newUUID function in Ganeti.Utils
genSublist :: [a] -> Gen [a]Source
Generates a sublist of a given list, keeping the ordering. The generated elements are always a subset of the list.
In order to better support corner cases, the size of the sublist is chosen to have the uniform distribution.
genMap :: (Ord k, Ord v) => Gen k -> Gen v -> Gen (Map k v)Source
Generates a map given generators for keys and values.
genFields :: Gen [String]Source
Generates a fields list. This uses the same character set as a DNS name (just for simplicity).
genUniquesList :: (Eq a, Arbitrary a, Ord a) => Int -> Gen a -> Gen [a]Source
Generates a list of a given size with non-duplicate elements.
genSetHelper :: Ord a => [a] -> Maybe Int -> Gen (Set a)Source
Helper for genSet
, declared separately due to type constraints.
genSet :: (Ord a, Bounded a, Enum a) => Maybe Int -> Gen (Set a)Source
Generates a Set
of arbitrary elements.
genListSet :: (Ord a, Bounded a, Enum a) => Maybe Int -> Gen (ListSet a)Source
Generates a Set
of arbitrary elements wrapped in a ListSet
genAndRestArguments :: Gen (Map String JSValue)Source
Generate an arbitrary element of and AndRestArguments field.
genIPv4Address :: Gen IPv4AddressSource
genIPv4AddrRange :: Gen StringSource
genIPv4Network :: Gen IPv4NetworkSource
netmask2NumHosts :: Word8 -> IntSource
Helper function to compute the number of hosts in a network given the netmask. (For IPv4 only.)
genIp6Addr :: Gen StringSource
Generates an arbitrary IPv6 network address in textual form. The generated address is not simpflified, e. g. an address like 2607:f0d0:1002:0051:0000:0000:0000:0004 does not become 2607:f0d0:1002:51::4
genOpCodesTagName :: TagKind -> Gen (Maybe String)Source
Generates a valid, arbitrary tag name with respect to the given
TagKind
for opcodes.
genLuxiTagName :: TagKind -> Gen StringSource
Generates a valid, arbitrary tag name with respect to the given
TagKind
for Luxi.
Helper functions
testSerialisation :: (Eq a, Show a, JSON a) => a -> PropertySource
Checks for serialisation idempotence.
testArraySerialisation :: (Eq a, Show a, ArrayObject a) => a -> PropertySource
Checks for array serialisation idempotence.
testDeserialisationFail :: (Eq a, Show a, JSON a) => a -> JSValue -> PropertySource
Checks if the deserializer doesn't accept forbidden values. The first argument is ignored, it just enforces the correct type.
resultProp :: Show a => GenericResult a b -> PropertyM IO bSource
Result to PropertyM IO.
getSourceDir :: IO FilePathSource
testDataFilename :: String -> String -> IO FilePathSource
readTestData :: String -> IO StringSource
Returns the content of the specified haskell test data file.
genSample :: Gen a -> IO aSource
Generate arbitrary values in the IO monad. This is a simple
wrapper over sample'
.
testParser :: (Show a, Eq a) => Parser a -> String -> a -> AssertionSource
Function for testing whether a file is parsed correctly.
genPropParser :: (Show a, Eq a) => Parser a -> String -> a -> PropertySource
Generate a property test for parsers.
genNonNegative :: Gen IntSource
Generate an arbitrary non negative integer number
relativeError :: Double -> Double -> DoubleSource
Computes the relative error of two Double
numbers.
This is the "relative error" algorithm in http://randomascii.wordpress.com/2012/02/25/ comparing-floating-point-numbers-2012-edition (URL split due to too long line).
getTempFileName :: String -> IO FilePathSource
Helper to a get a temporary file name.
listOfUniqueBy :: Ord b => Gen a -> (a -> b) -> [a] -> Gen [a]Source
listOfUniqueBy gen keyFun forbidden
: Generates a list of random length,
where all generated elements will be unique by the keying function
keyFun
. They will also be distinct from all elements in forbidden
by
the keying function.
As for listOf
, the maximum output length depends on the size parameter.
Example:
listOfUniqueBy (arbitrary :: Gen String) (length) ["hey"] -- Generates a list of strings of different length, but not of length 3.
The passed gen
should not make key collisions too likely, since the
implementation uses suchThat
, looping until enough unique elements
have been generated. If the gen
makes collisions likely, this function
will consequently be slow, or not terminate if it is not possible to
generate enough elements, like in:
listOfUniqueBy (arbitrary :: Gen Int) (`mod` 2) [] -- May not terminate depending on the size parameter of the Gen, -- since there are only 2 unique keys (0 and 1).
counterexample :: Testable prop => String -> prop -> PropertySource