Multi-producer multi-consumer queue with optional blocking
[folly.git] / folly / test / DeterministicScheduleTest.cpp
1 /*
2  * Copyright 2013 Facebook, Inc.
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 "DeterministicSchedule.h"
18
19 #include <gflags/gflags.h>
20 #include <gtest/gtest.h>
21
22 using namespace folly::test;
23
24 TEST(DeterministicSchedule, uniform) {
25   auto p = DeterministicSchedule::uniform(0);
26   int buckets[10] = {};
27   for (int i = 0; i < 100000; ++i) {
28     buckets[p(10)]++;
29   }
30   for (int i = 0; i < 10; ++i) {
31     EXPECT_TRUE(buckets[i] > 9000);
32   }
33 }
34
35 TEST(DeterministicSchedule, uniformSubset) {
36   auto ps = DeterministicSchedule::uniformSubset(0, 3, 100);
37   int buckets[10] = {};
38   std::set<int> seen;
39   for (int i = 0; i < 100000; ++i) {
40     if (i > 0 && (i % 100) == 0) {
41       EXPECT_EQ(seen.size(), 3);
42       seen.clear();
43     }
44     int x = ps(10);
45     seen.insert(x);
46     EXPECT_TRUE(seen.size() <= 3);
47     buckets[x]++;
48   }
49   for (int i = 0; i < 10; ++i) {
50     EXPECT_TRUE(buckets[i] > 9000);
51   }
52 }
53
54 int main(int argc, char** argv) {
55   testing::InitGoogleTest(&argc, argv);
56   google::ParseCommandLineFlags(&argc, &argv, true);
57   return RUN_ALL_TESTS();
58 }