aboutsummaryrefslogtreecommitdiff
path: root/tests/unit_tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit_tests')
-rw-r--r--tests/unit_tests/CMakeLists.txt1
-rw-r--r--tests/unit_tests/crypto.cpp5
-rw-r--r--tests/unit_tests/epee_levin_protocol_handler_async.cpp2
-rw-r--r--tests/unit_tests/epee_utils.cpp29
-rw-r--r--tests/unit_tests/logging.cpp177
-rw-r--r--tests/unit_tests/mul_div.cpp2
-rw-r--r--tests/unit_tests/testdb.h2
7 files changed, 214 insertions, 4 deletions
diff --git a/tests/unit_tests/CMakeLists.txt b/tests/unit_tests/CMakeLists.txt
index a46f11b5f..f7012746d 100644
--- a/tests/unit_tests/CMakeLists.txt
+++ b/tests/unit_tests/CMakeLists.txt
@@ -54,6 +54,7 @@ set(unit_tests_sources
hashchain.cpp
http.cpp
keccak.cpp
+ logging.cpp
main.cpp
memwipe.cpp
mlocker.cpp
diff --git a/tests/unit_tests/crypto.cpp b/tests/unit_tests/crypto.cpp
index 29fa88f9d..e09ec7f7a 100644
--- a/tests/unit_tests/crypto.cpp
+++ b/tests/unit_tests/crypto.cpp
@@ -47,6 +47,9 @@ namespace
"8b655970153799af2aeadc9ff1add0ea6c7251d54154cfa92c173a0dd39c1f94"
"6c7251d54154cfa92c173a0dd39c1f948b655970153799af2aeadc9ff1add0ea";
+ template<typename T> void *addressof(T &t) { return &t; }
+ template<> void *addressof(crypto::secret_key &k) { return addressof(unwrap(unwrap(k))); }
+
template<typename T>
bool is_formatted()
{
@@ -55,7 +58,7 @@ namespace
static_assert(alignof(T) == 1, "T must have 1 byte alignment");
static_assert(sizeof(T) <= sizeof(source), "T is too large for source");
static_assert(sizeof(T) * 2 <= sizeof(expected), "T is too large for destination");
- std::memcpy(std::addressof(value), source, sizeof(T));
+ std::memcpy(addressof(value), source, sizeof(T));
std::stringstream out;
out << "BEGIN" << value << "END";
diff --git a/tests/unit_tests/epee_levin_protocol_handler_async.cpp b/tests/unit_tests/epee_levin_protocol_handler_async.cpp
index 72d8f3205..10e62c167 100644
--- a/tests/unit_tests/epee_levin_protocol_handler_async.cpp
+++ b/tests/unit_tests/epee_levin_protocol_handler_async.cpp
@@ -294,7 +294,7 @@ TEST_F(positive_test_connection_to_levin_protocol_handler_calls, handler_initial
TEST_F(positive_test_connection_to_levin_protocol_handler_calls, concurent_handler_initialization_and_destruction_is_correct)
{
const size_t connection_count = 10000;
- auto create_and_destroy_connections = [this, connection_count]()
+ auto create_and_destroy_connections = [this]()
{
std::vector<test_connection_ptr> connections(connection_count);
for (size_t i = 0; i < connection_count; ++i)
diff --git a/tests/unit_tests/epee_utils.cpp b/tests/unit_tests/epee_utils.cpp
index c2b0b7647..c384ce9a5 100644
--- a/tests/unit_tests/epee_utils.cpp
+++ b/tests/unit_tests/epee_utils.cpp
@@ -456,6 +456,35 @@ TEST(StringTools, PodToHex)
);
}
+TEST(StringTools, ParseHex)
+{
+ static const char data[] = "a10b68c2";
+ for (size_t i = 0; i < sizeof(data); i += 2)
+ {
+ std::string res;
+ ASSERT_TRUE(epee::string_tools::parse_hexstr_to_binbuff(std::string(data, i), res));
+ std::string hex = epee::string_tools::buff_to_hex_nodelimer(res);
+ ASSERT_EQ(hex.size(), i);
+ ASSERT_EQ(memcmp(data, hex.data(), i), 0);
+ }
+}
+
+TEST(StringTools, ParseNotHex)
+{
+ std::string res;
+ for (size_t i = 0; i < 256; ++i)
+ {
+ std::string inputHexString = std::string(2, static_cast<char>(i));
+ if ((i >= '0' && i <= '9') || (i >= 'A' && i <= 'F') || (i >= 'a' && i <= 'f')) {
+ ASSERT_TRUE(epee::string_tools::parse_hexstr_to_binbuff(inputHexString, res));
+ } else {
+ ASSERT_FALSE(epee::string_tools::parse_hexstr_to_binbuff(inputHexString, res));
+ }
+ }
+
+ ASSERT_FALSE(epee::string_tools::parse_hexstr_to_binbuff(std::string("a"), res));
+}
+
TEST(StringTools, GetIpString)
{
EXPECT_EQ(
diff --git a/tests/unit_tests/logging.cpp b/tests/unit_tests/logging.cpp
new file mode 100644
index 000000000..476e92bef
--- /dev/null
+++ b/tests/unit_tests/logging.cpp
@@ -0,0 +1,177 @@
+// Copyright (c) 2016-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.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include <boost/filesystem.hpp>
+#include "gtest/gtest.h"
+#include "file_io_utils.h"
+#include "misc_log_ex.h"
+
+static std::string log_filename;
+
+static void init()
+{
+ boost::filesystem::path p = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path();
+ log_filename = p.string();
+ mlog_configure(log_filename, false, 0);
+}
+
+static void cleanup()
+{
+ boost::filesystem::remove(log_filename);
+}
+
+static size_t nlines(const std::string &str)
+{
+ size_t n = 0;
+ for (const char *ptr = str.c_str(); *ptr; ++ptr)
+ if (*ptr == '\n')
+ ++n;
+ return n;
+}
+
+static bool load_log_to_string(const std::string &filename, std::string &str)
+{
+ if (!epee::file_io_utils::load_file_to_string(filename, str))
+ return false;
+ for (const char *ptr = str.c_str(); *ptr; ++ptr)
+ {
+ if (*ptr == '\n')
+ {
+ std::string prefix = std::string(str.c_str(), ptr - str.c_str());
+ if (prefix.find("New log categories:") != std::string::npos)
+ {
+ str = std::string(ptr + 1, strlen(ptr + 1));
+ break;
+ }
+ }
+ }
+ return true;
+}
+
+static void log()
+{
+ MFATAL("fatal");
+ MERROR("error");
+ MWARNING("warning");
+ MINFO("info");
+ MDEBUG("debug");
+ MTRACE("trace");
+
+ MCINFO("a.b.c.d", "a.b.c.d");
+ MCINFO("a.b.c.e", "a.b.c.e");
+ MCINFO("global", "global");
+ MCINFO("x.y.z", "x.y.z");
+ MCINFO("y.y.z", "y.y.z");
+ MCINFO("x.y.x", "x.y.x");
+}
+
+TEST(logging, no_logs)
+{
+ init();
+ mlog_set_categories("");
+ log();
+ std::string str;
+ ASSERT_TRUE(load_log_to_string(log_filename, str));
+ ASSERT_TRUE(str == "");
+ cleanup();
+}
+
+TEST(logging, default)
+{
+ init();
+ log();
+ std::string str;
+ ASSERT_TRUE(load_log_to_string(log_filename, str));
+ ASSERT_TRUE(str.find("global") != std::string::npos);
+ ASSERT_TRUE(str.find("fatal") != std::string::npos);
+ ASSERT_TRUE(str.find("error") != std::string::npos);
+ ASSERT_TRUE(str.find("debug") == std::string::npos);
+ ASSERT_TRUE(str.find("trace") == std::string::npos);
+ cleanup();
+}
+
+TEST(logging, all)
+{
+ init();
+ mlog_set_categories("*:TRACE");
+ log();
+ std::string str;
+ ASSERT_TRUE(load_log_to_string(log_filename, str));
+ ASSERT_TRUE(str.find("global") != std::string::npos);
+ ASSERT_TRUE(str.find("fatal") != std::string::npos);
+ ASSERT_TRUE(str.find("error") != std::string::npos);
+ ASSERT_TRUE(str.find("debug") != std::string::npos);
+ ASSERT_TRUE(str.find("trace") != std::string::npos);
+ cleanup();
+}
+
+TEST(logging, glob_suffix)
+{
+ init();
+ mlog_set_categories("x.y*:TRACE");
+ log();
+ std::string str;
+ ASSERT_TRUE(load_log_to_string(log_filename, str));
+ ASSERT_TRUE(str.find("global") == std::string::npos);
+ ASSERT_TRUE(str.find("x.y.z") != std::string::npos);
+ ASSERT_TRUE(str.find("x.y.x") != std::string::npos);
+ ASSERT_TRUE(str.find("y.y.z") == std::string::npos);
+ cleanup();
+}
+
+TEST(logging, glob_prefix)
+{
+ init();
+ mlog_set_categories("*y.z:TRACE");
+ log();
+ std::string str;
+ ASSERT_TRUE(load_log_to_string(log_filename, str));
+ ASSERT_TRUE(str.find("global") == std::string::npos);
+ ASSERT_TRUE(str.find("x.y.z") != std::string::npos);
+ ASSERT_TRUE(str.find("x.y.x") == std::string::npos);
+ ASSERT_TRUE(str.find("y.y.z") != std::string::npos);
+ cleanup();
+}
+
+TEST(logging, last_precedence)
+{
+ init();
+ mlog_set_categories("gobal:FATAL,glo*:DEBUG");
+ log();
+ std::string str;
+ ASSERT_TRUE(load_log_to_string(log_filename, str));
+ ASSERT_TRUE(nlines(str) == 1);
+ ASSERT_TRUE(str.find("global") != std::string::npos);
+ ASSERT_TRUE(str.find("x.y.z") == std::string::npos);
+ ASSERT_TRUE(str.find("x.y.x") == std::string::npos);
+ ASSERT_TRUE(str.find("y.y.z") == std::string::npos);
+ cleanup();
+}
+
diff --git a/tests/unit_tests/mul_div.cpp b/tests/unit_tests/mul_div.cpp
index 8408d0da1..768b95d4b 100644
--- a/tests/unit_tests/mul_div.cpp
+++ b/tests/unit_tests/mul_div.cpp
@@ -30,7 +30,7 @@
#include "gtest/gtest.h"
-#include "common/int-util.h"
+#include "int-util.h"
namespace
{
diff --git a/tests/unit_tests/testdb.h b/tests/unit_tests/testdb.h
index b6962cc41..a9c772920 100644
--- a/tests/unit_tests/testdb.h
+++ b/tests/unit_tests/testdb.h
@@ -93,7 +93,7 @@ public:
virtual cryptonote::tx_out_index get_output_tx_and_index_from_global(const uint64_t& index) const { return cryptonote::tx_out_index(); }
virtual cryptonote::tx_out_index get_output_tx_and_index(const uint64_t& amount, const uint64_t& index) const { return cryptonote::tx_out_index(); }
virtual void get_output_tx_and_index(const uint64_t& amount, const std::vector<uint64_t> &offsets, std::vector<cryptonote::tx_out_index> &indices) const {}
- virtual void get_output_key(const uint64_t &amount, const std::vector<uint64_t> &offsets, std::vector<cryptonote::output_data_t> &outputs, bool allow_partial = false) {}
+ virtual void get_output_key(const epee::span<const uint64_t> &amounts, const std::vector<uint64_t> &offsets, std::vector<cryptonote::output_data_t> &outputs, bool allow_partial = false) {}
virtual bool can_thread_bulk_indices() const { return false; }
virtual std::vector<uint64_t> get_tx_output_indices(const crypto::hash& h) const { return std::vector<uint64_t>(); }
virtual std::vector<uint64_t> get_tx_amount_output_indices(const uint64_t tx_index) const { return std::vector<uint64_t>(); }