• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 20579846577

29 Dec 2025 06:24PM UTC coverage: 90.415% (+0.2%) from 90.243%
20579846577

push

github

web-flow
Merge pull request #5167 from randombit/jack/src-size-reductions

Changes to reduce unnecessary inclusions

101523 of 112285 relevant lines covered (90.42%)

12817276.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.8
/src/tests/test_tests.cpp
1
/*
2
* (C) 2017,2018 Jack Lloyd
3
*
4
* Botan is released under the Simplified BSD License (see license.txt)
5
*/
6

7
#include "tests.h"
8

9
#include <botan/rng.h>
10

11
#if defined(BOTAN_HAS_BIGINT)
12
   #include <botan/bigint.h>
13
#endif
14

15
namespace Botan_Tests {
16

17
/*
18
* Test the test framework :)
19
*/
20

21
class Test_Tests final : public Test {
1✔
22
   public:
23
      std::vector<Test::Result> run() override {
1✔
24
         /*
25
         Notation here is confusing. Idea is the result is the actual
26
         result of the test. The test_result is the result that is the
27
         testcase, and should typically be in a failure mode.
28
         */
29

30
         Test::Result result("Test Framework");
1✔
31

32
         // Test a few success corner cases first
33
         const std::string testcase_name = "Failing Test";
1✔
34

35
         // NOLINTNEXTLINE(hicpp-exception-baseclass)
36
         result.test_throws("throws pi(-ish)", []() { throw 22.0 / 7; });
3✔
37

38
         // Test expected failure cases
39
         {
1✔
40
            Test::Result test_result(testcase_name);
2✔
41
            test_result.test_throws("doesn't throw", []() {});
2✔
42
            verify_failure("test_throws 1", result, test_result);
1✔
43
         }
1✔
44

45
         {
1✔
46
            Test::Result test_result(testcase_name);
2✔
47
            test_result.test_failure("explicitly reported failure", std::vector<uint8_t>());
2✔
48
            verify_failure("explicit failure", result, test_result);
1✔
49
         }
1✔
50

51
         {
1✔
52
            Test::Result test_result(testcase_name);
2✔
53
            test_result.test_failure("explicitly reported failure", "test error");
2✔
54
            verify_failure("explicit failure", result, test_result);
1✔
55
         }
1✔
56

57
         { verify_failure("explicit failure", result, Test::Result::Failure(testcase_name, "failure")); }
2✔
58

59
         {
1✔
60
            Test::Result test_result(testcase_name);
2✔
61
            std::vector<uint8_t> vec1(5);
1✔
62
            std::vector<uint8_t> vec2(3, 9);
1✔
63
            test_result.test_eq("test vectors equal", vec1, vec2);
2✔
64
            verify_failure("test vectors equal", result, test_result);
2✔
65
         }
2✔
66

67
         {
1✔
68
            Test::Result test_result(testcase_name);
2✔
69
            std::vector<uint8_t> vec1(5);
1✔
70
            std::vector<uint8_t> vec2(5);
1✔
71
            test_result.test_ne("test vectors not equal", vec1, vec2);
2✔
72
            verify_failure("test vectors equal", result, test_result);
2✔
73
         }
2✔
74

75
         {
1✔
76
            Test::Result test_result(testcase_name);
2✔
77
            std::vector<uint8_t> vec1(5);
1✔
78
            std::vector<uint8_t> vec2(5);
1✔
79
            test_result.test_ne("test arrays not equal", vec1.data(), vec1.size(), vec2.data(), vec2.size());
1✔
80
            verify_failure("test vectors equal", result, test_result);
2✔
81
         }
2✔
82

83
         {
1✔
84
            Test::Result test_result(testcase_name);
2✔
85
            const size_t x = 5;
1✔
86
            const size_t y = 6;
1✔
87
            test_result.test_eq("test ints equal", x, y);
1✔
88
            verify_failure("test ints equal", result, test_result);
1✔
89
         }
1✔
90

91
         {
1✔
92
            Test::Result test_result(testcase_name);
2✔
93
            const size_t x = 5;
1✔
94
            const size_t y = 5;
1✔
95
            test_result.test_ne("test ints not equal", x, y);
1✔
96
            verify_failure("test ints not equal", result, test_result);
1✔
97
         }
1✔
98

99
         {
1✔
100
            Test::Result test_result(testcase_name);
2✔
101
            test_result.test_is_nonempty("empty", "");
2✔
102
            verify_failure("test_is_nonempty", result, test_result);
1✔
103
         }
1✔
104

105
         {
1✔
106
            Test::Result test_result(testcase_name);
2✔
107
            test_result.test_lt("not less", 5, 5);
1✔
108
            verify_failure("test_lt", result, test_result);
1✔
109
         }
1✔
110

111
         {
1✔
112
            Test::Result test_result(testcase_name);
2✔
113
            test_result.test_lte("not lte", 6, 5);
1✔
114
            verify_failure("test_lte", result, test_result);
1✔
115
         }
1✔
116

117
         {
1✔
118
            Test::Result test_result(testcase_name);
2✔
119
            test_result.test_gte("not gte", 5, 6);
1✔
120
            verify_failure("test_gte", result, test_result);
1✔
121
         }
1✔
122

123
         {
1✔
124
            Test::Result test_result(testcase_name);
2✔
125
            test_result.test_ne("string ne", "foo", "foo");
2✔
126
            verify_failure("test_ne", result, test_result);
1✔
127
         }
1✔
128

129
         {
1✔
130
            Test::Result test_result(testcase_name);
2✔
131
            test_result.test_rc_ok("test_func", -1);
1✔
132
            verify_failure("test_rc_ok", result, test_result);
1✔
133
         }
1✔
134

135
         {
1✔
136
            Test::Result test_result(testcase_name);
2✔
137
            test_result.test_rc("test_func", 0, 5);
1✔
138
            verify_failure("test_rc", result, test_result);
1✔
139
         }
1✔
140

141
         {
1✔
142
            Test::Result test_result(testcase_name);
2✔
143
            test_result.test_rc_fail("test_func", "testing", 0);
2✔
144
            verify_failure("test_rc_fail", result, test_result);
1✔
145
         }
1✔
146

147
         {
1✔
148
            Test::Result test_result(testcase_name);
2✔
149
            test_result.test_throws(
2✔
150
               "test_throws", "expected msg", []() { throw std::runtime_error("not the message"); });
1✔
151
            verify_failure("test_throws 2", result, test_result);
1✔
152
         }
1✔
153

154
         {
1✔
155
            Test::Result test_result(testcase_name);
2✔
156
            test_result.test_throws("test_throws", "expected msg", []() {
2✔
157
               // NOLINTNEXTLINE(hicpp-exception-baseclass)
158
               throw std::string("not even a std::exception");
1✔
159
            });
160
            verify_failure("test_throws 3", result, test_result);
1✔
161
         }
1✔
162

163
         {
1✔
164
            Test::Result test_result(testcase_name);
2✔
165
            test_result.test_throws("test_throws", "expected msg", []() { ; });
2✔
166
            verify_failure("test_throws 4", result, test_result);
1✔
167
         }
1✔
168

169
         {
1✔
170
            Test::Result test_result(testcase_name);
2✔
171
            test_result.test_throws<std::invalid_argument>(
2✔
172
               "test_throws", "expected msg", []() { throw std::runtime_error("expected msg"); });
1✔
173
            verify_failure("test_throws 5", result, test_result);
1✔
174
         }
1✔
175

176
         {
1✔
177
            Test::Result test_result(testcase_name);
2✔
178
            test_result.test_throws<std::invalid_argument>("test_throws",
2✔
179
                                                           []() { throw std::runtime_error("expected msg"); });
1✔
180
            verify_failure("test_throws 6", result, test_result);
1✔
181
         }
1✔
182

183
         {
1✔
184
            Test::Result test_result(testcase_name);
2✔
185
            test_result.test_no_throw("test_no_throw", []() { throw std::runtime_error("boom!"); });
3✔
186
            verify_failure("test_throws 7", result, test_result);
1✔
187
         }
1✔
188

189
#if defined(BOTAN_HAS_BIGINT)
190
         {
1✔
191
            Test::Result test_result(testcase_name);
2✔
192
            const auto x = Botan::BigInt::from_word(5);
1✔
193
            const auto y = Botan::BigInt::from_word(6);
1✔
194
            test_result.test_eq("test ints equal", x, y);
1✔
195
            verify_failure("test ints equal", result, test_result);
1✔
196
         }
1✔
197

198
         {
1✔
199
            Test::Result test_result(testcase_name);
2✔
200
            const auto x = Botan::BigInt::from_word(5);
1✔
201
            const auto y = Botan::BigInt::from_word(5);
1✔
202
            test_result.test_ne("test ints not equal", x, y);
1✔
203
            verify_failure("test ints not equal", result, test_result);
1✔
204
         }
1✔
205
#endif
206

207
         return {result, test_testsuite_rng()};
4✔
208
      }
2✔
209

210
   private:
211
      static Test::Result test_testsuite_rng() {
1✔
212
         Test::Result result("Testsuite_RNG");
1✔
213

214
         size_t histogram[256] = {0};
1✔
215

216
         const size_t RUNS = 1000;
1✔
217

218
         auto rng = Test::new_rng(__func__);
1✔
219

220
         for(size_t i = 0; i != 256 * RUNS; ++i) {
256,001✔
221
            histogram[rng->next_byte()] += 1;
256,000✔
222
         }
223

224
         for(const size_t count : histogram) {
257✔
225
            if(count < RUNS / 2 || count > RUNS * 2) {
256✔
226
               result.test_failure("Testsuite_RNG produced non-uniform output");
×
227
            } else {
228
               result.test_success("Testsuite_RNG seemed roughly uniform");
512✔
229
            }
230
         }
231

232
         return result;
1✔
233
      }
1✔
234

235
      static void verify_failure(const std::string& what, Test::Result& result, const Test::Result& test_result) {
25✔
236
         if(test_result.tests_failed() > 0) {
25✔
237
            result.test_success("Got expected failure for " + what);
25✔
238
            const std::string result_str = test_result.result_string();
25✔
239

240
            result.confirm("result string contains FAIL", result_str.find("FAIL") != std::string::npos);
50✔
241
         } else {
25✔
242
            result.test_failure("Expected test to fail for " + what);
×
243
         }
244
      }
25✔
245
};
246

247
BOTAN_REGISTER_TEST("utils", "testcode", Test_Tests);
248

249
}  // namespace Botan_Tests
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc