Skip to content

Commit

Permalink
farming rpc test (#1217)
Browse files Browse the repository at this point in the history
* farming rpc test

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* add to CI

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* fix totalSupply

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* adjust test order

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update block number

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* add to Calamari CI

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update block to 1000

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* log

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* more log

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* log block number

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* delay 12 second

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update 13s

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* block

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update state

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update block number

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update timeout

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* new block

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* adjust test order

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* update timeout

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* revert order

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* global referedum index

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* wait 5 block in governance

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* split farming test CI

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* trigger ÇI

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* add to calamari CI

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

* sleep 2 min

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>

---------

Signed-off-by: zqhxuyuan <zqhxuyuan@gmail.com>
  • Loading branch information
zqhxuyuan committed Jul 20, 2023
1 parent e82ca14 commit b965066
Show file tree
Hide file tree
Showing 8 changed files with 495 additions and 43 deletions.
27 changes: 27 additions & 0 deletions .github/workflows/integration_test_calamari.yml
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,33 @@ jobs:
with:
name: ${{ matrix.chain-spec.id }}-alice-stress.log
path: ${{ github.workspace }}/polkadot-launch/9921.log
- name: launch testnet
run: |
cd ${{ github.workspace }}/polkadot-launch
yarn install
yarn build
pm2 start dist/cli.js \
--name polkadot-launch \
--output ${{ github.workspace }}/polkadot-launch-for-${{ matrix.chain-spec.id }}-stdout.log \
--error ${{ github.workspace }}/polkadot-launch-for-${{ matrix.chain-spec.id }}-stderr.log \
--no-autorestart \
-- $HOME/.local/share/calamari-pc/${{ matrix.chain-spec.id }}-${GITHUB_SHA:0:7}-launch-config.json
- name: run farming test
run: |
sleep 120
cd ${{ github.workspace }}/Manta/tests
yarn install
yarn
yarn test_farming --address=ws://127.0.0.1:9921 --exit
- name: stop testnet
run: |
cd ${{ github.workspace }}/polkadot-launch
pm2 stop polkadot-launch
- if: always()
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.chain-spec.id }}-alice-stress.log
path: ${{ github.workspace }}/polkadot-launch/9921.log
docker-image-test:
timeout-minutes: 120
if: contains(github.event.pull_request.labels.*.name, 'A-calamari' || github.ref == 'refs/heads/manta')
Expand Down
27 changes: 27 additions & 0 deletions .github/workflows/integration_test_manta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,33 @@ jobs:
with:
name: ${{ matrix.chain-spec.id }}-alice-stress.log
path: ${{ github.workspace }}/polkadot-launch/9921.log
- name: launch testnet
run: |
cd ${{ github.workspace }}/polkadot-launch
yarn install
yarn build
pm2 start dist/cli.js \
--name polkadot-launch \
--output ${{ github.workspace }}/polkadot-launch-for-${{ matrix.chain-spec.id }}-stdout.log \
--error ${{ github.workspace }}/polkadot-launch-for-${{ matrix.chain-spec.id }}-stderr.log \
--no-autorestart \
-- $HOME/.local/share/calamari-pc/${{ matrix.chain-spec.id }}-${GITHUB_SHA:0:7}-launch-config.json
- name: run farming test
run: |
sleep 720
cd ${{ github.workspace }}/Manta/tests
yarn install
yarn
yarn test_farming --address=ws://127.0.0.1:9921 --exit
- name: stop testnet
run: |
cd ${{ github.workspace }}/polkadot-launch
pm2 stop polkadot-launch
- if: always()
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.chain-spec.id }}-alice-stress.log
path: ${{ github.workspace }}/polkadot-launch/9921.log
docker-image-test:
timeout-minutes: 120
if: contains(github.event.pull_request.labels.*.name, 'A-manta' || github.ref == 'refs/heads/manta')
Expand Down
111 changes: 111 additions & 0 deletions tests/chain-util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import {ApiPromise} from "@polkadot/api";
import {KeyringPair} from "@polkadot/keyring/types";
import {blake2AsHex} from "@polkadot/util-crypto";
import {BN} from "@polkadot/util";

export const timer = (ms: number) => new Promise(res => setTimeout(res, ms))

// Global referendum index
var referendumIndexObject = { referendumIndex: 0 };

/**
* Execute an extrinsic with Root origin via governance.
* @param api API object connecting to node.
* @param keyring keyring to sign extrinsics.
* @param extrinsicData the callData of the extrinsic that will be executed
*/
export async function execute_with_root_via_governance(
api: ApiPromise,
keyring: KeyringPair,
extrinsicData: any,
) {
const encodedCallData = extrinsicData.method.toHex();
await api.tx.preimage.notePreimage(encodedCallData).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade preimage noted ...");
let encodedCallDataHash = blake2AsHex(encodedCallData);
let externalProposeDefault = await api.tx.democracy.externalProposeDefault({
Legacy: {
hash: encodedCallDataHash
}
});
const encodedExternalProposeDefault = externalProposeDefault.method.toHex();
await api.tx.council.propose(1, encodedExternalProposeDefault, encodedExternalProposeDefault.length).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade governance proposed ...");
let fastTrackCall = await api.tx.democracy.fastTrack(encodedCallDataHash, 1, 1);
await api.tx.technicalCommittee.propose(1, fastTrackCall, fastTrackCall.encodedLength).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade governance fast tracked ...");
const parachainId = Number(await api.query.parachainInfo.parachainId());
let balance = new BN("1000000000000"); // Calamari: 12
if (parachainId != 2084) {
balance = new BN("1000000000000000000"); // Manta: 18
}
await api.tx.democracy.vote(referendumIndexObject.referendumIndex, {
Standard: { balance, vote: { aye: true, conviction: 1 } },
}).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade governance voted on ...");
referendumIndexObject.referendumIndex++;
}

export async function execute_via_governance(
api: ApiPromise,
keyring: KeyringPair,
extrinsicData: any,
) {
const encodedCallData = extrinsicData.method.toHex();
await api.tx.preimage.notePreimage(encodedCallData).signAndSend(keyring, {nonce: -1});

let encodedCallDataHash = blake2AsHex(encodedCallData);
let externalProposeDefault = await api.tx.democracy.externalProposeDefault({
Legacy: {
hash: encodedCallDataHash
}
});
const encodedExternalProposeDefault = externalProposeDefault.method.toHex();
await api.tx.council.propose(1, encodedExternalProposeDefault, encodedExternalProposeDefault.length).signAndSend(keyring, {nonce: -1});

let fastTrackCall = await api.tx.democracy.fastTrack(encodedCallDataHash, 3, 2);
await api.tx.technicalCommittee.propose(1, fastTrackCall, fastTrackCall.encodedLength).signAndSend(keyring, {nonce: -1});

// vote balance based on current network
const parachainId = Number(await api.query.parachainInfo.parachainId());
let balance = new BN("1000000000000"); // Calamari: 12
if (parachainId != 2084) {
balance = new BN("1000000000000000000"); // Manta: 18
}

await api.tx.democracy.vote(referendumIndexObject.referendumIndex, {
Standard: { balance, vote: { aye: true, conviction: 1 } },
}).signAndSend(keyring, {nonce: -1});
referendumIndexObject.referendumIndex++;

// time passing 5 block.
let block1 = Number(await api.query.system.number());
let block2 = Number(await api.query.system.number()) + 5;
while(block1 != block2) {
await timer(3000);
block1 = Number(await api.query.system.number());
}
}

export async function execute_transaction(
api: ApiPromise,
alice: KeyringPair,
extrinsicData: any,
sudo: boolean = true
) {
if (sudo) {
const rootCall = api.tx.sudo.sudo(extrinsicData);
await rootCall.signAndSend(alice, {nonce: -1}, async ({ events = [], status, txHash, dispatchError }) => {
if (dispatchError) {
console.log(`sudo extrinsic has error: ${dispatchError.toString()}`);
}
});
} else {
// @ts-ignore
await extrinsicData.signAndSend(alice, {nonce: -1}, async ({ events = [], status, txHash, dispatchError }) => {
if (dispatchError) {
console.log(`extrinsic has error: ${dispatchError.toString()}, hex:${extrinsicData.toHex()}`);
}
});
}
}
43 changes: 3 additions & 40 deletions tests/manta_pay.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { ApiPromise } from '@polkadot/api';
import { KeyringPair } from '@polkadot/keyring/types';
import { blake2AsHex } from "@polkadot/util-crypto";
import { u8aToHex, numberToU8a } from '@polkadot/util';
import { single_map_storage_key, double_map_storage_key, delay, HashType } from './test-util';
import {execute_with_root_via_governance} from "./chain-util";

// number of shards at MantaPay
export const manta_pay_config = {
Expand Down Expand Up @@ -76,8 +76,6 @@ function generate_batched_utxos(per_shard_amount: number, checkpoint: Array<numb
return {data: data, checkpoint: new_checkpoint};
}

var referendumIndexObject = { referendumIndex: 0 };

/**
* Insert utxos in batches
* @param api api object connecting to node.
Expand Down Expand Up @@ -106,7 +104,7 @@ async function insert_utxos_in_batches(
const {data, checkpoint} = generate_batched_utxos(per_shard_amount, cur_checkpoint);
cur_checkpoint = checkpoint;
const callData = api.tx.system.setStorage(data);
await execute_with_root_via_governance(api, keyring, callData, referendumIndexObject);
await execute_with_root_via_governance(api, keyring, callData);
await delay(5000);
}

Expand Down Expand Up @@ -163,7 +161,7 @@ async function insert_void_numbers_in_batch(
console.log("start vn batch %i", batch_idx);
const data = generate_vn_insertion_data(sender_idx, amount_per_batch);
const callData = api.tx.system.setStorage(data);
await execute_with_root_via_governance(api, keyring, callData, referendumIndexObject);
await execute_with_root_via_governance(api, keyring, callData);
sender_idx += amount_per_batch;
await delay(5000);
}
Expand Down Expand Up @@ -218,38 +216,3 @@ export async function setup_storage(
const vn_batch_done = await insert_void_numbers_in_batch(api, keyring, config.vn_batch_size, config.vn_batch_number, 0, 250);
console.log(">>>> Complete inserting %i void numbers", vn_batch_done * config.vn_batch_size);
}

/**
* Execute an extrinsic with Root origin via governance.
* @param api API object connecting to node.
* @param keyring keyring to sign extrinsics.
* @param extrinsicData the callData of the extrinsic that will be executed
* @param referendumIndexObject the index of the referendum that will be executed
*/
export async function execute_with_root_via_governance(
api: ApiPromise,
keyring: KeyringPair,
extrinsicData: any,
referendumIndexObject: any
) {
const encodedCallData = extrinsicData.method.toHex();
await api.tx.preimage.notePreimage(encodedCallData).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade preimage noted ...");
let encodedCallDataHash = blake2AsHex(encodedCallData);
let externalProposeDefault = await api.tx.democracy.externalProposeDefault({
Legacy: {
hash: encodedCallDataHash
}
});
const encodedExternalProposeDefault = externalProposeDefault.method.toHex();
await api.tx.council.propose(1, encodedExternalProposeDefault, encodedExternalProposeDefault.length).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade governance proposed ...");
let fastTrackCall = await api.tx.democracy.fastTrack(encodedCallDataHash, 1, 1);
await api.tx.technicalCommittee.propose(1, fastTrackCall, fastTrackCall.encodedLength).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade governance fast tracked ...");
await api.tx.democracy.vote(referendumIndexObject.referendumIndex, {
Standard: { balance: 1_000_000_000_000, vote: { aye: true, conviction: 1 } },
}).signAndSend(keyring, {nonce: -1});
console.log("Runtime upgrade governanceZ voted on ...");
referendumIndexObject.referendumIndex++;
}
1 change: 1 addition & 0 deletions tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"stress_benchmark_test": "mocha -r ts-node/register stress_benchmark_test.ts",
"runtime_upgrade_test": "mocha -r ts-node/register runtime_upgrade_test.ts",
"parachain_lease_test": "mocha -r ts-node/register check_parachain_lease_expiration.ts",
"test_farming": "mocha -r ts-node/register test-farming.ts",
"lint": "eslint ."
},
"keywords": [],
Expand Down
5 changes: 2 additions & 3 deletions tests/runtime_upgrade_test.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { ApiPromise, WsProvider } from '@polkadot/api';
import { Keyring } from '@polkadot/keyring';
import { manta_pay_types, rpc_api } from './types';
import {execute_with_root_via_governance } from './manta_pay';
import { delay } from './test-util';
import { assert } from 'chai';
import minimist, { ParsedArgs } from 'minimist';
import { blake2AsHex } from "@polkadot/util-crypto";
import * as fs from 'fs';
import {execute_with_root_via_governance} from "./chain-util";

const test_config = {
ws_address: "ws://127.0.0.1:9801",
Expand Down Expand Up @@ -40,8 +40,7 @@ describe('Node RPC Test', () => {
const code = fs.readFileSync('calamari.wasm').toString('hex');
let codeHash = blake2AsHex(`0x${code}`);
const authorizeUpgradeCallData = api.tx.parachainSystem.authorizeUpgrade(codeHash);
var referendumIndexObject = { referendumIndex: 0 };
execute_with_root_via_governance(api, aliceKeyPair, authorizeUpgradeCallData, referendumIndexObject);
execute_with_root_via_governance(api, aliceKeyPair, authorizeUpgradeCallData);
await delay(60000);
api.tx.parachainSystem.enactAuthorizedUpgrade(`0x${code}`).signAndSend(aliceKeyPair, {nonce: -1});
await delay(120000);
Expand Down
Loading

0 comments on commit b965066

Please sign in to comment.