All checks were successful
API Endpoint Tests / test-api-endpoints (push) Successful in 29s
CLI Tests / test-cli (push) Successful in 1m20s
Documentation Validation / validate-docs (push) Successful in 12s
JavaScript SDK Tests / test-js-sdk (push) Successful in 21s
Integration Tests / test-service-integration (push) Successful in 44s
Package Tests / test-python-packages (map[name:aitbc-agent-sdk path:packages/py/aitbc-agent-sdk]) (push) Successful in 38s
Package Tests / test-python-packages (map[name:aitbc-core path:packages/py/aitbc-core]) (push) Successful in 19s
Package Tests / test-python-packages (map[name:aitbc-crypto path:packages/py/aitbc-crypto]) (push) Successful in 21s
Package Tests / test-python-packages (map[name:aitbc-sdk path:packages/py/aitbc-sdk]) (push) Successful in 24s
Package Tests / test-javascript-packages (map[name:aitbc-sdk-js path:packages/js/aitbc-sdk]) (push) Successful in 8s
Package Tests / test-javascript-packages (map[name:aitbc-token path:packages/solidity/aitbc-token]) (push) Successful in 29s
Python Tests / test-python (push) Successful in 1m20s
Rust ZK Components Tests / test-rust-zk (push) Successful in 55s
Smart Contract Tests / test-solidity (map[name:aitbc-token path:packages/solidity/aitbc-token]) (push) Successful in 14s
Security Scanning / security-scan (push) Successful in 1m5s
Smart Contract Tests / test-solidity (map[name:zk-circuits path:apps/zk-circuits]) (push) Successful in 52s
Systemd Sync / sync-systemd (push) Successful in 4s
Smart Contract Tests / lint-solidity (push) Successful in 59s
TOTAL: 3524 → 924 lines (74% reduction) Per-file changes: - api-endpoint-tests.yml: 548 → 63 lines (-88%) - package-tests.yml: 1014 → 149 lines (-85%) - integration-tests.yml: 561 → 100 lines (-82%) - python-tests.yml: 290 → 77 lines (-73%) - smart-contract-tests.yml: 290 → 105 lines (-64%) - systemd-sync.yml: 192 → 86 lines (-55%) - cli-level1-tests.yml: 180 → 66 lines (-63%) - security-scanning.yml: 137 → 72 lines (-47%) - rust-zk-tests.yml: 112 → 69 lines (-38%) - docs-validation.yml: 104 → 72 lines (-31%) - js-sdk-tests.yml: 97 → 65 lines (-33%) Fixes applied: 1. Concurrency groups: all 7 workflows shared 'ci-workflows' group (they cancelled each other). Now each has unique group. 2. Removed all actions/checkout@v4 usage (not available on Gitea runner) → replaced with git clone http://gitea.bubuit.net:3000/oib/aitbc.git 3. Removed all sudo usage (Debian root environment) 4. Fixed wrong ports: wallet 8002→8003, RPC 8545→8006 5. External workspaces: /opt/aitbc/*-workspace → /var/lib/aitbc-workspaces/ 6. Extracted 274 echo'd Python lines → scripts/ci/test_api_endpoints.py 7. Removed dead CLI test code (tests were skipped entirely) 8. Moved aitbc.code-workspace out of workflows directory 9. Added --depth 1 to all git clones for speed 10. Added cleanup steps to all workflows New files: - scripts/ci/clone-repo.sh: reusable clone helper - scripts/ci/test_api_endpoints.py: extracted API test script
123 lines
4.3 KiB
Python
Executable File
123 lines
4.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""CI test script for AITBC API endpoints."""
|
|
|
|
import requests
|
|
import json
|
|
import time
|
|
import statistics
|
|
import sys
|
|
|
|
# Service ports (must match systemd config)
|
|
SERVICES = {
|
|
"coordinator": {"url": "http://localhost:8000", "endpoints": ["/", "/health", "/info"]},
|
|
"exchange": {"url": "http://localhost:8001", "endpoints": ["/", "/health", "/info"]},
|
|
"wallet": {"url": "http://localhost:8003", "endpoints": ["/", "/health", "/wallets"]},
|
|
"blockchain_rpc": {"url": "http://localhost:8006", "endpoints": []},
|
|
}
|
|
|
|
RPC_METHODS = [
|
|
{"method": "eth_blockNumber", "params": []},
|
|
{"method": "eth_getBalance", "params": ["0x0000000000000000000000000000000000000000", "latest"]},
|
|
{"method": "eth_chainId", "params": []},
|
|
{"method": "eth_gasPrice", "params": []},
|
|
]
|
|
|
|
|
|
def test_service_endpoints(name, base_url, endpoints, timeout=5):
|
|
results = {"service": name, "endpoints": [], "success": True}
|
|
for ep in endpoints:
|
|
url = f"{base_url}{ep}"
|
|
try:
|
|
r = requests.get(url, timeout=timeout)
|
|
ok = r.status_code in (200, 404, 405)
|
|
results["endpoints"].append({"url": url, "status": r.status_code, "success": ok})
|
|
print(f" {'✅' if ok else '❌'} {url}: {r.status_code}")
|
|
if not ok:
|
|
results["success"] = False
|
|
except Exception as e:
|
|
results["endpoints"].append({"url": url, "error": str(e), "success": False})
|
|
print(f" ❌ {url}: {e}")
|
|
results["success"] = False
|
|
return results
|
|
|
|
|
|
def test_rpc(base_url, timeout=5):
|
|
results = {"service": "blockchain_rpc", "methods": [], "success": True}
|
|
for m in RPC_METHODS:
|
|
payload = {"jsonrpc": "2.0", "method": m["method"], "params": m["params"], "id": 1}
|
|
try:
|
|
r = requests.post(base_url, json=payload, timeout=timeout)
|
|
ok = r.status_code == 200
|
|
result_val = r.json().get("result", "N/A") if ok else None
|
|
results["methods"].append({"method": m["method"], "status": r.status_code, "result": str(result_val), "success": ok})
|
|
print(f" {'✅' if ok else '❌'} {m['method']}: {result_val}")
|
|
if not ok:
|
|
results["success"] = False
|
|
except Exception as e:
|
|
results["methods"].append({"method": m["method"], "error": str(e), "success": False})
|
|
print(f" ❌ {m['method']}: {e}")
|
|
results["success"] = False
|
|
return results
|
|
|
|
|
|
def test_performance(apis, rounds=10, timeout=5):
|
|
results = {}
|
|
for name, url in apis:
|
|
times = []
|
|
ok_count = 0
|
|
for i in range(rounds):
|
|
try:
|
|
t0 = time.time()
|
|
r = requests.get(url, timeout=timeout)
|
|
dt = time.time() - t0
|
|
times.append(dt)
|
|
if r.status_code == 200:
|
|
ok_count += 1
|
|
except Exception:
|
|
pass
|
|
if times:
|
|
results[name] = {
|
|
"avg_ms": round(statistics.mean(times) * 1000, 1),
|
|
"min_ms": round(min(times) * 1000, 1),
|
|
"max_ms": round(max(times) * 1000, 1),
|
|
"success_rate": f"{ok_count}/{rounds}",
|
|
}
|
|
print(f" 📊 {name}: avg={results[name]['avg_ms']}ms ok={ok_count}/{rounds}")
|
|
else:
|
|
results[name] = {"error": "all requests failed"}
|
|
print(f" ❌ {name}: all requests failed")
|
|
return results
|
|
|
|
|
|
def main():
|
|
all_results = {}
|
|
overall_ok = True
|
|
|
|
for name, cfg in SERVICES.items():
|
|
print(f"\n🧪 Testing {name}...")
|
|
if name == "blockchain_rpc":
|
|
r = test_rpc(cfg["url"])
|
|
else:
|
|
r = test_service_endpoints(name, cfg["url"], cfg["endpoints"])
|
|
all_results[name] = r
|
|
if not r["success"]:
|
|
overall_ok = False
|
|
|
|
print("\n⚡ Performance tests...")
|
|
perf = test_performance([
|
|
("Coordinator", "http://localhost:8000/"),
|
|
("Exchange", "http://localhost:8001/"),
|
|
("Wallet", "http://localhost:8003/"),
|
|
])
|
|
all_results["performance"] = perf
|
|
|
|
with open("api-test-results.json", "w") as f:
|
|
json.dump(all_results, f, indent=2)
|
|
|
|
print(f"\n{'✅' if overall_ok else '⚠️'} API endpoint tests completed")
|
|
return 0 if overall_ok else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|