You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmonero/tests/mysql_tests.cpp

235 lines
32 KiB

6 years ago
//
// Created by mwo on 15/06/18.
//
#include "../src/MicroCore.h"
#include "../src/YourMoneroRequests.h"
6 years ago
#include "gtest/gtest.h"
namespace
6 years ago
{
using json = nlohmann::json;
using namespace std;
using namespace mysqlpp;
using namespace cryptonote;
using namespace epee::string_tools;
/**
* Fixture that connects to openmonero_test database
* and repopulates it with known data for each test.
*/
class MYSQL_TEST : public ::testing::Test
{
protected:
static void SetUpTestCase()
{
// read in confing json file and get test db info
std::string config_json_path{"../config/config.json"};
// check if config-file provided exist
if (!boost::filesystem::exists(config_json_path))
{
std::cerr << "Config file " << config_json_path
<< " does not exist\n";
return;
}
json config_json;
try
{
// try reading and parsing json config file provided
std::ifstream i(config_json_path);
i >> config_json;
db_config = config_json["database_test"];
}
catch (const std::exception &e)
{
std::cerr << "Error reading confing file "
<< config_json_path << ": "
<< e.what() << '\n';
throw e;
}
xmreg::MySqlConnector::url = db_config["url"];
xmreg::MySqlConnector::port = db_config["port"];
xmreg::MySqlConnector::username = db_config["user"];
xmreg::MySqlConnector::password = db_config["password"];
xmreg::MySqlConnector::dbname = db_config["dbname"];
try
{
auto conn = std::make_shared<xmreg::MySqlConnector>(
new mysqlpp::MultiStatementsOption(true));
// MySqlAccounts will try connecting to the mysql database
xmr_accounts = std::make_shared<xmreg::MySqlAccounts>(conn);
}
catch (std::exception const &e)
{
std::cerr << e.what() << '\n';
throw e;
}
db_data = xmreg::read("../sql/openmonero_test.sql");
}
virtual void SetUp()
{
mysqlpp::Query query = xmr_accounts
->get_connection()->get_connection().query(db_data);
query.parse();
try
{
bool is_success = query.exec();
while(query.more_results())
query.store_next();
}
catch (std::exception &e)
{
std::cerr << e.what() << '\n';
throw e;
}
}
static std::string db_data;
static json db_config;
static std::shared_ptr<xmreg::MySqlAccounts> xmr_accounts;
};
std::string MYSQL_TEST::db_data;
json MYSQL_TEST::db_config;
std::shared_ptr<xmreg::MySqlAccounts> MYSQL_TEST::xmr_accounts;
TEST_F(MYSQL_TEST, Connection)
{
EXPECT_TRUE(xmr_accounts != nullptr);
EXPECT_TRUE(xmr_accounts->get_connection()->get_connection().connected());
EXPECT_TRUE(xmr_accounts->get_connection()->ping());
}
TEST_F(MYSQL_TEST, GetAccount)
{
// existing address
string xmr_addr{"57Hx8QpLUSMjhgoCNkvJ2Ch91mVyxcffESCprnRPrtbphMCv8iGUEfCUJxrpUWUeWrS9vPWnFrnMmTwnFpSKJrSKNuaXc5q"};
xmreg::XmrAccount acc;
bool is_success = xmr_accounts->select(xmr_addr, acc);
EXPECT_TRUE(is_success);
EXPECT_EQ(acc.id, 129);
EXPECT_EQ(acc.scanned_block_height, 100968);
EXPECT_EQ(acc.viewkey_hash, "1acf92d12101afe2ce7392169a38d2d547bd042373148eaaab323a3b5185a9ba");
}
TEST_F(MYSQL_TEST, InsertAndGetAccount)
{
uint64_t mock_current_blockchain_height = 452145;
uint64_t mock_current_blockchain_timestamp = 1529302789;
DateTime blk_timestamp_mysql_format
= mysqlpp::DateTime(static_cast<time_t>(mock_current_blockchain_timestamp));
// address to insert
string xmr_addr {"44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A"};
string view_key {"f359631075708155cc3d92a32b75a7d02a5dcf27756707b47a2b31b21c389501"};
string view_key_hash {"cdd3ae89cbdae1d14b178c7e7c6ba380630556cb9892bd24eb61a9a517e478cd"};
uint64_t expected_primary_id = xmr_accounts->get_next_primary_id(xmreg::XmrAccount());
int64_t acc_id = xmr_accounts->insert(xmr_addr, view_key_hash,
blk_timestamp_mysql_format,
mock_current_blockchain_height);
EXPECT_EQ(acc_id, expected_primary_id);
xmreg::XmrAccount acc;
bool is_success = xmr_accounts->select(xmr_addr, acc);
EXPECT_EQ(acc.id, expected_primary_id);
EXPECT_EQ(acc.scanned_block_height, mock_current_blockchain_height);
EXPECT_EQ(acc.scanned_block_timestamp, mock_current_blockchain_timestamp);
EXPECT_EQ(acc.viewkey_hash, view_key_hash);
}
// stagenet tx: 4b40cfb2fdce2cd57a834a380901d55d70aba29dad13ac6c4dc82a895f439ecf
const string tx_4b40_hex {"0200010200089832f68b01b2a601a21ec01da83ffe0139a71678019703665175d1e067d20c738a8634aeaad6a7bc493a4b5a641b4962fa020002fb1d79f31791c9553c6dc1c066cde2361385021a5c33e7101d69a557cc3c34a1000292b1073ac7c2fdd851955e7fb76cbc7de4e812db745b5e795445594ea1c7d2a721010a9e82db48149442ac50cff52a39fda95f90b9683098b02e413a52b4d1f05f1c0180f3a3f93aaac0d8887ce542c01e49afbaf1f5ac8e1e4c8882011dd83fa33d1c9efa5f210d39e17c153a6a5825da329dcb31cd1acae98961d55038fb22e78fb93b95e6820a6904ff5b7bbfcf0cd1f6b9e9dd56f41062c7f5f43d9e1b3d69724eeca4bc3404a41ff0669f7f8ae725da8bbc2f8d0411605d2c3e959e3099414ffce1654418020d6ee74bb25042045e955b966e060a9f65b9cfccfbdcb4ee3101019a51f3a41372414c90383c9b84fb4ac690047ea67d70c917192abeb1fdf6c618aeafc732ae9a3e6c6f7fb274240ca04d24035a1d55b3fd1060dc3f4e64f9816868f36d2a0aeb76b64169bc9525d7d70b077c8b998b1204c6108e2917af893b0de24f4adb043eee433b096db8ef730de6e339a84f966b80b239821f350e2a8b10817fc19508da4f82bcb90fcf84cd47929ab1ba90bde5d252767736a4b23d26063cc6b2120dc636b2d4e3e7b3f6d7448882e01c10cf7bdd2117710dc49a59b49cf99212800093da22a6ab5bf693a80d4a662f35259f088a91a26ac261980c537238daa7a40477871f7481973edbcc86fa4885a4061d5c889d0986b4c0cb394165d4039081069f61cff822c7a227474d1609dbf05909f738803834b9e1b5ee68dcb825fcd906d880684e5fa684c8cb02495530fcaeeb35a405345f352ef3c8cf276c096d4303ee14cc0a48533afd1bcdf32dcfb25db4c45a19b10926dff72ace2c2a1d0759090acff99ad06e3f81c4d759a9f74d47fff9cb61d3784aa0eb57a250eec8d14800b85026f5b112740e2e8c257541bdfa4ea1f166b9d930e9705fa1d3f3c2be1e0fb242394d9230c7c457fc8422a6f919a06df5c52d954fa1bfdb57a0a2778d35020ef07490fc3c4f6e99ceaef97fcb3da049898944f3291b96a4f9ce491654340414565db2e0c6bd13eab933194b32336c09c478689cc4a7160b63ecb59937b2028e1649744c6ea69db01aed72fb8b39519cb28d764f158789cc539e01fd5f8f098597c8977e6d2b22c37b289c95dca13bece9e28f741ae2384ead8f0d6df7c30f311210523cb0b7e8c1173aee311362282f3c7d06ae2153969d073bec14ff3605d193bfe829e110df39b894fc4a8eb462d357098688748d579c85f9dc9e9cd20229c9865bc54ae8338433247c28875249e37d4d9b9ccbad611ce5948f1c7ea00fccdc41a9fbe942539a44111f160c9b1dc2653ecae0e4c30bada58d9164fa4c021b60fc0e2068510ef8ec56f7c8e036f2eb31ae0871c9a6aff7b8ad6a86054a06daf06393871f41859f51165f09d22fedd8a2326099a803491dbff5027f72540ed6981f505d1162d86c1ec716758bfbf4e1bfdbbe628b9340942a328209c86b0ec71981c90b407b146cbf065cfd8b0a1c2528aaf007c505a83779dacf8cb7500577a1f8f4a2c9a833d08b254c0c5edbbe87c9eaf266627d23bf518373dceba4099c13c6c468b99c16d56ea5eec12620867fdeb01be66bb0248a7ab7dd6434aa042392c4482e8694292bfc638f1a344d35c9cbfe121a25d2302db4db9688285905fcef9a892593840fe2ddebf0e059e341b2e7f107ee6a19fe386e3f9ea0da2801c5e9fe1b9c4b21155f6f2194ef36f2383097f9cf7ee0994873cfd92d098a33006547ef67bbeb2c1386fcbeec6f0b974532f2ac6e474b26683a37ed3919ec3108b578d3a552c32a362c0bea8bfe35c481f014721af9503a0663d95f5aa91b8802c32f60dbaa65978ad114a2fd45901a07fb4dded61d19e30c8c11e4efbdc1180a02d08d05a646bd8a4d160203da8d490ae0a0b4e631280401d635eb78e0416408c208436dcd653c11a75f365e2d012e0e69f0d4fe2fb2997726dad29468109001ed7c65464ba734e4b35f2ac85a4437fcafe0cdb6128e634970ba420e2e3296080636520e9fbf453e07cdd215117a2eeffed5a0ea0003761f5eb4c35aebf87b063f59d0571e149dc9d0c143a59415a7fe950d34b5024087145969abdc7f7140079bc25119825dda1bf080150bd40142d9635fd87e5dc691899d2686ccf6c9d106c7cdbf783fbbc83fc0feebe8abee3b458e7417a385215f1f89a2a89bef3b870c7a30a6cf4920ddd6eb50439c95c1f38fec867a41e628415ed142b7014991fd0818e8cf725b7075498e773790ccc882db0eb22453f0c9931debfb8d3adb09370f30e62b5fe94ffa7e55ff053488ad48f6e244ed6f043fae8f2225a024800c690ce15dd8017457d23c834b276d079d4a141f22db8fed4ea8f1e378fb741a2da30c09abc817ef0ad589428f966b8bdf92fb32fefa67f425ef1c58a2d4c881e8cc0156519256b87736ed84691b585687971c01a23da37ab76726602a01e771d9820add53f62168d51c7ec12ede030b61155f12e7c8d5573985a9e0884bcc41e0b50aa066b3337f2ab8e3b1031a1c843700413ef03d3734536547fc636055f5d15b0f804b3d25f90e4aaf199ee666d90199d0781526bb2040144b5a638411c1067d0bc5e3ef1911c5223fb0f5d0ce6387702b6957f9466b1a8be6879b8c7190ec1e0662cda6005a363f5d3d4585e6d9d15349be797353179b0a713b925dddfbd05609430601339bf31226cce63c763d887364aa6f1d640892f2a074338b741b7c3303e62c6fc16f544ceeed251dbaed83
TEST_F(MYSQL_TEST, SelectSingleTx)
{
transaction tx;
crypto::hash tx_hash;
crypto::hash tx_prefix_hash;
ASSERT_TRUE(xmreg::hex_to_tx(tx_4b40_hex, tx, tx_hash, tx_prefix_hash));
string tx_hash_str = pod_to_hex(tx_hash);
string tx_prefix_hash_str = pod_to_hex(tx_prefix_hash);
// existing address
string owner_addr {"57Hx8QpLUSMjhgoCNkvJ2Ch91mVyxcffESCprnRPrtbphMCv8iGUEfCUJxrpUWUeWrS9vPWnFrnMmTwnFpSKJrSKNuaXc5q"};
xmreg::XmrAccount acc;
ASSERT_TRUE(xmr_accounts->select(owner_addr, acc));
xmreg::XmrTransaction mysql_tx;
xmr_accounts->tx_exists(acc.id, tx_hash_str, mysql_tx);
EXPECT_EQ(mysql_tx.hash , tx_hash_str);
EXPECT_EQ(mysql_tx.prefix_hash, tx_prefix_hash_str);
EXPECT_EQ(mysql_tx.total_received, 0);
EXPECT_EQ(mysql_tx.total_sent, 100000000000000);
EXPECT_EQ(mysql_tx.blockchain_tx_id, 93830);
EXPECT_TRUE(static_cast<int>(mysql_tx.spendable) == 1);
EXPECT_TRUE(static_cast<int>(mysql_tx.coinbase) == 0);
EXPECT_TRUE(static_cast<int>(mysql_tx.is_rct) == 1);
EXPECT_TRUE(static_cast<int>(mysql_tx.rct_type) == 1);
EXPECT_EQ(mysql_tx.payment_id, string{});
EXPECT_EQ(mysql_tx.mixin, 8);
}
TEST_F(MYSQL_TEST, SelectAllTxsForAnAccount)
{
// existing address
string owner_addr {"5AjfkEY7RFgNGDYvoRQkncfwHXT6Fh7oJBisqFUX5u96i3ZepxDPocQK29tmAwBDuvKRpskZnfA6N8Ra58qFzA4bSA3QZFp"};
xmreg::XmrAccount acc;
ASSERT_TRUE(xmr_accounts->select(owner_addr, acc));
vector<xmreg::XmrTransaction> txs;
xmr_accounts->select_txs(acc.id, txs);
EXPECT_EQ(txs.size(), 8);
}
}