first commit
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Context system test runner script.
|
||||
|
||||
Features:
|
||||
1. Check whether the Redis service is available
|
||||
2. Run all Context system tests
|
||||
3. Generate a test report
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import time
|
||||
import redis
|
||||
from typing import Optional, Tuple
|
||||
|
||||
# Add the project root directory to the Python path.
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.insert(0, project_root)
|
||||
|
||||
|
||||
def check_redis_connection(host: str = "localhost", port: int = 6379, timeout: int = 5) -> Tuple[bool, str]:
|
||||
"""
|
||||
Check whether the Redis connection is available.
|
||||
|
||||
Args:
|
||||
host: Redis host address
|
||||
port: Redis port
|
||||
timeout: Connection timeout in seconds
|
||||
|
||||
Returns:
|
||||
(whether the connection succeeded, error message)
|
||||
"""
|
||||
try:
|
||||
r = redis.Redis(host=host, port=port, socket_connect_timeout=timeout, decode_responses=True)
|
||||
r.ping()
|
||||
r.close()
|
||||
return True, "Redis connection is healthy"
|
||||
except redis.ConnectionError as e:
|
||||
return False, f"Redis connection failed: {e}"
|
||||
except Exception as e:
|
||||
return False, f"Redis check exception: {e}"
|
||||
|
||||
|
||||
def start_redis_server() -> bool:
|
||||
"""
|
||||
Try to start the Redis server.
|
||||
|
||||
Returns:
|
||||
Whether startup succeeded.
|
||||
"""
|
||||
try:
|
||||
# Check whether Redis is already running.
|
||||
if check_redis_connection()[0]:
|
||||
print("✓ Redis service is already running")
|
||||
return True
|
||||
|
||||
# Try to start Redis.
|
||||
print("Trying to start the Redis service...")
|
||||
|
||||
# Try to start Redis on macOS.
|
||||
if sys.platform == "darwin":
|
||||
try:
|
||||
# Start Redis with brew.
|
||||
subprocess.run(["brew", "services", "start", "redis"],
|
||||
check=True, capture_output=True, timeout=10)
|
||||
time.sleep(2) # Wait for the service to start.
|
||||
if check_redis_connection()[0]:
|
||||
print("✓ Redis service started successfully")
|
||||
return True
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
try:
|
||||
# Start Redis directly.
|
||||
subprocess.run(["redis-server", "--daemonize", "yes"],
|
||||
check=True, capture_output=True, timeout=10)
|
||||
time.sleep(2)
|
||||
if check_redis_connection()[0]:
|
||||
print("✓ Redis service started successfully")
|
||||
return True
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
# Try to start Redis on Linux.
|
||||
elif sys.platform.startswith("linux"):
|
||||
try:
|
||||
subprocess.run(["sudo", "systemctl", "start", "redis"],
|
||||
check=True, capture_output=True, timeout=10)
|
||||
time.sleep(2)
|
||||
if check_redis_connection()[0]:
|
||||
print("✓ Redis service started successfully")
|
||||
return True
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
print("⚠️ Unable to start Redis automatically; please start it manually")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ Error while starting Redis service: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def install_test_dependencies() -> bool:
|
||||
"""
|
||||
Install test dependencies.
|
||||
|
||||
Returns:
|
||||
Whether installation succeeded.
|
||||
"""
|
||||
try:
|
||||
print("Checking test dependencies...")
|
||||
|
||||
# Check pytest.
|
||||
try:
|
||||
import pytest
|
||||
print("✓ pytest is installed")
|
||||
except ImportError:
|
||||
print("Installing pytest...")
|
||||
subprocess.run([sys.executable, "-m", "pip", "install", "pytest", "pytest-asyncio"],
|
||||
check=True)
|
||||
print("✓ pytest installation complete")
|
||||
|
||||
# Check redis.
|
||||
try:
|
||||
import redis
|
||||
print("✓ redis is installed")
|
||||
except ImportError:
|
||||
print("Installing redis...")
|
||||
subprocess.run([sys.executable, "-m", "pip", "install", "redis"],
|
||||
check=True)
|
||||
print("✓ redis installation complete")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ Error while installing test dependencies: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def run_tests() -> bool:
|
||||
"""
|
||||
Run Context system tests.
|
||||
|
||||
Returns:
|
||||
Whether all tests passed.
|
||||
"""
|
||||
try:
|
||||
print("\n" + "="*60)
|
||||
print("Starting Context system tests")
|
||||
print("="*60)
|
||||
|
||||
# Get the test file path.
|
||||
test_file = os.path.join(project_root, "test", "test_context_system.py")
|
||||
|
||||
if not os.path.exists(test_file):
|
||||
print(f"❌ Test file does not exist: {test_file}")
|
||||
return False
|
||||
|
||||
# Run tests.
|
||||
cmd = [
|
||||
sys.executable, "-m", "pytest",
|
||||
test_file,
|
||||
"-v", # Verbose output.
|
||||
"-s", # Show print output.
|
||||
"--tb=short", # Short traceback.
|
||||
"--color=yes" # Colored output.
|
||||
]
|
||||
|
||||
print(f"Executing command: {' '.join(cmd)}")
|
||||
print("-" * 60)
|
||||
|
||||
result = subprocess.run(cmd, cwd=project_root)
|
||||
|
||||
print("-" * 60)
|
||||
if result.returncode == 0:
|
||||
app_log("✅ All tests passed!")
|
||||
return True
|
||||
else:
|
||||
print("❌ Some tests failed")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error while running tests: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Main function."""
|
||||
print("Context System Test Runner")
|
||||
print("=" * 40)
|
||||
|
||||
# 1. Install dependencies.
|
||||
if not install_test_dependencies():
|
||||
print("❌ Dependency installation failed; exiting")
|
||||
return 1
|
||||
|
||||
# 2. Check Redis connection.
|
||||
print("\nChecking Redis service...")
|
||||
redis_ok, redis_msg = check_redis_connection()
|
||||
|
||||
if not redis_ok:
|
||||
print(f"⚠️ {redis_msg}")
|
||||
print("Trying to start Redis service...")
|
||||
|
||||
if not start_redis_server():
|
||||
print("❌ Unable to start Redis service")
|
||||
print("Please start Redis manually and rerun the tests")
|
||||
print("Example startup commands:")
|
||||
print(" macOS: brew services start redis")
|
||||
print(" Linux: sudo systemctl start redis")
|
||||
print(" Windows: redis-server")
|
||||
return 1
|
||||
else:
|
||||
print(f"✓ {redis_msg}")
|
||||
|
||||
# 3. Run tests.
|
||||
success = run_tests()
|
||||
|
||||
if success:
|
||||
print("\n🎉 Context system tests complete!")
|
||||
print("The test results verify:")
|
||||
print(" ✓ Redis storage works correctly")
|
||||
print(" ✓ File system persistence works correctly")
|
||||
print(" ✓ Message management works correctly")
|
||||
print(" ✓ Context manager works correctly")
|
||||
print(" ✓ Data serialization works correctly")
|
||||
print(" ✓ Concurrent access is safe")
|
||||
return 0
|
||||
else:
|
||||
print("\n❌ Context system tests failed")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
Reference in New Issue
Block a user