Skip to content

Commit

Permalink
Add new runtime functions tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dimartiro committed Aug 29, 2023
1 parent b765f73 commit 793d80c
Show file tree
Hide file tree
Showing 2 changed files with 231 additions and 4 deletions.
7 changes: 4 additions & 3 deletions lib/runtime/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ package runtime
const (
// v0.9 test API wasm
// This wasm is generated using https://github.com/ChainSafe/polkadot-spec.
HOST_API_TEST_RUNTIME = "hostapi_runtime"
HOST_API_TEST_RUNTIME_FP = "hostapi_runtime.compact.wasm"
HOST_API_TEST_RUNTIME_URL = "https://github.com/ChainSafe/polkadot-spec/raw/master/test/" +
HOST_API_TEST_RUNTIME = "hostapi_runtime"
HOST_API_TEST_RUNTIME_FP = "hostapi_runtime.compact.wasm"
// TODO: change this when https://github.com/ChainSafe/polkadot-spec/pull/17 is merged
HOST_API_TEST_RUNTIME_URL = "https://github.com/dimartiro/polkadot-spec/raw/add-triev1-functions/test/" +
"runtimes/hostapi/hostapi_runtime.compact.wasm"

// v0.9.29 polkadot
Expand Down
228 changes: 227 additions & 1 deletion lib/runtime/wazero/imports_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -554,7 +554,9 @@ func Test_ext_trie_blake2_256_root_version_1(t *testing.T) {
require.NoError(t, err)
encInput[0] = encInput[0] >> 1

res, err := inst.Exec("rtm_ext_trie_blake2_256_root_version_1", encInput)
data := encInput

res, err := inst.Exec("rtm_ext_trie_blake2_256_root_version_1", data)
require.NoError(t, err)

var hash []byte
Expand All @@ -569,6 +571,39 @@ func Test_ext_trie_blake2_256_root_version_1(t *testing.T) {
require.Equal(t, expected[:], hash)
}

// TODO: revisit it
func Test_ext_trie_blake2_256_root_version_2(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

testinput := []string{"dimartiro", "was", "here", "??"}
encInput, err := scale.Marshal(testinput)
require.NoError(t, err)
encInput[0] = encInput[0] >> 1

stateVersion := uint32(trie.V1)
stateVersionBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion)

encVersion, err := scale.Marshal(&stateVersionBytes)
require.NoError(t, err)

data := append(encInput, encVersion...)

res, err := inst.Exec("rtm_ext_trie_blake2_256_root_version_2", data)
require.NoError(t, err)

var hash []byte
err = scale.Unmarshal(res, &hash)
require.NoError(t, err)

tt := trie.NewEmptyTrie()
tt.Put([]byte("dimartiro"), []byte("was"), trie.V1)
tt.Put([]byte("here"), []byte("??"), trie.V1)

expected := tt.MustHash()
require.Equal(t, expected[:], hash)
}

func Test_ext_trie_blake2_256_ordered_root_version_1(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

Expand All @@ -587,6 +622,33 @@ func Test_ext_trie_blake2_256_ordered_root_version_1(t *testing.T) {
require.Equal(t, expected[:], hash)
}

func Test_ext_trie_blake2_256_ordered_root_version_2(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

testvalues := []string{"static", "even-keeled", "Future-proofed"}
encValues, err := scale.Marshal(testvalues)
require.NoError(t, err)

stateVersion := uint32(trie.V1)
stateVersionBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion)

encVersion, err := scale.Marshal(&stateVersionBytes)
require.NoError(t, err)

data := append(encValues, encVersion...)

res, err := inst.Exec("rtm_ext_trie_blake2_256_ordered_root_version_2", data)
require.NoError(t, err)

var hash []byte
err = scale.Unmarshal(res, &hash)
require.NoError(t, err)

expected := common.MustHexToHash("0xd847b86d0219a384d11458e829e9f4f4cce7e3cc2e6dcd0e8a6ad6f12c64a737")
require.Equal(t, expected[:], hash)
}

func Test_ext_trie_blake2_256_verify_proof_version_1(t *testing.T) {
tmp := t.TempDir()
memdb, err := database.NewPebble(tmp, true)
Expand Down Expand Up @@ -679,6 +741,107 @@ func Test_ext_trie_blake2_256_verify_proof_version_1(t *testing.T) {
}
}

func Test_ext_trie_blake2_256_verify_proof_version_2(t *testing.T) {
tmp := t.TempDir()
memdb, err := database.NewPebble(tmp, true)
require.NoError(t, err)

otherTrie := trie.NewEmptyTrie()
otherTrie.Put([]byte("simple"), []byte("cat"), trie.V1)

otherHash, err := otherTrie.Hash()
require.NoError(t, err)

tr := trie.NewEmptyTrie()
tr.Put([]byte("do"), []byte("verb"), trie.V1)
tr.Put([]byte("domain"), []byte("website"), trie.V1)
tr.Put([]byte("other"), []byte("random"), trie.V1)
tr.Put([]byte("otherwise"), []byte("randomstuff"), trie.V1)
tr.Put([]byte("cat"), []byte("another animal"), trie.V1)

err = tr.WriteDirty(memdb)
require.NoError(t, err)

hash, err := tr.Hash()
require.NoError(t, err)

keys := [][]byte{
[]byte("do"),
[]byte("domain"),
[]byte("other"),
[]byte("otherwise"),
[]byte("cat"),
}

root := hash.ToBytes()
otherRoot := otherHash.ToBytes()

allProofs, err := proof.Generate(root, keys, memdb)
require.NoError(t, err)

testcases := map[string]struct {
root, key, value []byte
proof [][]byte
expect bool
}{
"Proof_should_be_true": {
root: root, key: []byte("do"), proof: allProofs, value: []byte("verb"), expect: true},
"Root_empty,_proof_should_be_false": {
root: []byte{}, key: []byte("do"), proof: allProofs, value: []byte("verb"), expect: false},
"Other_root,_proof_should_be_false": {
root: otherRoot, key: []byte("do"), proof: allProofs, value: []byte("verb"), expect: false},
"Value_empty,_proof_should_be_true": {
root: root, key: []byte("do"), proof: allProofs, value: nil, expect: true},
"Unknow_key,_proof_should_be_false": {
root: root, key: []byte("unknow"), proof: allProofs, value: nil, expect: false},
"Key_and_value_unknow,_proof_should_be_false": {
root: root, key: []byte("unknow"), proof: allProofs, value: []byte("unknow"), expect: false},
"Empty_proof,_should_be_false": {
root: root, key: []byte("do"), proof: [][]byte{}, value: nil, expect: false},
}

inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

for name, testcase := range testcases {
testcase := testcase
t.Run(name, func(t *testing.T) {
hashEnc, err := scale.Marshal(testcase.root)
require.NoError(t, err)

args := hashEnc

encProof, err := scale.Marshal(testcase.proof)
require.NoError(t, err)
args = append(args, encProof...)

keyEnc, err := scale.Marshal(testcase.key)
require.NoError(t, err)
args = append(args, keyEnc...)

valueEnc, err := scale.Marshal(testcase.value)
require.NoError(t, err)
args = append(args, valueEnc...)

stateVersion := uint32(trie.V1)
stateVersionBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion)

encVersion, err := scale.Marshal(&stateVersionBytes)
require.NoError(t, err)

args = append(args, encVersion...)

res, err := inst.Exec("rtm_ext_trie_blake2_256_verify_proof_version_2", args)
require.NoError(t, err)

var got bool
err = scale.Unmarshal(res, &got)
require.NoError(t, err)
require.Equal(t, testcase.expect, got)
})
}
}

func Test_ext_misc_runtime_version_version_1(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

Expand Down Expand Up @@ -994,6 +1157,48 @@ func Test_ext_default_child_storage_root_version_1(t *testing.T) {
require.Equal(t, rootHash, actualValue)
}

func Test_ext_default_child_storage_root_version_2(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

err := inst.Context.Storage.SetChild(testChildKey, trie.NewEmptyTrie(), trie.V1)
require.NoError(t, err)

err = inst.Context.Storage.SetChildStorage(testChildKey, testKey, testValue, trie.V1)
require.NoError(t, err)

child, err := inst.Context.Storage.GetChild(testChildKey)
require.NoError(t, err)

rootHash, err := child.Hash()
require.NoError(t, err)

encChildKey, err := scale.Marshal(testChildKey)
require.NoError(t, err)
encKey, err := scale.Marshal(testKey)
require.NoError(t, err)

stateVersion := uint32(trie.V1)
stateVersionBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion)

encVersion, err := scale.Marshal(&stateVersionBytes)
require.NoError(t, err)

data := append(encChildKey, encKey...)
data = append(data, encVersion...)

ret, err := inst.Exec("rtm_ext_default_child_storage_root_version_2", data)
require.NoError(t, err)

var hash []byte
err = scale.Unmarshal(ret, &hash)
require.NoError(t, err)

// Convert decoded interface to common Hash
actualValue := common.BytesToHash(hash)
require.Equal(t, rootHash, actualValue)
}

func Test_ext_default_child_storage_storage_kill_version_1(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

Expand Down Expand Up @@ -1835,6 +2040,27 @@ func Test_ext_storage_root_version_1(t *testing.T) {
require.Equal(t, expected[:], hash)
}

func Test_ext_storage_root_version_2(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

stateVersion := uint32(trie.V1)
stateVersionBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(stateVersionBytes, stateVersion)

encVersion, err := scale.Marshal(&stateVersionBytes)
require.NoError(t, err)

ret, err := inst.Exec("rtm_ext_storage_root_version_2", encVersion)
require.NoError(t, err)

var hash []byte
err = scale.Unmarshal(ret, &hash)
require.NoError(t, err)

expected := trie.EmptyHash
require.Equal(t, expected[:], hash)
}

func Test_ext_storage_set_version_1(t *testing.T) {
inst := NewTestInstance(t, runtime.HOST_API_TEST_RUNTIME)

Expand Down

0 comments on commit 793d80c

Please sign in to comment.