OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_time.cpp
Go to the documentation of this file.
1#include "test_common.hpp"
2
5
8
9using namespace openvpn;
10using namespace openvpn;
11
12int my_abs(const int value)
13{
14 if (value >= 0)
15 return value;
16 return -value;
17}
18
19class Mean
20{
21 public:
22 void add(const int value)
23 {
24 sum_ += value;
25 ++count_;
26 }
27
28 int mean() const
29 {
30 return sum_ / count_;
31 }
32
33 void check_mean_range(const std::string &title, const int low, const int hi) const
34 {
35 const int m = mean();
36 ASSERT_TRUE(m > low && m < hi) << title << ' ' << to_string() << " outside of range=(" << low << ',' << hi << ')';
37 }
38
39 int count() const
40 {
41 return count_;
42 }
43
44 std::string to_string() const
45 {
46 return printfmt("[mean=%s count=%s]", mean(), count());
47 }
48
49 private:
50 int count_ = 0;
51 int sum_ = 0;
52};
53
54struct MeanDev
55{
58
59 std::string to_string() const
60 {
61 return mean.to_string() + " dev=" + dev.to_string();
62 }
63};
64
65void test_skew(const Time::Duration &dur,
66 const unsigned int skew_factor,
67 MeanDev &md,
68 const bool verbose,
69 RandomAPI &prng)
70{
71 const Time::Duration after = TimeSkew::skew(dur, skew_factor, prng);
72 md.mean.add(static_cast<int>(after.to_binary_ms()));
73 md.dev.add(my_abs(int(dur.to_binary_ms()) - int(after.to_binary_ms())));
74 if (verbose)
75 OPENVPN_LOG("BEFORE=" << dur.to_binary_ms() << " AFTER=" << after.to_binary_ms());
76}
77
78TEST(Time, Timeskew)
79{
80 MTRand::Ptr prng(new MTRand());
81 MeanDev md;
82 for (int i = 0; i < 10000; ++i)
83 {
84 test_skew(Time::Duration::seconds(10), TimeSkew::PCT_25, md, false, *prng);
85 }
86 // OPENVPN_LOG(md.to_string());
87 md.mean.check_mean_range("mean", 10100, 10300);
88 md.dev.check_mean_range("dev", 1250, 1350);
89}
90
91TEST(Time, Test1)
92{
94
95 const Time until = Time::now() + Time::Duration::seconds(1);
96
97 Time::base_type last_sec = 0;
98 Time::type last_frac = 0;
99
100 while (true)
101 {
102 const Time t = Time::now();
103 if (t >= until)
104 break;
105 const Time::base_type sec = t.seconds_since_epoch();
106 const Time::type frac = t.fractional_binary_ms();
107 if (sec != last_sec || frac != last_frac)
108 {
109 // std::cout << sec << ' ' << frac << "\n";
110 last_sec = sec;
111 last_frac = frac;
112 }
113 }
114}
115
116static void sub(const Time &t1, const Time &t2, bool large)
117{
118 const Time::Duration d = t1 - t2;
119 // std::cout << "T-T " << t1.raw() << " - " << t2.raw() << " = " << d.raw() << "\n";
120 if (large)
121 ASSERT_GE(d.raw(), 100000U);
122 else
123 ASSERT_EQ(d.raw(), 0U);
124}
125
126static void sub(const Time::Duration &d1, const Time::Duration &d2)
127{
128 const Time::Duration d = d1 - d2;
129 // std::cout << "D-D " << d1.raw() << " - " << d2.raw() << " = " << d.raw() << "\n";
130 Time::Duration x = d1;
131 x -= d2;
132 ASSERT_EQ(x, d) << "D-D INCONSISTENCY DETECTED";
133}
134
135static void add(const Time &t1, const Time::Duration &d1)
136{
137 const Time t = t1 + d1;
138 // std::cout << "T+D " << t1.raw() << " + " << d1.raw() << " = " << t.raw() << "\n";
139 Time x = t1;
140 x += d1;
141 ASSERT_EQ(x, t) << "T+D INCONSISTENCY DETECTED";
142}
143
144static void add(const Time::Duration &d1, const Time::Duration &d2)
145{
146 const Time::Duration d = d1 + d2;
147 // std::cout << "D+D " << d1.raw() << " + " << d2.raw() << " = " << d.raw() << "\n";
148 Time::Duration x = d1;
149 x += d2;
150 ASSERT_EQ(x, d) << "D+D INCONSISTENCY DETECTED";
151}
152
153TEST(Time, Timeaddsub)
154{
155 {
156 const Time now = Time::now();
157 const Time inf = Time::infinite();
158 sub(now, now, false);
159 sub(inf, now, true);
160 sub(now, inf, false);
161 sub(inf, inf, false);
162 }
163 {
164 const Time::Duration sec = Time::Duration::seconds(1);
165 const Time::Duration inf = Time::Duration::infinite();
166 sub(sec, sec);
167 sub(inf, sec);
168 sub(sec, inf);
169 sub(inf, inf);
170 }
171 {
172 const Time tf = Time::now();
173 const Time ti = Time::infinite();
174 const Time::Duration df = Time::Duration::seconds(1);
175 const Time::Duration di = Time::Duration::infinite();
176 add(tf, df);
177 add(tf, di);
178 add(ti, df);
179 add(ti, di);
180 }
181 {
182 const Time::Duration sec = Time::Duration::seconds(1);
183 const Time::Duration inf = Time::Duration::infinite();
184 add(sec, sec);
185 add(inf, sec);
186 add(sec, inf);
187 add(inf, inf);
188 }
189}
int sum_
Definition test_time.cpp:51
int count() const
Definition test_time.cpp:39
int count_
Definition test_time.cpp:50
void add(const int value)
Definition test_time.cpp:22
int mean() const
Definition test_time.cpp:28
std::string to_string() const
Definition test_time.cpp:44
void check_mean_range(const std::string &title, const int low, const int hi) const
Definition test_time.cpp:33
The smart pointer class.
Definition rc.hpp:119
Abstract base class for random number generators.
Definition randapi.hpp:39
static TimeType infinite()
Definition time.hpp:254
static void reset_base()
Definition time.hpp:420
static TimeType now()
Definition time.hpp:302
base_type seconds_since_epoch() const
Definition time.hpp:289
T fractional_binary_ms() const
Definition time.hpp:297
#define OPENVPN_LOG(args)
std::string printfmt(const std::string &fmt, Args... args)
Definition format.hpp:313
Mean dev
Definition test_time.cpp:57
std::string to_string() const
Definition test_time.cpp:59
Mean mean
Definition test_time.cpp:56
static Time::Duration skew(const Time::Duration &dur, const unsigned int factor, RandomAPI &prng)
Definition skew.hpp:36
static bool verbose
Definition test_ip.cpp:31
void test_skew(const Time::Duration &dur, const unsigned int skew_factor, MeanDev &md, const bool verbose, RandomAPI &prng)
Definition test_time.cpp:65
TEST(Time, Timeskew)
Definition test_time.cpp:78
int my_abs(const int value)
Definition test_time.cpp:12
static void add(const Time &t1, const Time::Duration &d1)
static void sub(const Time &t1, const Time &t2, bool large)