Skip to content

Commit

Permalink
Problem: query with iavl legacy iterator is not tested
Browse files Browse the repository at this point in the history
  • Loading branch information
mmsqe committed Dec 13, 2024
1 parent 4ec2a30 commit d3162ae
Show file tree
Hide file tree
Showing 6 changed files with 267 additions and 87 deletions.
34 changes: 34 additions & 0 deletions integration_tests/configs/cosmovisor_recent.jsonnet
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
local config = import 'default.jsonnet';

config {
'cronos_777-1'+: {
'app-config'+: {
'app-db-backend': 'rocksdb',
'iavl-lazy-loading':: super['iavl-lazy-loading'],
},
validators: [super.validators[0] {
'app-config'+: {
store: {
streamers: ['versiondb'],
memiavl:: super.memiavl,
versiondb:: super.versiondb,
},
},
}] + super.validators[1:],
genesis+: {
consensus_params: {
block: {
max_bytes: '1048576',
max_gas: '81500000',
},
},
app_state+: {
gov+: {
params+: {
expedited_voting_period:: super['expedited_voting_period'],
},
},
},
},
},
}
26 changes: 26 additions & 0 deletions integration_tests/configs/upgrade-test-package-recent.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
let
pkgs = import ../../nix { };
fetchFlake =
repo: rev:
(pkgs.flake-compat {
src = {
outPath = builtins.fetchTarball "https://github.com/${repo}/archive/${rev}.tar.gz";
inherit rev;
shortRev = builtins.substring 0 7 rev;
};
}).defaultNix;
# release/v1.3.x
releasedGenesis =
(fetchFlake "crypto-org-chain/cronos" "e1d819c862b30f0ce978baf2addb12516568639e").default;
current = pkgs.callPackage ../../. { };
in
pkgs.linkFarm "upgrade-test-package" [
{
name = "genesis";
path = releasedGenesis;
}
{
name = "v1.4";
path = current;
}
]
17 changes: 17 additions & 0 deletions integration_tests/contracts/contracts/CheckpointOracle.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

contract CheckpointOracle {
mapping(address => bool) admins;
address[] adminList;
uint64 sectionIndex;
uint height;
bytes32 hash;
uint sectionSize;
uint processConfirms;
uint threshold;

function VotingThreshold() public view returns (uint) {
return threshold;
}
}
93 changes: 7 additions & 86 deletions integration_tests/test_upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,18 @@
import pytest
import requests
from pystarport import ports
from pystarport.cluster import SUPERVISOR_CONFIG_FILE

from .network import Cronos, setup_custom_cronos
from .utils import (
ADDRS,
CONTRACTS,
approve_proposal,
assert_gov_params,
deploy_contract,
edit_ini_sections,
do_upgrade,
get_consensus_params,
get_send_enable,
post_init,
send_transaction,
wait_for_block,
wait_for_new_blocks,
wait_for_port,
)
Expand All @@ -44,42 +42,6 @@ def get_txs(base_port, end):
return res


def init_cosmovisor(home):
"""
build and setup cosmovisor directory structure in each node's home directory
"""
cosmovisor = home / "cosmovisor"
cosmovisor.mkdir()
(cosmovisor / "upgrades").symlink_to("../../../upgrades")
(cosmovisor / "genesis").symlink_to("./upgrades/genesis")


def post_init(path, base_port, config):
"""
prepare cosmovisor for each node
"""
chain_id = "cronos_777-1"
data = path / chain_id
cfg = json.loads((data / "config.json").read_text())
for i, _ in enumerate(cfg["validators"]):
home = data / f"node{i}"
init_cosmovisor(home)

edit_ini_sections(
chain_id,
data / SUPERVISOR_CONFIG_FILE,
lambda i, _: {
"command": f"cosmovisor run start --home %(here)s/node{i}",
"environment": (
"DAEMON_NAME=cronosd,"
"DAEMON_SHUTDOWN_GRACE=1m,"
"UNSAFE_SKIP_BACKUP=true,"
f"DAEMON_HOME=%(here)s/node{i}"
),
},
)


def setup_cronos_test(tmp_path_factory):
path = tmp_path_factory.mktemp("upgrade")
port = 26200
Expand Down Expand Up @@ -163,52 +125,11 @@ def exec(c, tmp_path_factory):
wait_for_port(ports.evmrpc_port(base_port))
wait_for_new_blocks(cli, 1)

def do_upgrade(plan_name, target, mode=None):
print(f"upgrade {plan_name} height: {target}")
if plan_name == "v1.4.0-rc5-testnet":
rsp = cli.software_upgrade(
"community",
{
"name": plan_name,
"title": "upgrade test",
"note": "ditto",
"upgrade-height": target,
"summary": "summary",
"deposit": "10000basetcro",
},
)
assert rsp["code"] == 0, rsp["raw_log"]
approve_proposal(c, rsp["events"])
else:
rsp = cli.gov_propose_legacy(
"community",
"software-upgrade",
{
"name": plan_name,
"title": "upgrade test",
"description": "ditto",
"upgrade-height": target,
"deposit": "10000basetcro",
},
mode=mode,
)
assert rsp["code"] == 0, rsp["raw_log"]
approve_proposal(c, rsp["logs"][0]["events"])

# update cli chain binary
c.chain_binary = (
Path(c.chain_binary).parent.parent.parent / f"{plan_name}/bin/cronosd"
)
# block should pass the target height
wait_for_block(c.cosmos_cli(), target + 2, timeout=480)
wait_for_port(ports.rpc_port(base_port))
return c.cosmos_cli()

# test migrate keystore
cli.migrate_keystore()
height = cli.block_height()
target_height0 = height + 15
cli = do_upgrade("v1.1.0", target_height0, "block")
cli = do_upgrade(c, "v1.1.0", target_height0, "block")
check_basic_tx(c)

height = cli.block_height()
Expand All @@ -231,7 +152,7 @@ def do_upgrade(plan_name, target, mode=None):
)
print("old values", old_height, old_balance, old_base_fee)

cli = do_upgrade("v1.2", target_height1)
cli = do_upgrade(c, "v1.2", target_height1)
check_basic_tx(c)

# deploy contract should still work
Expand Down Expand Up @@ -287,11 +208,11 @@ def do_upgrade(plan_name, target, mode=None):

height = cli.block_height()
txs = get_txs(base_port, height)
cli = do_upgrade("v1.3", height + 15)
cli = do_upgrade(c, "v1.3", height + 15)
assert txs == get_txs(base_port, height)

gov_param = cli.query_params("gov")
cli = do_upgrade("v1.4", cli.block_height() + 15)
cli = do_upgrade(c, "v1.4", cli.block_height() + 15)

assert_evm_params(cli, e0, target_height0 - 1)
assert_evm_params(cli, e1, target_height1 - 1)
Expand All @@ -302,7 +223,7 @@ def do_upgrade(plan_name, target, mode=None):
cli.query_params("icaauth")
assert_gov_params(cli, gov_param)

cli = do_upgrade("v1.4.0-rc5-testnet", cli.block_height() + 15)
cli = do_upgrade(c, "v1.4.0-rc5-testnet", cli.block_height() + 15)
check_basic_tx(c)


Expand Down
101 changes: 101 additions & 0 deletions integration_tests/test_upgrade_recent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import shutil
import stat
import subprocess
from concurrent.futures import ThreadPoolExecutor, as_completed
from contextlib import contextmanager
from pathlib import Path

import pytest
import requests
from pystarport import ports

from .network import setup_custom_cronos
from .utils import CONTRACTS, deploy_contract, do_upgrade, post_init

pytestmark = pytest.mark.upgrade


@pytest.fixture(scope="module")
def custom_cronos(tmp_path_factory):
yield from setup_cronos_test(tmp_path_factory)


def get_txs(base_port, end):
port = ports.rpc_port(base_port)
res = []
for h in range(1, end):
url = f"http://127.0.0.1:{port}/block_results?height={h}"
res.append(requests.get(url).json().get("result")["txs_results"])
return res


def setup_cronos_test(tmp_path_factory):
path = tmp_path_factory.mktemp("upgrade")
port = 27100
nix_name = "upgrade-test-package-recent"
cfg_name = "cosmovisor_recent"
configdir = Path(__file__).parent
cmd = [
"nix-build",
configdir / f"configs/{nix_name}.nix",
]
print(*cmd)
subprocess.run(cmd, check=True)

# copy the content so the new directory is writable.
upgrades = path / "upgrades"
shutil.copytree("./result", upgrades)
mod = stat.S_IRWXU
upgrades.chmod(mod)
for d in upgrades.iterdir():
d.chmod(mod)

# init with genesis binary
with contextmanager(setup_custom_cronos)(
path,
port,
configdir / f"configs/{cfg_name}.jsonnet",
post_init=post_init,
chain_binary=str(upgrades / "genesis/bin/cronosd"),
) as cronos:
yield cronos


def call(port, params):
url = f"http://127.0.0.1:{ports.evmrpc_port(port)}"
rsp = requests.post(url, json=params)
assert rsp.status_code == 200
return rsp.json()


def call_check(c, address):
batch = 10
concurrent = 10
base_port = c.base_port(0)
param = {
"jsonrpc": "2.0",
"method": "eth_call",
"params": [
{
"data": "0x0be5b6ba",
"to": address,
},
"latest",
],
"id": 1,
}
params = []
for _ in range(batch):
params.append(param)
with ThreadPoolExecutor(concurrent) as executor:
tasks = [executor.submit(call, base_port, params) for _ in range(0, concurrent)]
results = [future.result() for future in as_completed(tasks)]
assert len(results) == concurrent


def test_cosmovisor_upgrade(custom_cronos):
c = custom_cronos
cli = c.cosmos_cli()
cli = do_upgrade(c, "v1.4", cli.block_height() + 15)
res = deploy_contract(c.w3, CONTRACTS["CheckpointOracle"])
[call_check(c, res.address) for _ in range(10)]
Loading

0 comments on commit d3162ae

Please sign in to comment.