Skip to content

Commit 4049e92

Browse files
authored
test: e2e (#9)
1 parent 056c63f commit 4049e92

File tree

14 files changed

+375
-10
lines changed

14 files changed

+375
-10
lines changed

.github/workflows/ci.yml

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,10 @@ jobs:
7272
protoc --version
7373
- name: Install wasm-opt
7474
run: cargo install wasm-opt --locked
75+
- name: Install cosmwasm-check
76+
run: cargo install cosmwasm-check --locked
7577
- name: WASM release build
76-
run: RUSTFLAGS="-C link-arg=-s" cargo wasm --locked
77-
- name: Optimize WASM artifacts
78-
run: |
79-
mkdir artifacts
80-
for f in target/wasm32-unknown-unknown/release/*.wasm; do
81-
wasm-opt -Os "$f" -o "artifacts/$(basename "$f")"
82-
done
78+
run: make build-opt
8379
- name: Generate checksums
8480
run: |
8581
cd artifacts
@@ -108,12 +104,48 @@ jobs:
108104
sudo apt-get install -y protobuf-compiler
109105
protoc --version
110106
- name: Install cargo-tarpaulin
111-
run: cargo +1.82.0 install cargo-tarpaulin
107+
run: cargo +1.90.0 install cargo-tarpaulin
112108
- name: Run coverage
113-
run: cargo +1.82.0 tarpaulin --workspace --all-features --all-targets --locked --out Xml --output-dir coverage
109+
run: cargo +1.90.0 tarpaulin --workspace --all-features --all-targets --locked --out Xml --output-dir coverage
114110
- name: Upload coverage reports to Codecov
115111
uses: codecov/codecov-action@v5
116112
with:
117113
token: ${{ secrets.CODECOV_TOKEN }}
118114
files: coverage/cobertura.xml
119115
fail_ci_if_error: true
116+
117+
e2e:
118+
name: E2E
119+
runs-on: ubuntu-latest
120+
needs: fmt_lint
121+
steps:
122+
- uses: actions/checkout@v4
123+
with:
124+
submodules: recursive
125+
- name: Set up Docker Compose
126+
uses: docker/setup-buildx-action@v2
127+
- name: Install test deps
128+
run: |
129+
sudo apt-get update
130+
sudo apt-get install -y bats jq
131+
bats --version
132+
jq --version
133+
- name: Install toolchain
134+
uses: dtolnay/rust-toolchain@stable
135+
with:
136+
toolchain: ${{ env.RUST_VERSION }}
137+
targets: wasm32-unknown-unknown
138+
- name: Install protoc
139+
run: |
140+
sudo apt-get update
141+
sudo apt-get install -y protobuf-compiler
142+
protoc --version
143+
- name: Install wasm-opt
144+
run: cargo install wasm-opt --locked
145+
- name: Install cosmwasm-check
146+
run: cargo install cosmwasm-check --locked
147+
- name: E2E test
148+
run: bats e2e/tests/converter.bats
149+
- name: Cleanup
150+
if: always()
151+
run: docker compose -f e2e/docker-compose.yml down -v

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/target
22
.idea/
3+
artifacts/

.gitmodules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[submodule "e2e/test_helper/bats-support"]
2+
path = e2e/test_helper/bats-support
3+
url = https://github.com/bats-core/bats-support
4+
[submodule "e2e/test_helper/bats-assert"]
5+
path = e2e/test_helper/bats-assert
6+
url = https://github.com/bats-core/bats-assert

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ resolver = "2"
66

77
[workspace.package]
88
version = "0.1.0"
9+
rust-version = "1.86.0"
910

1011
[workspace.dependencies]
1112
bech32 = "0.11"

Makefile

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
MAKEFLAGS += --no-print-directory
2+
3+
e2e-chain-up:
4+
@echo "--> Starting e2e test blockchain environment"
5+
@docker compose -f e2e/docker-compose.yml up -d --wait
6+
7+
e2e-chain-down:
8+
@echo "--> Stopping e2e test blockchain environment"
9+
@docker compose -f e2e/docker-compose.yml down -v
10+
11+
.PHONY: e2e-chain-up e2e-chain-down
12+
13+
#### Build ####
14+
15+
build:
16+
@echo "--> Building contracts"
17+
@cargo wasm
18+
19+
build-opt:
20+
@echo "--> Checking for protoc installation"
21+
@$(MAKE) check-protoc
22+
@echo "--> Checking for wasm-opt installation"
23+
@$(MAKE) check-wasm-opt
24+
@echo "--> Checking for cosmwasm-check installation"
25+
@$(MAKE) check-cosmwasm-check
26+
@echo "--> Building optimized contracts"
27+
@RUSTFLAGS="-C link-arg=-s" cargo wasm --locked
28+
@echo "--> Optimizing wasm binaries"
29+
@mkdir -p ./artifacts/
30+
@for f in target/wasm32-unknown-unknown/release/*.wasm; do wasm-opt -Os "$$f" -o "artifacts/$$(basename "$$f")"; done
31+
@echo "--> Optimized wasm binaries are in the ./artifacts/ directory"
32+
@echo "--> Running cosmwasm-check on optimized binaries"
33+
@for f in artifacts/*.wasm; do cosmwasm-check "$$f"; done
34+
35+
clean:
36+
@echo "--> Cleaning build artifacts"
37+
@cargo clean
38+
39+
check-protoc:
40+
@command -v protoc >/dev/null 2>&1 || { echo "protoc not found; install with: sudo apt install protobuf-compiler (or your distro's package)"; exit 1; }
41+
42+
check-wasm-opt:
43+
@command -v wasm-opt >/dev/null 2>&1 || { echo "wasm-opt not found; install with: sudo apt install binaryen (or your distro's package)"; exit 1; }
44+
45+
check-cosmwasm-check:
46+
@command -v cosmwasm-check >/dev/null 2>&1 || { echo "cosmwasm-check not found; install with: cargo install cosmwasm-check"; exit 1; }
47+
48+
.PHONY: build clean build-opt check-protoc check-wasm-opt check-cosmwasm-check

contracts/converter/src/msg.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ pub enum QueryMsg {
2525
}
2626

2727
#[cw_serde]
28-
pub enum MigrateMsg {}
28+
pub enum MigrateMsg {
29+
Migrate {},
30+
}
2931

3032
// TODO: Write a macro to generate this struct from the Config struct
3133
#[cw_serde]

e2e/.env

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
KEY="user1"
2+
KEY2="user2"
3+
ADDR1="manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct"
4+
ADDR2="manifest1efd63aw40lxf3n4mhf7dzhjkr453axurm6rp3z"
5+
VESTING_ADDR="manifest1yyuzq9665yjmmhnmfn7zsajnyz9lcdelggf6ke"
6+
CHAIN_ID="test-1"
7+
MONIKER="zebradonkey"
8+
KEYRING="test"
9+
HOME_DIR="/persistent/.manifest"
10+
BINARY="/usr/bin/manifestd"
11+
MNEMO1="decorate bright ozone fork gallery riot bus exhaust worth way bone indoor calm squirrel merry zero scheme cotton until shop any excess stage laundry"
12+
MNEMO2="wealth flavor believe regret funny network recall kiss grape useless pepper cram hint member few certain unveil rather brick bargain curious require crowd raise"
13+
BANK_ADDR=manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct
14+
GAS_STATION_ADDR=manifest1efd63aw40lxf3n4mhf7dzhjkr453axurm6rp3z
15+
RPC="26657"
16+
REST="1317"
17+
PROFF="6060"
18+
P2P="26656"
19+
GRPC="9090"
20+
GRPC_WEB="9091"
21+
ROSETTA="8080"
22+
TIMEOUT_COMMIT="3s"
23+
VOTING_TIMEOUT="10s"
24+
DENOM=umfx
25+
BOND_DENOM=upoa
26+
POA_ADMIN_ADDRESS="manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct"
27+
USER_GROUP_ADDRESS="manifest1dlszg2sst9r69my4f84l3mj66zxcf3umcgujys30t84srg95dgvsmxrlcr"
28+
COMMON_MANIFESTD_ARGS="--gas-prices 0.0011${DENOM} --gas-adjustment 1.8 --gas auto --home ${HOME_DIR} --keyring-backend $KEYRING --chain-id $CHAIN_ID --yes --node http://manifest-ledger:$RPC"
29+
GROUP_MEMBERS={"members":[{"address":"${ADDR1}","weight":"1","metadata":"user1"},{"address":"${ADDR2}","weight":"1","metadata":"user2"}]}
30+
DECISION_POLICY={"@type":"/cosmos.group.v1.ThresholdDecisionPolicy","threshold":"1","windows":{"voting_period":"10s","min_execution_period":"0s"}}
31+
TX_COUNT_DIR=/tx-count
32+
TX_COUNT_FILE=tx-count.txt
33+
TX_COUNT_PATH="${TX_COUNT_DIR}/${TX_COUNT_FILE}"
34+
POSTGREST_HOST=postgrest
35+
CONVERT_WASM_ADDRESS="manifest14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s4zfs7u"

e2e/docker-compose.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
services:
2+
manifest-ledger:
3+
image: ghcr.io/manifest-network/manifest-ledger:1.0.11
4+
volumes:
5+
- manifest-ledger-bin:/usr/bin
6+
- manifest-ledger-data:/persistent
7+
- ./scripts/init_manifest_ledger.sh:/usr/local/bin/init_manifest_ledger.sh:ro
8+
- ../:/workspace:ro
9+
ports:
10+
- "9090:9090"
11+
- "26657:26657"
12+
entrypoint: ["/bin/bash", "-c"]
13+
env_file: ./.env
14+
command: /usr/local/bin/init_manifest_ledger.sh
15+
healthcheck:
16+
test: manifestd status | grep '"earliest_block_height":"1"'
17+
interval: 10s
18+
timeout: 5s
19+
retries: 5
20+
21+
volumes:
22+
manifest-ledger-bin:
23+
manifest-ledger-data:
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/usr/bin/env bash
2+
# This script initializes the manifest ledger genesis file and starts a ledger node
3+
4+
set -e
5+
6+
update_test_genesis () {
7+
cat $HOME_DIR/config/genesis.json | jq "$1" > $HOME_DIR/config/tmp_genesis.json && mv $HOME_DIR/config/tmp_genesis.json $HOME_DIR/config/genesis.json
8+
}
9+
10+
echo "$MNEMO1" | $BINARY keys add "$KEY" --home="$HOME_DIR" --keyring-backend "$KEYRING" --recover
11+
echo "$MNEMO2" | $BINARY keys add "$KEY2" --home="$HOME_DIR" --keyring-backend "$KEYRING" --recover
12+
$BINARY init $MONIKER --home=$HOME_DIR --chain-id $CHAIN_ID
13+
update_test_genesis '.consensus["params"]["block"]["max_gas"]="1000000000"'
14+
update_test_genesis '.app_state["bank"]["denom_metadata"]=[{"base":"umfx","denom_units":[{"aliases":[],"denom":"umfx","exponent":0},{"aliases":[],"denom":"MFX","exponent":6}],"description":"MFX","display":"MFX","name":"MFX","symbol":"MFX","uri":"","uri_hash":""}]'
15+
update_test_genesis '.app_state["gov"]["params"]["min_deposit"]=[{"denom":"'$DENOM'","amount":"1000000"}]'
16+
update_test_genesis '.app_state["gov"]["params"]["voting_period"]="15s"'
17+
update_test_genesis '.app_state["gov"]["params"]["expedited_voting_period"]="10s"'
18+
update_test_genesis '.app_state["staking"]["params"]["bond_denom"]="'${BOND_DENOM}'"'
19+
update_test_genesis '.app_state["staking"]["params"]["min_commission_rate"]="0.000000000000000000"'
20+
update_test_genesis '.app_state["mint"]["params"]["mint_denom"]="'$DENOM'"'
21+
update_test_genesis '.app_state["mint"]["params"]["blocks_per_year"]="6311520"'
22+
update_test_genesis '.app_state["tokenfactory"]["params"]["denom_creation_fee"]=[]'
23+
update_test_genesis '.app_state["tokenfactory"]["params"]["denom_creation_gas_consume"]=0'
24+
update_test_genesis '.app_state["feegrant"]["allowances"]=[{"granter":"'${GAS_STATION_ADDR}'","grantee":"'${BANK_ADDR}'","allowance":{"@type":"/cosmos.feegrant.v1beta1.AllowedMsgAllowance","allowance":{"@type":"/cosmos.feegrant.v1beta1.BasicAllowance","spend_limit":[],"expiration":null},"allowed_messages":["/cosmos.bank.v1beta1.MsgSend"]}}]'
25+
update_test_genesis '.app_state["group"]["group_seq"]="1"'
26+
update_test_genesis '.app_state["group"]["groups"]=[{"id":"1","admin":"'${POA_ADMIN_ADDRESS}'","metadata":"AQ==","version":"2","total_weight":"2","created_at":"2024-05-16T15:10:54.372190727Z"}]'
27+
update_test_genesis '.app_state["group"]["group_members"]=[{"group_id":"1","member":{"address":"'${ADDR1}'","weight":"1","metadata":"user1","added_at":"2024-05-16T15:10:54.372190727Z"}},{"group_id":"1","member":{"address":"'${ADDR2}'","weight":"1","metadata":"user2","added_at":"2024-05-16T15:10:54.372190727Z"}}]'
28+
update_test_genesis '.app_state["group"]["group_policy_seq"]="1"'
29+
update_test_genesis '.app_state["group"]["group_policies"]=[{"address":"'${POA_ADMIN_ADDRESS}'","group_id":"1","admin":"'${POA_ADMIN_ADDRESS}'","metadata":"AQ==","version":"2","decision_policy":{"@type":"/cosmos.group.v1.ThresholdDecisionPolicy","threshold":"1","windows":{"voting_period":"'${VOTING_TIMEOUT}'","min_execution_period":"0s"}},"created_at":"2024-05-16T15:10:54.372190727Z"}]'
30+
update_test_genesis '.app_state["tokenfactory"]["factory_denoms"]=[{"denom":"factory/manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj/upwr","authority_metadata":{"admin":"manifest1hj5fveer5cjtn4wd6wstzugjfdxzl0xp8ws9ct"}}]'
31+
update_test_genesis '.app_state["bank"]["denom_metadata"] |= . + [{"description":"PWR","denom_units":[{"denom":"factory/manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj/upwr","exponent":0,"aliases":["PWR"]},{"denom":"PWR","exponent":6,"aliases":["factory/manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj/upwr"]}],"base":"factory/manifest1afk9zr2hn2jsac63h4hm60vl9z3e5u69gndzf7c99cqge3vzwjzsfmy9qj/upwr","display":"PWR","name":"POWER","symbol":"PWR","uri":"","uri_hash":""}]'
32+
update_test_genesis '.app_state["wasm"]["params"]["code_upload_access"]["permission"]="Everybody"'
33+
update_test_genesis '.app_state["wasm"]["params"]["instantiate_default_permission"]="Everybody"'
34+
$BINARY genesis add-genesis-account $KEY 100000000000000000${BOND_DENOM},100000000000000000000000000000${DENOM} --keyring-backend $KEYRING --home=$HOME_DIR
35+
$BINARY genesis add-genesis-account $KEY2 100000000000000000${DENOM} --keyring-backend $KEYRING --home=$HOME_DIR
36+
$BINARY genesis gentx $KEY 1000000${BOND_DENOM} --keyring-backend $KEYRING --home=$HOME_DIR --chain-id $CHAIN_ID --commission-rate=0.0 --commission-max-rate=1.0 --commission-max-change-rate=0.1
37+
$BINARY genesis collect-gentxs --home=$HOME_DIR
38+
$BINARY genesis validate-genesis --home=$HOME_DIR
39+
sed -i 's/laddr = "tcp:\/\/127.0.0.1:26657"/laddr = "tcp:\/\/0.0.0.0:'$RPC'"/g' $HOME_DIR/config/config.toml
40+
sed -i 's/cors_allowed_origins = \[\]/cors_allowed_origins = \["\*"\]/g' $HOME_DIR/config/config.toml
41+
sed -i 's/address = "tcp:\/\/localhost:1317"/address = "tcp:\/\/0.0.0.0:'$REST'"/g' $HOME_DIR/config/app.toml
42+
sed -i 's/enable = false/enable = true/g' $HOME_DIR/config/app.toml
43+
sed -i 's/pprof_laddr = "localhost:6060"/pprof_laddr = "localhost:'$PROFF'"/g' $HOME_DIR/config/config.toml
44+
sed -i 's/laddr = "tcp:\/\/0.0.0.0:26656"/laddr = "tcp:\/\/0.0.0.0:'$P2P'"/g' $HOME_DIR/config/config.toml
45+
sed -i 's/address = "localhost:9090"/address = "0.0.0.0:'$GRPC'"/g' $HOME_DIR/config/app.toml
46+
sed -i 's/address = "localhost:9091"/address = "0.0.0.0:'$GRPC_WEB'"/g' $HOME_DIR/config/app.toml
47+
sed -i 's/address = ":8080"/address = "0.0.0.0:'$ROSETTA'"/g' $HOME_DIR/config/app.toml
48+
sed -i 's/timeout_commit = "5s"/timeout_commit = "'$TIMEOUT_COMMIT'"/g' $HOME_DIR/config/config.toml
49+
POA_ADMIN_ADDRESS=${POA_ADMIN_ADDRESS} $BINARY start --home=${HOME_DIR} --pruning=nothing --minimum-gas-prices=0.0011${DENOM} --rpc.laddr="tcp://0.0.0.0:$RPC"

e2e/test_helper/bats-assert

Submodule bats-assert added at f1e9280

0 commit comments

Comments
 (0)