235 lines
6.3 KiB
Bash
Executable file
235 lines
6.3 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# integration_testing.sh
|
|
#
|
|
# GitHub Action CI/CD based integration tests for herald.go
|
|
# These are smoke / sanity tests for the server behaving correctly on a "live"
|
|
# system, and looks for reasonable response codes, not specific correct
|
|
# behavior. Those are covered in unit tests.
|
|
#
|
|
# N.B.
|
|
# For the curl based json tests the `id` field existing is needed.
|
|
#
|
|
|
|
# global variables
|
|
|
|
RES=(0)
|
|
FINALRES=0
|
|
# functions
|
|
|
|
|
|
function logical_or {
|
|
for res in ${RES[@]}; do
|
|
if [ $res -eq 1 -o $FINALRES -eq 1 ]; then
|
|
FINALRES=1
|
|
return
|
|
fi
|
|
done
|
|
}
|
|
|
|
function want_got {
|
|
if [ "${WANT}" != "${GOT}" ]; then
|
|
echo "WANT: ${WANT}"
|
|
echo "GOT: ${GOT}"
|
|
RES+=(1)
|
|
else
|
|
RES+=(0)
|
|
fi
|
|
}
|
|
|
|
function want_greater {
|
|
if [ ${WANT} -ge ${GOT} ]; then
|
|
echo "WANT: ${WANT}"
|
|
echo "GOT: ${GOT}"
|
|
RES+=(1)
|
|
else
|
|
RES+=(0)
|
|
fi
|
|
}
|
|
|
|
function test_command_with_want {
|
|
echo $CMD
|
|
GOT=`eval $CMD`
|
|
|
|
want_got
|
|
}
|
|
|
|
# grpc endpoint testing
|
|
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
grpcurl -plaintext -d '{"value": ["@Styxhexenhammer666:2"]}' 127.0.0.1:50051 pb.Hub.Resolve
|
|
| jq .txos[0].txHash | sed 's/"//g'
|
|
EOM
|
|
WANT="VOFP8MQEwps9Oa5NJJQ18WfVzUzlpCjst0Wz3xyOPd4="
|
|
test_command_with_want
|
|
|
|
# GOT=`eval $CMD`
|
|
|
|
#want_got
|
|
|
|
##
|
|
## N.B. This is a degenerate case that takes a long time to run.
|
|
## The runtime should be fixed, but in the meantime, we definitely should
|
|
## ensure this behaves as expected.
|
|
##
|
|
## TODO: Test runtime doesn't exceed worst case.
|
|
##
|
|
|
|
#WANT=806389
|
|
#read -r -d '' CMD <<- EOM
|
|
# grpcurl -plaintext -d '{"value": ["foo"]}' 127.0.0.1:50051 pb.Hub.Resolve | jq .txos[0].height
|
|
#EOM
|
|
# test_command_with_want
|
|
|
|
# json rpc endpoint testing
|
|
|
|
## blockchain.block
|
|
|
|
### blockchain.block.get_chunk
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.block.get_chunk", "params": [0]}'
|
|
| jq .result | sed 's/"//g' | head -c 100
|
|
EOM
|
|
WANT="010000000000000000000000000000000000000000000000000000000000000000000000cc59e59ff97ac092b55e423aa549"
|
|
test_command_with_want
|
|
|
|
### blockchain.block.get_header
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.block.get_header", "params": []}'
|
|
| jq .result.timestamp
|
|
EOM
|
|
WANT=1446058291
|
|
test_command_with_want
|
|
|
|
### blockchain.block.headers
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.block.headers", "params": []}'
|
|
| jq .result.count
|
|
EOM
|
|
WANT=0
|
|
test_command_with_want
|
|
|
|
## blockchain.claimtrie
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.claimtrie.resolve", "params":[{"Data": ["@Styxhexenhammer666:2"]}]}'
|
|
| jq .result.txos[0].tx_hash | sed 's/"//g'
|
|
EOM
|
|
WANT="VOFP8MQEwps9Oa5NJJQ18WfVzUzlpCjst0Wz3xyOPd4="
|
|
test_command_with_want
|
|
|
|
## blockchain.address
|
|
|
|
### blockchain.address.get_balance
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.address.get_balance", "params":[{"Address": "bGqWuXRVm5bBqLvLPEQQpvsNxJ5ubc6bwN"}]}'
|
|
| jq .result.confirmed
|
|
EOM
|
|
WANT=44415602186
|
|
test_command_with_want
|
|
|
|
## blockchain.address.get_history
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.address.get_history", "params":[{"Address": "bGqWuXRVm5bBqLvLPEQQpvsNxJ5ubc6bwN"}]}'
|
|
| jq '.result.confirmed | length'
|
|
EOM
|
|
WANT=82
|
|
test_command_with_want
|
|
|
|
## blockchain.address.listunspent
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.address.listunspent", "params":[{"Address": "bGqWuXRVm5bBqLvLPEQQpvsNxJ5ubc6bwN"}]}'
|
|
| jq '.result | length'
|
|
EOM
|
|
WANT=32
|
|
test_command_with_want
|
|
|
|
# blockchain.scripthash
|
|
|
|
## blockchain.scripthash.get_mempool
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.scripthash.get_mempool", "params":[{"scripthash": "bGqWuXRVm5bBqLvLPEQQpvsNxJ5ubc6bwN"}]}'
|
|
| jq .error | sed 's/"//g'
|
|
EOM
|
|
WANT="encoding/hex: invalid byte: U+0047 'G'"
|
|
test_command_with_want
|
|
|
|
## blockchain.scripthash.get_history
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.scripthash.get_history", "params":[{"scripthash": "bGqWuXRVm5bBqLvLPEQQpvsNxJ5ubc6bwN"}]}'
|
|
| jq .error | sed 's/"//g'
|
|
EOM
|
|
WANT="encoding/hex: invalid byte: U+0047 'G'"
|
|
test_command_with_want
|
|
|
|
## blockchain.scripthash.listunspent
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "blockchain.scripthash.listunspent", "params":[{"scripthash": "bGqWuXRVm5bBqLvLPEQQpvsNxJ5ubc6bwN"}]}'
|
|
| jq .error | sed 's/"//g'
|
|
EOM
|
|
WANT="encoding/hex: invalid byte: U+0047 'G'"
|
|
test_command_with_want
|
|
|
|
## server.banner
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "server.banner", "params":[]}'
|
|
| jq .result | sed 's/"//g'
|
|
EOM
|
|
WANT="You are connected to an 0.107.0 server."
|
|
test_command_with_want
|
|
|
|
## server.version
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "server.version", "params":[]}'
|
|
| jq .result | sed 's/"//g'
|
|
EOM
|
|
WANT="0.107.0"
|
|
test_command_with_want
|
|
|
|
## server.features
|
|
|
|
read -r -d '' CMD <<- EOM
|
|
curl http://127.0.0.1:50002/rpc -s -H "Content-Type: application/json"
|
|
--data '{"id": 1, "method": "server.features", "params":[]}'
|
|
EOM
|
|
WANT='{"result":{"hosts":{},"pruning":"","server_version":"0.107.0","protocol_min":"0.54.0","protocol_max":"0.199.0","genesis_hash":"9c89283ba0f3227f6c03b70216b9f665f0118d5e0fa729cedf4fb34d6a34f463","description":"Herald","payment_address":"","donation_address":"","daily_fee":"1.0","hash_function":"sha256","trending_algorithm":"fast_ar"},"error":null,"id":1}'
|
|
test_command_with_want
|
|
|
|
# metrics endpoint testing
|
|
|
|
WANT=0
|
|
GOT=$(curl http://127.0.0.1:2112/metrics -s | grep requests | grep resolve | awk '{print $NF}')
|
|
want_greater
|
|
|
|
# caclulate return value
|
|
|
|
logical_or $RES
|
|
|
|
if [ $FINALRES -eq 1 ]; then
|
|
echo "Failed!"
|
|
exit 1
|
|
else
|
|
echo "Passed!"
|
|
exit 0
|
|
fi
|