1 #include "quiche/http2/test_tools/http2_random.h"
2
3 #include <set>
4
5 #include "quiche/common/platform/api/quiche_test.h"
6
7 namespace http2 {
8 namespace test {
9 namespace {
10
TEST(Http2RandomTest,ProducesDifferentNumbers)11 TEST(Http2RandomTest, ProducesDifferentNumbers) {
12 Http2Random random;
13 uint64_t value1 = random.Rand64();
14 uint64_t value2 = random.Rand64();
15 uint64_t value3 = random.Rand64();
16
17 EXPECT_NE(value1, value2);
18 EXPECT_NE(value2, value3);
19 EXPECT_NE(value3, value1);
20 }
21
TEST(Http2RandomTest,StartsWithDifferentKeys)22 TEST(Http2RandomTest, StartsWithDifferentKeys) {
23 Http2Random random1;
24 Http2Random random2;
25
26 EXPECT_NE(random1.Key(), random2.Key());
27 EXPECT_NE(random1.Rand64(), random2.Rand64());
28 EXPECT_NE(random1.Rand64(), random2.Rand64());
29 EXPECT_NE(random1.Rand64(), random2.Rand64());
30 }
31
TEST(Http2RandomTest,ReproducibleRandom)32 TEST(Http2RandomTest, ReproducibleRandom) {
33 Http2Random random;
34 uint64_t value1 = random.Rand64();
35 uint64_t value2 = random.Rand64();
36
37 Http2Random clone_random(random.Key());
38 EXPECT_EQ(clone_random.Key(), random.Key());
39 EXPECT_EQ(value1, clone_random.Rand64());
40 EXPECT_EQ(value2, clone_random.Rand64());
41 }
42
TEST(Http2RandomTest,STLShuffle)43 TEST(Http2RandomTest, STLShuffle) {
44 Http2Random random;
45 const std::string original = "abcdefghijklmonpqrsuvwxyz";
46
47 std::string shuffled = original;
48 std::shuffle(shuffled.begin(), shuffled.end(), random);
49 EXPECT_NE(original, shuffled);
50 }
51
TEST(Http2RandomTest,RandFloat)52 TEST(Http2RandomTest, RandFloat) {
53 Http2Random random;
54 for (int i = 0; i < 10000; i++) {
55 float value = random.RandFloat();
56 ASSERT_GE(value, 0.f);
57 ASSERT_LE(value, 1.f);
58 }
59 }
60
TEST(Http2RandomTest,RandStringWithAlphabet)61 TEST(Http2RandomTest, RandStringWithAlphabet) {
62 Http2Random random;
63 std::string str = random.RandStringWithAlphabet(1000, "xyz");
64 EXPECT_EQ(1000u, str.size());
65
66 std::set<char> characters(str.begin(), str.end());
67 EXPECT_THAT(characters, testing::ElementsAre('x', 'y', 'z'));
68 }
69
TEST(Http2RandomTest,SkewedLow)70 TEST(Http2RandomTest, SkewedLow) {
71 Http2Random random;
72 constexpr size_t kMax = 1234;
73 for (int i = 0; i < 10000; i++) {
74 size_t value = random.RandomSizeSkewedLow(kMax);
75 ASSERT_GE(value, 0u);
76 ASSERT_LE(value, kMax);
77 }
78 }
79
80 // Checks that SkewedLow() generates full range. This is required, since in
81 // some unit tests would infinitely loop.
TEST(Http2RandomTest,SkewedLowFullRange)82 TEST(Http2RandomTest, SkewedLowFullRange) {
83 Http2Random random;
84 std::set<size_t> values;
85 for (int i = 0; i < 1000; i++) {
86 values.insert(random.RandomSizeSkewedLow(3));
87 }
88 EXPECT_THAT(values, testing::ElementsAre(0, 1, 2, 3));
89 }
90
91 } // namespace
92 } // namespace test
93 } // namespace http2
94