xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/test_tools/http2_random_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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