From ef69336189b02ad3d48c4d952a25d19b805d54d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Fri, 24 Nov 2023 14:11:41 +0300 Subject: [PATCH] =?UTF-8?q?mdbx-test:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=82=D1=80=D0=B0=D0=BD=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D1=80=D0=BE=D0=B2=20hex/base64/base58.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/CMakeLists.txt | 8 ++ test/extra/hex_base64_base58.c++ | 128 +++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 test/extra/hex_base64_base58.c++ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 23789be0..08866fe4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -88,6 +88,13 @@ if(UNIX AND NOT SUBPROJECT) set_target_properties(test_extra_dupfixed_multiple PROPERTIES CXX_STANDARD ${MDBX_CXX_STANDARD} CXX_STANDARD_REQUIRED ON) endif() + add_executable(test_extra_hex_base64_base58 extra/hex_base64_base58.c++) + target_include_directories(test_extra_hex_base64_base58 PRIVATE "${PROJECT_SOURCE_DIR}") + target_link_libraries(test_extra_hex_base64_base58 ${TOOL_MDBX_LIB}) + if(MDBX_CXX_STANDARD) + set_target_properties(test_extra_hex_base64_base58 PROPERTIES + CXX_STANDARD ${MDBX_CXX_STANDARD} CXX_STANDARD_REQUIRED ON) + endif() endif() endif() @@ -172,6 +179,7 @@ else() if(MDBX_BUILD_CXX) add_test(NAME extra_maindb_ordinal COMMAND test_extra_maindb_ordinal) add_test(NAME extra_dupfixed_multiple COMMAND test_extra_dupfixed_multiple) + add_test(NAME extra_hex_base64_base58 COMMAND test_extra_hex_base64_base58) endif() endif() diff --git a/test/extra/hex_base64_base58.c++ b/test/extra/hex_base64_base58.c++ new file mode 100644 index 00000000..879e8f7b --- /dev/null +++ b/test/extra/hex_base64_base58.c++ @@ -0,0 +1,128 @@ +#include "mdbx.h++" +#include +#include +#include + +#include +#include + +using buffer = mdbx::default_buffer; + +std::default_random_engine prng(42); + +static buffer random(size_t length) { + buffer result(length); +#if defined(__cpp_lib_span) && __cpp_lib_span >= 202002L + for (auto &i : result.bytes()) + i = prng(); +#else + for (auto p = result.byte_ptr(); p < result.end_byte_ptr(); ++p) + *p = mdbx::byte(prng()); +#endif + return result; +} + +static bool basic() { + bool ok = true; + const char *const hex_dump = "1D58fa\n2e46E3\nBd9c7A\nC0bF"; + const uint8_t native[] = {0x1D, 0x58, 0xfa, 0x2e, 0x46, 0xE3, + 0xBd, 0x9c, 0x7A, 0xC0, 0xbF}; + + if (mdbx::slice(hex_dump).hex_decode(true) != mdbx::slice::wrap(native)) + std::cerr << "hex_decode() failed\n"; + else if (mdbx::slice::wrap(native).encode_hex(true, 4).hex_decode(true) != + mdbx::slice::wrap(native)) + std::cerr << "hex_encode(UPPERCASE) failed\n"; + else if (mdbx::slice::wrap(native).encode_hex(false).hex_decode(true) != + mdbx::slice::wrap(native)) + std::cerr << "hex_encode(lowercase) failed\n"; + + if (mdbx::slice("").as_base64_string() != "" || + mdbx::slice(" ").encode_base64().as_string() != "IA==" || + mdbx::slice("~0").encode_base64().as_string() != "fjA=" || + mdbx::slice("A_z").encode_base64().as_string() != "QV96" || + mdbx::slice("Ka9q").encode_base64().as_string() != "S2E5cQ==" || + mdbx::slice("123456789").encode_base64().as_string() != "MTIzNDU2Nzg5") { + std::cerr << "encode_base64() failed\n"; + ok = false; + } + + const uint8_t base58_rfc[] = {0x00, 0x00, 0x28, 0x7f, 0xb4, 0xcd}; + if (mdbx::slice("").as_base58_string() != "" || + mdbx::slice(" ").encode_base58().as_string() != "Z" || + mdbx::slice("Hello World!").as_base58_string() != "2NEpo7TZRRrLZSi2U" || + mdbx::slice("The quick brown fox jumps over the lazy dog.") + .encode_base58() + .as_string() != + "USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z" || + mdbx::slice::wrap(base58_rfc).as_base58_string() != "11233QC4" || + mdbx::slice("~0").encode_base58().as_string() != "Aby" || + mdbx::slice("A_z").encode_base58().as_string() != "NxZw" || + mdbx::slice("Ka9q").encode_base58().as_string() != "2vkjDi" || + mdbx::slice("123456789").encode_base58().as_string() != "dKYWwnRHc7Ck") { + std::cerr << "encode_base58() failed\n"; + ok = false; + } + + if (mdbx::slice("").base58_decode() != mdbx::slice() || + mdbx::slice("Z").base58_decode() != mdbx::slice(" ") || + mdbx::slice("2NEpo7TZRRrLZSi2U").base58_decode() != "Hello World!" || + mdbx::slice( + "USm3fpXnKG5EUBx2ndxBDMPVciP5hGey2Jh4NDv6gmeo1LkMeiKrLJUUBk6Z") + .base58_decode() != + mdbx::slice("The quick brown fox jumps over the lazy dog.") || + mdbx::slice("11233QC4").base58_decode() != + mdbx::slice::wrap(base58_rfc) || + mdbx::slice("Aby").base58_decode() != mdbx::slice("~0") || + mdbx::slice("NxZw").base58_decode() != mdbx::slice("A_z") || + mdbx::slice("2vkjDi").base58_decode() != mdbx::slice("Ka9q") || + mdbx::slice("dKYWwnRHc7Ck").base58_decode() != mdbx::slice("123456789")) { + std::cerr << "decode_base58() failed\n"; + ok = false; + } + + return ok; +} + +int main(int argc, const char *argv[]) { + (void)argc; + (void)argv; + + auto ok = basic(); + for (size_t n = 0; n < 1000; ++n) { + for (size_t length = 0; ok && length < 111; ++length) { + const auto pattern = random(length); + if (pattern != pattern.encode_hex(bool(prng() & 1), prng() % 111) + .hex_decode(true) + .encode_hex() + .hex_decode(false)) { + std::cerr << "hex encode/decode failed: n " << n << ", length " + << length << std::endl; + ok = false; + } + if (pattern != pattern.encode_base64(unsigned(prng() % 111)) + .base64_decode(true) + .encode_base64() + .base64_decode(false)) { + std::cerr << "base64 encode/decode failed: n " << n << ", length " + << length << std::endl; + ok = false; + } + if (pattern != pattern.encode_base58(unsigned(prng() % 111)) + .base58_decode(true) + .encode_base58() + .base58_decode(false)) { + std::cerr << "base58 encode/decode failed: n " << n << ", length " + << length << std::endl; + ok = false; + } + } + } + + if (!ok) { + std::cerr << "Fail\n"; + return EXIT_FAILURE; + } + std::cout << "OK\n"; + return EXIT_SUCCESS; +}