Statistics
| Branch: | Tag: | Revision:

root / htools / Ganeti / HTools / QC.hs @ e1ee7d5a

History | View | Annotate | Download (5.2 kB)

1
{-# LANGUAGE TemplateHaskell #-}
2
{-# OPTIONS_GHC -fno-warn-orphans -fno-warn-unused-imports #-}
3

    
4
-- FIXME: should remove the no-warn-unused-imports option, once we get
5
-- around to testing function from all modules; until then, we keep
6
-- the (unused) imports here to generate correct coverage (0 for
7
-- modules we don't use)
8

    
9
{-| Unittests for ganeti-htools.
10

    
11
-}
12

    
13
{-
14

    
15
Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
16

    
17
This program is free software; you can redistribute it and/or modify
18
it under the terms of the GNU General Public License as published by
19
the Free Software Foundation; either version 2 of the License, or
20
(at your option) any later version.
21

    
22
This program is distributed in the hope that it will be useful, but
23
WITHOUT ANY WARRANTY; without even the implied warranty of
24
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25
General Public License for more details.
26

    
27
You should have received a copy of the GNU General Public License
28
along with this program; if not, write to the Free Software
29
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
30
02110-1301, USA.
31

    
32
-}
33

    
34
module Ganeti.HTools.QC
35
  ( testJobs
36
  , testJSON
37
  ) where
38

    
39
import qualified Test.HUnit as HUnit
40
import Test.QuickCheck
41
import Test.QuickCheck.Monadic (assert, monadicIO, run, stop)
42
import Text.Printf (printf)
43
import Data.List (intercalate, nub, isPrefixOf, sort, (\\))
44
import Data.Maybe
45
import qualified Data.Set as Set
46
import Control.Monad
47
import Control.Applicative
48
import qualified System.Console.GetOpt as GetOpt
49
import qualified Text.JSON as J
50
import qualified Data.Map as Map
51
import qualified Data.IntMap as IntMap
52
import Control.Concurrent (forkIO)
53
import Control.Exception (bracket, catchJust)
54
import System.Directory (getTemporaryDirectory, removeFile)
55
import System.Environment (getEnv)
56
import System.Exit (ExitCode(..))
57
import System.IO (hClose, openTempFile)
58
import System.IO.Error (isEOFErrorType, ioeGetErrorType, isDoesNotExistError)
59
import System.Process (readProcessWithExitCode)
60

    
61
import qualified Ganeti.Confd as Confd
62
import qualified Ganeti.Confd.Server as Confd.Server
63
import qualified Ganeti.Confd.Utils as Confd.Utils
64
import qualified Ganeti.Config as Config
65
import qualified Ganeti.Daemon as Daemon
66
import qualified Ganeti.Hash as Hash
67
import qualified Ganeti.BasicTypes as BasicTypes
68
import qualified Ganeti.Jobs as Jobs
69
import qualified Ganeti.Logging as Logging
70
import qualified Ganeti.Luxi as Luxi
71
import qualified Ganeti.Objects as Objects
72
import qualified Ganeti.OpCodes as OpCodes
73
import qualified Ganeti.Query.Language as Qlang
74
import qualified Ganeti.Runtime as Runtime
75
import qualified Ganeti.HTools.CLI as CLI
76
import qualified Ganeti.HTools.Cluster as Cluster
77
import qualified Ganeti.HTools.Container as Container
78
import qualified Ganeti.HTools.ExtLoader
79
import qualified Ganeti.HTools.Group as Group
80
import qualified Ganeti.HTools.IAlloc as IAlloc
81
import qualified Ganeti.HTools.Instance as Instance
82
import qualified Ganeti.HTools.JSON as JSON
83
import qualified Ganeti.HTools.Loader as Loader
84
import qualified Ganeti.HTools.Luxi as HTools.Luxi
85
import qualified Ganeti.HTools.Node as Node
86
import qualified Ganeti.HTools.PeerMap as PeerMap
87
import qualified Ganeti.HTools.Rapi
88
import qualified Ganeti.HTools.Simu as Simu
89
import qualified Ganeti.HTools.Text as Text
90
import qualified Ganeti.HTools.Types as Types
91
import qualified Ganeti.HTools.Utils as Utils
92
import qualified Ganeti.HTools.Version
93
import qualified Ganeti.Constants as C
94

    
95
import qualified Ganeti.HTools.Program as Program
96
import qualified Ganeti.HTools.Program.Hail
97
import qualified Ganeti.HTools.Program.Hbal
98
import qualified Ganeti.HTools.Program.Hscan
99
import qualified Ganeti.HTools.Program.Hspace
100

    
101
import Test.Ganeti.TestHelper (testSuite)
102
import Test.Ganeti.TestCommon
103

    
104
-- * Helper functions
105

    
106

    
107
instance Arbitrary Jobs.OpStatus where
108
  arbitrary = elements [minBound..maxBound]
109

    
110
instance Arbitrary Jobs.JobStatus where
111
  arbitrary = elements [minBound..maxBound]
112

    
113
-- * Actual tests
114

    
115

    
116
-- ** Jobs tests
117

    
118
-- | Check that (queued) job\/opcode status serialization is idempotent.
119
prop_Jobs_OpStatus_serialization :: Jobs.OpStatus -> Property
120
prop_Jobs_OpStatus_serialization os =
121
  case J.readJSON (J.showJSON os) of
122
    J.Error e -> failTest $ "Cannot deserialise: " ++ e
123
    J.Ok os' -> os ==? os'
124

    
125
prop_Jobs_JobStatus_serialization :: Jobs.JobStatus -> Property
126
prop_Jobs_JobStatus_serialization js =
127
  case J.readJSON (J.showJSON js) of
128
    J.Error e -> failTest $ "Cannot deserialise: " ++ e
129
    J.Ok js' -> js ==? js'
130

    
131
testSuite "Jobs"
132
            [ 'prop_Jobs_OpStatus_serialization
133
            , 'prop_Jobs_JobStatus_serialization
134
            ]
135

    
136
-- * JSON tests
137

    
138
prop_JSON_toArray :: [Int] -> Property
139
prop_JSON_toArray intarr =
140
  let arr = map J.showJSON intarr in
141
  case JSON.toArray (J.JSArray arr) of
142
    Types.Ok arr' -> arr ==? arr'
143
    Types.Bad err -> failTest $ "Failed to parse array: " ++ err
144

    
145
prop_JSON_toArrayFail :: Int -> String -> Bool -> Property
146
prop_JSON_toArrayFail i s b =
147
  -- poor man's instance Arbitrary JSValue
148
  forAll (elements [J.showJSON i, J.showJSON s, J.showJSON b]) $ \item ->
149
  case JSON.toArray item of
150
    Types.Bad _ -> property True
151
    Types.Ok result -> failTest $ "Unexpected parse, got " ++ show result
152

    
153
testSuite "JSON"
154
          [ 'prop_JSON_toArray
155
          , 'prop_JSON_toArrayFail
156
          ]