From d3dc4c731fa11274089129e9eb0d8855e72dd1c2 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 6 Sep 2021 15:49:39 +0200 Subject: [PATCH] Added more tests --- src/p2pool.cpp | 3 +- src/pow_hash.cpp | 2 +- src/pow_hash.h | 3 +- src/side_chain.cpp | 6 +- src/side_chain.h | 2 +- tests/CMakeLists.txt | 25 +++++++- tests/src/crypto_tests.cpp | 2 +- tests/src/hash_tests.cpp | 17 +++++ tests/src/mainnet_test2_block.dat | Bin 0 -> 5753 bytes tests/src/pool_block_tests.cpp | 102 ++++++++++++++++++++++++++++++ 10 files changed, 153 insertions(+), 9 deletions(-) create mode 100644 tests/src/mainnet_test2_block.dat create mode 100644 tests/src/pool_block_tests.cpp diff --git a/src/p2pool.cpp b/src/p2pool.cpp index 23d91be..f3f5d00 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -1011,7 +1011,8 @@ int p2pool::run() LOGINFO(1, "uv_run exited, result = " << rc); } catch (const std::exception& e) { - LOGERR(1, "exception " << e.what()); + const char* s = e.what(); + LOGERR(1, "exception " << s); panic(); } diff --git a/src/pow_hash.cpp b/src/pow_hash.cpp index c44cb78..d0e412a 100644 --- a/src/pow_hash.cpp +++ b/src/pow_hash.cpp @@ -38,7 +38,7 @@ RandomX_Hasher::RandomX_Hasher(p2pool* pool) { uint64_t memory_allocated = 0; - if (!m_pool->params().m_lightMode) { + if (m_pool && !m_pool->params().m_lightMode) { m_dataset = randomx_alloc_dataset(RANDOMX_FLAG_LARGE_PAGES); if (!m_dataset) { LOGWARN(1, "couldn't allocate RandomX dataset using large pages"); diff --git a/src/pow_hash.h b/src/pow_hash.h index 922683c..21f4778 100644 --- a/src/pow_hash.h +++ b/src/pow_hash.h @@ -34,12 +34,13 @@ public: ~RandomX_Hasher(); void set_seed_async(const hash& seed); + void set_seed(const hash& seed); + void set_old_seed(const hash& seed); bool calculate(const void* data, size_t size, const hash& seed, hash& result); private: - void set_seed(const hash& seed); struct ThreadSafeVM { diff --git a/src/side_chain.cpp b/src/side_chain.cpp index ff4911c..719e9b3 100644 --- a/src/side_chain.cpp +++ b/src/side_chain.cpp @@ -51,11 +51,11 @@ static_assert(1 <= UNCLE_BLOCK_DEPTH && UNCLE_BLOCK_DEPTH <= 10, "Invalid UNCLE_ namespace p2pool { -SideChain::SideChain(p2pool* pool, NetworkType type) +SideChain::SideChain(p2pool* pool, NetworkType type, const char* pool_name) : m_pool(pool) , m_networkType(type) , m_chainTip(nullptr) - , m_poolName("mainnet test 2") + , m_poolName(pool_name ? pool_name : "mainnet test 2") , m_targetBlockTime(10) , m_minDifficulty(MIN_DIFFICULTY, 0) , m_chainWindowSize(2160) @@ -64,7 +64,7 @@ SideChain::SideChain(p2pool* pool, NetworkType type) { LOGINFO(1, log::LightCyan() << "network type = " << m_networkType); - if (!load_config(m_pool->params().m_config)) { + if (m_pool && !load_config(m_pool->params().m_config)) { panic(); } diff --git a/src/side_chain.h b/src/side_chain.h index 2c9b0cd..68d48f7 100644 --- a/src/side_chain.h +++ b/src/side_chain.h @@ -41,7 +41,7 @@ struct MinerShare class SideChain { public: - SideChain(p2pool* pool, NetworkType type); + SideChain(p2pool* pool, NetworkType type, const char* pool_name = nullptr); ~SideChain(); void fill_sidechain_data(PoolBlock& block, Wallet* w, const hash& txkeySec, std::vector& shares); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5bb02d7..2eb2981 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -15,6 +15,9 @@ endif() add_subdirectory(googletest) set(LIBS gtest) +add_subdirectory(../external/src/RandomX RandomX) +set(LIBS ${LIBS} randomx) + if (CMAKE_CXX_COMPILER_ID MATCHES GNU) set(WARNING_FLAGS "") set(OPTIMIZATION_FLAGS "-Ofast -s") @@ -67,14 +70,32 @@ set(SOURCES src/hash_tests.cpp src/keccak_tests.cpp src/main.cpp + src/pool_block_tests.cpp src/wallet_tests.cpp ../external/src/cryptonote/crypto-ops-data.c ../external/src/cryptonote/crypto-ops.c + ../external/src/llhttp/api.c + ../external/src/llhttp/http.c + ../external/src/llhttp/llhttp.c + ../src/block_cache.cpp + ../src/block_template.cpp + ../src/console_commands.cpp ../src/crypto.cpp + ../src/json_rpc_request.cpp ../src/keccak.cpp ../src/log.cpp + ../src/mempool.cpp + ../src/p2p_server.cpp + ../src/p2pool.cpp + ../src/p2pool_api.cpp + ../src/params.cpp + ../src/pool_block.cpp + ../src/pow_hash.cpp + ../src/side_chain.cpp + ../src/stratum_server.cpp ../src/util.cpp ../src/wallet.cpp + ../src/zmq_reader.cpp ) include_directories(../src) @@ -84,7 +105,8 @@ include_directories(../external/src/libuv/include) include_directories(../external/src/cppzmq) include_directories(../external/src/libzmq/include) include_directories(../external/src/llhttp) -include_directories(../external/src/randomx/src) +include_directories(../external/src/RandomX/src) +include_directories(../external/src/rapidjson/include) include_directories(src) include_directories(googletest/googletest/include) @@ -127,3 +149,4 @@ add_definitions(/DZMQ_STATIC /DP2POOL_LOG_DISABLE) add_executable(${CMAKE_PROJECT_NAME} ${HEADERS} ${SOURCES}) target_link_libraries(${CMAKE_PROJECT_NAME} debug ${ZMQ_LIBRARY_DEBUG} debug ${UV_LIBRARY_DEBUG} optimized ${ZMQ_LIBRARY} optimized ${UV_LIBRARY} ${LIBS}) add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/crypto_tests.txt" $) +add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/src/mainnet_test2_block.dat" $) diff --git a/tests/src/crypto_tests.cpp b/tests/src/crypto_tests.cpp index 26860d5..608195a 100644 --- a/tests/src/crypto_tests.cpp +++ b/tests/src/crypto_tests.cpp @@ -38,7 +38,7 @@ static void parse_hash(const std::string& s, hash& h) TEST(crypto, derivation) { std::ifstream f("crypto_tests.txt"); - ASSERT_EQ(f.good(), true); + ASSERT_EQ(f.good() && f.is_open(), true); do { std::string name; f >> name; diff --git a/tests/src/hash_tests.cpp b/tests/src/hash_tests.cpp index 525fa84..59073b1 100644 --- a/tests/src/hash_tests.cpp +++ b/tests/src/hash_tests.cpp @@ -29,6 +29,23 @@ TEST(hash, constructor) ASSERT_EQ(memcmp(h.h, buf, HASH_SIZE), 0); } +TEST(hash, compare) +{ + hash hashes[HASH_SIZE + 1]; + + for (size_t i = 1; i <= HASH_SIZE; ++i) { + hashes[i].h[i - 1] = 1; + } + + for (size_t i = 0; i <= HASH_SIZE; ++i) { + for (size_t j = 0; j <= HASH_SIZE; ++j) { + ASSERT_EQ(hashes[i] < hashes[j], i < j); + ASSERT_EQ(hashes[i] == hashes[j], i == j); + ASSERT_EQ(hashes[i] != hashes[j], i != j); + } + } +} + TEST(hash, empty) { hash h; diff --git a/tests/src/mainnet_test2_block.dat b/tests/src/mainnet_test2_block.dat new file mode 100644 index 0000000000000000000000000000000000000000..fea3b60b88468575d0e9f44cfb2f04e19edb5103 GIT binary patch literal 5753 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 literal 0 HcmV?d00001 diff --git a/tests/src/pool_block_tests.cpp b/tests/src/pool_block_tests.cpp new file mode 100644 index 0000000..9ea1c01 --- /dev/null +++ b/tests/src/pool_block_tests.cpp @@ -0,0 +1,102 @@ +/* + * This file is part of the Monero P2Pool + * Copyright (c) 2021 SChernykh + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "common.h" +#include "pool_block.h" +#include "pow_hash.h" +#include "side_chain.h" +#include "gtest/gtest.h" +#include + +namespace p2pool { + +TEST(pool_block, deserialize) +{ + PoolBlock b; + SideChain sidechain(nullptr, NetworkType::Mainnet, "mainnet test 2"); + + constexpr uint64_t expeted_consensus_id[HASH_SIZE / sizeof(uint64_t)] = { + 0x92680bb5e77eaf22ull, + 0x27446c2c6bda99e3ull, + 0x008e04a9d40451b2ull, + 0x18f90744f09d6eb1ull + }; + + const std::vector& consensus_id = sidechain.consensus_id(); + ASSERT_EQ(consensus_id.size(), HASH_SIZE); + ASSERT_EQ(memcmp(consensus_id.data(), expeted_consensus_id, HASH_SIZE), 0); + + std::ifstream f("mainnet_test2_block.dat", std::ios::binary | std::ios::ate); + ASSERT_EQ(f.good() && f.is_open(), true); + + std::vector buf(f.tellg()); + f.seekg(0); + f.read(reinterpret_cast(buf.data()), buf.size()); + ASSERT_EQ(f.good(), true); + + ASSERT_EQ(b.deserialize(buf.data(), buf.size(), sidechain), 0); + + ASSERT_EQ(b.m_mainChainData.size(), 5607); + ASSERT_EQ(b.m_mainChainHeaderSize, 43); + ASSERT_EQ(b.m_mainChainMinerTxSize, 506); + ASSERT_EQ(b.m_mainChainOutputsOffset, 54); + ASSERT_EQ(b.m_mainChainOutputsBlobSize, 420); + ASSERT_EQ(b.m_majorVersion, 14); + ASSERT_EQ(b.m_minorVersion, 14); + ASSERT_EQ(b.m_timestamp, 1630934403); + ASSERT_EQ(b.m_nonce, 2432795907); + ASSERT_EQ(b.m_txinGenHeight, 2443466); + ASSERT_EQ(b.m_outputs.size(), 11); + ASSERT_EQ(b.m_extraNonceSize, 4); + ASSERT_EQ(b.m_extraNonce, 28); + ASSERT_EQ(b.m_transactions.size(), 159); + ASSERT_EQ(b.m_sideChainData.size(), 146); + ASSERT_EQ(b.m_uncles.size(), 0); + ASSERT_EQ(b.m_sidechainHeight, 53450); + ASSERT_EQ(b.m_difficulty.lo, 319296691); + ASSERT_EQ(b.m_difficulty.hi, 0); + ASSERT_EQ(b.m_cumulativeDifficulty.lo, 12544665764606ull); + ASSERT_EQ(b.m_cumulativeDifficulty.hi, 0); + ASSERT_EQ(b.m_tmpTxExtra.size(), 0); + ASSERT_EQ(b.m_tmpInts.size(), 0); + ASSERT_EQ(b.m_depth, 0); + ASSERT_EQ(b.m_verified, false); + ASSERT_EQ(b.m_invalid, false); + ASSERT_EQ(b.m_broadcasted, false); + ASSERT_EQ(b.m_wantBroadcast, false); + + RandomX_Hasher hasher(nullptr); + + hash seed; + { + std::stringstream s; + s << "c293f04b0f97cf76008c6ce8b0dbd2ba5be6b734de0aec9d1b758a12d7ec6451"; + s >> seed; + } + + hasher.set_seed(seed); + + hash pow_hash; + ASSERT_EQ(b.get_pow_hash(&hasher, seed, pow_hash), true); + ASSERT_EQ(b.m_difficulty.check_pow(pow_hash), true); + + std::stringstream s; + s << pow_hash; + ASSERT_EQ(s.str(), "f76d731c61c9c9b6c3f46be2e60c9478930b49b4455feecd41ecb9420d000000"); +} + +}