aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/core_proxy/core_proxy.h1
-rw-r--r--tests/performance_tests/subaddress_expand.h2
-rw-r--r--tests/unit_tests/CMakeLists.txt5
-rw-r--r--tests/unit_tests/ban.cpp1
-rw-r--r--tests/unit_tests/hardfork.cpp9
-rw-r--r--tests/unit_tests/main.cpp11
-rw-r--r--tests/unit_tests/ringdb.cpp164
7 files changed, 180 insertions, 13 deletions
diff --git a/tests/core_proxy/core_proxy.h b/tests/core_proxy/core_proxy.h
index 59f8d5239..6684c134c 100644
--- a/tests/core_proxy/core_proxy.h
+++ b/tests/core_proxy/core_proxy.h
@@ -97,6 +97,7 @@ namespace tests
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::list<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::transaction>& txs, std::list<crypto::hash>& missed_txs) const { return false; }
bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; }
+ uint8_t get_ideal_hard_fork_version() const { return 0; }
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; }
uint8_t get_hard_fork_version(uint64_t height) const { return 0; }
cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; }
diff --git a/tests/performance_tests/subaddress_expand.h b/tests/performance_tests/subaddress_expand.h
index 2896faebc..2a13ff5c2 100644
--- a/tests/performance_tests/subaddress_expand.h
+++ b/tests/performance_tests/subaddress_expand.h
@@ -56,7 +56,7 @@ public:
bool test()
{
- wallet.expand_subaddresses({0, 0});
+ wallet.expand_subaddresses({1, 0});
return true;
}
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt
index 9c58536c9..8cc074bb2 100644
--- a/tests/unit_tests/CMakeLists.txt
+++ b/tests/unit_tests/CMakeLists.txt
@@ -68,7 +68,8 @@ set(unit_tests_sources
varint.cpp
ringct.cpp
output_selection.cpp
- vercmp.cpp)
+ vercmp.cpp
+ ringdb.cpp)
set(unit_tests_headers
unit_tests_utils.h)
@@ -103,6 +104,8 @@ if (NOT MSVC)
COMPILE_FLAGS " -Wno-undef -Wno-sign-compare")
endif ()
+SET_PROPERTY(SOURCE main.cpp PROPERTY COMPILE_FLAGS -DDEFAULT_DATA_DIR="\\"${CMAKE_SOURCE_DIR}/tests/data\\"")
+
SET_PROPERTY(SOURCE memwipe.cpp PROPERTY COMPILE_FLAGS -Ofast)
add_test(
diff --git a/tests/unit_tests/ban.cpp b/tests/unit_tests/ban.cpp
index 688656cbc..e56a89971 100644
--- a/tests/unit_tests/ban.cpp
+++ b/tests/unit_tests/ban.cpp
@@ -76,6 +76,7 @@ public:
bool get_blocks(uint64_t start_offset, size_t count, std::list<std::pair<cryptonote::blobdata, cryptonote::block>>& blocks, std::list<cryptonote::blobdata>& txs) const { return false; }
bool get_transactions(const std::vector<crypto::hash>& txs_ids, std::list<cryptonote::transaction>& txs, std::list<crypto::hash>& missed_txs) const { return false; }
bool get_block_by_hash(const crypto::hash &h, cryptonote::block &blk, bool *orphan = NULL) const { return false; }
+ uint8_t get_ideal_hard_fork_version() const { return 0; }
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return 0; }
uint8_t get_hard_fork_version(uint64_t height) const { return 0; }
cryptonote::difficulty_type get_block_cumulative_difficulty(uint64_t height) const { return 0; }
diff --git a/tests/unit_tests/hardfork.cpp b/tests/unit_tests/hardfork.cpp
index 3e2199217..7c27b9c5d 100644
--- a/tests/unit_tests/hardfork.cpp
+++ b/tests/unit_tests/hardfork.cpp
@@ -64,6 +64,8 @@ public:
virtual blobdata get_block_blob_from_height(const uint64_t& height) const { return cryptonote::t_serializable_object_to_blob(get_block_from_height(height)); }
virtual blobdata get_block_blob(const crypto::hash& h) const { return blobdata(); }
virtual bool get_tx_blob(const crypto::hash& h, cryptonote::blobdata &tx) const { return false; }
+ virtual bool get_pruned_tx_blob(const crypto::hash& h, cryptonote::blobdata &tx) const { return false; }
+ virtual bool get_prunable_tx_hash(const crypto::hash& tx_hash, crypto::hash &prunable_hash) const { return false; }
virtual uint64_t get_block_height(const crypto::hash& h) const { return 0; }
virtual block_header get_block_header(const crypto::hash& h) const { return block_header(); }
virtual uint64_t get_block_timestamp(const uint64_t& height) const { return 0; }
@@ -99,7 +101,7 @@ public:
virtual std::vector<uint64_t> get_tx_amount_output_indices(const uint64_t tx_index) const { return std::vector<uint64_t>(); }
virtual bool has_key_image(const crypto::key_image& img) const { return false; }
virtual void remove_block() { blocks.pop_back(); }
- virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash) {return 0;}
+ virtual uint64_t add_transaction_data(const crypto::hash& blk_hash, const transaction& tx, const crypto::hash& tx_hash, const crypto::hash& tx_prunable_hash) {return 0;}
virtual void remove_transaction_data(const crypto::hash& tx_hash, const transaction& tx) {}
virtual uint64_t add_output(const crypto::hash& tx_hash, const tx_out& tx_output, const uint64_t& local_index, const uint64_t unlock_time, const rct::key *commitment) {return 0;}
virtual void add_tx_amount_output_indices(const uint64_t tx_index, const std::vector<uint64_t>& amount_output_indices) {}
@@ -108,11 +110,12 @@ public:
virtual bool for_all_key_images(std::function<bool(const crypto::key_image&)>) const { return true; }
virtual bool for_blocks_range(const uint64_t&, const uint64_t&, std::function<bool(uint64_t, const crypto::hash&, const cryptonote::block&)>) const { return true; }
- virtual bool for_all_transactions(std::function<bool(const crypto::hash&, const cryptonote::transaction&)>) const { return true; }
+ virtual bool for_all_transactions(std::function<bool(const crypto::hash&, const cryptonote::transaction&)>, bool pruned) const { return true; }
virtual bool for_all_outputs(std::function<bool(uint64_t amount, const crypto::hash &tx_hash, uint64_t height, size_t tx_idx)> f) const { return true; }
virtual bool for_all_outputs(uint64_t amount, const std::function<bool(uint64_t height)> &f) const { return true; }
virtual bool is_read_only() const { return false; }
- virtual std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff) const { return std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>>(); }
+ virtual std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>> get_output_histogram(const std::vector<uint64_t> &amounts, bool unlocked, uint64_t recent_cutoff, uint64_t min_count) const { return std::map<uint64_t, std::tuple<uint64_t, uint64_t, uint64_t>>(); }
+ virtual bool get_output_distribution(uint64_t amount, uint64_t from_height, uint64_t to_height, std::vector<uint64_t> &distribution, uint64_t &base) const { return false; }
virtual void add_txpool_tx(const transaction &tx, const txpool_tx_meta_t& details) {}
virtual void update_txpool_tx(const crypto::hash &txid, const txpool_tx_meta_t& details) {}
diff --git a/tests/unit_tests/main.cpp b/tests/unit_tests/main.cpp
index 85c6cbed5..13b62cbb4 100644
--- a/tests/unit_tests/main.cpp
+++ b/tests/unit_tests/main.cpp
@@ -61,8 +61,8 @@ int main(int argc, char** argv)
::testing::InitGoogleTest(&argc, argv);
po::options_description desc_options("Command line options");
- const command_line::arg_descriptor<std::string> arg_data_dir = { "data-dir", "Data files directory" };
- command_line::add_arg(desc_options, arg_data_dir, "");
+ const command_line::arg_descriptor<std::string> arg_data_dir = { "data-dir", "Data files directory", DEFAULT_DATA_DIR };
+ command_line::add_arg(desc_options, arg_data_dir);
po::variables_map vm;
bool r = command_line::handle_error_helper(desc_options, [&]()
@@ -74,12 +74,7 @@ int main(int argc, char** argv)
if (! r)
return 1;
- if (command_line::is_arg_defaulted(vm, arg_data_dir))
- unit_test::data_dir = boost::filesystem::canonical(boost::filesystem::path(epee::string_tools::get_current_module_folder()))
- .parent_path().parent_path().parent_path().parent_path()
- .append("tests").append("data");
- else
- unit_test::data_dir = command_line::get_arg(vm, arg_data_dir);
+ unit_test::data_dir = command_line::get_arg(vm, arg_data_dir);
return RUN_ALL_TESTS();
}
diff --git a/tests/unit_tests/ringdb.cpp b/tests/unit_tests/ringdb.cpp
new file mode 100644
index 000000000..d50d61b0f
--- /dev/null
+++ b/tests/unit_tests/ringdb.cpp
@@ -0,0 +1,164 @@
+// Copyright (c) 2018, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <boost/filesystem.hpp>
+
+#include "gtest/gtest.h"
+
+#include "string_tools.h"
+#include "crypto/crypto.h"
+#include "crypto/random.h"
+#include "crypto/chacha.h"
+#include "wallet/ringdb.h"
+
+static crypto::chacha_key generate_chacha_key()
+{
+ uint8_t key[CHACHA_KEY_SIZE];
+ crypto::rand(CHACHA_KEY_SIZE, key);
+ crypto::chacha_key chacha_key;
+ memcpy(&chacha_key, key, CHACHA_KEY_SIZE);
+ return chacha_key;
+}
+
+static crypto::key_image generate_key_image()
+{
+ return crypto::rand<crypto::key_image>();
+}
+
+static crypto::public_key generate_output()
+{
+ return crypto::rand<crypto::public_key>();
+}
+
+
+static const crypto::chacha_key KEY_1 = generate_chacha_key();
+static const crypto::chacha_key KEY_2 = generate_chacha_key();
+static const crypto::key_image KEY_IMAGE_1 = generate_key_image();
+static const crypto::public_key OUTPUT_1 = generate_output();
+static const crypto::public_key OUTPUT_2 = generate_output();
+
+class RingDB: public tools::ringdb
+{
+public:
+ RingDB(const char *genesis = ""): tools::ringdb(make_filename(), genesis) { }
+ ~RingDB() { close(); boost::filesystem::remove_all(filename); free(filename); }
+
+private:
+ std::string make_filename()
+ {
+ boost::filesystem::path path = tools::get_default_data_dir();
+ path /= "fake";
+#if defined(__MINGW32__) || defined(__MINGW__)
+ filename = tempnam(path.string().c_str(), "ringdb-test-");
+ EXPECT_TRUE(filename != NULL);
+#else
+ path /= "ringdb-test-XXXXXX";
+ filename = strdup(path.string().c_str());
+ EXPECT_TRUE(mkdtemp(filename) != NULL);
+#endif
+ return filename;
+ }
+
+private:
+ char *filename;
+};
+
+TEST(ringdb, not_found)
+{
+ RingDB ringdb;
+ std::vector<uint64_t> outs;
+ ASSERT_FALSE(ringdb.get_ring(KEY_1, KEY_IMAGE_1, outs));
+}
+
+TEST(ringdb, found)
+{
+ RingDB ringdb;
+ std::vector<uint64_t> outs, outs2;
+ outs.push_back(43); outs.push_back(7320); outs.push_back(8429);
+ ASSERT_TRUE(ringdb.set_ring(KEY_1, KEY_IMAGE_1, outs, false));
+ ASSERT_TRUE(ringdb.get_ring(KEY_1, KEY_IMAGE_1, outs2));
+ ASSERT_EQ(outs, outs2);
+}
+
+TEST(ringdb, convert)
+{
+ RingDB ringdb;
+ std::vector<uint64_t> outs, outs2;
+ outs.push_back(43); outs.push_back(7320); outs.push_back(8429);
+ ASSERT_TRUE(ringdb.set_ring(KEY_1, KEY_IMAGE_1, outs, true));
+ ASSERT_TRUE(ringdb.get_ring(KEY_1, KEY_IMAGE_1, outs2));
+ ASSERT_EQ(outs2.size(), 3);
+ ASSERT_EQ(outs2[0], 43);
+ ASSERT_EQ(outs2[1], 43+7320);
+ ASSERT_EQ(outs2[2], 43+7320+8429);
+}
+
+TEST(ringdb, different_genesis)
+{
+ RingDB ringdb;
+ std::vector<uint64_t> outs, outs2;
+ outs.push_back(43); outs.push_back(7320); outs.push_back(8429);
+ ASSERT_TRUE(ringdb.set_ring(KEY_1, KEY_IMAGE_1, outs, false));
+ ASSERT_FALSE(ringdb.get_ring(KEY_2, KEY_IMAGE_1, outs2));
+}
+
+TEST(blackball, not_found)
+{
+ RingDB ringdb;
+ ASSERT_TRUE(ringdb.blackball(OUTPUT_1));
+ ASSERT_FALSE(ringdb.blackballed(OUTPUT_2));
+}
+
+TEST(blackball, found)
+{
+ RingDB ringdb;
+ ASSERT_TRUE(ringdb.blackball(OUTPUT_1));
+ ASSERT_TRUE(ringdb.blackballed(OUTPUT_1));
+}
+
+TEST(blackball, unblackball)
+{
+ RingDB ringdb;
+ ASSERT_TRUE(ringdb.blackball(OUTPUT_1));
+ ASSERT_TRUE(ringdb.unblackball(OUTPUT_1));
+ ASSERT_FALSE(ringdb.blackballed(OUTPUT_1));
+}
+
+TEST(blackball, clear)
+{
+ RingDB ringdb;
+ ASSERT_TRUE(ringdb.blackball(OUTPUT_1));
+ ASSERT_TRUE(ringdb.clear_blackballs());
+ ASSERT_FALSE(ringdb.blackballed(OUTPUT_1));
+}
+