rand_test.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. package ice
  4. import (
  5. "sync"
  6. "testing"
  7. )
  8. func TestRandomGeneratorCollision(t *testing.T) {
  9. candidateIDGen := newCandidateIDGenerator()
  10. testCases := map[string]struct {
  11. gen func(t *testing.T) string
  12. }{
  13. "CandidateID": {
  14. gen: func(t *testing.T) string {
  15. return candidateIDGen.Generate()
  16. },
  17. },
  18. "PWD": {
  19. gen: func(t *testing.T) string {
  20. s, err := generatePwd()
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. return s
  25. },
  26. },
  27. "Ufrag": {
  28. gen: func(t *testing.T) string {
  29. s, err := generateUFrag()
  30. if err != nil {
  31. t.Fatal(err)
  32. }
  33. return s
  34. },
  35. },
  36. }
  37. const N = 100
  38. const iteration = 100
  39. for name, testCase := range testCases {
  40. testCase := testCase
  41. t.Run(name, func(t *testing.T) {
  42. for iter := 0; iter < iteration; iter++ {
  43. var wg sync.WaitGroup
  44. var mu sync.Mutex
  45. rands := make([]string, 0, N)
  46. for i := 0; i < N; i++ {
  47. wg.Add(1)
  48. go func() {
  49. r := testCase.gen(t)
  50. mu.Lock()
  51. rands = append(rands, r)
  52. mu.Unlock()
  53. wg.Done()
  54. }()
  55. }
  56. wg.Wait()
  57. if len(rands) != N {
  58. t.Fatal("Failed to generate randoms")
  59. }
  60. for i := 0; i < N; i++ {
  61. for j := i + 1; j < N; j++ {
  62. if rands[i] == rands[j] {
  63. t.Fatalf("generateRandString caused collision: %s == %s", rands[i], rands[j])
  64. }
  65. }
  66. }
  67. }
  68. })
  69. }
  70. }