Statistics
| Branch: | Tag: | Revision:

root / htest / Test / Ganeti / Network.hs @ da1dcce1

History | View | Annotate | Download (4.5 kB)

1 76a0266e Helga Velroyen
{-# LANGUAGE TemplateHaskell, TypeSynonymInstances, FlexibleInstances #-}
2 76a0266e Helga Velroyen
{-# OPTIONS_GHC -fno-warn-orphans #-}
3 76a0266e Helga Velroyen
4 76a0266e Helga Velroyen
module Test.Ganeti.Network
5 76a0266e Helga Velroyen
  ( testNetwork
6 0b288282 Helga Velroyen
  , genBitStringMaxLen
7 0b288282 Helga Velroyen
  , genNetworkType
8 76a0266e Helga Velroyen
  ) where
9 76a0266e Helga Velroyen
10 76a0266e Helga Velroyen
import Test.QuickCheck
11 76a0266e Helga Velroyen
12 76a0266e Helga Velroyen
import Ganeti.Network as Network
13 76a0266e Helga Velroyen
import Ganeti.Objects as Objects
14 76a0266e Helga Velroyen
15 0b288282 Helga Velroyen
import Test.Ganeti.Objects
16 0b288282 Helga Velroyen
  ( genBitStringMaxLen
17 0b288282 Helga Velroyen
  , genNetworkType
18 0b288282 Helga Velroyen
  , genValidNetwork )
19 76a0266e Helga Velroyen
import Test.Ganeti.TestHelper
20 76a0266e Helga Velroyen
import Test.Ganeti.TestCommon
21 76a0266e Helga Velroyen
22 76a0266e Helga Velroyen
import qualified Data.Vector.Unboxed as V
23 76a0266e Helga Velroyen
24 76a0266e Helga Velroyen
-- * Generators and arbitrary instances
25 76a0266e Helga Velroyen
26 76a0266e Helga Velroyen
-- | Generates address pools. The size of the network is intentionally
27 76a0266e Helga Velroyen
-- decoupled from the size of the bit vectors, to avoid slowing down
28 76a0266e Helga Velroyen
-- the tests by generating unnecessary bit strings.
29 76a0266e Helga Velroyen
genAddressPool :: Int -> Gen AddressPool
30 76a0266e Helga Velroyen
genAddressPool maxLenBitVec = do
31 0b288282 Helga Velroyen
  -- Generating networks with netmask of minimum /24 to avoid too long
32 0b288282 Helga Velroyen
  -- bit strings being generated.
33 0b288282 Helga Velroyen
  net <- genValidNetwork
34 76a0266e Helga Velroyen
  lenBitVec <- choose (0, maxLenBitVec)
35 76a0266e Helga Velroyen
  res <- genBitVector lenBitVec
36 76a0266e Helga Velroyen
  ext_res <- genBitVector lenBitVec
37 76a0266e Helga Velroyen
  return AddressPool { network = net
38 76a0266e Helga Velroyen
                     , reservations = res
39 76a0266e Helga Velroyen
                     , extReservations = ext_res }
40 76a0266e Helga Velroyen
41 0b288282 Helga Velroyen
-- | Generates an arbitrary bit vector of the given length.
42 0b288282 Helga Velroyen
genBitVector :: Int -> Gen (V.Vector Bool)
43 0b288282 Helga Velroyen
genBitVector len = do
44 0b288282 Helga Velroyen
  boolList <- vector len::Gen [Bool]
45 0b288282 Helga Velroyen
  return $ V.fromList boolList
46 0b288282 Helga Velroyen
47 76a0266e Helga Velroyen
instance Arbitrary AddressPool where
48 76a0266e Helga Velroyen
  arbitrary = genAddressPool ((2::Int)^(8::Int))
49 76a0266e Helga Velroyen
50 76a0266e Helga Velroyen
-- * Test cases
51 76a0266e Helga Velroyen
52 76a0266e Helga Velroyen
-- | Check the mapping of bit strings to bit vectors
53 76a0266e Helga Velroyen
prop_bitStringToBitVector :: Property
54 76a0266e Helga Velroyen
prop_bitStringToBitVector =
55 76a0266e Helga Velroyen
  forAll (genBitStringMaxLen 256) $ \bs ->
56 76a0266e Helga Velroyen
  let bitList = V.toList $ Network.bitStringToBitVector bs
57 76a0266e Helga Velroyen
      bitCharList = Prelude.zip bitList bs
58 76a0266e Helga Velroyen
  in  Prelude.all checkBit bitCharList
59 76a0266e Helga Velroyen
60 76a0266e Helga Velroyen
-- | Check whether an element of a bit vector is consistent with an element
61 76a0266e Helga Velroyen
-- of a bit string (containing '0' and '1' characters).
62 76a0266e Helga Velroyen
checkBit :: (Bool, Char) -> Bool
63 76a0266e Helga Velroyen
checkBit (False, '0') = True
64 76a0266e Helga Velroyen
checkBit (True, '1') = True
65 76a0266e Helga Velroyen
checkBit _ = False
66 76a0266e Helga Velroyen
67 76a0266e Helga Velroyen
-- | Check creation of an address pool when a network is given.
68 76a0266e Helga Velroyen
prop_createAddressPool :: Objects.Network -> Property
69 76a0266e Helga Velroyen
prop_createAddressPool n =
70 76a0266e Helga Velroyen
  let valid = networkIsValid n
71 76a0266e Helga Velroyen
  in  case createAddressPool n of
72 76a0266e Helga Velroyen
        Just _ -> True ==? valid
73 76a0266e Helga Velroyen
        Nothing -> False ==? valid
74 76a0266e Helga Velroyen
75 76a0266e Helga Velroyen
-- | Check that the address pool's properties are calculated correctly.
76 76a0266e Helga Velroyen
prop_addressPoolProperties :: AddressPool -> Property
77 76a0266e Helga Velroyen
prop_addressPoolProperties a =
78 76a0266e Helga Velroyen
  conjoin
79 76a0266e Helga Velroyen
    [ printTestCase
80 76a0266e Helga Velroyen
        ("Not all reservations are included in 'allReservations' of " ++
81 76a0266e Helga Velroyen
         "address pool:" ++ show a) (allReservationsSubsumesInternal a)
82 76a0266e Helga Velroyen
    , printTestCase
83 76a0266e Helga Velroyen
        ("Not all external reservations are covered by 'allReservations' " ++
84 76a0266e Helga Velroyen
         "of address pool: " ++ show a)
85 76a0266e Helga Velroyen
        (allReservationsSubsumesExternal a)
86 76a0266e Helga Velroyen
    , printTestCase
87 76a0266e Helga Velroyen
        ("The counts of free and reserved addresses do not add up for " ++
88 76a0266e Helga Velroyen
         "address pool: " ++ show a)
89 76a0266e Helga Velroyen
        (checkCounts a)
90 76a0266e Helga Velroyen
    , printTestCase
91 76a0266e Helga Velroyen
        ("'isFull' wrongly classified the status of the address pool: " ++
92 76a0266e Helga Velroyen
         show a) (checkIsFull a)
93 76a0266e Helga Velroyen
    , printTestCase
94 76a0266e Helga Velroyen
        ("Network map is inconsistent with reservations of address pool: " ++
95 76a0266e Helga Velroyen
         show a) (checkGetMap a)
96 76a0266e Helga Velroyen
    ]
97 76a0266e Helga Velroyen
98 76a0266e Helga Velroyen
-- | Check that all internally reserved ips are included in 'allReservations'.
99 76a0266e Helga Velroyen
allReservationsSubsumesInternal :: AddressPool -> Bool
100 76a0266e Helga Velroyen
allReservationsSubsumesInternal a =
101 76a0266e Helga Velroyen
  bitVectorSubsumes (allReservations a) (reservations a)
102 76a0266e Helga Velroyen
103 76a0266e Helga Velroyen
-- | Check that all externally reserved ips are included in 'allReservations'.
104 76a0266e Helga Velroyen
allReservationsSubsumesExternal :: AddressPool -> Bool
105 76a0266e Helga Velroyen
allReservationsSubsumesExternal a =
106 76a0266e Helga Velroyen
  bitVectorSubsumes (allReservations a) (extReservations a)
107 76a0266e Helga Velroyen
108 76a0266e Helga Velroyen
-- | Checks if one bit vector subsumes the other one.
109 76a0266e Helga Velroyen
bitVectorSubsumes :: V.Vector Bool -> V.Vector Bool -> Bool
110 76a0266e Helga Velroyen
bitVectorSubsumes v1 v2 = V.and $
111 76a0266e Helga Velroyen
                          V.zipWith (\a b -> not b || a) v1 v2
112 76a0266e Helga Velroyen
113 76a0266e Helga Velroyen
-- | Check that the counts of free and reserved ips add up.
114 76a0266e Helga Velroyen
checkCounts :: AddressPool -> Bool
115 76a0266e Helga Velroyen
checkCounts a =
116 76a0266e Helga Velroyen
  let res = reservations a
117 76a0266e Helga Velroyen
  in  V.length res == getFreeCount a + getReservedCount a
118 76a0266e Helga Velroyen
119 76a0266e Helga Velroyen
-- | Check that the detection of a full network works correctly.
120 76a0266e Helga Velroyen
checkIsFull :: AddressPool -> Bool
121 76a0266e Helga Velroyen
checkIsFull a = isFull a == V.notElem False (allReservations a)
122 76a0266e Helga Velroyen
123 76a0266e Helga Velroyen
-- | Check that the map representation of the network corresponds to the
124 76a0266e Helga Velroyen
-- network's reservations.
125 76a0266e Helga Velroyen
checkGetMap :: AddressPool -> Bool
126 76a0266e Helga Velroyen
checkGetMap a =
127 76a0266e Helga Velroyen
  allReservations a == V.fromList (Prelude.map (== 'X') (getMap a))
128 76a0266e Helga Velroyen
129 76a0266e Helga Velroyen
testSuite "Network"
130 76a0266e Helga Velroyen
  [ 'prop_bitStringToBitVector
131 76a0266e Helga Velroyen
  , 'prop_createAddressPool
132 76a0266e Helga Velroyen
  , 'prop_addressPoolProperties
133 76a0266e Helga Velroyen
  ]