// Package security 提供滑动窗口限流器的基准测试。
//
// 该文件测试近似模式和精确模式的滑动窗口限流性能。
//
// 作者：xfy
package security

import (
	"testing"
	"time"
)

// BenchmarkSlidingWindowAllow 测试近似模式滑动窗口 Allow 性能。
func BenchmarkSlidingWindowAllow(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 10000, false)

	b.ResetTimer()
	for b.Loop() {
		sw.Allow("192.168.1.100")
	}
}

// BenchmarkSlidingWindowAllowPrecise 测试精确模式滑动窗口 Allow 性能。
func BenchmarkSlidingWindowAllowPrecise(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 10000, true)

	b.ResetTimer()
	for b.Loop() {
		sw.Allow("192.168.1.100")
	}
}

// BenchmarkSlidingWindowAllowParallel 测试近似模式并发 Allow 性能。
func BenchmarkSlidingWindowAllowParallel(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 100000, false)

	clients := make([]string, 10)
	for i := range clients {
		clients[i] = "192.168.1." + string(rune('0'+i))
	}

	b.ResetTimer()
	b.RunParallel(func(pb *testing.PB) {
		i := 0
		for pb.Next() {
			sw.Allow(clients[i%10])
			i++
		}
	})
}

// BenchmarkSlidingWindowAllowPreciseParallel 测试精确模式并发 Allow 性能。
func BenchmarkSlidingWindowAllowPreciseParallel(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 100000, true)

	clients := make([]string, 10)
	for i := range clients {
		clients[i] = "192.168.1." + string(rune('0'+i))
	}

	b.ResetTimer()
	b.RunParallel(func(pb *testing.PB) {
		i := 0
		for pb.Next() {
			sw.Allow(clients[i%10])
			i++
		}
	})
}

// BenchmarkSlidingWindowCleanup 测试滑动窗口清理性能。
func BenchmarkSlidingWindowCleanup(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 1000, false)

	// 预创建 100 个键
	for i := range 100 {
		sw.Allow("192.168.0." + string(rune(i)))
	}

	b.ResetTimer()
	for b.Loop() {
		sw.Cleanup(time.Hour)
	}
}

// BenchmarkSlidingWindowGetCount 测试获取计数性能。
func BenchmarkSlidingWindowGetCount(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 10000, false)
	key := "192.168.1.100"

	// 预先添加一些请求
	for range 100 {
		sw.Allow(key)
	}

	b.ResetTimer()
	for b.Loop() {
		sw.GetCount(key)
	}
}

// BenchmarkSlidingWindowReset 测试重置性能。
func BenchmarkSlidingWindowReset(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 10000, false)
	key := "192.168.1.100"

	b.ResetTimer()
	for b.Loop() {
		sw.Allow(key)
		sw.Reset(key)
	}
}

// BenchmarkSlidingWindowMultiKey 测试多键场景性能。
func BenchmarkSlidingWindowMultiKey(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 10000, false)

	keys := make([]string, 100)
	for i := range keys {
		keys[i] = "192.168.0." + string(rune(i))
	}

	b.ResetTimer()
	for i := 0; b.Loop(); i++ {
		sw.Allow(keys[i%100])
	}
}

// BenchmarkSlidingWindowStats 测试获取统计信息性能。
func BenchmarkSlidingWindowStats(b *testing.B) {
	sw := NewSlidingWindowLimiter(time.Second, 10000, false)

	// 预创建一些键
	for i := range 50 {
		sw.Allow("192.168.0." + string(rune(i)))
	}

	b.ResetTimer()
	for b.Loop() {
		sw.GetStats()
	}
}
