billing_cache_jitter_test.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package repository
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/require"
  7. )
  8. // --- Task 6.1 验证: math/rand/v2 迁移后 jitteredTTL 行为正确 ---
  9. func TestJitteredTTL_WithinExpectedRange(t *testing.T) {
  10. // jitteredTTL 使用减法抖动: billingCacheTTL - [0, billingCacheJitter)
  11. // 所以结果应在 [billingCacheTTL - billingCacheJitter, billingCacheTTL] 范围内
  12. lowerBound := billingCacheTTL - billingCacheJitter // 5min - 30s = 4min30s
  13. upperBound := billingCacheTTL // 5min
  14. for i := 0; i < 200; i++ {
  15. ttl := jitteredTTL()
  16. assert.GreaterOrEqual(t, int64(ttl), int64(lowerBound),
  17. "TTL 不应低于 %v,实际得到 %v", lowerBound, ttl)
  18. assert.LessOrEqual(t, int64(ttl), int64(upperBound),
  19. "TTL 不应超过 %v(上界不变保证),实际得到 %v", upperBound, ttl)
  20. }
  21. }
  22. func TestJitteredTTL_NeverExceedsBase(t *testing.T) {
  23. // 关键安全性测试:jitteredTTL 使用减法抖动,确保永远不超过 billingCacheTTL
  24. for i := 0; i < 500; i++ {
  25. ttl := jitteredTTL()
  26. assert.LessOrEqual(t, int64(ttl), int64(billingCacheTTL),
  27. "jitteredTTL 不应超过基础 TTL(上界预期不被打破)")
  28. }
  29. }
  30. func TestJitteredTTL_HasVariance(t *testing.T) {
  31. // 验证抖动确实产生了不同的值
  32. results := make(map[time.Duration]bool)
  33. for i := 0; i < 100; i++ {
  34. ttl := jitteredTTL()
  35. results[ttl] = true
  36. }
  37. require.Greater(t, len(results), 1,
  38. "jitteredTTL 应产生不同的值(抖动生效),但 100 次调用结果全部相同")
  39. }
  40. func TestJitteredTTL_AverageNearCenter(t *testing.T) {
  41. // 验证平均值大约在抖动范围中间
  42. var sum time.Duration
  43. runs := 1000
  44. for i := 0; i < runs; i++ {
  45. sum += jitteredTTL()
  46. }
  47. avg := sum / time.Duration(runs)
  48. expectedCenter := billingCacheTTL - billingCacheJitter/2 // 4min45s
  49. // 允许 ±5s 的误差
  50. tolerance := 5 * time.Second
  51. assert.InDelta(t, float64(expectedCenter), float64(avg), float64(tolerance),
  52. "平均 TTL 应接近抖动范围中心 %v", expectedCenter)
  53. }
  54. func TestBillingKeyGeneration(t *testing.T) {
  55. t.Run("balance_key", func(t *testing.T) {
  56. key := billingBalanceKey(12345)
  57. assert.Equal(t, "billing:balance:12345", key)
  58. })
  59. t.Run("sub_key", func(t *testing.T) {
  60. key := billingSubKey(100, 200)
  61. assert.Equal(t, "billing:sub:100:200", key)
  62. })
  63. }
  64. func BenchmarkJitteredTTL(b *testing.B) {
  65. for i := 0; i < b.N; i++ {
  66. _ = jitteredTTL()
  67. }
  68. }