Skip to content

Commit afd5360

Browse files
add test cases demonstrating key collisions (#22282)
Keys are currently broken in the presence of force-vetted invalid upgrades (or missing incompatible creation package). This PR adds test cases which should result in "key not found" errors but instead either succeed or fail with an upgrade validation error. These tests are therefore marked as broken and should "fail to be broken" once I fix keys.
1 parent a2620d7 commit afd5360

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)