response_transformer_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. //go:build unit
  2. package antigravity
  3. import (
  4. "sync"
  5. "sync/atomic"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. )
  10. // --- Task 7: 验证 generateRandomID 和降级碰撞防护 ---
  11. func TestGenerateRandomID_Uniqueness(t *testing.T) {
  12. seen := make(map[string]struct{}, 100)
  13. for i := 0; i < 100; i++ {
  14. id := generateRandomID()
  15. require.Len(t, id, 12, "ID 长度应为 12")
  16. _, dup := seen[id]
  17. require.False(t, dup, "第 %d 次调用生成了重复 ID: %s", i, id)
  18. seen[id] = struct{}{}
  19. }
  20. }
  21. func TestFallbackCounter_Increments(t *testing.T) {
  22. // 验证 fallbackCounter 的原子递增行为确保降级分支不会生成相同 seed
  23. before := atomic.LoadUint64(&fallbackCounter)
  24. cnt1 := atomic.AddUint64(&fallbackCounter, 1)
  25. cnt2 := atomic.AddUint64(&fallbackCounter, 1)
  26. require.Equal(t, before+1, cnt1, "第一次递增应为 before+1")
  27. require.Equal(t, before+2, cnt2, "第二次递增应为 before+2")
  28. require.NotEqual(t, cnt1, cnt2, "连续两次递增的计数器值应不同")
  29. }
  30. func TestFallbackCounter_ConcurrentIncrements(t *testing.T) {
  31. // 验证并发递增的原子性 — 每次递增都应产生唯一值
  32. const goroutines = 50
  33. results := make([]uint64, goroutines)
  34. var wg sync.WaitGroup
  35. wg.Add(goroutines)
  36. for i := 0; i < goroutines; i++ {
  37. go func(idx int) {
  38. defer wg.Done()
  39. results[idx] = atomic.AddUint64(&fallbackCounter, 1)
  40. }(i)
  41. }
  42. wg.Wait()
  43. // 所有结果应唯一
  44. seen := make(map[uint64]bool, goroutines)
  45. for _, v := range results {
  46. assert.False(t, seen[v], "并发递增产生了重复值: %d", v)
  47. seen[v] = true
  48. }
  49. }
  50. func TestGenerateRandomID_Charset(t *testing.T) {
  51. const validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  52. validSet := make(map[byte]struct{}, len(validChars))
  53. for i := 0; i < len(validChars); i++ {
  54. validSet[validChars[i]] = struct{}{}
  55. }
  56. for i := 0; i < 50; i++ {
  57. id := generateRandomID()
  58. for j := 0; j < len(id); j++ {
  59. _, ok := validSet[id[j]]
  60. require.True(t, ok, "ID 包含非法字符: %c (ID=%s)", id[j], id)
  61. }
  62. }
  63. }
  64. func TestGenerateRandomID_Length(t *testing.T) {
  65. for i := 0; i < 100; i++ {
  66. id := generateRandomID()
  67. assert.Len(t, id, 12, "每次生成的 ID 长度应为 12")
  68. }
  69. }
  70. func TestGenerateRandomID_ConcurrentUniqueness(t *testing.T) {
  71. // 验证并发调用不会产生重复 ID
  72. const goroutines = 100
  73. results := make([]string, goroutines)
  74. var wg sync.WaitGroup
  75. wg.Add(goroutines)
  76. for i := 0; i < goroutines; i++ {
  77. go func(idx int) {
  78. defer wg.Done()
  79. results[idx] = generateRandomID()
  80. }(i)
  81. }
  82. wg.Wait()
  83. seen := make(map[string]bool, goroutines)
  84. for _, id := range results {
  85. assert.False(t, seen[id], "并发调用产生了重复 ID: %s", id)
  86. seen[id] = true
  87. }
  88. }
  89. func BenchmarkGenerateRandomID(b *testing.B) {
  90. for i := 0; i < b.N; i++ {
  91. _ = generateRandomID()
  92. }
  93. }