OLD | NEW |
| (Empty) |
1 // Copyright 2008 Google Inc. | |
2 // Authors: Craig Silverstein, Lincoln Smith | |
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 #ifndef OPEN_VCDIFF_TESTING_H_ | |
17 #define OPEN_VCDIFF_TESTING_H_ | |
18 | |
19 #include <config.h> | |
20 #include <stdint.h> // int64_t, uint64_t | |
21 #include <time.h> // gettimeofday | |
22 #include <cassert> | |
23 #include <cstdlib> // rand | |
24 #include "gtest/gtest.h" | |
25 | |
26 #ifdef HAVE_SYS_TIME_H | |
27 #include <sys/time.h> // struct timeval | |
28 #endif // HAVE_SYS_TIME_H | |
29 | |
30 #ifdef HAVE_WINDOWS_H | |
31 #include <windows.h> // QueryPerformanceCounter | |
32 #endif // HAVE_WINDOWS_H | |
33 | |
34 // CHECK is used for assertions that verify the consistency of the test itself, | |
35 // rather than correctness of the code that is being tested. | |
36 // | |
37 // It is better to use a preprocessor macro for CHECK | |
38 // than an inline function, because assert() may report | |
39 // the source file and line where the failure occurred. | |
40 // | |
41 // Putting parentheses around the macro arguments | |
42 // (e.g. "assert((X) == (Y))") would be good practice | |
43 // but would produce error messages that are inconsistent | |
44 // with those expected in the unit tests. | |
45 | |
46 #define CHECK(CONDITION) assert(CONDITION) | |
47 #define CHECK_EQ(X, Y) assert(X == Y) | |
48 #define CHECK_NE(X, Y) assert(X != Y) | |
49 #define CHECK_GE(X, Y) assert(X >= Y) | |
50 #define CHECK_GT(X, Y) assert(X > Y) | |
51 #define CHECK_LE(X, Y) assert(X <= Y) | |
52 #define CHECK_LT(X, Y) assert(X < Y) | |
53 | |
54 namespace open_vcdiff { | |
55 | |
56 // Support for timing tests | |
57 #if defined(HAVE_GETTIMEOFDAY) | |
58 class CycleTimer { | |
59 public: | |
60 inline CycleTimer() { | |
61 Reset(); | |
62 } | |
63 | |
64 inline void Reset() { | |
65 start_time_.tv_sec = 0; | |
66 start_time_.tv_usec = 0; | |
67 cumulative_time_in_usec_ = 0; | |
68 } | |
69 | |
70 inline void Start() { | |
71 CHECK(!IsStarted()); | |
72 gettimeofday(&start_time_, NULL); | |
73 } | |
74 | |
75 inline void Restart() { | |
76 Reset(); | |
77 Start(); | |
78 } | |
79 | |
80 inline void Stop() { | |
81 struct timeval end_time; | |
82 gettimeofday(&end_time, NULL); | |
83 CHECK(IsStarted()); | |
84 cumulative_time_in_usec_ += | |
85 (1000000 * (end_time.tv_sec - start_time_.tv_sec)) | |
86 + end_time.tv_usec - start_time_.tv_usec; | |
87 start_time_.tv_sec = 0; | |
88 start_time_.tv_usec = 0; | |
89 } | |
90 | |
91 inline int64_t GetInUsec() { | |
92 return cumulative_time_in_usec_; | |
93 } | |
94 | |
95 private: | |
96 inline bool IsStarted() { | |
97 return (start_time_.tv_usec > 0) || (start_time_.tv_sec > 0); | |
98 } | |
99 | |
100 struct timeval start_time_; | |
101 int64_t cumulative_time_in_usec_; | |
102 }; | |
103 #elif defined(HAVE_QUERYPERFORMANCECOUNTER) | |
104 class CycleTimer { | |
105 public: | |
106 inline CycleTimer() { | |
107 LARGE_INTEGER frequency; | |
108 QueryPerformanceFrequency(&frequency); // counts per second | |
109 usecs_per_count_ = 1000000.0 / static_cast<double>(frequency.QuadPart); | |
110 Reset(); | |
111 } | |
112 | |
113 inline void Reset() { | |
114 start_time_.QuadPart = 0; | |
115 cumulative_time_in_usec_ = 0; | |
116 } | |
117 | |
118 inline void Start() { | |
119 CHECK(!IsStarted()); | |
120 QueryPerformanceCounter(&start_time_); | |
121 } | |
122 | |
123 inline void Restart() { | |
124 Reset(); | |
125 Start(); | |
126 } | |
127 | |
128 inline void Stop() { | |
129 LARGE_INTEGER end_time; | |
130 QueryPerformanceCounter(&end_time); | |
131 CHECK(IsStarted()); | |
132 double count_diff = static_cast<double>( | |
133 end_time.QuadPart - start_time_.QuadPart); | |
134 cumulative_time_in_usec_ += | |
135 static_cast<int64_t>(count_diff * usecs_per_count_); | |
136 start_time_.QuadPart = 0; | |
137 } | |
138 | |
139 inline int64_t GetInUsec() { | |
140 return cumulative_time_in_usec_; | |
141 } | |
142 | |
143 private: | |
144 inline bool IsStarted() { | |
145 return start_time_.QuadPart > 0; | |
146 } | |
147 | |
148 LARGE_INTEGER start_time_; | |
149 int64_t cumulative_time_in_usec_; | |
150 double usecs_per_count_; | |
151 }; | |
152 #else | |
153 #error CycleTimer needs an implementation that does not use gettimeofday or Quer
yPerformanceCounter | |
154 #endif // HAVE_GETTIMEOFDAY | |
155 | |
156 // This function returns a pseudo-random value of type IntType between 0 and | |
157 // limit. It uses the standard rand() function to produce the value, and makes | |
158 // as many calls to rand() as needed to ensure that the values returned can fall | |
159 // within the full range specified. It is slow, so don't include calls to this | |
160 // function when calculating the execution time of tests. | |
161 // | |
162 template<typename IntType> | |
163 inline IntType PortableRandomInRange(IntType limit) { | |
164 uint64_t value = rand(); | |
165 double rand_limit = RAND_MAX; // The maximum possible value | |
166 while (rand_limit < limit) { | |
167 // value is multiplied by (RAND_MAX + 1) each iteration. This factor will be | |
168 // canceled out when we divide by rand_limit to get scaled_value, below. | |
169 value = (value * (static_cast<uint64_t>(RAND_MAX) + 1)) + rand(); | |
170 rand_limit = (rand_limit * (RAND_MAX + 1.0)) + RAND_MAX; | |
171 } | |
172 // Translate the random 64-bit integer into a floating-point value between | |
173 // 0.0 (inclusive) and 1.0 (inclusive). | |
174 const double scaled_value = value / rand_limit; | |
175 return static_cast<IntType>(limit * scaled_value); | |
176 } | |
177 | |
178 } // namespace open_vcdiff | |
179 | |
180 #endif // OPEN_VCDIFF_TESTING_H_ | |
OLD | NEW |