From 8da5ce49ef1857c8d3231e929c17bfa0fcacf7bf Mon Sep 17 00:00:00 2001 From: SEK1RO Date: Thu, 26 Sep 2024 20:05:38 +0300 Subject: [PATCH] fix(base64): coverage --- Makefile | 1 + src/base64.cpp | 33 +++++++++++++++------------------ test/test-base64.cpp | 12 ++++++++++++ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 525492d..77bf9be 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,7 @@ docs: doxygen Doxyfile cover: ${DIRS} ${patsubst %, ${BINDIR}/%${-g}-cov, ${TESTS}} + rm -f **/*.gcda ${patsubst %, ./${BINDIR}/%${-g}-cov;, ${TESTS}} gcovr --html-nested cov/index.html --txt --exclude-throw-branches diff --git a/src/base64.cpp b/src/base64.cpp index 8976085..e00972b 100644 --- a/src/base64.cpp +++ b/src/base64.cpp @@ -74,25 +74,22 @@ namespace base64 str[i * 4 + 3] = digits[data[i * 3 + 2] & 0x3F]; } uint64_t last_idx = data_size / 3 * 4; - if (last_idx + 3 < str_size) + switch (data_size % 3) { - switch (data_size % 3) - { - case 1: - str[last_idx] = digits[data[data_size - 1] >> 2]; - str[last_idx + 1] = digits[data[data_size - 1] << 4 & 0x30]; - str[last_idx + 2] = '='; - str[last_idx + 3] = '='; - break; - case 2: - str[last_idx] = digits[data[data_size - 2] >> 2]; - str[last_idx + 1] = digits[(data[data_size - 2] << 4 | data[data_size - 1] >> 4) & 0x3F]; - str[last_idx + 2] = digits[data[data_size - 1] & 0x0F]; - str[last_idx + 3] = '='; - break; - default: - break; - } + case 1: + str[last_idx] = digits[data[data_size - 1] >> 2]; + str[last_idx + 1] = digits[data[data_size - 1] << 4 & 0x30]; + str[last_idx + 2] = '='; + str[last_idx + 3] = '='; + break; + case 2: + str[last_idx] = digits[data[data_size - 2] >> 2]; + str[last_idx + 1] = digits[(data[data_size - 2] << 4 | data[data_size - 1] >> 4) & 0x3F]; + str[last_idx + 2] = digits[data[data_size - 1] & 0x0F]; + str[last_idx + 3] = '='; + break; + default: + break; } } std::string encode(std::span data) noexcept diff --git a/test/test-base64.cpp b/test/test-base64.cpp index f0877da..92d2316 100644 --- a/test/test-base64.cpp +++ b/test/test-base64.cpp @@ -28,6 +28,12 @@ TEST(base64, encode) { for (auto it : tests) EXPECT_EQ(it.first, encode(hex::decode(it.second))); + + std::vector data = {0x74, 0x65, 0x73, 0x74}; + std::string str = ""; + EXPECT_THROW(encode(data.data(), std::numeric_limits::max(), str.data(), str.size()), std::overflow_error); + EXPECT_THROW(encode(data.data(), data.size(), str.data(), str.size()), std::length_error); + EXPECT_NO_THROW(encode(data.data(), 0, str.data(), str.size())); } TEST(base64, encode_1e7) { @@ -38,6 +44,12 @@ TEST(base64, decode) { for (auto it : tests) EXPECT_EQ(hex::encode(decode(it.first)), it.second); + + std::vector data = {0x61, 0x6e, 0x6f}; + EXPECT_THROW(decode("FFF", 3, data.data(), data.size()), std::logic_error); + EXPECT_THROW(decode("!@#!", 4, data.data(), data.size()), std::logic_error); + EXPECT_THROW(decode("FF==", 2, data.data(), 0), std::length_error); + EXPECT_NO_THROW(decode("" , 0, data.data(), 0)); } TEST(base64, decode_1e7) {