Add AMB monitor e2e tests (#231)
* Add amb monitor e2e tests * Fix eventsStats endpoint monitor
This commit is contained in:
parent
db89d1c12e
commit
5d770e8607
18
e2e-commons/components-envs/monitor-amb.env
Normal file
18
e2e-commons/components-envs/monitor-amb.env
Normal file
@ -0,0 +1,18 @@
|
||||
COMMON_HOME_RPC_URL=http://parity1:8545
|
||||
COMMON_FOREIGN_RPC_URL=http://parity2:8545
|
||||
COMMON_HOME_BRIDGE_ADDRESS=0x0AEe1FCD12dDFab6265F7f8956e6E012A9Fe4Aa0
|
||||
COMMON_FOREIGN_BRIDGE_ADDRESS=0x0AEe1FCD12dDFab6265F7f8956e6E012A9Fe4Aa0
|
||||
MONITOR_HOME_START_BLOCK=0
|
||||
MONITOR_FOREIGN_START_BLOCK=0
|
||||
MONITOR_VALIDATOR_HOME_TX_LIMIT=300000
|
||||
COMMON_HOME_GAS_PRICE_SUPPLIER_URL=https://gasprice.poa.network/
|
||||
COMMON_HOME_GAS_PRICE_SPEED_TYPE=standard
|
||||
COMMON_HOME_GAS_PRICE_FALLBACK=1000000000
|
||||
COMMON_HOME_GAS_PRICE_FACTOR=1
|
||||
MONITOR_VALIDATOR_FOREIGN_TX_LIMIT=300000
|
||||
COMMON_FOREIGN_GAS_PRICE_SUPPLIER_URL=https://gasprice.poa.network/
|
||||
COMMON_FOREIGN_GAS_PRICE_SPEED_TYPE=standard
|
||||
COMMON_FOREIGN_GAS_PRICE_FALLBACK=1000000000
|
||||
COMMON_FOREIGN_GAS_PRICE_FACTOR=1
|
||||
MONITOR_TX_NUMBER_THRESHOLD=100
|
||||
MONITOR_PORT=3013
|
@ -41,7 +41,8 @@
|
||||
"home": "0x0AEe1FCD12dDFab6265F7f8956e6E012A9Fe4Aa0",
|
||||
"foreign": "0x0AEe1FCD12dDFab6265F7f8956e6E012A9Fe4Aa0",
|
||||
"homeBox": "0x6C4EaAb8756d53Bf599FFe2347FAFF1123D6C8A1",
|
||||
"foreignBox": "0x6C4EaAb8756d53Bf599FFe2347FAFF1123D6C8A1"
|
||||
"foreignBox": "0x6C4EaAb8756d53Bf599FFe2347FAFF1123D6C8A1",
|
||||
"monitor": "http://monitor-amb:3013"
|
||||
},
|
||||
"homeRPC": {
|
||||
"URL": "http://parity1:8545",
|
||||
|
@ -132,6 +132,17 @@ services:
|
||||
- "3012:3012"
|
||||
networks:
|
||||
- ultimate
|
||||
monitor-amb:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: monitor/Dockerfile
|
||||
args:
|
||||
DOT_ENV_PATH: e2e-commons/components-envs/monitor-amb.env
|
||||
entrypoint: yarn check-and-start
|
||||
ports:
|
||||
- "3013:3013"
|
||||
networks:
|
||||
- ultimate
|
||||
e2e:
|
||||
build:
|
||||
context: ..
|
||||
|
@ -46,7 +46,7 @@ while [ "$1" != "" ]; do
|
||||
fi
|
||||
|
||||
if [ "$1" == "monitor" ]; then
|
||||
docker-compose up -d monitor monitor-erc20 monitor-erc20-native
|
||||
docker-compose up -d monitor monitor-erc20 monitor-erc20-native monitor-amb
|
||||
fi
|
||||
|
||||
if [ "$1" == "native-to-erc" ]; then
|
||||
|
@ -3,4 +3,5 @@ while true; do
|
||||
docker-compose -f ../e2e-commons/docker-compose.yml exec monitor yarn check-all
|
||||
docker-compose -f ../e2e-commons/docker-compose.yml exec monitor-erc20 yarn check-all
|
||||
docker-compose -f ../e2e-commons/docker-compose.yml exec monitor-erc20-native yarn check-all
|
||||
docker-compose -f ../e2e-commons/docker-compose.yml exec monitor-amb yarn check-all
|
||||
done
|
||||
|
128
monitor-e2e/test/amb.js
Normal file
128
monitor-e2e/test/amb.js
Normal file
@ -0,0 +1,128 @@
|
||||
const assert = require('assert')
|
||||
const axios = require('axios')
|
||||
const { amb, user, foreignRPC, homeRPC, validator } = require('../../e2e-commons/constants.json')
|
||||
const { waitUntil, sendAMBMessage, addValidator } = require('../utils')
|
||||
|
||||
const baseUrl = amb.monitor
|
||||
|
||||
describe('AMB', () => {
|
||||
describe('balances', async () => {
|
||||
let data
|
||||
|
||||
before(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}`))
|
||||
})
|
||||
|
||||
describe('home', async () => {
|
||||
it('should contain toForeign:', () => assert(data.home.toForeign === 0))
|
||||
it('should contain fromForeign', () => assert(data.home.fromForeign === 0))
|
||||
})
|
||||
|
||||
describe('foreign', async () => {
|
||||
it('should contain fromHome:', () => assert(data.foreign.fromHome === 0))
|
||||
it('should contain toHome', () => assert(data.foreign.toHome === 0))
|
||||
})
|
||||
|
||||
describe('general', async () => {
|
||||
it('should contain fromHomeToForeignDiff', () => assert(data.fromHomeToForeignDiff === 0))
|
||||
it('should contain fromForeignToHomeDiff', () => assert(data.fromForeignToHomeDiff === 0))
|
||||
it('should contain lastChecked', () => assert(data.lastChecked >= 0))
|
||||
it('should contain timeDiff', () => assert(data.timeDiff >= 0))
|
||||
it('should contain lastChecked', () => assert(data.lastChecked >= 0))
|
||||
})
|
||||
})
|
||||
describe('validators', async () => {
|
||||
let data
|
||||
|
||||
before(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}/validators`))
|
||||
})
|
||||
|
||||
it('home', () => {
|
||||
assert(typeof data.home.validators === 'object')
|
||||
assert(data.home.validators[validator.address].balance > 0)
|
||||
assert(data.home.validators[validator.address].leftTx > 0)
|
||||
assert(data.home.validators[validator.address].gasPrice > 0)
|
||||
})
|
||||
|
||||
it('foreign', () => {
|
||||
assert(typeof data.foreign.validators === 'object')
|
||||
assert(data.foreign.validators[validator.address].balance > 0)
|
||||
assert(data.foreign.validators[validator.address].leftTx > 0)
|
||||
assert(data.foreign.validators[validator.address].gasPrice > 0)
|
||||
})
|
||||
|
||||
it('requiredSignaturesMatch', () => assert(data.requiredSignaturesMatch, 1))
|
||||
it('validatorsMatch', () => assert(data.validatorsMatch))
|
||||
it('lastChecked', () => assert(data.lastChecked >= 0))
|
||||
it('timeDiff', () => assert(data.timeDiff >= 0))
|
||||
it('homeOk', () => assert(data.homeOk))
|
||||
it('foreignOk', () => assert(data.foreignOk))
|
||||
it('ok', () => assert(data.ok))
|
||||
})
|
||||
describe('eventsStats', async () => {
|
||||
let data
|
||||
|
||||
before(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}/eventsStats`))
|
||||
})
|
||||
|
||||
it('ok', () => assert(data.ok))
|
||||
it('lastChecked', () => assert(data.lastChecked >= 0))
|
||||
it('timeDiff', () => assert(data.timeDiff >= 0))
|
||||
it('home-deliveredMsgNotProcessedInForeign', () =>
|
||||
assert(typeof data.home.deliveredMsgNotProcessedInForeign === 'object'))
|
||||
it('home-processedMsgNotDeliveredInForeign', () =>
|
||||
assert(typeof data.home.processedMsgNotDeliveredInForeign === 'object'))
|
||||
it('foreign-deliveredMsgNotProcessedInHome', () =>
|
||||
assert(typeof data.foreign.deliveredMsgNotProcessedInHome === 'object'))
|
||||
it('foreign-processedMsgNotDeliveredInHome', () =>
|
||||
assert(typeof data.foreign.processedMsgNotDeliveredInHome === 'object'))
|
||||
})
|
||||
describe('alerts', async () => {
|
||||
let data
|
||||
|
||||
before(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}/alerts`))
|
||||
})
|
||||
|
||||
it('ok', () => assert(data.ok))
|
||||
it('lastChecked', () => assert(data.lastChecked >= 0))
|
||||
it('timeDiff', () => assert(data.timeDiff >= 0))
|
||||
it('executeSignatures', () => assert(typeof data.executeSignatures === 'object'))
|
||||
it('executeAffirmations', () => assert(typeof data.executeAffirmations === 'object'))
|
||||
})
|
||||
describe('changing state of contracts', () => {
|
||||
let data
|
||||
|
||||
before(async () => {
|
||||
assert((await axios.get(`${baseUrl}/validators`)).data.validatorsMatch === true)
|
||||
})
|
||||
|
||||
it('should change fromForeignToHomeDiff', async () => {
|
||||
// send message
|
||||
await sendAMBMessage(foreignRPC.URL, user, amb.foreignBox, amb.foreign, amb.homeBox)
|
||||
|
||||
await waitUntil(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}`))
|
||||
return data.fromForeignToHomeDiff !== 0
|
||||
})
|
||||
})
|
||||
it('should change fromHomeToForeignDiff', async () => {
|
||||
// send message
|
||||
await sendAMBMessage(homeRPC.URL, user, amb.homeBox, amb.home, amb.foreignBox)
|
||||
|
||||
await waitUntil(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}`))
|
||||
return data.fromHomeToForeignDiff !== 0
|
||||
})
|
||||
})
|
||||
it('should change validatorsMatch', async () => {
|
||||
await addValidator(foreignRPC.URL, validator, amb.foreign)
|
||||
await waitUntil(async () => {
|
||||
;({ data } = await axios.get(`${baseUrl}/validators`))
|
||||
return data.validatorsMatch === false
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
@ -1,5 +1,5 @@
|
||||
const Web3 = require('web3')
|
||||
const { ERC677_BRIDGE_TOKEN_ABI, BRIDGE_VALIDATORS_ABI, FOREIGN_NATIVE_TO_ERC_ABI } = require('../commons')
|
||||
const { ERC677_BRIDGE_TOKEN_ABI, BRIDGE_VALIDATORS_ABI, FOREIGN_NATIVE_TO_ERC_ABI, BOX_ABI } = require('../commons')
|
||||
|
||||
const waitUntil = async (predicate, step = 100, timeout = 10000) => {
|
||||
const stopTime = Date.now() + timeout
|
||||
@ -37,6 +37,17 @@ const sendTokens = async (rpcUrl, account, tokenAddress, recipientAddress) => {
|
||||
})
|
||||
}
|
||||
|
||||
const sendAMBMessage = async (rpcUrl, account, boxAddress, bridgeAddress, boxOtherSideAddress) => {
|
||||
const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl))
|
||||
web3.eth.accounts.wallet.add(account.privateKey)
|
||||
const homeBox = new web3.eth.Contract(BOX_ABI, boxAddress)
|
||||
|
||||
await homeBox.methods.setValueOnOtherNetwork(3, bridgeAddress, boxOtherSideAddress).send({
|
||||
from: account.address,
|
||||
gas: '400000'
|
||||
})
|
||||
}
|
||||
|
||||
const addValidator = async (rpcUrl, account, bridgeAddress) => {
|
||||
const web3 = new Web3(new Web3.providers.HttpProvider(rpcUrl))
|
||||
web3.eth.accounts.wallet.add(account.privateKey)
|
||||
@ -53,5 +64,6 @@ module.exports = {
|
||||
waitUntil,
|
||||
sendEther,
|
||||
sendTokens,
|
||||
addValidator
|
||||
addValidator,
|
||||
sendAMBMessage
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ check_files_exist() {
|
||||
(docker-compose -f ../e2e-commons/docker-compose.yml exec monitor /bin/bash -c "$command") || rc=1
|
||||
(docker-compose -f ../e2e-commons/docker-compose.yml exec monitor-erc20 /bin/bash -c "$command") || rc=1
|
||||
(docker-compose -f ../e2e-commons/docker-compose.yml exec monitor-erc20-native /bin/bash -c "$command") || rc=1
|
||||
(docker-compose -f ../e2e-commons/docker-compose.yml exec monitor-amb /bin/bash -c "$command") || rc=1
|
||||
done
|
||||
return $rc
|
||||
}
|
||||
|
@ -77,10 +77,10 @@ app.get('/eventsStats', async (req, res, next) => {
|
||||
try {
|
||||
const results = await readFile('./responses/eventsStats.json')
|
||||
results.ok =
|
||||
results.onlyInHomeDeposits.length === 0 &&
|
||||
results.onlyInForeignDeposits.length === 0 &&
|
||||
results.onlyInHomeWithdrawals.length === 0 &&
|
||||
results.onlyInForeignWithdrawals.length === 0
|
||||
(results.onlyInHomeDeposits || results.home.deliveredMsgNotProcessedInForeign).length === 0 &&
|
||||
(results.onlyInForeignDeposits || results.home.processedMsgNotDeliveredInForeign).length === 0 &&
|
||||
(results.onlyInHomeWithdrawals || results.foreign.deliveredMsgNotProcessedInHome).length === 0 &&
|
||||
(results.onlyInForeignWithdrawals || results.foreign.processedMsgNotDeliveredInHome).length === 0
|
||||
res.json(results)
|
||||
} catch (e) {
|
||||
// this will eventually be handled by your error handling middleware
|
||||
|
Loading…
Reference in New Issue
Block a user