Revision e8a25d62 htools/Ganeti/HTools/QC.hs

b/htools/Ganeti/HTools/QC.hs
49 49
  , testLUXI
50 50
  , testSsconf
51 51
  , testRpc
52
  , testQuery2
52 53
  ) where
53 54

  
54 55
import Test.QuickCheck
......
557 558
instance Arbitrary Rpc.RpcCallNodeInfo where
558 559
  arbitrary = Rpc.RpcCallNodeInfo <$> arbitrary <*> arbitrary
559 560

  
561
-- | Custom 'Query2.Filter' generator (top-level), which enforces a
562
-- (sane) limit on the depth of the generated filters.
563
genFilter :: Gen Query2.Filter
564
genFilter = choose (0, 10) >>= genFilter'
565

  
566
-- | Custom generator for filters that correctly halves the state of
567
-- the generators at each recursive step, per the QuickCheck
568
-- documentation, in order not to run out of memory.
569
genFilter' :: Int -> Gen Query2.Filter
570
genFilter' 0 =
571
  oneof [ return Query2.EmptyFilter
572
        , Query2.TrueFilter     <$> getName
573
        , Query2.EQFilter       <$> getName <*> value
574
        , Query2.LTFilter       <$> getName <*> value
575
        , Query2.GTFilter       <$> getName <*> value
576
        , Query2.LEFilter       <$> getName <*> value
577
        , Query2.GEFilter       <$> getName <*> value
578
        , Query2.RegexpFilter   <$> getName <*> getName
579
        , Query2.ContainsFilter <$> getName <*> value
580
        ]
581
    where value = oneof [ Query2.QuotedString <$> getName
582
                        , Query2.NumericValue <$> arbitrary
583
                        ]
584
genFilter' n = do
585
  oneof [ Query2.AndFilter  <$> vectorOf n'' (genFilter' n')
586
        , Query2.OrFilter   <$> vectorOf n'' (genFilter' n')
587
        , Query2.NotFilter  <$> genFilter' n'
588
        ]
589
  where n' = n `div` 2 -- sub-filter generator size
590
        n'' = max n' 2 -- but we don't want empty or 1-element lists,
591
                       -- so use this for and/or filter list length
592

  
560 593
-- * Actual tests
561 594

  
562 595
-- ** Utils tests
......
1954 1987
  , 'prop_Rpc_noffl_request_instlist
1955 1988
  , 'prop_Rpc_noffl_request_nodeinfo
1956 1989
  ]
1990

  
1991
-- * Query2 tests
1992

  
1993
-- | Tests that serialisation/deserialisation of filters is
1994
-- idempotent.
1995
prop_Query2_Serialisation :: Property
1996
prop_Query2_Serialisation =
1997
  forAll genFilter $ \flt ->
1998
  J.readJSON (J.showJSON flt) ==? J.Ok flt
1999

  
2000
testSuite "Query2"
2001
  [ 'prop_Query2_Serialisation
2002
  ]

Also available in: Unified diff