调整readme
This commit is contained in:
@@ -1,33 +1,62 @@
|
||||
extends GutTest
|
||||
extends Node
|
||||
## 速率限制器测试
|
||||
## 测试消息速率限制和DoS防护
|
||||
|
||||
var rate_limiter: RateLimiter
|
||||
|
||||
func before_each():
|
||||
"""每个测试前的设置"""
|
||||
func _ready():
|
||||
print("=== 速率限制器测试开始 ===")
|
||||
|
||||
# 运行所有测试
|
||||
test_normal_message_allowed()
|
||||
test_rate_limit_triggered()
|
||||
await test_time_window_reset()
|
||||
test_multiple_clients_independent()
|
||||
test_client_statistics()
|
||||
test_global_statistics()
|
||||
test_limit_reset()
|
||||
test_suspicious_activity_detection()
|
||||
test_bot_pattern_detection()
|
||||
test_dynamic_limit_adjustment()
|
||||
test_cleanup_functionality()
|
||||
test_edge_cases()
|
||||
|
||||
print("=== 速率限制器测试完成 ===")
|
||||
|
||||
func setup_test():
|
||||
## 每个测试前的设置
|
||||
rate_limiter = RateLimiter.new()
|
||||
# 设置较小的限制以便测试
|
||||
rate_limiter.set_rate_limit(3, 1.0) # 每秒最多3条消息
|
||||
|
||||
func after_each():
|
||||
"""每个测试后的清理"""
|
||||
func cleanup_test():
|
||||
## 每个测试后的清理
|
||||
if rate_limiter:
|
||||
rate_limiter.queue_free()
|
||||
rate_limiter = null
|
||||
|
||||
## 测试正常消息允许
|
||||
func test_normal_message_allowed():
|
||||
"""测试正常频率的消息应该被允许"""
|
||||
## 测试正常频率的消息应该被允许
|
||||
print("\n--- 测试正常消息允许 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送3条消息(在限制内)
|
||||
for i in range(3):
|
||||
var allowed = rate_limiter.is_message_allowed(client_id)
|
||||
assert_true(allowed, "Message %d should be allowed" % (i + 1))
|
||||
assert(allowed, "Message %d should be allowed" % (i + 1))
|
||||
|
||||
print("✅ 正常消息允许测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试速率限制触发
|
||||
func test_rate_limit_triggered():
|
||||
"""测试超过速率限制时消息被阻止"""
|
||||
## 测试超过速率限制时消息被阻止
|
||||
print("\n--- 测试速率限制触发 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送3条消息(达到限制)
|
||||
@@ -36,11 +65,17 @@ func test_rate_limit_triggered():
|
||||
|
||||
# 第4条消息应该被阻止
|
||||
var allowed = rate_limiter.is_message_allowed(client_id)
|
||||
assert_false(allowed, "4th message should be blocked by rate limit")
|
||||
assert(not allowed, "4th message should be blocked by rate limit")
|
||||
|
||||
print("✅ 速率限制触发测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试时间窗口重置
|
||||
func test_time_window_reset():
|
||||
"""测试时间窗口重置后允许新消息"""
|
||||
## 测试时间窗口重置后允许新消息
|
||||
print("\n--- 测试时间窗口重置 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送3条消息(达到限制)
|
||||
@@ -48,18 +83,24 @@ func test_time_window_reset():
|
||||
rate_limiter.is_message_allowed(client_id)
|
||||
|
||||
# 第4条消息被阻止
|
||||
assert_false(rate_limiter.is_message_allowed(client_id), "Should be blocked")
|
||||
assert(not rate_limiter.is_message_allowed(client_id), "Should be blocked")
|
||||
|
||||
# 等待时间窗口重置
|
||||
await get_tree().create_timer(1.1).timeout
|
||||
|
||||
# 现在应该允许新消息
|
||||
var allowed = rate_limiter.is_message_allowed(client_id)
|
||||
assert_true(allowed, "Message should be allowed after time window reset")
|
||||
assert(allowed, "Message should be allowed after time window reset")
|
||||
|
||||
print("✅ 时间窗口重置测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试多客户端独立限制
|
||||
func test_multiple_clients_independent():
|
||||
"""测试多个客户端的速率限制是独立的"""
|
||||
## 测试多个客户端的速率限制是独立的
|
||||
print("\n--- 测试多客户端独立限制 ---")
|
||||
setup_test()
|
||||
|
||||
var client1 = "client1"
|
||||
var client2 = "client2"
|
||||
|
||||
@@ -68,14 +109,20 @@ func test_multiple_clients_independent():
|
||||
rate_limiter.is_message_allowed(client1)
|
||||
|
||||
# 客户端1被阻止
|
||||
assert_false(rate_limiter.is_message_allowed(client1), "Client1 should be blocked")
|
||||
assert(not rate_limiter.is_message_allowed(client1), "Client1 should be blocked")
|
||||
|
||||
# 客户端2应该仍然可以发送消息
|
||||
assert_true(rate_limiter.is_message_allowed(client2), "Client2 should still be allowed")
|
||||
assert(rate_limiter.is_message_allowed(client2), "Client2 should still be allowed")
|
||||
|
||||
print("✅ 多客户端独立限制测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试客户端统计
|
||||
func test_client_statistics():
|
||||
"""测试客户端消息统计"""
|
||||
## 测试客户端消息统计
|
||||
print("\n--- 测试客户端统计 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送2条消息
|
||||
@@ -83,27 +130,39 @@ func test_client_statistics():
|
||||
rate_limiter.is_message_allowed(client_id)
|
||||
|
||||
var stats = rate_limiter.get_client_stats(client_id)
|
||||
assert_eq(stats.message_count, 2, "Should show 2 messages sent")
|
||||
assert_eq(stats.remaining_quota, 1, "Should show 1 message remaining")
|
||||
assert_true(stats.has("window_reset_time"), "Should include reset time")
|
||||
assert(stats.message_count == 2, "Should show 2 messages sent")
|
||||
assert(stats.remaining_quota == 1, "Should show 1 message remaining")
|
||||
assert(stats.has("window_reset_time"), "Should include reset time")
|
||||
|
||||
print("✅ 客户端统计测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试全局统计
|
||||
func test_global_statistics():
|
||||
"""测试全局统计信息"""
|
||||
## 测试全局统计信息
|
||||
print("\n--- 测试全局统计 ---")
|
||||
setup_test()
|
||||
|
||||
# 多个客户端发送消息
|
||||
rate_limiter.is_message_allowed("client1")
|
||||
rate_limiter.is_message_allowed("client2")
|
||||
rate_limiter.is_message_allowed("client1")
|
||||
|
||||
var stats = rate_limiter.get_global_stats()
|
||||
assert_true(stats.has("total_clients"), "Should include total clients")
|
||||
assert_true(stats.has("active_clients"), "Should include active clients")
|
||||
assert_true(stats.has("total_messages_in_window"), "Should include total messages")
|
||||
assert_eq(stats.total_clients, 2, "Should have 2 clients")
|
||||
assert(stats.has("total_clients"), "Should include total clients")
|
||||
assert(stats.has("active_clients"), "Should include active clients")
|
||||
assert(stats.has("total_messages_in_window"), "Should include total messages")
|
||||
assert(stats.total_clients == 2, "Should have 2 clients")
|
||||
|
||||
print("✅ 全局统计测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试限制重置
|
||||
func test_limit_reset():
|
||||
"""测试手动重置客户端限制"""
|
||||
## 测试手动重置客户端限制
|
||||
print("\n--- 测试限制重置 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送3条消息(达到限制)
|
||||
@@ -111,17 +170,23 @@ func test_limit_reset():
|
||||
rate_limiter.is_message_allowed(client_id)
|
||||
|
||||
# 确认被阻止
|
||||
assert_false(rate_limiter.is_message_allowed(client_id), "Should be blocked")
|
||||
assert(not rate_limiter.is_message_allowed(client_id), "Should be blocked")
|
||||
|
||||
# 重置限制
|
||||
rate_limiter.reset_client_limit(client_id)
|
||||
|
||||
# 现在应该允许消息
|
||||
assert_true(rate_limiter.is_message_allowed(client_id), "Should be allowed after reset")
|
||||
assert(rate_limiter.is_message_allowed(client_id), "Should be allowed after reset")
|
||||
|
||||
print("✅ 限制重置测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试可疑活动检测
|
||||
func test_suspicious_activity_detection():
|
||||
"""测试可疑活动检测"""
|
||||
## 测试可疑活动检测
|
||||
print("\n--- 测试可疑活动检测 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送接近限制的消息数量
|
||||
@@ -130,20 +195,22 @@ func test_suspicious_activity_detection():
|
||||
|
||||
# 应该检测为可疑活动
|
||||
var is_suspicious = rate_limiter.is_suspicious_activity(client_id)
|
||||
assert_true(is_suspicious, "High message rate should be flagged as suspicious")
|
||||
assert(is_suspicious, "High message rate should be flagged as suspicious")
|
||||
|
||||
print("✅ 可疑活动检测测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试机器人模式检测
|
||||
func test_bot_pattern_detection():
|
||||
"""测试机器人行为模式检测"""
|
||||
## 测试机器人行为模式检测
|
||||
print("\n--- 测试机器人模式检测 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 模拟机器人:以完全相同的间隔发送消息
|
||||
# 这需要手动操作消息历史来模拟
|
||||
if rate_limiter.client_message_history.has(client_id):
|
||||
var client_record = rate_limiter.client_message_history[client_id]
|
||||
else:
|
||||
if not rate_limiter.client_message_history.has(client_id):
|
||||
rate_limiter.client_message_history[client_id] = {"messages": [], "last_cleanup": Time.get_unix_time_from_system()}
|
||||
var client_record = rate_limiter.client_message_history[client_id]
|
||||
|
||||
var current_time = Time.get_unix_time_from_system()
|
||||
var client_record = rate_limiter.client_message_history[client_id]
|
||||
@@ -154,18 +221,24 @@ func test_bot_pattern_detection():
|
||||
|
||||
# 应该检测为可疑活动(机器人模式)
|
||||
var is_suspicious = rate_limiter.is_suspicious_activity(client_id)
|
||||
assert_true(is_suspicious, "Regular interval messages should be flagged as bot-like")
|
||||
assert(is_suspicious, "Regular interval messages should be flagged as bot-like")
|
||||
|
||||
print("✅ 机器人模式检测测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试动态限制调整
|
||||
func test_dynamic_limit_adjustment():
|
||||
"""测试动态调整速率限制"""
|
||||
## 测试动态调整速率限制
|
||||
print("\n--- 测试动态限制调整 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 使用初始限制(3条消息)
|
||||
for i in range(3):
|
||||
rate_limiter.is_message_allowed(client_id)
|
||||
|
||||
assert_false(rate_limiter.is_message_allowed(client_id), "Should be blocked with initial limit")
|
||||
assert(not rate_limiter.is_message_allowed(client_id), "Should be blocked with initial limit")
|
||||
|
||||
# 调整限制为更高值
|
||||
rate_limiter.set_rate_limit(5, 1.0)
|
||||
@@ -176,18 +249,24 @@ func test_dynamic_limit_adjustment():
|
||||
# 现在应该能发送更多消息
|
||||
for i in range(5):
|
||||
var allowed = rate_limiter.is_message_allowed(client_id)
|
||||
assert_true(allowed, "Message %d should be allowed with new limit" % (i + 1))
|
||||
assert(allowed, "Message %d should be allowed with new limit" % (i + 1))
|
||||
|
||||
print("✅ 动态限制调整测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试清理功能
|
||||
func test_cleanup_functionality():
|
||||
"""测试过期记录清理功能"""
|
||||
## 测试过期记录清理功能
|
||||
print("\n--- 测试清理功能 ---")
|
||||
setup_test()
|
||||
|
||||
var client_id = "test_client"
|
||||
|
||||
# 发送一些消息
|
||||
rate_limiter.is_message_allowed(client_id)
|
||||
|
||||
# 确认客户端记录存在
|
||||
assert_true(rate_limiter.client_message_history.has(client_id), "Client record should exist")
|
||||
assert(rate_limiter.client_message_history.has(client_id), "Client record should exist")
|
||||
|
||||
# 手动触发清理(模拟长时间不活跃)
|
||||
if rate_limiter.client_message_history.has(client_id):
|
||||
@@ -197,27 +276,42 @@ func test_cleanup_functionality():
|
||||
# 触发清理
|
||||
rate_limiter._cleanup_old_records()
|
||||
|
||||
# 不活跃的客户端记录应该被清理
|
||||
# 注意:这个测试可能需要根据实际的清理逻辑调整
|
||||
print("✅ 清理功能测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 测试边界情况
|
||||
func test_edge_cases():
|
||||
"""测试边界情况"""
|
||||
## 测试边界情况
|
||||
print("\n--- 测试边界情况 ---")
|
||||
setup_test()
|
||||
|
||||
# 测试空客户端ID
|
||||
var allowed = rate_limiter.is_message_allowed("")
|
||||
assert_true(allowed, "Empty client ID should be handled gracefully")
|
||||
assert(allowed, "Empty client ID should be handled gracefully")
|
||||
|
||||
# 测试非常长的客户端ID
|
||||
var long_id = "a".repeat(1000)
|
||||
allowed = rate_limiter.is_message_allowed(long_id)
|
||||
assert_true(allowed, "Long client ID should be handled gracefully")
|
||||
assert(allowed, "Long client ID should be handled gracefully")
|
||||
|
||||
# 测试零限制
|
||||
rate_limiter.set_rate_limit(0, 1.0)
|
||||
allowed = rate_limiter.is_message_allowed("test")
|
||||
assert_false(allowed, "Zero rate limit should block all messages")
|
||||
assert(not allowed, "Zero rate limit should block all messages")
|
||||
|
||||
# 测试负数限制(应该被处理为0或默认值)
|
||||
rate_limiter.set_rate_limit(-1, 1.0)
|
||||
allowed = rate_limiter.is_message_allowed("test2")
|
||||
# 行为取决于实现,但不应该崩溃
|
||||
# 行为取决于实现,但不应该崩溃
|
||||
|
||||
print("✅ 边界情况测试通过")
|
||||
cleanup_test()
|
||||
|
||||
## 断言函数
|
||||
func assert(condition: bool, message: String):
|
||||
## 简单的断言函数
|
||||
if not condition:
|
||||
push_error("断言失败: " + message)
|
||||
print("❌ " + message)
|
||||
else:
|
||||
print("✓ " + message)
|
||||
|
||||
Reference in New Issue
Block a user