mirror of
https://github.com/smittix/intercept.git
synced 2026-04-26 07:40:01 -07:00
262 lines
7.8 KiB
Bash
Executable File
262 lines
7.8 KiB
Bash
Executable File
#!/bin/bash
|
||
# GSM Spy System - Verification Test Script
|
||
# Tests the 4 critical fixes: geocoding, pipeline, scanner loop, process management
|
||
|
||
set -e
|
||
|
||
echo "=========================================="
|
||
echo "GSM Spy System - Verification Tests"
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
# Colors
|
||
GREEN='\033[0;32m'
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Test results
|
||
TESTS_PASSED=0
|
||
TESTS_FAILED=0
|
||
|
||
function pass_test() {
|
||
echo -e "${GREEN}✓ PASS:${NC} $1"
|
||
((TESTS_PASSED++))
|
||
}
|
||
|
||
function fail_test() {
|
||
echo -e "${RED}✗ FAIL:${NC} $1"
|
||
((TESTS_FAILED++))
|
||
}
|
||
|
||
function info() {
|
||
echo -e "${YELLOW}ℹ INFO:${NC} $1"
|
||
}
|
||
|
||
# Test 1: Check that geocoding module exists
|
||
echo "Test 1: Geocoding Module"
|
||
echo "-------------------------"
|
||
if [ -f "utils/gsm_geocoding.py" ]; then
|
||
pass_test "Geocoding module exists"
|
||
|
||
# Check for key functions
|
||
if grep -q "def enrich_tower_data" utils/gsm_geocoding.py; then
|
||
pass_test "enrich_tower_data() function present"
|
||
else
|
||
fail_test "enrich_tower_data() function missing"
|
||
fi
|
||
|
||
if grep -q "def lookup_cell_coordinates" utils/gsm_geocoding.py; then
|
||
pass_test "lookup_cell_coordinates() function present"
|
||
else
|
||
fail_test "lookup_cell_coordinates() function missing"
|
||
fi
|
||
else
|
||
fail_test "Geocoding module missing"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 2: Check scanner thread improvements
|
||
echo "Test 2: Scanner Thread Non-Blocking I/O"
|
||
echo "---------------------------------------"
|
||
if grep -q "import select" routes/gsm_spy.py; then
|
||
pass_test "select module imported"
|
||
else
|
||
fail_test "select module not imported"
|
||
fi
|
||
|
||
if grep -q "select.select.*process.stdout" routes/gsm_spy.py; then
|
||
pass_test "Non-blocking I/O with select.select() implemented"
|
||
else
|
||
fail_test "select.select() not found in scanner thread"
|
||
fi
|
||
|
||
if grep -q "scan_timeout = 120" routes/gsm_spy.py; then
|
||
pass_test "Scan timeout configured"
|
||
else
|
||
fail_test "Scan timeout not configured"
|
||
fi
|
||
|
||
if grep -q "with app_module.gsm_spy_lock:" routes/gsm_spy.py; then
|
||
pass_test "Thread-safe counter updates implemented"
|
||
else
|
||
fail_test "Thread-safe counter updates missing"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 3: Check geocoding worker
|
||
echo "Test 3: Background Geocoding Worker"
|
||
echo "-----------------------------------"
|
||
if grep -q "def start_geocoding_worker" routes/gsm_spy.py; then
|
||
pass_test "start_geocoding_worker() function exists"
|
||
else
|
||
fail_test "start_geocoding_worker() function missing"
|
||
fi
|
||
|
||
if grep -q "def geocoding_worker" routes/gsm_spy.py; then
|
||
pass_test "geocoding_worker() function exists"
|
||
else
|
||
fail_test "geocoding_worker() function missing"
|
||
fi
|
||
|
||
if grep -q "start_geocoding_worker()" routes/gsm_spy.py; then
|
||
pass_test "Geocoding worker is started in start_scanner()"
|
||
else
|
||
fail_test "Geocoding worker not started in start_scanner()"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 4: Check enrichment integration
|
||
echo "Test 4: Tower Data Enrichment"
|
||
echo "-----------------------------"
|
||
if grep -q "from utils.gsm_geocoding import enrich_tower_data" routes/gsm_spy.py; then
|
||
pass_test "enrich_tower_data imported in scanner thread"
|
||
else
|
||
fail_test "enrich_tower_data not imported"
|
||
fi
|
||
|
||
if grep -q "enriched = enrich_tower_data(parsed)" routes/gsm_spy.py; then
|
||
pass_test "Tower data enrichment called in scanner"
|
||
else
|
||
fail_test "Tower data enrichment not called"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 5: Check monitor pipeline fixes
|
||
echo "Test 5: Monitor Pipeline Connection"
|
||
echo "-----------------------------------"
|
||
if grep -q "Give grgsm_livemon time to initialize" routes/gsm_spy.py; then
|
||
pass_test "Pipeline initialization delay comment present"
|
||
else
|
||
fail_test "Pipeline initialization delay comment missing"
|
||
fi
|
||
|
||
if grep -A 5 "Start grgsm_livemon" routes/gsm_spy.py | grep -q "time.sleep(2)"; then
|
||
pass_test "2-second delay between grgsm_livemon and tshark"
|
||
else
|
||
fail_test "Initialization delay not implemented"
|
||
fi
|
||
|
||
if grep -q "Started grgsm_livemon (PID:" routes/gsm_spy.py; then
|
||
pass_test "Process verification logging added"
|
||
else
|
||
fail_test "Process verification logging missing"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 6: Check monitor thread improvements
|
||
echo "Test 6: Monitor Thread Non-Blocking I/O"
|
||
echo "---------------------------------------"
|
||
if grep -q "def monitor_thread(process):" routes/gsm_spy.py; then
|
||
pass_test "monitor_thread() function exists"
|
||
|
||
if grep -A 20 "def monitor_thread(process):" routes/gsm_spy.py | grep -q "select.select.*process.stdout"; then
|
||
pass_test "Monitor thread uses non-blocking I/O"
|
||
else
|
||
fail_test "Monitor thread doesn't use select.select()"
|
||
fi
|
||
else
|
||
fail_test "monitor_thread() function missing"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 7: Check frontend coordinate validation
|
||
echo "Test 7: Frontend Coordinate Validation"
|
||
echo "--------------------------------------"
|
||
if grep -q "Validate coordinates before creating map marker" templates/gsm_spy_dashboard.html; then
|
||
pass_test "Coordinate validation comment present"
|
||
else
|
||
fail_test "Coordinate validation comment missing"
|
||
fi
|
||
|
||
if grep -q "isNaN(parseFloat(data.lat))" templates/gsm_spy_dashboard.html; then
|
||
pass_test "Coordinate validation checks implemented"
|
||
else
|
||
fail_test "Coordinate validation checks missing"
|
||
fi
|
||
|
||
if grep -q "tower_update" templates/gsm_spy_dashboard.html; then
|
||
pass_test "tower_update message handler added"
|
||
else
|
||
fail_test "tower_update message handler missing"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 8: Check process cleanup improvements
|
||
echo "Test 8: Process Cleanup & Zombie Prevention"
|
||
echo "-------------------------------------------"
|
||
if grep -q "process.terminate()" routes/gsm_spy.py; then
|
||
pass_test "Process termination implemented"
|
||
else
|
||
fail_test "Process termination missing"
|
||
fi
|
||
|
||
if grep -q "subprocess.TimeoutExpired" routes/gsm_spy.py; then
|
||
pass_test "Timeout handling for process termination"
|
||
else
|
||
fail_test "Timeout handling missing"
|
||
fi
|
||
|
||
if grep -q "process.kill()" routes/gsm_spy.py; then
|
||
pass_test "Force kill fallback implemented"
|
||
else
|
||
fail_test "Force kill fallback missing"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 9: Python syntax check
|
||
echo "Test 9: Python Syntax Validation"
|
||
echo "--------------------------------"
|
||
if python3 -m py_compile routes/gsm_spy.py 2>/dev/null; then
|
||
pass_test "routes/gsm_spy.py has valid syntax"
|
||
else
|
||
fail_test "routes/gsm_spy.py has syntax errors"
|
||
fi
|
||
|
||
if python3 -m py_compile utils/gsm_geocoding.py 2>/dev/null; then
|
||
pass_test "utils/gsm_geocoding.py has valid syntax"
|
||
else
|
||
fail_test "utils/gsm_geocoding.py has syntax errors"
|
||
fi
|
||
echo ""
|
||
|
||
# Test 10: Check auto-monitor persistence
|
||
echo "Test 10: Auto-Monitor Flag Persistence"
|
||
echo "--------------------------------------"
|
||
if grep -q "auto_monitor_triggered = False.*# Moved outside loop" routes/gsm_spy.py; then
|
||
pass_test "auto_monitor_triggered flag moved outside loop"
|
||
else
|
||
fail_test "auto_monitor_triggered flag not properly placed"
|
||
fi
|
||
|
||
if grep -q "if current_count >= 3 and not auto_monitor_triggered" routes/gsm_spy.py; then
|
||
pass_test "Auto-monitor only triggers once per session"
|
||
else
|
||
fail_test "Auto-monitor trigger condition incorrect"
|
||
fi
|
||
echo ""
|
||
|
||
# Summary
|
||
echo "=========================================="
|
||
echo "Test Summary"
|
||
echo "=========================================="
|
||
echo -e "Tests passed: ${GREEN}${TESTS_PASSED}${NC}"
|
||
echo -e "Tests failed: ${RED}${TESTS_FAILED}${NC}"
|
||
echo ""
|
||
|
||
if [ $TESTS_FAILED -eq 0 ]; then
|
||
echo -e "${GREEN}All tests passed! ✓${NC}"
|
||
echo ""
|
||
echo "Next steps:"
|
||
echo "1. Start INTERCEPT: sudo -E venv/bin/python intercept.py"
|
||
echo "2. Navigate to GSM Spy dashboard in browser"
|
||
echo "3. Click 'Start Scanner' to test tower detection with geocoding"
|
||
echo "4. Verify towers appear on map with coordinates"
|
||
echo "5. Check that auto-monitor starts after 3+ towers found"
|
||
echo "6. Test Stop button for responsive shutdown (< 2 seconds)"
|
||
exit 0
|
||
else
|
||
echo -e "${RED}Some tests failed. Please review the output above.${NC}"
|
||
exit 1
|
||
fi
|