root / test / hs / Test / Ganeti / Network.hs @ 93f1e606
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 | ] |