random_test.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <algorithm>
  5. #include <atomic>
  6. #include <cstdint>
  7. #include <initializer_list>
  8. #include <iterator>
  9. #include <string>
  10. #include <thread>
  11. #include <vector>
  12. #include "opentelemetry/nostd/span.h"
  13. #include "src/common/random.h"
  14. using opentelemetry::sdk::common::Random;
  15. TEST(RandomTest, GenerateRandom64)
  16. {
  17. EXPECT_NE(Random::GenerateRandom64(), Random::GenerateRandom64());
  18. }
  19. TEST(RandomTest, GenerateRandomBuffer)
  20. {
  21. uint8_t buf1_array[8] = {0};
  22. uint8_t buf2_array[8] = {0};
  23. Random::GenerateRandomBuffer(buf1_array);
  24. Random::GenerateRandomBuffer(buf2_array);
  25. EXPECT_FALSE(std::equal(std::begin(buf1_array), std::end(buf1_array), std::begin(buf2_array)));
  26. // Edge cases.
  27. for (auto size : {7, 8, 9, 16, 17})
  28. {
  29. std::vector<uint8_t> buf1_vector(size);
  30. std::vector<uint8_t> buf2_vector(size);
  31. Random::GenerateRandomBuffer(buf1_vector);
  32. Random::GenerateRandomBuffer(buf2_vector);
  33. EXPECT_FALSE(
  34. std::equal(std::begin(buf1_vector), std::end(buf1_vector), std::begin(buf2_vector)));
  35. }
  36. }
  37. void doSomethingOnce(std::atomic_uint *count)
  38. {
  39. static std::atomic_flag flag;
  40. if (!flag.test_and_set())
  41. {
  42. (*count)++;
  43. }
  44. }
  45. TEST(RandomTest, AtomicFlagMultiThreadTest)
  46. {
  47. std::vector<std::thread> threads;
  48. std::atomic_uint count(0);
  49. threads.reserve(10);
  50. for (int i = 0; i < 10; ++i)
  51. {
  52. threads.push_back(std::thread(doSomethingOnce, &count));
  53. }
  54. for (auto &t : threads)
  55. {
  56. t.join();
  57. }
  58. EXPECT_EQ(1, count.load());
  59. }