|
3 | 3 | #include <stdexcept> |
4 | 4 | #include <vector> |
5 | 5 | #include <limits> |
| 6 | +#include <cerrno> |
6 | 7 |
|
7 | 8 | #include "hmac.hpp" |
8 | 9 | #include "hmac_utils.hpp" |
9 | 10 |
|
10 | 11 | static std::time_t mock_time_value = 0; |
| 12 | +static int mock_errno_value = 0; |
11 | 13 | extern "C" std::time_t time(std::time_t* t) { |
12 | 14 | if (t) *t = mock_time_value; |
| 15 | + errno = mock_errno_value; |
13 | 16 | return mock_time_value; |
14 | 17 | } |
15 | 18 |
|
@@ -45,6 +48,17 @@ TEST(HashTest, SHA512LargeInput) { |
45 | 48 | "596d71e02b4eca81f668215d3e9b9e5a143a9c3d8d1981608e0811b20e290961ec2a7e7ecd0e275366cf10aa5f7ab1e052b868c5fa57b6d2bd6e75477b2ecea7"); |
46 | 49 | } |
47 | 50 |
|
| 51 | +TEST(HashTest, InvalidTypeThrowsString) { |
| 52 | + auto invalid = static_cast<hmac::TypeHash>(999); |
| 53 | + EXPECT_THROW(hmac::get_hash("grape", invalid), std::invalid_argument); |
| 54 | +} |
| 55 | + |
| 56 | +TEST(HashTest, InvalidTypeThrowsBuffer) { |
| 57 | + auto invalid = static_cast<hmac::TypeHash>(999); |
| 58 | + const char data[] = "grape"; |
| 59 | + EXPECT_THROW(hmac::get_hash(data, sizeof(data) - 1, invalid), std::invalid_argument); |
| 60 | +} |
| 61 | + |
48 | 62 | TEST(UtilsTest, ToHex) { |
49 | 63 | EXPECT_EQ(hmac::to_hex("012345"), "303132333435"); |
50 | 64 | } |
@@ -99,7 +113,14 @@ TEST(HMACTest, MsgLenOverflowThrows) { |
99 | 113 | size_t huge_len = std::numeric_limits<size_t>::max() - |
100 | 114 | hmac_hash::SHA256::SHA224_256_BLOCK_SIZE + 1; |
101 | 115 | EXPECT_THROW(hmac::get_hmac(key, sizeof(key) - 1, msg, huge_len, |
102 | | - hmac::TypeHash::SHA256), std::overflow_error); |
| 116 | + hmac::TypeHash::SHA256), std::overflow_error); |
| 117 | +} |
| 118 | + |
| 119 | +TEST(HMACTest, InvalidTypeThrowsString) { |
| 120 | + const std::string key = "key"; |
| 121 | + const std::string msg = "abc"; |
| 122 | + auto invalid = static_cast<hmac::TypeHash>(999); |
| 123 | + EXPECT_THROW(hmac::get_hmac(key, msg, invalid), std::invalid_argument); |
103 | 124 | } |
104 | 125 |
|
105 | 126 | TEST(TOTPTest, AtTime) { |
@@ -166,6 +187,44 @@ TEST(TokenBoundaryFingerprintTest, MinTime) { |
166 | 187 | EXPECT_TRUE(hmac::is_token_valid(token_next, key, fingerprint, interval)); |
167 | 188 | } |
168 | 189 |
|
| 190 | +TEST(TimeErrorTest, MinusOneNoErrno) { |
| 191 | + const std::string key = "12345"; |
| 192 | + mock_time_value = static_cast<std::time_t>(-1); |
| 193 | + mock_errno_value = 0; |
| 194 | + std::string token; |
| 195 | + EXPECT_NO_THROW(token = hmac::generate_time_token(key)); |
| 196 | + EXPECT_EQ(token, hmac::get_hmac(key, "0", hmac::TypeHash::SHA256)); |
| 197 | + mock_time_value = 0; |
| 198 | + mock_errno_value = 0; |
| 199 | +} |
| 200 | + |
| 201 | +TEST(TimeErrorTest, MinusOneWithErrno) { |
| 202 | + const std::string key = "12345"; |
| 203 | + mock_time_value = static_cast<std::time_t>(-1); |
| 204 | + mock_errno_value = EINVAL; |
| 205 | + EXPECT_THROW(hmac::generate_time_token(key), std::runtime_error); |
| 206 | + mock_errno_value = 0; |
| 207 | + mock_time_value = 0; |
| 208 | +} |
| 209 | + |
| 210 | +TEST(TotpTimeErrorTest, MinusOneNoErrno) { |
| 211 | + const std::string key = "12345"; |
| 212 | + mock_time_value = static_cast<std::time_t>(-1); |
| 213 | + mock_errno_value = 0; |
| 214 | + EXPECT_NO_THROW(hmac::get_totp_code(key)); |
| 215 | + mock_time_value = 0; |
| 216 | + mock_errno_value = 0; |
| 217 | +} |
| 218 | + |
| 219 | +TEST(TotpTimeErrorTest, MinusOneWithErrno) { |
| 220 | + const std::string key = "12345"; |
| 221 | + mock_time_value = static_cast<std::time_t>(-1); |
| 222 | + mock_errno_value = EINVAL; |
| 223 | + EXPECT_THROW(hmac::get_totp_code(key), std::runtime_error); |
| 224 | + mock_errno_value = 0; |
| 225 | + mock_time_value = 0; |
| 226 | +} |
| 227 | + |
169 | 228 | int main(int argc, char **argv) { |
170 | 229 | ::testing::InitGoogleTest(&argc, argv); |
171 | 230 | return RUN_ALL_TESTS(); |
|
0 commit comments