Statistics
| Branch: | Tag: | Revision:

root / test / hs / Test / Ganeti / OpCodes.hs @ 82b948e4

History | View | Annotate | Download (24.4 kB)

1 aed2325f Iustin Pop
{-# LANGUAGE TemplateHaskell #-}
2 aed2325f Iustin Pop
{-# OPTIONS_GHC -fno-warn-orphans #-}
3 aed2325f Iustin Pop
4 aed2325f Iustin Pop
{-| Unittests for ganeti-htools.
5 aed2325f Iustin Pop
6 aed2325f Iustin Pop
-}
7 aed2325f Iustin Pop
8 aed2325f Iustin Pop
{-
9 aed2325f Iustin Pop
10 72747d91 Iustin Pop
Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
11 aed2325f Iustin Pop
12 aed2325f Iustin Pop
This program is free software; you can redistribute it and/or modify
13 aed2325f Iustin Pop
it under the terms of the GNU General Public License as published by
14 aed2325f Iustin Pop
the Free Software Foundation; either version 2 of the License, or
15 aed2325f Iustin Pop
(at your option) any later version.
16 aed2325f Iustin Pop
17 aed2325f Iustin Pop
This program is distributed in the hope that it will be useful, but
18 aed2325f Iustin Pop
WITHOUT ANY WARRANTY; without even the implied warranty of
19 aed2325f Iustin Pop
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 aed2325f Iustin Pop
General Public License for more details.
21 aed2325f Iustin Pop
22 aed2325f Iustin Pop
You should have received a copy of the GNU General Public License
23 aed2325f Iustin Pop
along with this program; if not, write to the Free Software
24 aed2325f Iustin Pop
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 aed2325f Iustin Pop
02110-1301, USA.
26 aed2325f Iustin Pop
27 aed2325f Iustin Pop
-}
28 aed2325f Iustin Pop
29 aed2325f Iustin Pop
module Test.Ganeti.OpCodes
30 aed2325f Iustin Pop
  ( testOpCodes
31 aed2325f Iustin Pop
  , OpCodes.OpCode(..)
32 aed2325f Iustin Pop
  ) where
33 aed2325f Iustin Pop
34 f56013fd Iustin Pop
import Test.HUnit as HUnit
35 f56013fd Iustin Pop
import Test.QuickCheck as QuickCheck
36 aed2325f Iustin Pop
37 aed2325f Iustin Pop
import Control.Applicative
38 dc4b5c42 Iustin Pop
import Control.Monad
39 dc4b5c42 Iustin Pop
import Data.Char
40 aed2325f Iustin Pop
import Data.List
41 c66f09f5 Iustin Pop
import qualified Data.Map as Map
42 aed2325f Iustin Pop
import qualified Text.JSON as J
43 8d239fa4 Iustin Pop
import Text.Printf (printf)
44 aed2325f Iustin Pop
45 aed2325f Iustin Pop
import Test.Ganeti.TestHelper
46 aed2325f Iustin Pop
import Test.Ganeti.TestCommon
47 c7d249d0 Iustin Pop
import Test.Ganeti.Types ()
48 c66f09f5 Iustin Pop
import Test.Ganeti.Query.Language
49 aed2325f Iustin Pop
50 f56013fd Iustin Pop
import Ganeti.BasicTypes
51 aed2325f Iustin Pop
import qualified Ganeti.Constants as C
52 aed2325f Iustin Pop
import qualified Ganeti.OpCodes as OpCodes
53 c7d249d0 Iustin Pop
import Ganeti.Types
54 c7d249d0 Iustin Pop
import Ganeti.OpParams
55 c66f09f5 Iustin Pop
import Ganeti.JSON
56 aed2325f Iustin Pop
57 5b11f8db Iustin Pop
{-# ANN module "HLint: ignore Use camelCase" #-}
58 5b11f8db Iustin Pop
59 aed2325f Iustin Pop
-- * Arbitrary instances
60 aed2325f Iustin Pop
61 d8e7c45e Iustin Pop
instance Arbitrary OpCodes.TagObject where
62 5006418e Iustin Pop
  arbitrary = oneof [ OpCodes.TagInstance <$> genFQDN
63 5006418e Iustin Pop
                    , OpCodes.TagNode     <$> genFQDN
64 5006418e Iustin Pop
                    , OpCodes.TagGroup    <$> genFQDN
65 95e00de7 Hrvoje Ribicic
                    , OpCodes.TagNetwork  <$> genFQDN
66 d8e7c45e Iustin Pop
                    , pure OpCodes.TagCluster
67 d8e7c45e Iustin Pop
                    ]
68 367c4241 Dato Simó
69 7022db83 Iustin Pop
$(genArbitrary ''OpCodes.ReplaceDisksMode)
70 aed2325f Iustin Pop
71 6d558717 Iustin Pop
$(genArbitrary ''DiskAccess)
72 6d558717 Iustin Pop
73 aed2325f Iustin Pop
instance Arbitrary OpCodes.DiskIndex where
74 aed2325f Iustin Pop
  arbitrary = choose (0, C.maxDisks - 1) >>= OpCodes.mkDiskIndex
75 aed2325f Iustin Pop
76 5ef4fbb1 Iustin Pop
instance Arbitrary INicParams where
77 5006418e Iustin Pop
  arbitrary = INicParams <$> genMaybe genNameNE <*> genMaybe genName <*>
78 4e4433e8 Christos Stavrakakis
              genMaybe genNameNE <*> genMaybe genNameNE <*> genMaybe genNameNE
79 c66f09f5 Iustin Pop
80 6d558717 Iustin Pop
instance Arbitrary IDiskParams where
81 6d558717 Iustin Pop
  arbitrary = IDiskParams <$> arbitrary <*> arbitrary <*>
82 5006418e Iustin Pop
              genMaybe genNameNE <*> genMaybe genNameNE <*>
83 4e4433e8 Christos Stavrakakis
              genMaybe genNameNE <*> genMaybe genNameNE
84 6d558717 Iustin Pop
85 c2d3219b Iustin Pop
instance Arbitrary RecreateDisksInfo where
86 c2d3219b Iustin Pop
  arbitrary = oneof [ pure RecreateDisksAll
87 c2d3219b Iustin Pop
                    , RecreateDisksIndices <$> arbitrary
88 c2d3219b Iustin Pop
                    , RecreateDisksParams <$> arbitrary
89 c2d3219b Iustin Pop
                    ]
90 c2d3219b Iustin Pop
91 c2d3219b Iustin Pop
instance Arbitrary DdmOldChanges where
92 c2d3219b Iustin Pop
  arbitrary = oneof [ DdmOldIndex <$> arbitrary
93 c2d3219b Iustin Pop
                    , DdmOldMod   <$> arbitrary
94 c2d3219b Iustin Pop
                    ]
95 c2d3219b Iustin Pop
96 c2d3219b Iustin Pop
instance (Arbitrary a) => Arbitrary (SetParamsMods a) where
97 c2d3219b Iustin Pop
  arbitrary = oneof [ pure SetParamsEmpty
98 c2d3219b Iustin Pop
                    , SetParamsDeprecated <$> arbitrary
99 c2d3219b Iustin Pop
                    , SetParamsNew        <$> arbitrary
100 c2d3219b Iustin Pop
                    ]
101 c2d3219b Iustin Pop
102 398e9066 Iustin Pop
instance Arbitrary ExportTarget where
103 398e9066 Iustin Pop
  arbitrary = oneof [ ExportTargetLocal <$> genNodeNameNE
104 398e9066 Iustin Pop
                    , ExportTargetRemote <$> pure []
105 398e9066 Iustin Pop
                    ]
106 398e9066 Iustin Pop
107 aed2325f Iustin Pop
instance Arbitrary OpCodes.OpCode where
108 aed2325f Iustin Pop
  arbitrary = do
109 aed2325f Iustin Pop
    op_id <- elements OpCodes.allOpIDs
110 aed2325f Iustin Pop
    case op_id of
111 aed2325f Iustin Pop
      "OP_TEST_DELAY" ->
112 7d421386 Iustin Pop
        OpCodes.OpTestDelay <$> arbitrary <*> arbitrary <*>
113 7d421386 Iustin Pop
          genNodeNamesNE <*> arbitrary
114 aed2325f Iustin Pop
      "OP_INSTANCE_REPLACE_DISKS" ->
115 3d7e87b8 Iustin Pop
        OpCodes.OpInstanceReplaceDisks <$> genFQDN <*> arbitrary <*>
116 3d7e87b8 Iustin Pop
          arbitrary <*> arbitrary <*> genDiskIndices <*>
117 3d7e87b8 Iustin Pop
          genMaybe genNodeNameNE <*> genMaybe genNameNE
118 aed2325f Iustin Pop
      "OP_INSTANCE_FAILOVER" ->
119 3d7e87b8 Iustin Pop
        OpCodes.OpInstanceFailover <$> genFQDN <*> arbitrary <*> arbitrary <*>
120 aa7a5c90 Michele Tartara
          genMaybe genNodeNameNE <*> arbitrary <*> genMaybe genNameNE <*>
121 aa7a5c90 Michele Tartara
          arbitrary
122 aed2325f Iustin Pop
      "OP_INSTANCE_MIGRATE" ->
123 3d7e87b8 Iustin Pop
        OpCodes.OpInstanceMigrate <$> genFQDN <*> arbitrary <*> arbitrary <*>
124 3d7e87b8 Iustin Pop
          genMaybe genNodeNameNE <*> arbitrary <*>
125 3d7e87b8 Iustin Pop
          arbitrary <*> arbitrary <*> genMaybe genNameNE <*> arbitrary
126 a451dae2 Iustin Pop
      "OP_TAGS_GET" ->
127 a451dae2 Iustin Pop
        OpCodes.OpTagsGet <$> arbitrary <*> arbitrary
128 a451dae2 Iustin Pop
      "OP_TAGS_SEARCH" ->
129 a451dae2 Iustin Pop
        OpCodes.OpTagsSearch <$> genNameNE
130 3bebda52 Dato Simó
      "OP_TAGS_SET" ->
131 d8e7c45e Iustin Pop
        OpCodes.OpTagsSet <$> arbitrary <*> genTags
132 3bebda52 Dato Simó
      "OP_TAGS_DEL" ->
133 d8e7c45e Iustin Pop
        OpCodes.OpTagsSet <$> arbitrary <*> genTags
134 c66f09f5 Iustin Pop
      "OP_CLUSTER_POST_INIT" -> pure OpCodes.OpClusterPostInit
135 c66f09f5 Iustin Pop
      "OP_CLUSTER_DESTROY" -> pure OpCodes.OpClusterDestroy
136 c66f09f5 Iustin Pop
      "OP_CLUSTER_QUERY" -> pure OpCodes.OpClusterQuery
137 c66f09f5 Iustin Pop
      "OP_CLUSTER_VERIFY" ->
138 c66f09f5 Iustin Pop
        OpCodes.OpClusterVerify <$> arbitrary <*> arbitrary <*>
139 5ef4fbb1 Iustin Pop
          genSet Nothing <*> genSet Nothing <*> arbitrary <*>
140 5006418e Iustin Pop
          genMaybe genNameNE
141 c66f09f5 Iustin Pop
      "OP_CLUSTER_VERIFY_CONFIG" ->
142 c66f09f5 Iustin Pop
        OpCodes.OpClusterVerifyConfig <$> arbitrary <*> arbitrary <*>
143 c66f09f5 Iustin Pop
          genSet Nothing <*> arbitrary
144 c66f09f5 Iustin Pop
      "OP_CLUSTER_VERIFY_GROUP" ->
145 5ef4fbb1 Iustin Pop
        OpCodes.OpClusterVerifyGroup <$> genNameNE <*> arbitrary <*>
146 c66f09f5 Iustin Pop
          arbitrary <*> genSet Nothing <*> genSet Nothing <*> arbitrary
147 c66f09f5 Iustin Pop
      "OP_CLUSTER_VERIFY_DISKS" -> pure OpCodes.OpClusterVerifyDisks
148 c66f09f5 Iustin Pop
      "OP_GROUP_VERIFY_DISKS" ->
149 5ef4fbb1 Iustin Pop
        OpCodes.OpGroupVerifyDisks <$> genNameNE
150 c66f09f5 Iustin Pop
      "OP_CLUSTER_REPAIR_DISK_SIZES" ->
151 5006418e Iustin Pop
        OpCodes.OpClusterRepairDiskSizes <$> genNodeNamesNE
152 c66f09f5 Iustin Pop
      "OP_CLUSTER_CONFIG_QUERY" ->
153 5ef4fbb1 Iustin Pop
        OpCodes.OpClusterConfigQuery <$> genFieldsNE
154 c66f09f5 Iustin Pop
      "OP_CLUSTER_RENAME" ->
155 5006418e Iustin Pop
        OpCodes.OpClusterRename <$> genNameNE
156 c66f09f5 Iustin Pop
      "OP_CLUSTER_SET_PARAMS" ->
157 e5c92cfb Klaus Aehlig
        OpCodes.OpClusterSetParams <$> arbitrary <*> emptyMUD <*> emptyMUD <*>
158 5006418e Iustin Pop
          arbitrary <*> genMaybe (listOf1 arbitrary >>= mkNonEmpty) <*>
159 5006418e Iustin Pop
          genMaybe genEmptyContainer <*> emptyMUD <*>
160 5006418e Iustin Pop
          genMaybe genEmptyContainer <*> genMaybe genEmptyContainer <*>
161 5006418e Iustin Pop
          genMaybe genEmptyContainer <*> genMaybe arbitrary <*>
162 c66f09f5 Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*>
163 c66f09f5 Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*>
164 c66f09f5 Iustin Pop
          emptyMUD <*> emptyMUD <*> arbitrary <*>
165 67fc4de7 Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
166 75f2ff7d Michele Tartara
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary
167 c66f09f5 Iustin Pop
      "OP_CLUSTER_REDIST_CONF" -> pure OpCodes.OpClusterRedistConf
168 c66f09f5 Iustin Pop
      "OP_CLUSTER_ACTIVATE_MASTER_IP" ->
169 c66f09f5 Iustin Pop
        pure OpCodes.OpClusterActivateMasterIp
170 c66f09f5 Iustin Pop
      "OP_CLUSTER_DEACTIVATE_MASTER_IP" ->
171 c66f09f5 Iustin Pop
        pure OpCodes.OpClusterDeactivateMasterIp
172 c66f09f5 Iustin Pop
      "OP_QUERY" ->
173 c66f09f5 Iustin Pop
        OpCodes.OpQuery <$> arbitrary <*> arbitrary <*> arbitrary <*> genFilter
174 c66f09f5 Iustin Pop
      "OP_QUERY_FIELDS" ->
175 c66f09f5 Iustin Pop
        OpCodes.OpQueryFields <$> arbitrary <*> arbitrary
176 c66f09f5 Iustin Pop
      "OP_OOB_COMMAND" ->
177 c66f09f5 Iustin Pop
        OpCodes.OpOobCommand <$> genNodeNamesNE <*> arbitrary <*>
178 c66f09f5 Iustin Pop
          arbitrary <*> arbitrary <*> (arbitrary `suchThat` (>0))
179 5006418e Iustin Pop
      "OP_NODE_REMOVE" -> OpCodes.OpNodeRemove <$> genNodeNameNE
180 c66f09f5 Iustin Pop
      "OP_NODE_ADD" ->
181 5ef4fbb1 Iustin Pop
        OpCodes.OpNodeAdd <$> genNodeNameNE <*> emptyMUD <*> emptyMUD <*>
182 5006418e Iustin Pop
          genMaybe genName <*> genMaybe genNameNE <*> arbitrary <*>
183 5006418e Iustin Pop
          genMaybe genNameNE <*> arbitrary <*> arbitrary <*> emptyMUD
184 c66f09f5 Iustin Pop
      "OP_NODE_QUERY" ->
185 3131adc7 Iustin Pop
        OpCodes.OpNodeQuery <$> genFieldsNE <*> genNamesNE <*> arbitrary
186 c66f09f5 Iustin Pop
      "OP_NODE_QUERYVOLS" ->
187 c66f09f5 Iustin Pop
        OpCodes.OpNodeQueryvols <$> arbitrary <*> genNodeNamesNE
188 c66f09f5 Iustin Pop
      "OP_NODE_QUERY_STORAGE" ->
189 c66f09f5 Iustin Pop
        OpCodes.OpNodeQueryStorage <$> arbitrary <*> arbitrary <*>
190 5ef4fbb1 Iustin Pop
          genNodeNamesNE <*> genNameNE
191 c66f09f5 Iustin Pop
      "OP_NODE_MODIFY_STORAGE" ->
192 c66f09f5 Iustin Pop
        OpCodes.OpNodeModifyStorage <$> genNodeNameNE <*> arbitrary <*>
193 5ef4fbb1 Iustin Pop
          genNameNE <*> pure emptyJSObject
194 c66f09f5 Iustin Pop
      "OP_REPAIR_NODE_STORAGE" ->
195 c66f09f5 Iustin Pop
        OpCodes.OpRepairNodeStorage <$> genNodeNameNE <*> arbitrary <*>
196 5ef4fbb1 Iustin Pop
          genNameNE <*> arbitrary
197 c66f09f5 Iustin Pop
      "OP_NODE_SET_PARAMS" ->
198 c66f09f5 Iustin Pop
        OpCodes.OpNodeSetParams <$> genNodeNameNE <*> arbitrary <*>
199 c66f09f5 Iustin Pop
          emptyMUD <*> emptyMUD <*> arbitrary <*> arbitrary <*> arbitrary <*>
200 5006418e Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
201 67fc4de7 Iustin Pop
          emptyMUD <*> arbitrary
202 c66f09f5 Iustin Pop
      "OP_NODE_POWERCYCLE" ->
203 c66f09f5 Iustin Pop
        OpCodes.OpNodePowercycle <$> genNodeNameNE <*> arbitrary
204 c66f09f5 Iustin Pop
      "OP_NODE_MIGRATE" ->
205 c66f09f5 Iustin Pop
        OpCodes.OpNodeMigrate <$> genNodeNameNE <*> arbitrary <*>
206 5006418e Iustin Pop
          arbitrary <*> genMaybe genNodeNameNE <*> arbitrary <*>
207 5006418e Iustin Pop
          arbitrary <*> genMaybe genNameNE
208 c66f09f5 Iustin Pop
      "OP_NODE_EVACUATE" ->
209 c66f09f5 Iustin Pop
        OpCodes.OpNodeEvacuate <$> arbitrary <*> genNodeNameNE <*>
210 5006418e Iustin Pop
          genMaybe genNodeNameNE <*> genMaybe genNameNE <*> arbitrary
211 6d558717 Iustin Pop
      "OP_INSTANCE_CREATE" ->
212 5006418e Iustin Pop
        OpCodes.OpInstanceCreate <$> genFQDN <*> arbitrary <*>
213 6d558717 Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> pure emptyJSObject <*>
214 5006418e Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
215 5006418e Iustin Pop
          pure emptyJSObject <*> arbitrary <*> genMaybe genNameNE <*>
216 6d558717 Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
217 6d558717 Iustin Pop
          arbitrary <*> arbitrary <*> pure emptyJSObject <*>
218 5006418e Iustin Pop
          genMaybe genNameNE <*>
219 5006418e Iustin Pop
          genMaybe genNodeNameNE <*> genMaybe genNodeNameNE <*>
220 5006418e Iustin Pop
          genMaybe (pure []) <*> genMaybe genNodeNameNE <*>
221 5006418e Iustin Pop
          arbitrary <*> genMaybe genNodeNameNE <*>
222 5006418e Iustin Pop
          genMaybe genNodeNameNE <*> genMaybe genNameNE <*>
223 1f1188c3 Michael Hanselmann
          arbitrary <*> arbitrary <*> (genTags >>= mapM mkNonEmpty)
224 c2d3219b Iustin Pop
      "OP_INSTANCE_MULTI_ALLOC" ->
225 c298ed02 Michael Hanselmann
        OpCodes.OpInstanceMultiAlloc <$> genMaybe genNameNE <*> pure [] <*>
226 c298ed02 Michael Hanselmann
          arbitrary
227 c2d3219b Iustin Pop
      "OP_INSTANCE_REINSTALL" ->
228 5006418e Iustin Pop
        OpCodes.OpInstanceReinstall <$> genFQDN <*> arbitrary <*>
229 5006418e Iustin Pop
          genMaybe genNameNE <*> genMaybe (pure emptyJSObject)
230 c2d3219b Iustin Pop
      "OP_INSTANCE_REMOVE" ->
231 5006418e Iustin Pop
        OpCodes.OpInstanceRemove <$> genFQDN <*> arbitrary <*> arbitrary
232 c2d3219b Iustin Pop
      "OP_INSTANCE_RENAME" ->
233 5006418e Iustin Pop
        OpCodes.OpInstanceRename <$> genFQDN <*> genNodeNameNE <*>
234 c2d3219b Iustin Pop
          arbitrary <*> arbitrary
235 c2d3219b Iustin Pop
      "OP_INSTANCE_STARTUP" ->
236 5006418e Iustin Pop
        OpCodes.OpInstanceStartup <$> genFQDN <*> arbitrary <*> arbitrary <*>
237 c2d3219b Iustin Pop
          pure emptyJSObject <*> pure emptyJSObject <*>
238 c2d3219b Iustin Pop
          arbitrary <*> arbitrary
239 c2d3219b Iustin Pop
      "OP_INSTANCE_SHUTDOWN" ->
240 0d57ce24 Guido Trotter
        OpCodes.OpInstanceShutdown <$> genFQDN <*> arbitrary <*> arbitrary <*>
241 c2d3219b Iustin Pop
          arbitrary <*> arbitrary
242 c2d3219b Iustin Pop
      "OP_INSTANCE_REBOOT" ->
243 5006418e Iustin Pop
        OpCodes.OpInstanceReboot <$> genFQDN <*> arbitrary <*>
244 aa922d64 Michele Tartara
          arbitrary <*> arbitrary
245 c2d3219b Iustin Pop
      "OP_INSTANCE_MOVE" ->
246 5006418e Iustin Pop
        OpCodes.OpInstanceMove <$> genFQDN <*> arbitrary <*> arbitrary <*>
247 c2d3219b Iustin Pop
          genNodeNameNE <*> arbitrary
248 5006418e Iustin Pop
      "OP_INSTANCE_CONSOLE" -> OpCodes.OpInstanceConsole <$> genFQDN
249 c2d3219b Iustin Pop
      "OP_INSTANCE_ACTIVATE_DISKS" ->
250 5006418e Iustin Pop
        OpCodes.OpInstanceActivateDisks <$> genFQDN <*>
251 c2d3219b Iustin Pop
          arbitrary <*> arbitrary
252 c2d3219b Iustin Pop
      "OP_INSTANCE_DEACTIVATE_DISKS" ->
253 5006418e Iustin Pop
        OpCodes.OpInstanceDeactivateDisks <$> genFQDN <*> arbitrary
254 c2d3219b Iustin Pop
      "OP_INSTANCE_RECREATE_DISKS" ->
255 5006418e Iustin Pop
        OpCodes.OpInstanceRecreateDisks <$> genFQDN <*> arbitrary <*>
256 5006418e Iustin Pop
          genNodeNamesNE <*> genMaybe genNameNE
257 1cd563e2 Iustin Pop
      "OP_INSTANCE_QUERY" ->
258 1cd563e2 Iustin Pop
        OpCodes.OpInstanceQuery <$> genFieldsNE <*> genNamesNE <*> arbitrary
259 c2d3219b Iustin Pop
      "OP_INSTANCE_QUERY_DATA" ->
260 c2d3219b Iustin Pop
        OpCodes.OpInstanceQueryData <$> arbitrary <*>
261 c2d3219b Iustin Pop
          genNodeNamesNE <*> arbitrary
262 c2d3219b Iustin Pop
      "OP_INSTANCE_SET_PARAMS" ->
263 5006418e Iustin Pop
        OpCodes.OpInstanceSetParams <$> genFQDN <*> arbitrary <*>
264 c2d3219b Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
265 c2d3219b Iustin Pop
          pure emptyJSObject <*> arbitrary <*> pure emptyJSObject <*>
266 d2204b1a Klaus Aehlig
          arbitrary <*> genMaybe genNodeNameNE <*> genMaybe genNodeNameNE <*>
267 d2204b1a Klaus Aehlig
          genMaybe genNameNE <*> pure emptyJSObject <*> arbitrary <*>
268 82b948e4 Dimitris Aragiorgis
          arbitrary <*> arbitrary <*> arbitrary
269 c2d3219b Iustin Pop
      "OP_INSTANCE_GROW_DISK" ->
270 5006418e Iustin Pop
        OpCodes.OpInstanceGrowDisk <$> genFQDN <*> arbitrary <*>
271 c2d3219b Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary
272 c2d3219b Iustin Pop
      "OP_INSTANCE_CHANGE_GROUP" ->
273 5006418e Iustin Pop
        OpCodes.OpInstanceChangeGroup <$> genFQDN <*> arbitrary <*>
274 5006418e Iustin Pop
          genMaybe genNameNE <*> genMaybe (resize maxNodes (listOf genNameNE))
275 398e9066 Iustin Pop
      "OP_GROUP_ADD" ->
276 398e9066 Iustin Pop
        OpCodes.OpGroupAdd <$> genNameNE <*> arbitrary <*>
277 5006418e Iustin Pop
          emptyMUD <*> genMaybe genEmptyContainer <*>
278 398e9066 Iustin Pop
          emptyMUD <*> emptyMUD <*> emptyMUD
279 398e9066 Iustin Pop
      "OP_GROUP_ASSIGN_NODES" ->
280 398e9066 Iustin Pop
        OpCodes.OpGroupAssignNodes <$> genNameNE <*> arbitrary <*>
281 398e9066 Iustin Pop
          genNodeNamesNE
282 398e9066 Iustin Pop
      "OP_GROUP_QUERY" ->
283 398e9066 Iustin Pop
        OpCodes.OpGroupQuery <$> genFieldsNE <*> genNamesNE
284 398e9066 Iustin Pop
      "OP_GROUP_SET_PARAMS" ->
285 398e9066 Iustin Pop
        OpCodes.OpGroupSetParams <$> genNameNE <*> arbitrary <*>
286 5006418e Iustin Pop
          emptyMUD <*> genMaybe genEmptyContainer <*>
287 398e9066 Iustin Pop
          emptyMUD <*> emptyMUD <*> emptyMUD
288 398e9066 Iustin Pop
      "OP_GROUP_REMOVE" ->
289 398e9066 Iustin Pop
        OpCodes.OpGroupRemove <$> genNameNE
290 398e9066 Iustin Pop
      "OP_GROUP_RENAME" ->
291 398e9066 Iustin Pop
        OpCodes.OpGroupRename <$> genNameNE <*> genNameNE
292 398e9066 Iustin Pop
      "OP_GROUP_EVACUATE" ->
293 398e9066 Iustin Pop
        OpCodes.OpGroupEvacuate <$> genNameNE <*> arbitrary <*>
294 5006418e Iustin Pop
          genMaybe genNameNE <*> genMaybe genNamesNE
295 398e9066 Iustin Pop
      "OP_OS_DIAGNOSE" ->
296 398e9066 Iustin Pop
        OpCodes.OpOsDiagnose <$> genFieldsNE <*> genNamesNE
297 b954f097 Constantinos Venetsanopoulos
      "OP_EXT_STORAGE_DIAGNOSE" ->
298 b954f097 Constantinos Venetsanopoulos
        OpCodes.OpOsDiagnose <$> genFieldsNE <*> genNamesNE
299 398e9066 Iustin Pop
      "OP_BACKUP_QUERY" ->
300 398e9066 Iustin Pop
        OpCodes.OpBackupQuery <$> arbitrary <*> genNodeNamesNE
301 398e9066 Iustin Pop
      "OP_BACKUP_PREPARE" ->
302 5006418e Iustin Pop
        OpCodes.OpBackupPrepare <$> genFQDN <*> arbitrary
303 398e9066 Iustin Pop
      "OP_BACKUP_EXPORT" ->
304 5006418e Iustin Pop
        OpCodes.OpBackupExport <$> genFQDN <*> arbitrary <*>
305 398e9066 Iustin Pop
          arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*>
306 67fc4de7 Iustin Pop
          arbitrary <*> genMaybe (pure []) <*> genMaybe genNameNE
307 398e9066 Iustin Pop
      "OP_BACKUP_REMOVE" ->
308 5006418e Iustin Pop
        OpCodes.OpBackupRemove <$> genFQDN
309 a3f02317 Iustin Pop
      "OP_TEST_ALLOCATOR" ->
310 a3f02317 Iustin Pop
        OpCodes.OpTestAllocator <$> arbitrary <*> arbitrary <*>
311 a3f02317 Iustin Pop
          genNameNE <*> pure [] <*> pure [] <*>
312 5006418e Iustin Pop
          arbitrary <*> genMaybe genNameNE <*>
313 a3f02317 Iustin Pop
          (genTags >>= mapM mkNonEmpty) <*>
314 5006418e Iustin Pop
          arbitrary <*> arbitrary <*> genMaybe genNameNE <*>
315 5006418e Iustin Pop
          arbitrary <*> genMaybe genNodeNamesNE <*> arbitrary <*>
316 5006418e Iustin Pop
          genMaybe genNamesNE <*> arbitrary <*> arbitrary
317 a3f02317 Iustin Pop
      "OP_TEST_JQUEUE" ->
318 a3f02317 Iustin Pop
        OpCodes.OpTestJqueue <$> arbitrary <*> arbitrary <*>
319 5006418e Iustin Pop
          resize 20 (listOf genFQDN) <*> arbitrary
320 a3f02317 Iustin Pop
      "OP_TEST_DUMMY" ->
321 a3f02317 Iustin Pop
        OpCodes.OpTestDummy <$> pure J.JSNull <*> pure J.JSNull <*>
322 a3f02317 Iustin Pop
          pure J.JSNull <*> pure J.JSNull
323 8d239fa4 Iustin Pop
      "OP_NETWORK_ADD" ->
324 5cfa6c37 Dimitris Aragiorgis
        OpCodes.OpNetworkAdd <$> genNameNE <*> genIp4Net <*>
325 5006418e Iustin Pop
          genMaybe genIp4Addr <*> pure Nothing <*> pure Nothing <*>
326 5006418e Iustin Pop
          genMaybe genMacPrefix <*> genMaybe (listOf genIp4Addr) <*>
327 1dbceab9 Iustin Pop
          arbitrary <*> (genTags >>= mapM mkNonEmpty)
328 8d239fa4 Iustin Pop
      "OP_NETWORK_REMOVE" ->
329 8d239fa4 Iustin Pop
        OpCodes.OpNetworkRemove <$> genNameNE <*> arbitrary
330 8d239fa4 Iustin Pop
      "OP_NETWORK_SET_PARAMS" ->
331 5cfa6c37 Dimitris Aragiorgis
        OpCodes.OpNetworkSetParams <$> genNameNE <*>
332 5006418e Iustin Pop
          genMaybe genIp4Addr <*> pure Nothing <*> pure Nothing <*>
333 5006418e Iustin Pop
          genMaybe genMacPrefix <*> genMaybe (listOf genIp4Addr) <*>
334 5006418e Iustin Pop
          genMaybe (listOf genIp4Addr)
335 8d239fa4 Iustin Pop
      "OP_NETWORK_CONNECT" ->
336 8d239fa4 Iustin Pop
        OpCodes.OpNetworkConnect <$> genNameNE <*> genNameNE <*>
337 8d239fa4 Iustin Pop
          arbitrary <*> genNameNE <*> arbitrary
338 8d239fa4 Iustin Pop
      "OP_NETWORK_DISCONNECT" ->
339 0ae4b355 Helga Velroyen
        OpCodes.OpNetworkDisconnect <$> genNameNE <*> genNameNE
340 8d239fa4 Iustin Pop
      "OP_NETWORK_QUERY" ->
341 8d459129 Michael Hanselmann
        OpCodes.OpNetworkQuery <$> genFieldsNE <*> genNamesNE <*> arbitrary
342 1cd563e2 Iustin Pop
      "OP_RESTRICTED_COMMAND" ->
343 1cd563e2 Iustin Pop
        OpCodes.OpRestrictedCommand <$> arbitrary <*> genNodeNamesNE <*>
344 1cd563e2 Iustin Pop
          genNameNE
345 c66f09f5 Iustin Pop
      _ -> fail $ "Undefined arbitrary for opcode " ++ op_id
346 aed2325f Iustin Pop
347 516a0e94 Michele Tartara
-- | Generates one element of a reason trail
348 516a0e94 Michele Tartara
genReasonElem :: Gen ReasonElem
349 516a0e94 Michele Tartara
genReasonElem = (,,) <$> genFQDN <*> genFQDN <*> arbitrary
350 516a0e94 Michele Tartara
351 516a0e94 Michele Tartara
-- | Generates a reason trail
352 516a0e94 Michele Tartara
genReasonTrail :: Gen ReasonTrail
353 516a0e94 Michele Tartara
genReasonTrail = do
354 516a0e94 Michele Tartara
  size <- choose (0, 10)
355 516a0e94 Michele Tartara
  vectorOf size genReasonElem
356 516a0e94 Michele Tartara
357 4a826364 Iustin Pop
instance Arbitrary OpCodes.CommonOpParams where
358 4a826364 Iustin Pop
  arbitrary = OpCodes.CommonOpParams <$> arbitrary <*> arbitrary <*>
359 516a0e94 Michele Tartara
                arbitrary <*> resize 5 arbitrary <*> genMaybe genName <*>
360 516a0e94 Michele Tartara
                genReasonTrail
361 4a826364 Iustin Pop
362 c7d249d0 Iustin Pop
-- * Helper functions
363 c7d249d0 Iustin Pop
364 c66f09f5 Iustin Pop
-- | Empty JSObject.
365 c66f09f5 Iustin Pop
emptyJSObject :: J.JSObject J.JSValue
366 c66f09f5 Iustin Pop
emptyJSObject = J.toJSObject []
367 c66f09f5 Iustin Pop
368 c66f09f5 Iustin Pop
-- | Empty maybe unchecked dictionary.
369 c66f09f5 Iustin Pop
emptyMUD :: Gen (Maybe (J.JSObject J.JSValue))
370 5006418e Iustin Pop
emptyMUD = genMaybe $ pure emptyJSObject
371 c66f09f5 Iustin Pop
372 c66f09f5 Iustin Pop
-- | Generates an empty container.
373 c66f09f5 Iustin Pop
genEmptyContainer :: (Ord a) => Gen (GenericContainer a b)
374 c66f09f5 Iustin Pop
genEmptyContainer = pure . GenericContainer $ Map.fromList []
375 c66f09f5 Iustin Pop
376 c7d249d0 Iustin Pop
-- | Generates list of disk indices.
377 c7d249d0 Iustin Pop
genDiskIndices :: Gen [DiskIndex]
378 c7d249d0 Iustin Pop
genDiskIndices = do
379 c7d249d0 Iustin Pop
  cnt <- choose (0, C.maxDisks)
380 df8578fb Iustin Pop
  genUniquesList cnt arbitrary
381 c7d249d0 Iustin Pop
382 c7d249d0 Iustin Pop
-- | Generates a list of node names.
383 c7d249d0 Iustin Pop
genNodeNames :: Gen [String]
384 5006418e Iustin Pop
genNodeNames = resize maxNodes (listOf genFQDN)
385 c7d249d0 Iustin Pop
386 c66f09f5 Iustin Pop
-- | Generates a list of node names in non-empty string type.
387 c66f09f5 Iustin Pop
genNodeNamesNE :: Gen [NonEmptyString]
388 417ab39c Iustin Pop
genNodeNamesNE = genNodeNames >>= mapM mkNonEmpty
389 c66f09f5 Iustin Pop
390 c7d249d0 Iustin Pop
-- | Gets a node name in non-empty type.
391 c7d249d0 Iustin Pop
genNodeNameNE :: Gen NonEmptyString
392 5006418e Iustin Pop
genNodeNameNE = genFQDN >>= mkNonEmpty
393 c7d249d0 Iustin Pop
394 5ef4fbb1 Iustin Pop
-- | Gets a name (non-fqdn) in non-empty type.
395 5ef4fbb1 Iustin Pop
genNameNE :: Gen NonEmptyString
396 5006418e Iustin Pop
genNameNE = genName >>= mkNonEmpty
397 5ef4fbb1 Iustin Pop
398 398e9066 Iustin Pop
-- | Gets a list of names (non-fqdn) in non-empty type.
399 398e9066 Iustin Pop
genNamesNE :: Gen [NonEmptyString]
400 398e9066 Iustin Pop
genNamesNE = resize maxNodes (listOf genNameNE)
401 398e9066 Iustin Pop
402 5ef4fbb1 Iustin Pop
-- | Returns a list of non-empty fields.
403 5ef4fbb1 Iustin Pop
genFieldsNE :: Gen [NonEmptyString]
404 5006418e Iustin Pop
genFieldsNE = genFields >>= mapM mkNonEmpty
405 5ef4fbb1 Iustin Pop
406 8d239fa4 Iustin Pop
-- | Generate a 3-byte MAC prefix.
407 8d239fa4 Iustin Pop
genMacPrefix :: Gen NonEmptyString
408 8d239fa4 Iustin Pop
genMacPrefix = do
409 8d239fa4 Iustin Pop
  octets <- vectorOf 3 $ choose (0::Int, 255)
410 8d239fa4 Iustin Pop
  mkNonEmpty . intercalate ":" $ map (printf "%02x") octets
411 8d239fa4 Iustin Pop
412 4a826364 Iustin Pop
-- | Arbitrary instance for MetaOpCode, defined here due to TH ordering.
413 4a826364 Iustin Pop
$(genArbitrary ''OpCodes.MetaOpCode)
414 4a826364 Iustin Pop
415 f56013fd Iustin Pop
-- | Small helper to check for a failed JSON deserialisation
416 f56013fd Iustin Pop
isJsonError :: J.Result a -> Bool
417 f56013fd Iustin Pop
isJsonError (J.Error _) = True
418 f56013fd Iustin Pop
isJsonError _           = False
419 f56013fd Iustin Pop
420 aed2325f Iustin Pop
-- * Test cases
421 aed2325f Iustin Pop
422 aed2325f Iustin Pop
-- | Check that opcode serialization is idempotent.
423 20bc5360 Iustin Pop
prop_serialization :: OpCodes.OpCode -> Property
424 63b068c1 Iustin Pop
prop_serialization = testSerialisation
425 aed2325f Iustin Pop
426 aed2325f Iustin Pop
-- | Check that Python and Haskell defined the same opcode list.
427 20bc5360 Iustin Pop
case_AllDefined :: HUnit.Assertion
428 20bc5360 Iustin Pop
case_AllDefined = do
429 9b773665 Iustin Pop
  let py_ops = sort C.opcodesOpIds
430 9b773665 Iustin Pop
      hs_ops = sort OpCodes.allOpIDs
431 9b773665 Iustin Pop
      extra_py = py_ops \\ hs_ops
432 aed2325f Iustin Pop
      extra_hs = hs_ops \\ py_ops
433 9b773665 Iustin Pop
  HUnit.assertBool ("Missing OpCodes from the Haskell code:\n" ++
434 9b773665 Iustin Pop
                    unlines extra_py) (null extra_py)
435 aed2325f Iustin Pop
  HUnit.assertBool ("Extra OpCodes in the Haskell code code:\n" ++
436 aed2325f Iustin Pop
                    unlines extra_hs) (null extra_hs)
437 aed2325f Iustin Pop
438 aed2325f Iustin Pop
-- | Custom HUnit test case that forks a Python process and checks
439 aed2325f Iustin Pop
-- correspondence between Haskell-generated OpCodes and their Python
440 aed2325f Iustin Pop
-- decoded, validated and re-encoded version.
441 aed2325f Iustin Pop
--
442 aed2325f Iustin Pop
-- Note that we have a strange beast here: since launching Python is
443 aed2325f Iustin Pop
-- expensive, we don't do this via a usual QuickProperty, since that's
444 aed2325f Iustin Pop
-- slow (I've tested it, and it's indeed quite slow). Rather, we use a
445 aed2325f Iustin Pop
-- single HUnit assertion, and in it we manually use QuickCheck to
446 aed2325f Iustin Pop
-- generate 500 opcodes times the number of defined opcodes, which
447 aed2325f Iustin Pop
-- then we pass in bulk to Python. The drawbacks to this method are
448 aed2325f Iustin Pop
-- two fold: we cannot control the number of generated opcodes, since
449 aed2325f Iustin Pop
-- HUnit assertions don't get access to the test options, and for the
450 aed2325f Iustin Pop
-- same reason we can't run a repeatable seed. We should probably find
451 aed2325f Iustin Pop
-- a better way to do this, for example by having a
452 aed2325f Iustin Pop
-- separately-launched Python process (if not running the tests would
453 aed2325f Iustin Pop
-- be skipped).
454 d1ac695f Iustin Pop
case_py_compat_types :: HUnit.Assertion
455 d1ac695f Iustin Pop
case_py_compat_types = do
456 086ad4cf Iustin Pop
  let num_opcodes = length OpCodes.allOpIDs * 100
457 72747d91 Iustin Pop
  opcodes <- genSample (vectorOf num_opcodes
458 72747d91 Iustin Pop
                                   (arbitrary::Gen OpCodes.MetaOpCode))
459 72747d91 Iustin Pop
  let with_sum = map (\o -> (OpCodes.opSummary $
460 ad1c1e41 Iustin Pop
                             OpCodes.metaOpCode o, o)) opcodes
461 aed2325f Iustin Pop
      serialized = J.encode opcodes
462 dc4b5c42 Iustin Pop
  -- check for non-ASCII fields, usually due to 'arbitrary :: String'
463 dc4b5c42 Iustin Pop
  mapM_ (\op -> when (any (not . isAscii) (J.encode op)) .
464 dc4b5c42 Iustin Pop
                HUnit.assertFailure $
465 dc4b5c42 Iustin Pop
                  "OpCode has non-ASCII fields: " ++ show op
466 dc4b5c42 Iustin Pop
        ) opcodes
467 aed2325f Iustin Pop
  py_stdout <-
468 aed2325f Iustin Pop
     runPython "from ganeti import opcodes\n\
469 aed2325f Iustin Pop
               \import sys\n\
470 aed2325f Iustin Pop
               \from ganeti import serializer\n\
471 aed2325f Iustin Pop
               \op_data = serializer.Load(sys.stdin.read())\n\
472 aed2325f Iustin Pop
               \decoded = [opcodes.OpCode.LoadOpCode(o) for o in op_data]\n\
473 aed2325f Iustin Pop
               \for op in decoded:\n\
474 aed2325f Iustin Pop
               \  op.Validate(True)\n\
475 ad1c1e41 Iustin Pop
               \encoded = [(op.Summary(), op.__getstate__())\n\
476 ad1c1e41 Iustin Pop
               \           for op in decoded]\n\
477 aed2325f Iustin Pop
               \print serializer.Dump(encoded)" serialized
478 aed2325f Iustin Pop
     >>= checkPythonResult
479 ad1c1e41 Iustin Pop
  let deserialised =
480 ad1c1e41 Iustin Pop
        J.decode py_stdout::J.Result [(String, OpCodes.MetaOpCode)]
481 aed2325f Iustin Pop
  decoded <- case deserialised of
482 aed2325f Iustin Pop
               J.Ok ops -> return ops
483 aed2325f Iustin Pop
               J.Error msg ->
484 aed2325f Iustin Pop
                 HUnit.assertFailure ("Unable to decode opcodes: " ++ msg)
485 aed2325f Iustin Pop
                 -- this already raised an expection, but we need it
486 aed2325f Iustin Pop
                 -- for proper types
487 aed2325f Iustin Pop
                 >> fail "Unable to decode opcodes"
488 aed2325f Iustin Pop
  HUnit.assertEqual "Mismatch in number of returned opcodes"
489 ad1c1e41 Iustin Pop
    (length decoded) (length with_sum)
490 aed2325f Iustin Pop
  mapM_ (uncurry (HUnit.assertEqual "Different result after encoding/decoding")
491 ad1c1e41 Iustin Pop
        ) $ zip decoded with_sum
492 aed2325f Iustin Pop
493 d1ac695f Iustin Pop
-- | Custom HUnit test case that forks a Python process and checks
494 d1ac695f Iustin Pop
-- correspondence between Haskell OpCodes fields and their Python
495 d1ac695f Iustin Pop
-- equivalent.
496 d1ac695f Iustin Pop
case_py_compat_fields :: HUnit.Assertion
497 d1ac695f Iustin Pop
case_py_compat_fields = do
498 d1ac695f Iustin Pop
  let hs_fields = sort $ map (\op_id -> (op_id, OpCodes.allOpFields op_id))
499 d1ac695f Iustin Pop
                         OpCodes.allOpIDs
500 d1ac695f Iustin Pop
  py_stdout <-
501 d1ac695f Iustin Pop
     runPython "from ganeti import opcodes\n\
502 d1ac695f Iustin Pop
               \import sys\n\
503 d1ac695f Iustin Pop
               \from ganeti import serializer\n\
504 d1ac695f Iustin Pop
               \fields = [(k, sorted([p[0] for p in v.OP_PARAMS]))\n\
505 d1ac695f Iustin Pop
               \           for k, v in opcodes.OP_MAPPING.items()]\n\
506 d1ac695f Iustin Pop
               \print serializer.Dump(fields)" ""
507 d1ac695f Iustin Pop
     >>= checkPythonResult
508 d1ac695f Iustin Pop
  let deserialised = J.decode py_stdout::J.Result [(String, [String])]
509 d1ac695f Iustin Pop
  py_fields <- case deserialised of
510 d1ac695f Iustin Pop
                 J.Ok v -> return $ sort v
511 d1ac695f Iustin Pop
                 J.Error msg ->
512 d1ac695f Iustin Pop
                   HUnit.assertFailure ("Unable to decode op fields: " ++ msg)
513 d1ac695f Iustin Pop
                   -- this already raised an expection, but we need it
514 d1ac695f Iustin Pop
                   -- for proper types
515 d1ac695f Iustin Pop
                   >> fail "Unable to decode op fields"
516 d1ac695f Iustin Pop
  HUnit.assertEqual "Mismatch in number of returned opcodes"
517 d1ac695f Iustin Pop
    (length hs_fields) (length py_fields)
518 d1ac695f Iustin Pop
  HUnit.assertEqual "Mismatch in defined OP_IDs"
519 d1ac695f Iustin Pop
    (map fst hs_fields) (map fst py_fields)
520 d1ac695f Iustin Pop
  mapM_ (\((py_id, py_flds), (hs_id, hs_flds)) -> do
521 d1ac695f Iustin Pop
           HUnit.assertEqual "Mismatch in OP_ID" py_id hs_id
522 d1ac695f Iustin Pop
           HUnit.assertEqual ("Mismatch in fields for " ++ hs_id)
523 d1ac695f Iustin Pop
             py_flds hs_flds
524 d1ac695f Iustin Pop
        ) $ zip py_fields hs_fields
525 d1ac695f Iustin Pop
526 4a826364 Iustin Pop
-- | Checks that setOpComment works correctly.
527 4a826364 Iustin Pop
prop_setOpComment :: OpCodes.MetaOpCode -> String -> Property
528 4a826364 Iustin Pop
prop_setOpComment op comment =
529 4a826364 Iustin Pop
  let (OpCodes.MetaOpCode common _) = OpCodes.setOpComment comment op
530 4a826364 Iustin Pop
  in OpCodes.opComment common ==? Just comment
531 4a826364 Iustin Pop
532 f56013fd Iustin Pop
-- | Tests wrong tag object building (cluster takes only jsnull, the
533 f56013fd Iustin Pop
-- other take a string, so we test the opposites).
534 f56013fd Iustin Pop
case_TagObject_fail :: Assertion
535 f56013fd Iustin Pop
case_TagObject_fail =
536 f56013fd Iustin Pop
  mapM_ (\(t, j) -> assertEqual (show t ++ "/" ++ J.encode j) Nothing $
537 f56013fd Iustin Pop
                    tagObjectFrom t j)
538 f56013fd Iustin Pop
    [ (TagTypeCluster,  J.showJSON "abc")
539 f56013fd Iustin Pop
    , (TagTypeInstance, J.JSNull)
540 f56013fd Iustin Pop
    , (TagTypeNode,     J.JSNull)
541 f56013fd Iustin Pop
    , (TagTypeGroup,    J.JSNull)
542 95e00de7 Hrvoje Ribicic
    , (TagTypeNetwork,  J.JSNull)
543 f56013fd Iustin Pop
    ]
544 f56013fd Iustin Pop
545 f56013fd Iustin Pop
-- | Tests wrong (negative) disk index.
546 f56013fd Iustin Pop
prop_mkDiskIndex_fail :: QuickCheck.Positive Int -> Property
547 f56013fd Iustin Pop
prop_mkDiskIndex_fail (Positive i) =
548 f56013fd Iustin Pop
  case mkDiskIndex (negate i) of
549 f56013fd Iustin Pop
    Bad msg -> printTestCase "error message " $
550 f56013fd Iustin Pop
               "Invalid value" `isPrefixOf` msg
551 f56013fd Iustin Pop
    Ok v -> failTest $ "Succeeded to build disk index '" ++ show v ++
552 f56013fd Iustin Pop
                       "' from negative value " ++ show (negate i)
553 f56013fd Iustin Pop
554 f56013fd Iustin Pop
-- | Tests a few invalid 'readRecreateDisks' cases.
555 f56013fd Iustin Pop
case_readRecreateDisks_fail :: Assertion
556 f56013fd Iustin Pop
case_readRecreateDisks_fail = do
557 f56013fd Iustin Pop
  assertBool "null" $
558 f56013fd Iustin Pop
    isJsonError (J.readJSON J.JSNull::J.Result RecreateDisksInfo)
559 f56013fd Iustin Pop
  assertBool "string" $
560 f56013fd Iustin Pop
    isJsonError (J.readJSON (J.showJSON "abc")::J.Result RecreateDisksInfo)
561 f56013fd Iustin Pop
562 f56013fd Iustin Pop
-- | Tests a few invalid 'readDdmOldChanges' cases.
563 f56013fd Iustin Pop
case_readDdmOldChanges_fail :: Assertion
564 f56013fd Iustin Pop
case_readDdmOldChanges_fail = do
565 f56013fd Iustin Pop
  assertBool "null" $
566 f56013fd Iustin Pop
    isJsonError (J.readJSON J.JSNull::J.Result DdmOldChanges)
567 f56013fd Iustin Pop
  assertBool "string" $
568 f56013fd Iustin Pop
    isJsonError (J.readJSON (J.showJSON "abc")::J.Result DdmOldChanges)
569 f56013fd Iustin Pop
570 f56013fd Iustin Pop
-- | Tests a few invalid 'readExportTarget' cases.
571 f56013fd Iustin Pop
case_readExportTarget_fail :: Assertion
572 f56013fd Iustin Pop
case_readExportTarget_fail = do
573 f56013fd Iustin Pop
  assertBool "null" $
574 f56013fd Iustin Pop
    isJsonError (J.readJSON J.JSNull::J.Result ExportTarget)
575 f56013fd Iustin Pop
  assertBool "int" $
576 f56013fd Iustin Pop
    isJsonError (J.readJSON (J.showJSON (5::Int))::J.Result ExportTarget)
577 f56013fd Iustin Pop
578 aed2325f Iustin Pop
testSuite "OpCodes"
579 20bc5360 Iustin Pop
            [ 'prop_serialization
580 20bc5360 Iustin Pop
            , 'case_AllDefined
581 d1ac695f Iustin Pop
            , 'case_py_compat_types
582 d1ac695f Iustin Pop
            , 'case_py_compat_fields
583 4a826364 Iustin Pop
            , 'prop_setOpComment
584 f56013fd Iustin Pop
            , 'case_TagObject_fail
585 f56013fd Iustin Pop
            , 'prop_mkDiskIndex_fail
586 f56013fd Iustin Pop
            , 'case_readRecreateDisks_fail
587 f56013fd Iustin Pop
            , 'case_readDdmOldChanges_fail
588 f56013fd Iustin Pop
            , 'case_readExportTarget_fail
589 aed2325f Iustin Pop
            ]