backend-infra-engineer: Release v0.3.3 snapshot
This commit is contained in:
196
scripts/test-symbol-detection.sh
Executable file
196
scripts/test-symbol-detection.sh
Executable file
@@ -0,0 +1,196 @@
|
||||
#!/bin/bash
|
||||
# Integration Test - Symbol Conflict Detection System
|
||||
#
|
||||
# Verifies that extract-symbols and check-duplicate-symbols work correctly
|
||||
# This script is NOT for CI, but for manual testing and validation
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")"
|
||||
BUILD_DIR="${PROJECT_ROOT}/build"
|
||||
|
||||
echo -e "${BLUE}=== Symbol Detection System Test ===${NC}"
|
||||
echo ""
|
||||
|
||||
# Test 1: Verify scripts are executable
|
||||
echo -e "${CYAN}[Test 1]${NC} Verifying scripts are executable..."
|
||||
if [[ -x "${SCRIPT_DIR}/extract-symbols.sh" ]]; then
|
||||
echo -e " ${GREEN}✓${NC} extract-symbols.sh is executable"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} extract-symbols.sh is NOT executable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -x "${SCRIPT_DIR}/check-duplicate-symbols.sh" ]]; then
|
||||
echo -e " ${GREEN}✓${NC} check-duplicate-symbols.sh is executable"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} check-duplicate-symbols.sh is NOT executable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -x "${PROJECT_ROOT}/.githooks/pre-commit" ]]; then
|
||||
echo -e " ${GREEN}✓${NC} .githooks/pre-commit is executable"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} .githooks/pre-commit is NOT executable"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 2: Verify build directory exists
|
||||
echo -e "${CYAN}[Test 2]${NC} Checking build directory..."
|
||||
if [[ -d "${BUILD_DIR}" ]]; then
|
||||
echo -e " ${GREEN}✓${NC} Build directory exists: ${BUILD_DIR}"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} Build directory not found: ${BUILD_DIR}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for object files
|
||||
OBJ_COUNT=$(find "${BUILD_DIR}" -name "*.o" -o -name "*.obj" 2>/dev/null | wc -l)
|
||||
if [[ ${OBJ_COUNT} -gt 0 ]]; then
|
||||
echo -e " ${GREEN}✓${NC} Found ${OBJ_COUNT} object files"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} No object files found (run cmake --build build first)"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 3: Run extract-symbols
|
||||
echo -e "${CYAN}[Test 3]${NC} Running symbol extraction..."
|
||||
if cd "${PROJECT_ROOT}" && ./scripts/extract-symbols.sh "${BUILD_DIR}" 2>&1 | tail -5; then
|
||||
echo -e " ${GREEN}✓${NC} Symbol extraction completed"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} Symbol extraction failed"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 4: Verify symbol database was created
|
||||
echo -e "${CYAN}[Test 4]${NC} Verifying symbol database..."
|
||||
DB_FILE="${BUILD_DIR}/symbol_database.json"
|
||||
if [[ -f "${DB_FILE}" ]]; then
|
||||
SIZE=$(du -h "${DB_FILE}" | cut -f1)
|
||||
echo -e " ${GREEN}✓${NC} Symbol database created: ${DB_FILE} (${SIZE})"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} Symbol database not created"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 5: Verify JSON structure
|
||||
echo -e "${CYAN}[Test 5]${NC} Validating JSON structure..."
|
||||
if python3 -m json.tool "${DB_FILE}" > /dev/null 2>&1; then
|
||||
echo -e " ${GREEN}✓${NC} Valid JSON format"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} Invalid JSON format"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for expected fields
|
||||
if python3 << PYTHON_EOF
|
||||
import json
|
||||
with open("${DB_FILE}") as f:
|
||||
data = json.load(f)
|
||||
|
||||
required = ["metadata", "conflicts", "symbols"]
|
||||
for field in required:
|
||||
if field not in data:
|
||||
exit(1)
|
||||
|
||||
metadata = data.get("metadata", {})
|
||||
required_meta = ["platform", "build_dir", "timestamp", "object_files_scanned", "total_symbols"]
|
||||
for field in required_meta:
|
||||
if field not in metadata:
|
||||
exit(1)
|
||||
|
||||
print(" ${GREEN}✓${NC} JSON structure is correct")
|
||||
exit(0)
|
||||
PYTHON_EOF
|
||||
; then
|
||||
: # Already printed
|
||||
else
|
||||
echo -e " ${RED}✗${NC} JSON structure validation failed"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 6: Run duplicate checker
|
||||
echo -e "${CYAN}[Test 6]${NC} Running duplicate symbol checker..."
|
||||
if cd "${PROJECT_ROOT}" && ./scripts/check-duplicate-symbols.sh "${DB_FILE}" 2>&1 | tail -10; then
|
||||
echo -e " ${GREEN}✓${NC} Duplicate checker completed (no conflicts)"
|
||||
else
|
||||
# Duplicate checker returns 1 if conflicts found, which is expected behavior
|
||||
exit_code=$?
|
||||
if [[ ${exit_code} -eq 1 ]]; then
|
||||
echo -e " ${YELLOW}✓${NC} Duplicate checker found conflicts (expected in some cases)"
|
||||
else
|
||||
echo -e " ${RED}✗${NC} Duplicate checker failed with error"
|
||||
exit ${exit_code}
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 7: Verify pre-commit hook
|
||||
echo -e "${CYAN}[Test 7]${NC} Checking pre-commit hook setup..."
|
||||
HOOK_PATH="${PROJECT_ROOT}/.githooks/pre-commit"
|
||||
if [[ -f "${HOOK_PATH}" ]]; then
|
||||
echo -e " ${GREEN}✓${NC} Pre-commit hook exists"
|
||||
|
||||
# Check if git hooks are configured
|
||||
cd "${PROJECT_ROOT}"
|
||||
if git config core.hooksPath 2>/dev/null | grep -q "\.githooks"; then
|
||||
echo -e " ${GREEN}✓${NC} Git hooks path configured: $(git config core.hooksPath)"
|
||||
else
|
||||
echo -e " ${YELLOW}!${NC} Git hooks path not configured"
|
||||
echo -e " Run: ${CYAN}git config core.hooksPath .githooks${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e " ${RED}✗${NC} Pre-commit hook not found: ${HOOK_PATH}"
|
||||
exit 1
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 8: Display sample output
|
||||
echo -e "${CYAN}[Test 8]${NC} Sample symbol database contents..."
|
||||
python3 << PYTHON_EOF
|
||||
import json
|
||||
|
||||
with open("${DB_FILE}") as f:
|
||||
data = json.load(f)
|
||||
|
||||
meta = data.get("metadata", {})
|
||||
print(f" Platform: {meta.get('platform', '?')}")
|
||||
print(f" Object files: {meta.get('object_files_scanned', '?')}")
|
||||
print(f" Total symbols: {meta.get('total_symbols', '?')}")
|
||||
print(f" Conflicts: {meta.get('total_conflicts', 0)}")
|
||||
|
||||
conflicts = data.get("conflicts", [])
|
||||
if conflicts:
|
||||
print(f"\n Sample conflicts:")
|
||||
for conflict in conflicts[:3]:
|
||||
symbol = conflict.get("symbol", "?")
|
||||
count = conflict.get("count", 0)
|
||||
print(f" - {symbol} (x{count})")
|
||||
if len(conflicts) > 3:
|
||||
print(f" ... and {len(conflicts) - 3} more")
|
||||
PYTHON_EOF
|
||||
echo ""
|
||||
|
||||
# Final Summary
|
||||
echo -e "${GREEN}=== All Tests Passed! ===${NC}"
|
||||
echo ""
|
||||
echo -e "Next steps:"
|
||||
echo -e " 1. Configure git hooks: ${CYAN}git config core.hooksPath .githooks${NC}"
|
||||
echo -e " 2. Review symbol database: ${CYAN}cat ${DB_FILE} | head -50${NC}"
|
||||
echo -e " 3. Check for conflicts: ${CYAN}./scripts/check-duplicate-symbols.sh${NC}"
|
||||
echo -e " 4. Integrate into CI: See docs/internal/testing/symbol-conflict-detection.md"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user