]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/test-dns_random_hh.cc
Merge pull request #8096 from mind04/pdns-notify-db-queries
[thirdparty/pdns.git] / pdns / test-dns_random_hh.cc
CommitLineData
78cb2bd0 1#define BOOST_TEST_DYN_LINK
2#define BOOST_TEST_NO_MAIN
e59c5996 3
34eb951c 4// Disable this code for gcc 4.8 and lower
4b587bc5 5#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ > 8) || !__GNUC__
9c4701ec 6
7#ifdef HAVE_CONFIG_H
e59c5996 8#include "config.h"
870a0fe4 9#endif
78cb2bd0 10#include <boost/test/unit_test.hpp>
11#include <boost/assign/std/map.hpp>
fa8fd4d2 12
78cb2bd0 13#include <boost/accumulators/statistics/median.hpp>
14#include <boost/accumulators/statistics/mean.hpp>
15#include <boost/accumulators/accumulators.hpp>
16#include <boost/accumulators/statistics.hpp>
17
05739b0e 18#include "arguments.hh"
78cb2bd0 19#include "dns_random.hh"
20#include "namespaces.hh"
21
e59c5996 22
78cb2bd0 23using namespace boost;
24using namespace boost::accumulators;
25
26typedef accumulator_set<
27 double
28 , stats<boost::accumulators::tag::median(with_p_square_quantile),
232f0877
CH
29 boost::accumulators::tag::mean(immediate)
30 >
78cb2bd0 31 > acc_t;
32
33
34
35BOOST_AUTO_TEST_SUITE(test_dns_random_hh)
36
809137d7 37BOOST_AUTO_TEST_CASE(test_dns_random_auto_average) {
e59c5996 38
05739b0e
RG
39 ::arg().set("rng")="auto";
40 ::arg().set("entropy-source")="/dev/urandom";
e59c5996 41
05739b0e 42 dns_random_init("", true);
e59c5996 43
78cb2bd0 44 acc_t acc;
45
78cb2bd0 46 for(unsigned int n=0; n < 100000; ++n) {
47 acc(dns_random(100000)/100000.0);
48 }
49 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
50 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
e59c5996 51
78cb2bd0 52 // please add covariance tests, chi-square, Kolmogorov-Smirnov
53}
54
809137d7 55BOOST_AUTO_TEST_CASE(test_dns_random_urandom_average) {
05739b0e
RG
56
57 ::arg().set("rng")="urandom";
58 ::arg().set("entropy-source")="/dev/urandom";
59
60 dns_random_init("", true);
61
62 acc_t acc;
63
64 for(unsigned int n=0; n < 100000; ++n) {
65 acc(dns_random(100000)/100000.0);
66 }
67 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
68 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
69
70 // please add covariance tests, chi-square, Kolmogorov-Smirnov
71}
72
809137d7 73BOOST_AUTO_TEST_CASE(test_dns_random_garbage) {
05739b0e
RG
74
75 ::arg().set("rng")="garbage";
76 ::arg().set("entropy-source")="/dev/urandom";
77
78 BOOST_CHECK_THROW(dns_random_init("", true), std::runtime_error);
79}
80
0abdd3fb
PD
81BOOST_AUTO_TEST_CASE(test_dns_random_upper_bound) {
82 ::arg().set("rng")="auto";
83 ::arg().set("entropy-source")="/dev/urandom";
84
85 dns_random_init("", true);
86
87 map<int, bool> seen;
88 for(unsigned int n=0; n < 100000; ++n) {
89 seen[dns_random(10)] = true;
90 }
91
92 BOOST_CHECK_EQUAL(seen[0], true);
93 BOOST_CHECK_EQUAL(seen[1], true);
94 BOOST_CHECK_EQUAL(seen[2], true);
95 BOOST_CHECK_EQUAL(seen[3], true);
96 BOOST_CHECK_EQUAL(seen[4], true);
97 BOOST_CHECK_EQUAL(seen[5], true);
98 BOOST_CHECK_EQUAL(seen[6], true);
99 BOOST_CHECK_EQUAL(seen[7], true);
100 BOOST_CHECK_EQUAL(seen[8], true);
101 BOOST_CHECK_EQUAL(seen[9], true);
102 BOOST_CHECK_EQUAL(seen[10], false);
103}
104
05739b0e 105#if defined(HAVE_GETRANDOM)
809137d7 106BOOST_AUTO_TEST_CASE(test_dns_random_getrandom_average) {
05739b0e
RG
107
108 ::arg().set("rng")="getrandom";
109 ::arg().set("entropy-source")="/dev/urandom";
110
111 dns_random_init("", true);
112
113 acc_t acc;
114
115 for(unsigned int n=0; n < 100000; ++n) {
116 acc(dns_random(100000)/100000.0);
117 }
118 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
119 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
120
121 // please add covariance tests, chi-square, Kolmogorov-Smirnov
122}
123#endif
124
125#if defined(HAVE_ARC4RANDOM)
809137d7 126BOOST_AUTO_TEST_CASE(test_dns_random_getrandom_average) {
05739b0e
RG
127
128 ::arg().set("rng")="arc4random";
129 ::arg().set("entropy-source")="/dev/urandom";
130
131 dns_random_init("", true);
132
133 acc_t acc;
134
135 for(unsigned int n=0; n < 100000; ++n) {
136 acc(dns_random(100000)/100000.0);
137 }
138 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
139 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
140
141 // please add covariance tests, chi-square, Kolmogorov-Smirnov
142}
143#endif
144
145#if defined(HAVE_RANDOMBYTES_STIR)
809137d7 146BOOST_AUTO_TEST_CASE(test_dns_random_sodium_average) {
05739b0e
RG
147
148 ::arg().set("rng")="sodium";
149 ::arg().set("entropy-source")="/dev/urandom";
150
151 dns_random_init("", true);
152
153 acc_t acc;
154
155 for(unsigned int n=0; n < 100000; ++n) {
156 acc(dns_random(100000)/100000.0);
157 }
158 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
159 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
160
161 // please add covariance tests, chi-square, Kolmogorov-Smirnov
162}
163#endif
164
165#if defined(HAVE_RAND_BYTES)
809137d7 166BOOST_AUTO_TEST_CASE(test_dns_random_openssl_average) {
05739b0e
RG
167
168 ::arg().set("rng")="openssl";
169 ::arg().set("entropy-source")="/dev/urandom";
170
171 dns_random_init("", true);
172
173 acc_t acc;
174
175 for(unsigned int n=0; n < 100000; ++n) {
176 acc(dns_random(100000)/100000.0);
177 }
178 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
179 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
180
181 // please add covariance tests, chi-square, Kolmogorov-Smirnov
182}
183#endif
184
185#if defined(HAVE_KISS_RNG)
809137d7 186BOOST_AUTO_TEST_CASE(test_dns_random_kiss_average) {
05739b0e
RG
187
188 ::arg().set("rng")="kiss";
189 ::arg().set("entropy-source")="/dev/urandom";
190
191 dns_random_init("", true);
192
193 acc_t acc;
194
195 for(unsigned int n=0; n < 100000; ++n) {
196 acc(dns_random(100000)/100000.0);
197 }
198 BOOST_CHECK_CLOSE(0.5, median(acc), 2.0); // within 2%
199 BOOST_CHECK_CLOSE(0.5, mean(acc), 2.0);
200
201 // please add covariance tests, chi-square, Kolmogorov-Smirnov
202}
203#endif
e59c5996 204
205
78cb2bd0 206BOOST_AUTO_TEST_SUITE_END()
e59c5996 207
4d68b3b1 208#endif