Verify that updateLocks is idempotent
authorKlaus Aehlig <aehlig@google.com>
Fri, 29 May 2015 16:24:39 +0000 (18:24 +0200)
committerKlaus Aehlig <aehlig@google.com>
Mon, 1 Jun 2015 08:19:24 +0000 (10:19 +0200)
...so that it can be repeated, if necessary.

Signed-off-by: Klaus Aehlig <aehlig@google.com>
Reviewed-by: Petr Pudlak <pudlak@google.com>

test/hs/Test/Ganeti/Locking/Waiting.hs

index 3b5abb2..915f5c5 100644 (file)
@@ -247,6 +247,24 @@ prop_PendingJustified =
   in printTestCase "Pebding requests must be good and not fulfillable"
      . all isJustified . S.toList $ getPendingRequests state
 
+-- | Verify that `updateLocks` is idempotent, except that in the repetition,
+-- no waiters are notified.
+prop_UpdateIdempotent :: Property
+prop_UpdateIdempotent =
+  forAll (arbitrary :: Gen (LockWaiting TestLock TestOwner Integer)) $ \state ->
+  forAll (arbitrary :: Gen TestOwner) $ \owner ->
+  forAll (arbitrary :: Gen [LockRequest TestLock]) $ \req ->
+  let (state', (answer', _)) = updateLocks owner req state
+      (state'', (answer'', nfy)) = updateLocks owner req state'
+  in conjoin [ printTestCase ("repeated updateLocks waiting gave different\
+                              \ answers: " ++ show answer' ++ " /= "
+                              ++ show answer'') $ answer' == answer''
+             , printTestCase "updateLocks not idempotent"
+               $ extRepr state' == extRepr state''
+             , printTestCase ("notifications (" ++ show nfy ++ ") on replay")
+               $ S.null nfy
+             ]
+
 -- | Verify that extRepr . fromExtRepr = id for all valid extensional
 -- representations.
 prop_extReprPreserved :: Property
@@ -352,6 +370,7 @@ testSuite "Locking/Waiting"
  , 'prop_ProgressSound
  , 'prop_PendingJustified
  , 'prop_extReprPreserved
+ , 'prop_UpdateIdempotent
  , 'prop_SimulateUpdateLocks
  , 'prop_SimulateUpdateLocksWaiting
  , 'prop_ReadShow