核心变更: - engine.py(1781行)拆分为8个独立模块: lifecycle/security/deps/ datastore/pl_injector/watcher/signature/manager - 新增plugin-bridge: 事件总线 + 服务注册 + RPC通信 - 新增i18n: 国际化/多语言翻译支持 - 新增plugin-storage: 插件键值/文件存储 - 新增ws-api: WebSocket实时通信(pub/sub + 自定义处理器) - nodejs-adapter统一为Plugin ABC模式 Bug修复: - 修复load_all()中store_dir未定义崩溃 - 修复DependencyResolver入度计算(拓扑排序) - 修复PermissionError隐藏内置异常 - 修复CORS中间件头部未附加到响应 - 修复IntegrityChecker跳过__pycache__目录 - 修复版本号不一致(v2.0.0→v1.2.0) - 修复测试文件的Logger导入/路径/私有方法调用 - 修复context.py缺少typing导入 - 修复config.py STORE_DIR默认路径(./mods→./store) 测试覆盖: 14→91个测试, 全部通过
164 lines
5.0 KiB
Python
164 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
限流功能测试
|
|
"""
|
|
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
project_root = Path(__file__).parent.parent
|
|
sys.path.insert(0, str(project_root))
|
|
|
|
import importlib
|
|
|
|
|
|
rate_limiter_path = str(project_root / "oss" / "core" / "http_api" / "rate_limiter.py")
|
|
spec = importlib.util.spec_from_file_location("rate_limiter_mod", rate_limiter_path)
|
|
rate_limiter_mod = importlib.util.module_from_spec(spec)
|
|
sys.modules["rate_limiter_mod"] = rate_limiter_mod
|
|
spec.loader.exec_module(rate_limiter_mod)
|
|
|
|
RateLimiter = rate_limiter_mod.RateLimiter
|
|
RateLimitMiddleware = rate_limiter_mod.RateLimitMiddleware
|
|
|
|
|
|
def test_rate_limiter():
|
|
"""测试限流器基本功能"""
|
|
print("=== 测试限流器 ===")
|
|
|
|
limiter = RateLimiter(max_requests=3, time_window=1)
|
|
|
|
for i in range(3):
|
|
allowed = limiter.is_allowed("test_ip")
|
|
print(f"请求 {i+1}: {'允许' if allowed else '拒绝'}")
|
|
assert allowed, f"请求 {i+1} 应该被允许"
|
|
|
|
allowed = limiter.is_allowed("test_ip")
|
|
print(f"请求 4: {'允许' if allowed else '拒绝'}")
|
|
assert not allowed, "请求 4 应该被拒绝"
|
|
|
|
print("限流器基本功能测试通过")
|
|
|
|
|
|
def test_rate_limit_middleware():
|
|
"""测试限流中间件"""
|
|
print("\n=== 测试限流中间件 ===")
|
|
|
|
middleware = RateLimitMiddleware()
|
|
|
|
class MockRequest:
|
|
def __init__(self, path="/api/test", headers=None):
|
|
self.path = path
|
|
self.headers = headers or {"Remote-Addr": "127.0.0.1"}
|
|
|
|
middleware.enabled = False
|
|
ctx = {"request": MockRequest()}
|
|
result = middleware.process(ctx, lambda: None)
|
|
assert result is None, "禁用限流时应该直接通过"
|
|
print("禁用限流测试通过")
|
|
|
|
middleware.enabled = True
|
|
ctx = {"request": MockRequest()}
|
|
result = middleware.process(ctx, lambda: None)
|
|
assert result is None, "启用限流时应该允许请求"
|
|
print("启用限流测试通过")
|
|
|
|
print("限流中间件测试通过")
|
|
|
|
|
|
def test_endpoint_specific_limiting():
|
|
"""测试端点特定限流"""
|
|
print("\n=== 测试端点特定限流 ===")
|
|
|
|
middleware = RateLimitMiddleware()
|
|
|
|
class MockRequest:
|
|
def __init__(self, path, headers=None):
|
|
self.path = path
|
|
self.headers = headers or {"Remote-Addr": "127.0.0.1"}
|
|
|
|
ctx = {"request": MockRequest("/api/test")}
|
|
result = middleware.process(ctx, lambda: None)
|
|
assert result is None, "普通端点应该允许请求"
|
|
print("普通端点限流测试通过")
|
|
|
|
ctx = {"request": MockRequest("/api/dashboard/stats")}
|
|
result = middleware.process(ctx, lambda: None)
|
|
assert result is None, "特定端点应该允许请求"
|
|
print("特定端点限流测试通过")
|
|
|
|
print("端点特定限流测试通过")
|
|
|
|
|
|
def test_client_identification():
|
|
"""测试客户端标识符"""
|
|
print("\n=== 测试客户端标识符 ===")
|
|
|
|
middleware = RateLimitMiddleware()
|
|
|
|
request = type('Request', (), {
|
|
'headers': {'Remote-Addr': '192.168.1.1'}
|
|
})()
|
|
identifier = middleware._get_client_identifier(request)
|
|
assert identifier == "ip:192.168.1.1", f"IP标识符错误: {identifier}"
|
|
print("IP标识符测试通过")
|
|
|
|
request = type('Request', (), {
|
|
'headers': {'Authorization': 'Bearer test_key_123'}
|
|
})()
|
|
identifier = middleware._get_client_identifier(request)
|
|
assert identifier == "api_key:test_key_123", f"API Key标识符错误: {identifier}"
|
|
print("API Key标识符测试通过")
|
|
|
|
print("客户端标识符测试通过")
|
|
|
|
|
|
def test_rate_limit_response():
|
|
"""测试限流响应"""
|
|
print("\n=== 测试限流响应 ===")
|
|
|
|
middleware = RateLimitMiddleware()
|
|
response = middleware._create_rate_limit_response()
|
|
|
|
assert response.status == 429, f"状态码错误: {response.status}"
|
|
assert "Rate limit exceeded" in response.body, "响应体错误"
|
|
assert "Retry-After" in response.headers, "缺少Retry-After头"
|
|
assert "X-Rate-Limit-Limit" in response.headers, "缺少X-Rate-Limit-Limit头"
|
|
|
|
print("限流响应测试通过")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("开始限流功能测试...")
|
|
|
|
tests = [
|
|
("限流器基本功能测试", test_rate_limiter),
|
|
("限流中间件测试", test_rate_limit_middleware),
|
|
("端点特定限流测试", test_endpoint_specific_limiting),
|
|
("客户端标识符测试", test_client_identification),
|
|
("限流响应测试", test_rate_limit_response),
|
|
]
|
|
|
|
passed = 0
|
|
total = len(tests)
|
|
|
|
for test_name, test_func in tests:
|
|
print(f"\n--- {test_name} ---")
|
|
try:
|
|
test_func()
|
|
passed += 1
|
|
print(f"{test_name} 通过")
|
|
except Exception as e:
|
|
print(f"{test_name} 失败: {e}")
|
|
|
|
print(f"\n--- 测试结果 ---")
|
|
print(f"通过: {passed}/{total}")
|
|
|
|
if passed == total:
|
|
print("所有限流功能测试通过!")
|
|
sys.exit(0)
|
|
else:
|
|
print("部分测试失败,需要修复。")
|
|
sys.exit(1)
|