Statistics
| Branch: | Tag: | Revision:

root / test / hs / Test / Ganeti / Network.hs @ 14933c17

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