Revision 91c1a265 test/hs/Test/Ganeti/Query/Query.hs
b/test/hs/Test/Ganeti/Query/Query.hs | ||
---|---|---|
1 |
{-# LANGUAGE TemplateHaskell #-} |
|
1 |
{-# LANGUAGE TemplateHaskell, BangPatterns #-}
|
|
2 | 2 |
{-# OPTIONS_GHC -fno-warn-orphans #-} |
3 | 3 |
|
4 | 4 |
{-| Unittests for ganeti-htools. |
... | ... | |
36 | 36 |
import Data.List |
37 | 37 |
import qualified Data.Map as Map |
38 | 38 |
import Data.Maybe |
39 |
import qualified Data.Set as Set |
|
39 | 40 |
import Text.JSON (JSValue(..), showJSON) |
40 | 41 |
|
41 | 42 |
import Test.Ganeti.TestHelper |
... | ... | |
44 | 45 |
|
45 | 46 |
import Ganeti.BasicTypes |
46 | 47 |
import Ganeti.Errors |
48 |
import Ganeti.JSON |
|
49 |
import Ganeti.Objects |
|
47 | 50 |
import Ganeti.Query.Filter |
48 | 51 |
import qualified Ganeti.Query.Group as Group |
49 | 52 |
import Ganeti.Query.Language |
50 | 53 |
import qualified Ganeti.Query.Node as Node |
51 | 54 |
import Ganeti.Query.Query |
52 | 55 |
import qualified Ganeti.Query.Job as Job |
56 |
import Ganeti.Utils (sepSplit) |
|
53 | 57 |
|
54 | 58 |
{-# ANN module "HLint: ignore Use camelCase" #-} |
55 | 59 |
|
... | ... | |
163 | 167 |
(sortBy field_sort . map (\(f, _, _) -> f) $ Map.elems Node.fieldsMap) |
164 | 168 |
(sortBy field_sort fdefs) |
165 | 169 |
|
170 |
-- | Check if cluster node names are unique (first elems). |
|
171 |
areNodeNamesSane :: ConfigData -> Bool |
|
172 |
areNodeNamesSane cfg = |
|
173 |
let fqdns = map nodeName . Map.elems . fromContainer $ configNodes cfg |
|
174 |
names = map (head . sepSplit '.') fqdns |
|
175 |
in length names == length (nub names) |
|
176 |
|
|
177 |
-- | Check that the nodes reported by a name filter are sane. |
|
178 |
prop_queryNode_filter :: Property |
|
179 |
prop_queryNode_filter = |
|
180 |
forAll (choose (1, maxNodes)) $ \nodes -> |
|
181 |
forAll (genEmptyCluster nodes `suchThat` |
|
182 |
areNodeNamesSane) $ \cluster -> monadicIO $ do |
|
183 |
let node_list = map nodeName . Map.elems . fromContainer $ |
|
184 |
configNodes cluster |
|
185 |
count <- pick $ choose (1, nodes) |
|
186 |
fqdn_set <- pick . genSetHelper node_list $ Just count |
|
187 |
let fqdns = Set.elems fqdn_set |
|
188 |
names = map (head . sepSplit '.') fqdns |
|
189 |
flt = makeSimpleFilter "name" $ map Left names |
|
190 |
QueryResult _ fdata <- |
|
191 |
run (query cluster False (Query (ItemTypeOpCode QRNode) |
|
192 |
["name"] flt)) >>= resultProp |
|
193 |
stop $ conjoin |
|
194 |
[ printTestCase "Invalid node names" $ |
|
195 |
map (map rentryValue) fdata ==? map (\f -> [Just (showJSON f)]) fqdns |
|
196 |
] |
|
197 |
|
|
166 | 198 |
-- ** Group queries |
167 | 199 |
|
168 | 200 |
prop_queryGroup_noUnknown :: Property |
... | ... | |
328 | 360 |
[ 'prop_queryNode_noUnknown |
329 | 361 |
, 'prop_queryNode_Unknown |
330 | 362 |
, 'prop_queryNode_types |
363 |
, 'prop_queryNode_filter |
|
331 | 364 |
, 'case_queryNode_allfields |
332 | 365 |
, 'prop_queryGroup_noUnknown |
333 | 366 |
, 'prop_queryGroup_Unknown |
Also available in: Unified diff