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

randombit / botan / 5111374265

29 May 2023 11:19AM UTC coverage: 92.227% (+0.5%) from 91.723%
5111374265

push

github

randombit
Next release will be 3.1.0. Update release notes

75588 of 81959 relevant lines covered (92.23%)

11886470.91 hits per line

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

97.52
/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
#if defined(BOTAN_HAS_BIGINT)
10
   #include <botan/bigint.h>
11
#endif
12

13
namespace Botan_Tests {
14

15
/*
16
* Test the test framework :)
17
*/
18

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

28
         Test::Result result("Test Framework");
1✔
29

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

33
         result.test_throws("throws pi", []() { throw 3.14159; });  // NOLINT(hicpp-exception-baseclass)
3✔
34

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

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

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

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

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

63
         {
1✔
64
            Test::Result test_result(testcase_name);
2✔
65
            std::vector<uint8_t> vec1(5), vec2(5);
1✔
66
            test_result.test_ne("test vectors not equal", vec1, vec2);
2✔
67
            verify_failure("test vectors equal", result, test_result);
2✔
68
         }
2✔
69

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

77
         {
1✔
78
            Test::Result test_result(testcase_name);
2✔
79
            size_t x = 5, y = 6;
1✔
80
            test_result.test_eq("test ints equal", x, y);
1✔
81
            verify_failure("test ints equal", result, test_result);
1✔
82
         }
1✔
83

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

91
         {
1✔
92
            Test::Result test_result(testcase_name);
2✔
93
            test_result.test_is_nonempty("empty", "");
2✔
94
            verify_failure("test_is_nonempty", result, test_result);
1✔
95
         }
1✔
96

97
         {
1✔
98
            Test::Result test_result(testcase_name);
2✔
99
            test_result.test_lt("not less", 5, 5);
1✔
100
            verify_failure("test_lt", result, test_result);
1✔
101
         }
1✔
102

103
         {
1✔
104
            Test::Result test_result(testcase_name);
2✔
105
            test_result.test_lte("not lte", 6, 5);
1✔
106
            verify_failure("test_lte", result, test_result);
1✔
107
         }
1✔
108

109
         {
1✔
110
            Test::Result test_result(testcase_name);
2✔
111
            test_result.test_gte("not gte", 5, 6);
1✔
112
            verify_failure("test_gte", result, test_result);
1✔
113
         }
1✔
114

115
         {
1✔
116
            Test::Result test_result(testcase_name);
2✔
117
            test_result.test_ne("string ne", "foo", "foo");
2✔
118
            verify_failure("test_ne", result, test_result);
1✔
119
         }
1✔
120

121
         {
1✔
122
            Test::Result test_result(testcase_name);
2✔
123
            test_result.test_rc_ok("test_func", -1);
1✔
124
            verify_failure("test_rc_ok", result, test_result);
1✔
125
         }
1✔
126

127
         {
1✔
128
            Test::Result test_result(testcase_name);
2✔
129
            test_result.test_rc("test_func", 0, 5);
1✔
130
            verify_failure("test_rc", result, test_result);
1✔
131
         }
1✔
132

133
         {
1✔
134
            Test::Result test_result(testcase_name);
2✔
135
            test_result.test_rc_fail("test_func", "testing", 0);
2✔
136
            verify_failure("test_rc_fail", result, test_result);
1✔
137
         }
1✔
138

139
         {
1✔
140
            Test::Result test_result(testcase_name);
2✔
141
            test_result.test_throws(
2✔
142
               "test_throws", "expected msg", []() { throw std::runtime_error("not the message"); });
1✔
143
            verify_failure("test_throws 2", result, test_result);
1✔
144
         }
1✔
145

146
         {
1✔
147
            Test::Result test_result(testcase_name);
2✔
148
            test_result.test_throws("test_throws", "expected msg", []() {
2✔
149
               throw std::string("not even a std::exception");
1✔
150
            });  // NOLINT(hicpp-exception-baseclass)
151
            verify_failure("test_throws 3", 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
            verify_failure("test_throws 4", result, test_result);
1✔
158
         }
1✔
159

160
         {
1✔
161
            Test::Result test_result(testcase_name);
2✔
162
            test_result.test_throws<std::invalid_argument>(
2✔
163
               "test_throws", "expected msg", []() { throw std::runtime_error("expected msg"); });
1✔
164
            verify_failure("test_throws 5", result, test_result);
1✔
165
         }
1✔
166

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

174
         {
1✔
175
            Test::Result test_result(testcase_name);
2✔
176
            test_result.test_no_throw("test_no_throw", []() { throw std::runtime_error("boom!"); });
3✔
177
            verify_failure("test_throws 7", result, test_result);
1✔
178
         }
1✔
179

180
#if defined(BOTAN_HAS_BIGINT)
181
         {
1✔
182
            Test::Result test_result(testcase_name);
2✔
183
            const auto x = Botan::BigInt::from_word(5);
1✔
184
            const auto y = Botan::BigInt::from_word(6);
1✔
185
            test_result.test_eq("test ints equal", x, y);
1✔
186
            verify_failure("test ints equal", result, test_result);
2✔
187
         }
2✔
188

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

198
         return {result, test_testsuite_rng()};
4✔
199
      }
1✔
200

201
   private:
202
      static Test::Result test_testsuite_rng() {
1✔
203
         Test::Result result("Testsuite_RNG");
1✔
204

205
         size_t histogram[256] = {0};
1✔
206

207
         const size_t RUNS = 1000;
1✔
208

209
         for(size_t i = 0; i != 256 * RUNS; ++i) {
256,001✔
210
            histogram[rng().next_byte()] += 1;
256,000✔
211
         }
212

213
         for(size_t i = 0; i != 256; ++i) {
257✔
214
            if(histogram[i] < RUNS / 2 || histogram[i] > RUNS * 2)
256✔
215
               result.test_failure("Testsuite_RNG produced non-uniform output");
×
216
            else
217
               result.test_success("Testsuite_RNG seemed roughly uniform");
512✔
218
         }
219

220
         return result;
1✔
221
      }
×
222

223
      static void verify_failure(const std::string& what, Test::Result& result, const Test::Result& test_result) {
25✔
224
         if(test_result.tests_failed() > 0) {
25✔
225
            result.test_success("Got expected failure for " + what);
25✔
226
            const std::string result_str = test_result.result_string();
25✔
227

228
            result.confirm("result string contains FAIL", result_str.find("FAIL") != std::string::npos);
75✔
229
         } else
25✔
230
            result.test_failure("Expected test to fail for " + what);
×
231
      }
25✔
232
};
233

234
BOTAN_REGISTER_TEST("utils", "testcode", Test_Tests);
235

236
}  // 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

© 2025 Coveralls, Inc