1 //
2 // Copyright (C) 2014 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "update_engine/update_manager/prng.h"
18 
19 #include <vector>
20 
21 #include <gtest/gtest.h>
22 
23 using std::vector;
24 
25 namespace chromeos_update_manager {
26 
TEST(UmPRNGTest,ShouldBeDeterministic)27 TEST(UmPRNGTest, ShouldBeDeterministic) {
28   PRNG a(42);
29   PRNG b(42);
30 
31   for (int i = 0; i < 1000; ++i) {
32     EXPECT_EQ(a.Rand(), b.Rand()) << "Iteration i=" << i;
33   }
34 }
35 
TEST(UmPRNGTest,SeedChangesGeneratedSequence)36 TEST(UmPRNGTest, SeedChangesGeneratedSequence) {
37   PRNG a(42);
38   PRNG b(5);
39 
40   vector<uint32_t> values_a;
41   vector<uint32_t> values_b;
42 
43   for (int i = 0; i < 100; ++i) {
44     values_a.push_back(a.Rand());
45     values_b.push_back(b.Rand());
46   }
47   EXPECT_NE(values_a, values_b);
48 }
49 
TEST(UmPRNGTest,IsNotConstant)50 TEST(UmPRNGTest, IsNotConstant) {
51   PRNG prng(5);
52 
53   uint32_t initial_value = prng.Rand();
54   bool prng_is_constant = true;
55   for (int i = 0; i < 100; ++i) {
56     if (prng.Rand() != initial_value) {
57       prng_is_constant = false;
58       break;
59     }
60   }
61   EXPECT_FALSE(prng_is_constant) << "After 100 iterations.";
62 }
63 
TEST(UmPRNGTest,RandCoversRange)64 TEST(UmPRNGTest, RandCoversRange) {
65   PRNG a(42);
66   int hits[11] = {0};
67 
68   for (int i = 0; i < 1000; i++) {
69     int r = a.RandMinMax(0, 10);
70     ASSERT_LE(0, r);
71     ASSERT_GE(10, r);
72     hits[r]++;
73   }
74 
75   for (auto& hit : hits)
76     EXPECT_LT(0, hit);
77 }
78 
79 }  // namespace chromeos_update_manager
80