Skip to content

Commit 86dd876

Browse files
add test cases demonstrating key collisions
1 parent 3011ac5 commit 86dd876

File tree

1 file changed

+194
-1
lines changed

1 file changed

+194
-1
lines changed

sdk/daml-script/test/daml/upgrades/dev/ContractKeys.daml

Lines changed: 194 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@ import qualified V1.ChangedMaintainersExpr as V1
1818
import qualified V2.ChangedMaintainersExpr as V2
1919
import qualified V1.UpgradedContractKeys as V1
2020
import qualified V2.UpgradedContractKeys as V2
21+
import qualified V1.InvalidKeyUpgrade as V1
22+
import qualified V2.InvalidKeyUpgrade as V2
23+
import qualified V1.InvalidKeyRenaming as V1
24+
import qualified V2.InvalidKeyRenaming as V2
2125
import qualified V1.ContractKeyPresence as V1
2226
import qualified V2.ContractKeyPresence as V2
2327
import qualified V1.IfaceMod as Iface
28+
import qualified V1.KeyUpgradeClient as Client
2429

2530
{- PACKAGE
2631
name: contract-key-upgrades-iface
@@ -107,14 +112,26 @@ main = tests
107112
]
108113
]
109114
]
110-
, subtree "Changed key type"
115+
, subtree "Changed key type, valid upgrade"
111116
[ subtree "Unchanged key value (modulo trailing `None`s)"
112117
[ ("queryContractKey, src=v1 tgt=v2", queryKeyUpgraded)
113118
, ("exerciseByKeyCmd, src=v1 tgt=v2", exerciseCmdKeyUpgraded)
114119
, ("fetch, src=v1 tgt=v2", fetchKeyUpgraded)
115120
, ("exerciseByKey, src=v1 tgt=v2", exerciseUpdateKeyUpgraded)
116121
]
117122
]
123+
, subtree "Changed key type, invalid upgrade"
124+
[ broken ("queryContractKeyCmd, global", queryInvalidKeyUpgradeGlobal)
125+
, broken ("exerciseByKeyCmd, global", exerciseInvalidKeyUpgradeGlobal)
126+
, broken ("fetch, local", fetchInvalidKeyUpgradeLocal)
127+
, broken ("exerciseByKey, local", exerciseInvalidKeyUpgradeLocal)
128+
]
129+
, subtree "Renamed key label, invalid upgrade"
130+
[ broken ("queryContractKeyCmd, global", queryInvalidKeyRenamingGlobal)
131+
, broken ("exerciseByKeyCmd, global", exerciseInvalidKeyRenamingGlobal)
132+
, broken ("fetch, local", fetchInvalidKeyRenamingLocal)
133+
, broken ("exerciseByKey, local", exerciseInvalidKeyRenamingLocal)
134+
]
118135
, subtree "Changed key presence"
119136
[ subtree "Key in v1, no key in v2"
120137
[ ("fetch", fetchTemplateWithUnexpectedKey)
@@ -666,6 +683,182 @@ exerciseUpdateKeyUpgraded = test $ do
666683
res <- a `submit` createAndExerciseCmd (V2.UpgradedKeyHelper a) (V2.UpgradedKeyExercise $ V2.UpgradedKeyKey a 1 None)
667684
res === "V2"
668685

686+
{- MODULE
687+
package: contract-key-upgrades
688+
contents: |
689+
module InvalidKeyUpgrade where
690+
691+
data InvalidKeyUpgradeKey = InvalidKeyUpgradeKey with
692+
p : Party
693+
n : Int -- @V 1
694+
n : Bool -- @V 2
695+
deriving (Eq, Show)
696+
697+
template InvalidKeyUpgrade
698+
with
699+
party : Party
700+
where
701+
signatory party
702+
key (InvalidKeyUpgradeKey party 0) : InvalidKeyUpgradeKey -- @V 1
703+
key (InvalidKeyUpgradeKey party False) : InvalidKeyUpgradeKey -- @V 2
704+
maintainer key.p
705+
706+
choice InvalidKeyUpgradeCall : Text
707+
controller party
708+
do pure (show (key this).n)
709+
-}
710+
711+
{- MODULE
712+
package: contract-key-upgrades
713+
contents: |
714+
module InvalidKeyRenaming where
715+
716+
data InvalidKeyRenamingKey = InvalidKeyRenamingKey with
717+
p : Party
718+
n : Int -- @V 1
719+
m : Int -- @V 2
720+
deriving (Eq, Show)
721+
722+
template InvalidKeyRenaming
723+
with
724+
party : Party
725+
where
726+
signatory party
727+
key (InvalidKeyRenamingKey party 42) : InvalidKeyRenamingKey
728+
maintainer key.p
729+
730+
choice InvalidKeyRenamingCall : Int
731+
controller party
732+
do
733+
pure (key this).n -- @V 1
734+
pure (key this).m -- @V 2
735+
-}
736+
737+
{- PACKAGE
738+
name: contract-key-upgrades-client
739+
versions: 1
740+
depends: |
741+
contract-key-upgrades-1.0.0
742+
contract-key-upgrades-2.0.0
743+
-}
744+
745+
{- MODULE
746+
package: contract-key-upgrades-client
747+
contents: |
748+
module KeyUpgradeClient where
749+
750+
import V1.InvalidKeyUpgrade as V1
751+
import V2.InvalidKeyUpgrade as V2
752+
import V1.InvalidKeyRenaming as V1
753+
import V2.InvalidKeyRenaming as V2
754+
755+
template KeyUpgradeClient
756+
with
757+
party : Party
758+
where
759+
signatory party
760+
761+
-- InvalidKeyUpgrade
762+
763+
choice InvalidKeyUpgradeFetch : (ContractId V2.InvalidKeyUpgrade, V2.InvalidKeyUpgrade)
764+
controller party
765+
do
766+
cid <- create (V1.InvalidKeyUpgrade party)
767+
fetchByKey (V2.InvalidKeyUpgradeKey party False)
768+
769+
choice InvalidKeyUpgradeExercise : Text
770+
controller party
771+
do
772+
cid <- create (V1.InvalidKeyUpgrade party)
773+
exerciseByKey @V2.InvalidKeyUpgrade (V2.InvalidKeyUpgradeKey party False) V2.InvalidKeyUpgradeCall
774+
775+
-- InvalidKeyRenaming
776+
777+
choice InvalidKeyRenamingFetch : (ContractId V2.InvalidKeyRenaming, V2.InvalidKeyRenaming)
778+
controller party
779+
do
780+
cid <- create (V1.InvalidKeyRenaming party)
781+
fetchByKey (V2.InvalidKeyRenamingKey party 42)
782+
783+
choice InvalidKeyRenamingExercise : Int
784+
controller party
785+
do
786+
cid <- create (V1.InvalidKeyRenaming party)
787+
exerciseByKey @V2.InvalidKeyRenaming (V2.InvalidKeyRenamingKey party 42) V2.InvalidKeyRenamingCall
788+
-}
789+
790+
-- InvalidKeyUpgrade
791+
792+
queryInvalidKeyUpgradeGlobal : Test
793+
queryInvalidKeyUpgradeGlobal = test $ do
794+
a <- allocateParty "alice"
795+
cid <- a `submit` createExactCmd (V1.InvalidKeyUpgrade a)
796+
keyRes <- queryContractKey @V2.InvalidKeyUpgrade a $ V2.InvalidKeyUpgradeKey a False
797+
case keyRes of
798+
None -> pure ()
799+
_ -> assertFail ("Expected None (key not found), but got: " <> show keyRes)
800+
801+
exerciseInvalidKeyUpgradeGlobal : Test
802+
exerciseInvalidKeyUpgradeGlobal = test $ do
803+
a <- allocateParty "alice"
804+
cid <- a `submit` createExactCmd (V1.InvalidKeyUpgrade a)
805+
res <- a `trySubmit` exerciseByKeyExactCmd @V2.InvalidKeyUpgrade (V2.InvalidKeyUpgradeKey a False) V2.InvalidKeyUpgradeCall
806+
case res of
807+
Left (ContractKeyNotFound _) -> pure ()
808+
_ -> assertFail ("Expected ContractKeyNotFound, but got: " <> show res)
809+
810+
fetchInvalidKeyUpgradeLocal : Test
811+
fetchInvalidKeyUpgradeLocal = test $ do
812+
a <- allocateParty "alice"
813+
res <- a `trySubmit` createAndExerciseCmd (Client.KeyUpgradeClient a) Client.InvalidKeyUpgradeFetch
814+
case res of
815+
Left (ContractKeyNotFound _) -> pure ()
816+
_ -> assertFail ("Expected ContractKeyNotFound, but got: " <> show res)
817+
818+
exerciseInvalidKeyUpgradeLocal : Test
819+
exerciseInvalidKeyUpgradeLocal = test $ do
820+
a <- allocateParty "alice"
821+
res <- a `trySubmit` createAndExerciseCmd (Client.KeyUpgradeClient a) Client.InvalidKeyUpgradeExercise
822+
case res of
823+
Left (ContractKeyNotFound _) -> pure ()
824+
_ -> assertFail ("Expected ContractKeyNotFound, but got: " <> show res)
825+
826+
-- InvalidKeyRenaming
827+
828+
queryInvalidKeyRenamingGlobal : Test
829+
queryInvalidKeyRenamingGlobal = test $ do
830+
a <- allocateParty "alice"
831+
cid <- a `submit` createExactCmd (V1.InvalidKeyRenaming a)
832+
keyRes <- queryContractKey @V2.InvalidKeyRenaming a $ V2.InvalidKeyRenamingKey a 42
833+
case keyRes of
834+
None -> pure ()
835+
_ -> assertFail ("Expected None (key not found), but got: " <> show keyRes)
836+
837+
exerciseInvalidKeyRenamingGlobal : Test
838+
exerciseInvalidKeyRenamingGlobal = test $ do
839+
a <- allocateParty "alice"
840+
cid <- a `submit` createExactCmd (V1.InvalidKeyRenaming a)
841+
res <- a `trySubmit` exerciseByKeyExactCmd @V2.InvalidKeyRenaming (V2.InvalidKeyRenamingKey a 42) V2.InvalidKeyRenamingCall
842+
case res of
843+
Left (ContractKeyNotFound _) -> pure ()
844+
_ -> assertFail ("Expected ContractKeyNotFound, but got: " <> show res)
845+
846+
fetchInvalidKeyRenamingLocal : Test
847+
fetchInvalidKeyRenamingLocal = test $ do
848+
a <- allocateParty "alice"
849+
res <- a `trySubmit` createAndExerciseCmd (Client.KeyUpgradeClient a) Client.InvalidKeyRenamingFetch
850+
case res of
851+
Left (ContractKeyNotFound _) -> pure ()
852+
_ -> assertFail ("Expected ContractKeyNotFound, but got: " <> show res)
853+
854+
exerciseInvalidKeyRenamingLocal : Test
855+
exerciseInvalidKeyRenamingLocal = test $ do
856+
a <- allocateParty "alice"
857+
res <- a `trySubmit` createAndExerciseCmd (Client.KeyUpgradeClient a) Client.InvalidKeyRenamingExercise
858+
case res of
859+
Left (ContractKeyNotFound _) -> pure ()
860+
_ -> assertFail ("Expected ContractKeyNotFound, but got: " <> show res)
861+
669862
{- MODULE
670863
package: contract-key-upgrades
671864
contents: |

0 commit comments

Comments
 (0)