| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- //go:build unit
- package antigravity
- import (
- "sync"
- "sync/atomic"
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- )
- // --- Task 7: 验证 generateRandomID 和降级碰撞防护 ---
- func TestGenerateRandomID_Uniqueness(t *testing.T) {
- seen := make(map[string]struct{}, 100)
- for i := 0; i < 100; i++ {
- id := generateRandomID()
- require.Len(t, id, 12, "ID 长度应为 12")
- _, dup := seen[id]
- require.False(t, dup, "第 %d 次调用生成了重复 ID: %s", i, id)
- seen[id] = struct{}{}
- }
- }
- func TestFallbackCounter_Increments(t *testing.T) {
- // 验证 fallbackCounter 的原子递增行为确保降级分支不会生成相同 seed
- before := atomic.LoadUint64(&fallbackCounter)
- cnt1 := atomic.AddUint64(&fallbackCounter, 1)
- cnt2 := atomic.AddUint64(&fallbackCounter, 1)
- require.Equal(t, before+1, cnt1, "第一次递增应为 before+1")
- require.Equal(t, before+2, cnt2, "第二次递增应为 before+2")
- require.NotEqual(t, cnt1, cnt2, "连续两次递增的计数器值应不同")
- }
- func TestFallbackCounter_ConcurrentIncrements(t *testing.T) {
- // 验证并发递增的原子性 — 每次递增都应产生唯一值
- const goroutines = 50
- results := make([]uint64, goroutines)
- var wg sync.WaitGroup
- wg.Add(goroutines)
- for i := 0; i < goroutines; i++ {
- go func(idx int) {
- defer wg.Done()
- results[idx] = atomic.AddUint64(&fallbackCounter, 1)
- }(i)
- }
- wg.Wait()
- // 所有结果应唯一
- seen := make(map[uint64]bool, goroutines)
- for _, v := range results {
- assert.False(t, seen[v], "并发递增产生了重复值: %d", v)
- seen[v] = true
- }
- }
- func TestGenerateRandomID_Charset(t *testing.T) {
- const validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
- validSet := make(map[byte]struct{}, len(validChars))
- for i := 0; i < len(validChars); i++ {
- validSet[validChars[i]] = struct{}{}
- }
- for i := 0; i < 50; i++ {
- id := generateRandomID()
- for j := 0; j < len(id); j++ {
- _, ok := validSet[id[j]]
- require.True(t, ok, "ID 包含非法字符: %c (ID=%s)", id[j], id)
- }
- }
- }
- func TestGenerateRandomID_Length(t *testing.T) {
- for i := 0; i < 100; i++ {
- id := generateRandomID()
- assert.Len(t, id, 12, "每次生成的 ID 长度应为 12")
- }
- }
- func TestGenerateRandomID_ConcurrentUniqueness(t *testing.T) {
- // 验证并发调用不会产生重复 ID
- const goroutines = 100
- results := make([]string, goroutines)
- var wg sync.WaitGroup
- wg.Add(goroutines)
- for i := 0; i < goroutines; i++ {
- go func(idx int) {
- defer wg.Done()
- results[idx] = generateRandomID()
- }(i)
- }
- wg.Wait()
- seen := make(map[string]bool, goroutines)
- for _, id := range results {
- assert.False(t, seen[id], "并发调用产生了重复 ID: %s", id)
- seen[id] = true
- }
- }
- func BenchmarkGenerateRandomID(b *testing.B) {
- for i := 0; i < b.N; i++ {
- _ = generateRandomID()
- }
- }
|