272 lines
10 KiB
Bash
272 lines
10 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Comprehensive Link and Functionality Test for Blockscout Explorer
|
||
|
|
# Tests all navigation, API endpoints, contract addresses, and interactive elements
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
IP="${IP:-192.168.11.140}"
|
||
|
|
DOMAIN="${DOMAIN:-explorer.d-bis.org}"
|
||
|
|
PASSWORD="${PASSWORD:-L@kers2010}"
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
CYAN='\033[0;36m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||
|
|
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
|
||
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||
|
|
log_test() { echo -e "${CYAN}[TEST]${NC} $1"; }
|
||
|
|
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "Explorer Link and Functionality Test"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
FAILED=0
|
||
|
|
PASSED=0
|
||
|
|
|
||
|
|
test_endpoint() {
|
||
|
|
local name="$1"
|
||
|
|
local url="$2"
|
||
|
|
log_test "Testing: $name"
|
||
|
|
|
||
|
|
if response=$(curl -k -sL "$url" 2>&1); then
|
||
|
|
if echo "$response" | grep -qE "(error|Error|ERROR|404|500)" && ! echo "$response" | grep -qE '"status":"1"|"result":'; then
|
||
|
|
log_error "Failed: $name"
|
||
|
|
((FAILED++))
|
||
|
|
return 1
|
||
|
|
else
|
||
|
|
log_success "Passed: $name"
|
||
|
|
((PASSED++))
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
log_error "Failed: $name (connection error)"
|
||
|
|
((FAILED++))
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
test_api_endpoint() {
|
||
|
|
local name="$1"
|
||
|
|
local url="$2"
|
||
|
|
log_test "Testing API: $name"
|
||
|
|
|
||
|
|
if response=$(curl -k -sL "$url" 2>&1); then
|
||
|
|
if echo "$response" | python3 -c "import sys, json; d=json.load(sys.stdin); sys.exit(0 if ('result' in d or 'status' in d or 'total_blocks' in d) else 1)" 2>/dev/null; then
|
||
|
|
log_success "Passed: $name"
|
||
|
|
((PASSED++))
|
||
|
|
return 0
|
||
|
|
else
|
||
|
|
log_error "Failed: $name (invalid JSON or missing expected fields)"
|
||
|
|
((FAILED++))
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
log_error "Failed: $name (connection error)"
|
||
|
|
((FAILED++))
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "1. BASIC CONNECTIVITY TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
test_endpoint "Home Page" "https://explorer.d-bis.org/"
|
||
|
|
test_endpoint "HTTPS Redirect" "http://explorer.d-bis.org/"
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "2. API ENDPOINT TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Get latest block number first
|
||
|
|
LATEST_BLOCK_HEX=$(curl -k -sL 'https://explorer.d-bis.org/api?module=block&action=eth_block_number' 2>&1 | python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('result', '0x0'))" 2>/dev/null || echo "0x0")
|
||
|
|
|
||
|
|
test_api_endpoint "Network Stats API" "https://explorer.d-bis.org/api/v2/stats"
|
||
|
|
test_api_endpoint "Block Number API" "https://explorer.d-bis.org/api?module=block&action=eth_block_number"
|
||
|
|
|
||
|
|
if [ "$LATEST_BLOCK_HEX" != "0x0" ] && [ -n "$LATEST_BLOCK_HEX" ]; then
|
||
|
|
test_api_endpoint "Block Data API" "https://explorer.d-bis.org/api?module=block&action=eth_get_block_by_number&tag=$LATEST_BLOCK_HEX&boolean=false"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "3. CONTRACT ADDRESS TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Contract addresses
|
||
|
|
CONTRACTS=(
|
||
|
|
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2:WETH9"
|
||
|
|
"0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f:WETH10"
|
||
|
|
"0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e:CCIP Router"
|
||
|
|
"0x105F8A15b819948a89153505762444Ee9f324684:CCIP Sender"
|
||
|
|
"0x89dd12025bfCD38A168455A44B400e913ED33BE2:WETH9 Bridge"
|
||
|
|
"0xe0E93247376aa097dB308B92e6Ba36bA015535D0:WETH10 Bridge"
|
||
|
|
)
|
||
|
|
|
||
|
|
for contract_info in "${CONTRACTS[@]}"; do
|
||
|
|
IFS=':' read -r addr name <<< "$contract_info"
|
||
|
|
test_api_endpoint "$name Balance" "https://explorer.d-bis.org/api?module=account&action=eth_get_balance&address=$addr&tag=latest"
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "4. EXTERNAL RESOURCE TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
test_endpoint "Font Awesome CDN" "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
|
||
|
|
test_endpoint "Ethers.js CDN" "https://cdn.ethers.io/lib/ethers-5.7.2.umd.min.js"
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "5. NAVIGATION FUNCTION TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Check if JavaScript functions exist in HTML
|
||
|
|
log_test "Checking JavaScript functions..."
|
||
|
|
|
||
|
|
FUNCTIONS=(
|
||
|
|
"showHome"
|
||
|
|
"showBlocks"
|
||
|
|
"showTransactions"
|
||
|
|
"showBridgeMonitoring"
|
||
|
|
"showWETHUtilities"
|
||
|
|
"connectMetaMask"
|
||
|
|
"wrapWETH9"
|
||
|
|
"unwrapWETH9"
|
||
|
|
"wrapWETH10"
|
||
|
|
"unwrapWETH10"
|
||
|
|
"refreshWETHBalances"
|
||
|
|
"handleSearch"
|
||
|
|
)
|
||
|
|
|
||
|
|
sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no root@"$IP" "cat /var/www/html/index.html" > /tmp/explorer-html.txt
|
||
|
|
|
||
|
|
for func in "${FUNCTIONS[@]}"; do
|
||
|
|
if grep -q "function $func\|$func()" /tmp/explorer-html.txt; then
|
||
|
|
log_success "Function exists: $func"
|
||
|
|
((PASSED++))
|
||
|
|
else
|
||
|
|
log_error "Function missing: $func"
|
||
|
|
((FAILED++))
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "6. HTML STRUCTURE TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
log_test "Checking HTML structure..."
|
||
|
|
|
||
|
|
ELEMENTS=(
|
||
|
|
"navbar"
|
||
|
|
"nav-links"
|
||
|
|
"searchInput"
|
||
|
|
"homeView"
|
||
|
|
"blocksView"
|
||
|
|
"transactionsView"
|
||
|
|
"bridgeView"
|
||
|
|
"wethView"
|
||
|
|
"metamaskStatus"
|
||
|
|
)
|
||
|
|
|
||
|
|
for element in "${ELEMENTS[@]}"; do
|
||
|
|
if grep -q "id=\"$element\"\|class=\"$element\"" /tmp/explorer-html.txt; then
|
||
|
|
log_success "Element exists: $element"
|
||
|
|
((PASSED++))
|
||
|
|
else
|
||
|
|
log_warn "Element may be missing: $element (checking alternative patterns...)"
|
||
|
|
if grep -qi "$element" /tmp/explorer-html.txt; then
|
||
|
|
log_success "Element found (alternative pattern): $element"
|
||
|
|
((PASSED++))
|
||
|
|
else
|
||
|
|
log_error "Element missing: $element"
|
||
|
|
((FAILED++))
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "7. CONTRACT ADDRESS REFERENCES"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
log_test "Checking contract address references..."
|
||
|
|
|
||
|
|
for contract_info in "${CONTRACTS[@]}"; do
|
||
|
|
IFS=':' read -r addr name <<< "$contract_info"
|
||
|
|
if grep -qi "$addr" /tmp/explorer-html.txt; then
|
||
|
|
log_success "Address referenced: $name ($addr)"
|
||
|
|
((PASSED++))
|
||
|
|
else
|
||
|
|
log_warn "Address not found: $name ($addr)"
|
||
|
|
((FAILED++))
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "8. SSL/TLS TESTS"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
log_test "Testing SSL configuration..."
|
||
|
|
|
||
|
|
if curl -k -sI "https://explorer.d-bis.org/" 2>&1 | grep -qi "HTTP/2\|200\|strict-transport-security"; then
|
||
|
|
log_success "SSL/TLS working correctly"
|
||
|
|
((PASSED++))
|
||
|
|
else
|
||
|
|
log_error "SSL/TLS issue detected"
|
||
|
|
((FAILED++))
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Test HSTS header
|
||
|
|
if curl -k -sI "https://explorer.d-bis.org/" 2>&1 | grep -qi "strict-transport-security"; then
|
||
|
|
log_success "HSTS header present"
|
||
|
|
((PASSED++))
|
||
|
|
else
|
||
|
|
log_warn "HSTS header not found (may be in Cloudflare)"
|
||
|
|
((PASSED++))
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo "TEST SUMMARY"
|
||
|
|
echo "════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
TOTAL=$((PASSED + FAILED))
|
||
|
|
PERCENTAGE=$((PASSED * 100 / TOTAL))
|
||
|
|
|
||
|
|
echo "Tests Passed: $PASSED / $TOTAL"
|
||
|
|
echo "Tests Failed: $FAILED / $TOTAL"
|
||
|
|
echo "Success Rate: $PERCENTAGE%"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ $FAILED -eq 0 ]; then
|
||
|
|
log_success "All tests passed! ✅"
|
||
|
|
exit 0
|
||
|
|
elif [ $PERCENTAGE -ge 90 ]; then
|
||
|
|
log_warn "Most tests passed, minor issues detected ⚠️"
|
||
|
|
exit 0
|
||
|
|
else
|
||
|
|
log_error "Multiple test failures detected ❌"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|