blob: 868b348b1147411cb74d3d83dfec0ffc9f3e6431 [file] [log] [blame]
Amit Hilbuchc63ddb22019-01-02 10:13:58 -08001/*
2 * Copyright 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "rtc_base/unique_id_generator.h"
12
Steve Anton2acd1632019-03-25 13:48:30 -070013#include <string>
14#include <vector>
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080015
Steve Anton2acd1632019-03-25 13:48:30 -070016#include "absl/algorithm/container.h"
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080017#include "api/array_view.h"
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080018#include "rtc_base/gunit.h"
19#include "rtc_base/helpers.h"
20#include "test/gmock.h"
21
22using ::testing::IsEmpty;
23using ::testing::Test;
24
Amit Hilbuchdbb49df2019-01-23 14:54:24 -080025namespace rtc {
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080026
27template <typename Generator>
28class UniqueIdGeneratorTest : public Test {};
29
30using test_types = ::testing::Types<UniqueNumberGenerator<uint8_t>,
31 UniqueNumberGenerator<uint16_t>,
32 UniqueNumberGenerator<uint32_t>,
Elad Alonefc9a142019-02-08 23:35:59 +010033 UniqueNumberGenerator<int>,
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080034 UniqueRandomIdGenerator,
35 UniqueStringGenerator>;
36
Mirko Bonadeic84f6612019-01-31 12:20:57 +010037TYPED_TEST_SUITE(UniqueIdGeneratorTest, test_types);
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080038
39TYPED_TEST(UniqueIdGeneratorTest, ElementsDoNotRepeat) {
40 typedef TypeParam Generator;
41 const size_t num_elements = 255;
42 Generator generator;
43 std::vector<typename Generator::value_type> values;
44 for (size_t i = 0; i < num_elements; i++) {
45 values.push_back(generator());
46 }
47
48 EXPECT_EQ(num_elements, values.size());
49 // Use a set to check uniqueness.
50 std::set<typename Generator::value_type> set(values.begin(), values.end());
51 EXPECT_EQ(values.size(), set.size()) << "Returned values were not unique.";
52}
53
54TYPED_TEST(UniqueIdGeneratorTest, KnownElementsAreNotGenerated) {
55 typedef TypeParam Generator;
56 const size_t num_elements = 100;
57 rtc::InitRandom(0);
58 Generator generator1;
59 std::vector<typename Generator::value_type> known_values;
60 for (size_t i = 0; i < num_elements; i++) {
61 known_values.push_back(generator1());
62 }
63 EXPECT_EQ(num_elements, known_values.size());
64
65 rtc::InitRandom(0);
66 Generator generator2(known_values);
67
68 std::vector<typename Generator::value_type> values;
69 for (size_t i = 0; i < num_elements; i++) {
70 values.push_back(generator2());
71 }
72 EXPECT_THAT(values, ::testing::SizeIs(num_elements));
Steve Anton2acd1632019-03-25 13:48:30 -070073 absl::c_sort(values);
74 absl::c_sort(known_values);
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080075 std::vector<typename Generator::value_type> intersection;
Steve Anton2acd1632019-03-25 13:48:30 -070076 absl::c_set_intersection(values, known_values,
77 std::back_inserter(intersection));
Amit Hilbuchc63ddb22019-01-02 10:13:58 -080078 EXPECT_THAT(intersection, IsEmpty());
79}
80
Amit Hilbuchae3df542019-01-07 12:13:08 -080081TYPED_TEST(UniqueIdGeneratorTest, AddedElementsAreNotGenerated) {
82 typedef TypeParam Generator;
83 const size_t num_elements = 100;
84 rtc::InitRandom(0);
85 Generator generator1;
86 std::vector<typename Generator::value_type> known_values;
87 for (size_t i = 0; i < num_elements; i++) {
88 known_values.push_back(generator1());
89 }
90 EXPECT_EQ(num_elements, known_values.size());
91
92 rtc::InitRandom(0);
93 Generator generator2;
94
Mirko Bonadei739baf02019-01-27 17:29:42 +010095 for (const typename Generator::value_type& value : known_values) {
Amit Hilbuchae3df542019-01-07 12:13:08 -080096 generator2.AddKnownId(value);
97 }
98
99 std::vector<typename Generator::value_type> values;
100 for (size_t i = 0; i < num_elements; i++) {
101 values.push_back(generator2());
102 }
103 EXPECT_THAT(values, ::testing::SizeIs(num_elements));
Steve Anton2acd1632019-03-25 13:48:30 -0700104 absl::c_sort(values);
105 absl::c_sort(known_values);
Amit Hilbuchae3df542019-01-07 12:13:08 -0800106 std::vector<typename Generator::value_type> intersection;
Steve Anton2acd1632019-03-25 13:48:30 -0700107 absl::c_set_intersection(values, known_values,
108 std::back_inserter(intersection));
Amit Hilbuchae3df542019-01-07 12:13:08 -0800109 EXPECT_THAT(intersection, IsEmpty());
110}
111
Elad Alonefc9a142019-02-08 23:35:59 +0100112TYPED_TEST(UniqueIdGeneratorTest, AddKnownIdOnNewIdReturnsTrue) {
113 typedef TypeParam Generator;
114
115 rtc::InitRandom(0);
116 Generator generator1;
117 const typename Generator::value_type id = generator1();
118
119 rtc::InitRandom(0);
120 Generator generator2;
121 EXPECT_TRUE(generator2.AddKnownId(id));
122}
123
124TYPED_TEST(UniqueIdGeneratorTest, AddKnownIdCalledAgainForSameIdReturnsFalse) {
125 typedef TypeParam Generator;
126
127 rtc::InitRandom(0);
128 Generator generator1;
129 const typename Generator::value_type id = generator1();
130
131 rtc::InitRandom(0);
132 Generator generator2;
133 ASSERT_TRUE(generator2.AddKnownId(id));
134 EXPECT_FALSE(generator2.AddKnownId(id));
135}
136
137TYPED_TEST(UniqueIdGeneratorTest,
138 AddKnownIdOnIdProvidedAsKnownToCtorReturnsFalse) {
139 typedef TypeParam Generator;
140
141 rtc::InitRandom(0);
142 Generator generator1;
143 const typename Generator::value_type id = generator1();
144 std::vector<typename Generator::value_type> known_values = {id};
145
146 rtc::InitRandom(0);
147 Generator generator2(known_values);
148 EXPECT_FALSE(generator2.AddKnownId(id));
149}
150
Amit Hilbuchdbb49df2019-01-23 14:54:24 -0800151} // namespace rtc