// Copyright (c) 2012-2015, The CryptoNote developers, The Bytecoin developers // // This file is part of Bytecoin. // // Bytecoin is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Bytecoin 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with Bytecoin. If not, see . #pragma once #include #include #include "INode.h" #include "cryptonote_core/cryptonote_basic.h" #include "TestBlockchainGenerator.h" #include "Common/ObserverManager.h" #include "wallet/WalletAsyncContextCounter.h" class INodeDummyStub : public CryptoNote::INode { public: virtual bool addObserver(CryptoNote::INodeObserver* observer) override; virtual bool removeObserver(CryptoNote::INodeObserver* observer) override; virtual void init(const CryptoNote::INode::Callback& callback) {callback(std::error_code());}; virtual bool shutdown() { return true; }; virtual size_t getPeerCount() const { return 0; }; virtual uint64_t getLastLocalBlockHeight() const { return 0; }; virtual uint64_t getLastKnownBlockHeight() const { return 0; }; virtual uint64_t getLocalBlockCount() const override { return 0; }; virtual uint64_t getKnownBlockCount() const override { return 0; }; virtual uint64_t getLastLocalBlockTimestamp() const override { return 0; } virtual void getNewBlocks(std::list&& knownBlockIds, std::list& newBlocks, uint64_t& startHeight, const Callback& callback) {callback(std::error_code());}; virtual void relayTransaction(const CryptoNote::Transaction& transaction, const Callback& callback) {callback(std::error_code());}; virtual void getRandomOutsByAmounts(std::vector&& amounts, uint64_t outsCount, std::vector& result, const Callback& callback) {callback(std::error_code());}; virtual void getTransactionOutsGlobalIndices(const crypto::hash& transactionHash, std::vector& outsGlobalIndices, const Callback& callback) { callback(std::error_code()); }; virtual void getPoolSymmetricDifference(std::vector&& known_pool_tx_ids, crypto::hash known_block_id, bool& is_bc_actual, std::vector& new_txs, std::vector& deleted_tx_ids, const Callback& callback) override { is_bc_actual = true; callback(std::error_code()); }; virtual void queryBlocks(std::list&& knownBlockIds, uint64_t timestamp, std::list& newBlocks, uint64_t& startHeight, const Callback& callback) { callback(std::error_code()); }; void updateObservers(); tools::ObserverManager observerManager; }; class INodeTrivialRefreshStub : public INodeDummyStub { public: INodeTrivialRefreshStub(TestBlockchainGenerator& generator) : m_lastHeight(1), m_blockchainGenerator(generator), m_nextTxError(false), m_getMaxBlocks(std::numeric_limits::max()), m_nextTxToPool(false) {}; void setGetNewBlocksLimit(size_t maxBlocks) { m_getMaxBlocks = maxBlocks; } virtual uint64_t getLastLocalBlockHeight() const { return m_blockchainGenerator.getBlockchain().size() - 1; }; virtual uint64_t getLastKnownBlockHeight() const { return m_blockchainGenerator.getBlockchain().size() - 1; }; virtual void getNewBlocks(std::list&& knownBlockIds, std::list& newBlocks, uint64_t& startHeight, const Callback& callback); virtual void relayTransaction(const CryptoNote::Transaction& transaction, const Callback& callback); virtual void getRandomOutsByAmounts(std::vector&& amounts, uint64_t outsCount, std::vector& result, const Callback& callback); virtual void getTransactionOutsGlobalIndices(const crypto::hash& transactionHash, std::vector& outsGlobalIndices, const Callback& callback); virtual void queryBlocks(std::list&& knownBlockIds, uint64_t timestamp, std::list& newBlocks, uint64_t& startHeight, const Callback& callback) override; virtual void getPoolSymmetricDifference(std::vector&& known_pool_tx_ids, crypto::hash known_block_id, bool& is_bc_actual, std::vector& new_txs, std::vector& deleted_tx_ids, const Callback& callback) override; virtual void startAlternativeChain(uint64_t height); void setNextTransactionError(); void setNextTransactionToPool(); void includeTransactionsFromPoolToBlock(); std::vector calls_getTransactionOutsGlobalIndices; virtual ~INodeTrivialRefreshStub(); protected: void doGetNewBlocks(std::list knownBlockIds, std::list& newBlocks, uint64_t& startHeight, std::vector blockchain, const Callback& callback); void doGetTransactionOutsGlobalIndices(const crypto::hash& transactionHash, std::vector& outsGlobalIndices, const Callback& callback); void doRelayTransaction(const CryptoNote::Transaction& transaction, const Callback& callback); void doGetRandomOutsByAmounts(std::vector amounts, uint64_t outsCount, std::vector& result, const Callback& callback); void doGetPoolSymmetricDifference(std::vector& known_pool_tx_ids, crypto::hash known_block_id, bool& is_bc_actual, std::vector& new_txs, std::vector& deleted_tx_ids, const Callback& callback); size_t m_getMaxBlocks; uint64_t m_lastHeight; TestBlockchainGenerator& m_blockchainGenerator; bool m_nextTxError; bool m_nextTxToPool; std::mutex m_multiWalletLock; CryptoNote::WalletAsyncContextCounter m_asyncCounter; };