testing dshackle

This commit is contained in:
Maksim Fomenkov
2022-11-09 13:42:34 +03:00
parent 8fcd4febcc
commit 01211c6f47
4 changed files with 125 additions and 903 deletions

View File

@@ -1,47 +1,109 @@
import {describe} from "./grpc-clent";
import {describe, connect, nativeCall} from "./grpc-clent";
import arg from 'arg';
import clc from "cli-color";
import util from "util";
const chains = {
CHAIN_BSC: 1006,
CHAIN_OPTIMISM: 1005,
CHAIN_ARBITRUM: 1004,
CHAIN_MATIC: 1002,
CHAIN_ETHEREUM: 100
}
export function cli(args) {
let opts = parseArgumentsIntoOptions(args);
if (!opts.url) {
console.log("Err: URL not specified!!!")
return
}
describe(opts.url, opts.ca, opts.cert, opts.key, (error, response) => {
if (error) {
console.error(clc.red('Connection to ' + opts.url + ' failed! [' + error.message + ']'));
} else {
console.error(clc.green('Connected to ', opts.url));
if (opts.print) {
console.log(util.inspect(response, false, null, true /* enable colors */));
} else {
response.chains.forEach(function (item) {
var state = item.status.availability;
switch (state) {
case 'AVAIL_OK':
state = clc.green(state);
break
case 'AVAIL_UNKNOWN':
case 'AVAIL_UNAVAILABLE':
state = clc.red(state);
break
default:
state = clc.yellow(state);
}
console.log(item.status.chain + ' -> ' + clc.bold(state))
})
const client = connect(opts.url, opts.ca, opts.cert, opts.key)
describe(client, (error, response) => {
if (error) {
console.error(clc.red('Connection to ' + opts.url + ' failed: ' + error.message));
return
}
console.log(clc.green('Connected to ', opts.url));
if (opts.print) {
console.log(util.inspect(response, false, null, true /* enable colors */));
}
processDescribe(client, response, opts.testRun)
})
}
function processDescribe(client, response, testRun) {
let promises = []
let statuses = new Map()
response.chains.forEach((item) => {
const state = item.status.availability
const chain = item.status.chain
let status = {
state: 'AVAIL_UNKNOWN',
grpc: clc.yellow('UNKNOWN'),
failed: false
}
switch (state) {
case 'AVAIL_OK':
status.state = clc.green(state);
break
case 'AVAIL_UNKNOWN':
case 'AVAIL_UNAVAILABLE':
status.state = clc.red(state);
break
default:
status.state = clc.yellow(state);
}
if (state === 'AVAIL_OK') {
promises.push(nativeCall(client, chains[chain], chain))
} else {
status.failed = true
}
statuses.set(chain, status)
})
Promise.all(promises).then(responses => {
responses.forEach((resp) => {
let status = statuses.get(resp.chain)
if (resp.error) {
status.failed = true
status.grpc = clc.red(resp.error.message)
} else {
if (resp.payload.succeed) {
status.grpc = clc.green('OK')
} else {
status.grpc = clc.red('FAILED')
status.failed = true
}
}
})
let hasError = false
statuses.forEach((status, chain) => {
printState(chain, status)
if (status.failed) {
hasError = true
}
})
if (hasError && testRun) {
process.exit(1)
}
})
}
function printState(chain, status) {
console.log(chain + ' -> ' + "state: " + clc.bold(status.state) + " gRPC: " + clc.bold(status.grpc))
}
function parseArgumentsIntoOptions(rawArgs) {
const args = arg(
{
'--print': Boolean,
'--test-run': Boolean,
'--ca': String,
'--cert': String,
'--key': String,
@@ -53,6 +115,7 @@ function parseArgumentsIntoOptions(rawArgs) {
);
return {
print: args['--print'] || false,
testRun: args['--test-run'] || false,
url: args._[0],
ca: args['--ca'],
cert: args['--cert'],