Add basic REST tests and fix a few bugs (#103)

This commit is contained in:
Lee *!* Clagett
2024-04-06 16:04:53 -04:00
committed by Lee *!* Clagett
parent f785cad557
commit fe9d861dfb
7 changed files with 633 additions and 66 deletions

View File

@@ -25,10 +25,10 @@
// 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 "scanner.test.h"
#include "framework.test.h"
#include <boost/thread.hpp>
#include <iostream>
#include "cryptonote_basic/account.h" // monero/src
#include "cryptonote_basic/cryptonote_format_utils.h" // monero/src
@@ -47,7 +47,6 @@
namespace
{
constexpr const char rendevous[] = "inproc://fake_daemon";
constexpr const std::chrono::seconds message_timeout{3};
template<typename T>
@@ -82,60 +81,6 @@ namespace
return cryptonote::rpc::FullMessage::getResponse(message, id);
}
void rpc_thread(void* ctx, const std::vector<epee::byte_slice>& reply)
{
struct stop_
{
~stop_() noexcept { lws::scanner::stop(); };
} stop{};
try
{
net::zmq::socket server{};
server.reset(zmq_socket(ctx, ZMQ_REP));
if (!server || zmq_bind(server.get(), rendevous))
{
std::cout << "Failed to create ZMQ server" << std::endl;
return;
}
for (const epee::byte_slice& message : reply)
{
const auto start = std::chrono::steady_clock::now();
for (;;)
{
const auto request = net::zmq::receive(server.get(), ZMQ_DONTWAIT);
if (request)
break;
if (request != net::zmq::make_error_code(EAGAIN))
{
std::cout << "Failed to retrieve message in fake ZMQ server: " << request.error().message() << std::endl;;
return;
}
if (message_timeout <= std::chrono::steady_clock::now() - start)
{
std::cout << "Timeout in dummy RPC server" << std::endl;
return;
}
boost::this_thread::sleep_for(boost::chrono::milliseconds{10});
} // until error or received message
const auto sent = net::zmq::send(message.clone(), server.get());
if (!sent)
{
std::cout << "Failed to send dummy RPC message: " << sent.error().message() << std::endl;
return;
}
} // foreach message
}
catch (const std::exception& e)
{
std::cout << "Unexpected exception in dummy RPC server: " << e.what() << std::endl;
}
}
struct join
{
boost::thread& thread;
@@ -278,6 +223,63 @@ namespace
}
return out;
}
} // anonymous
namespace lws_test
{
void rpc_thread(void* ctx, const std::vector<epee::byte_slice>& reply)
{
struct stop_
{
~stop_() noexcept { lws::scanner::stop(); };
} stop{};
try
{
net::zmq::socket server{};
server.reset(zmq_socket(ctx, ZMQ_REP));
if (!server || zmq_bind(server.get(), lws_test::rpc_rendevous))
{
std::cout << "Failed to create ZMQ server" << std::endl;
return;
}
for (const epee::byte_slice& message : reply)
{
const auto start = std::chrono::steady_clock::now();
for (;;)
{
const auto request = net::zmq::receive(server.get(), ZMQ_DONTWAIT);
if (request)
break;
if (request != net::zmq::make_error_code(EAGAIN))
{
std::cout << "Failed to retrieve message in fake ZMQ server: " << request.error().message() << std::endl;;
return;
}
if (message_timeout <= std::chrono::steady_clock::now() - start)
{
std::cout << "Timeout in dummy RPC server" << std::endl;
return;
}
boost::this_thread::sleep_for(boost::chrono::milliseconds{10});
} // until error or received message
const auto sent = net::zmq::send(message.clone(), server.get());
if (!sent)
{
std::cout << "Failed to send dummy RPC message: " << sent.error().message() << std::endl;
return;
}
} // foreach message
}
catch (const std::exception& e)
{
std::cout << "Unexpected exception in dummy RPC server: " << e.what() << std::endl;
}
}
}
LWS_CASE("lws::scanner::sync and lws::scanner::run")
@@ -321,7 +323,7 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
{
lws::scanner::reset();
auto rpc =
lws::rpc::context::make(rendevous, {}, {}, {}, std::chrono::minutes{0}, false);
lws::rpc::context::make(lws_test::rpc_rendevous, {}, {}, {}, std::chrono::minutes{0}, false);
lws::db::test::cleanup_db on_scope_exit{};
@@ -343,7 +345,7 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
std::vector<epee::byte_slice> messages{};
messages.push_back(to_json_rpc(1));
boost::thread server_thread(&rpc_thread, rpc.zmq_context(), std::cref(messages));
boost::thread server_thread(&lws_test::rpc_thread, rpc.zmq_context(), std::cref(messages));
const join on_scope_exit{server_thread};
EXPECT(!lws::scanner::sync(db.clone(), MONERO_UNWRAP(rpc.connect())));
lws_test::test_chain(lest_env, MONERO_UNWRAP(db.start_read()), last_block.id, hashes);
@@ -375,7 +377,7 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
lws_test::test_chain(lest_env, MONERO_UNWRAP(db.start_read()), last_block.id, {hashes.data(), 1});
{
boost::thread server_thread(&rpc_thread, rpc.zmq_context(), std::cref(messages));
boost::thread server_thread(&lws_test::rpc_thread, rpc.zmq_context(), std::cref(messages));
const join on_scope_exit{server_thread};
EXPECT(lws::scanner::sync(db.clone(), MONERO_UNWRAP(rpc.connect())));
lws_test::test_chain(lest_env, MONERO_UNWRAP(db.start_read()), last_block.id, epee::to_span(hashes));
@@ -398,7 +400,7 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
message.hashes.resize(1);
messages.push_back(daemon_response(message));
boost::thread server_thread(&rpc_thread, rpc.zmq_context(), std::cref(messages));
boost::thread server_thread(&lws_test::rpc_thread, rpc.zmq_context(), std::cref(messages));
const join on_scope_exit{server_thread};
EXPECT(lws::scanner::sync(db.clone(), MONERO_UNWRAP(rpc.connect())));
lws_test::test_chain(lest_env, MONERO_UNWRAP(db.start_read()), last_block.id, epee::to_span(hashes));
@@ -505,7 +507,7 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
messages.push_back(daemon_response(hmessage));
{
boost::thread server_thread(&rpc_thread, rpc.zmq_context(), std::cref(messages));
boost::thread server_thread(&lws_test::rpc_thread, rpc.zmq_context(), std::cref(messages));
const join on_scope_exit{server_thread};
EXPECT(lws::scanner::sync(db.clone(), MONERO_UNWRAP(rpc.connect())));
lws_test::test_chain(lest_env, MONERO_UNWRAP(db.start_read()), last_block.id, epee::to_span(hashes));
@@ -524,7 +526,7 @@ LWS_CASE("lws::scanner::sync and lws::scanner::run")
bmessage.output_indices.resize(1);
messages.push_back(daemon_response(bmessage));
{
boost::thread server_thread(&rpc_thread, rpc.zmq_context(), std::cref(messages));
boost::thread server_thread(&lws_test::rpc_thread, rpc.zmq_context(), std::cref(messages));
const join on_scope_exit{server_thread};
lws::scanner::run(db.clone(), std::move(rpc), 1, epee::net_utils::ssl_verification_t::none, true);
}