074-hasher.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. // SPDX-FileCopyrightText: 2019-2023 Ivan Baidakou
  3. #include "test-utils.h"
  4. #include "test_supervisor.h"
  5. #include "access.h"
  6. #include "hasher/hasher_actor.h"
  7. #include <ostream>
  8. #include <fstream>
  9. #include <net/names.h>
  10. namespace r = rotor;
  11. namespace st = syncspirit::test;
  12. namespace h = syncspirit::hasher;
  13. using namespace syncspirit::hasher;
  14. struct hash_consumer_t : r::actor_base_t {
  15. r::address_ptr_t hasher;
  16. r::intrusive_ptr_t<message::digest_response_t> digest_res;
  17. r::intrusive_ptr_t<message::validation_response_t> validation_res;
  18. using r::actor_base_t::actor_base_t;
  19. void configure(r::plugin::plugin_base_t &plugin) noexcept {
  20. r::actor_base_t::configure(plugin);
  21. plugin.with_casted<r::plugin::registry_plugin_t>(
  22. [&](auto &p) { p.discover_name("hasher-1", hasher, true).link(); });
  23. plugin.with_casted<r::plugin::starter_plugin_t>([&](auto &p) {
  24. p.subscribe_actor(&hash_consumer_t::on_digest);
  25. p.subscribe_actor(&hash_consumer_t::on_validation);
  26. });
  27. }
  28. void request_digest(const std::string_view &data) {
  29. request<payload::digest_request_t>(hasher, std::string(data)).send(init_timeout);
  30. }
  31. void request_validation(const std::string_view &data, const std::string_view &hash) {
  32. request<payload::validation_request_t>(hasher, data, std::string(hash), nullptr).send(init_timeout);
  33. }
  34. void on_digest(message::digest_response_t &res) noexcept { digest_res = &res; }
  35. void on_validation(message::validation_response_t &res) noexcept { validation_res = &res; }
  36. };
  37. TEST_CASE("hasher-actor", "[hasher]") {
  38. r::system_context_t ctx;
  39. auto timeout = r::pt::milliseconds{10};
  40. auto sup = ctx.create_supervisor<st::supervisor_t>().timeout(timeout).create_registry().finish();
  41. sup->start();
  42. sup->create_actor<hasher_actor_t>().index(1).timeout(timeout).finish();
  43. auto consumer = sup->create_actor<hash_consumer_t>().timeout(timeout).finish();
  44. sup->do_process();
  45. std::string data = "abcdef";
  46. consumer->request_digest(data);
  47. sup->do_process();
  48. REQUIRE(consumer->digest_res);
  49. CHECK(consumer->digest_res->payload.res.weak == 136184406u);
  50. auto digest = consumer->digest_res->payload.res.digest;
  51. CHECK(digest[2] == 126);
  52. consumer->request_validation(data, digest);
  53. sup->do_process();
  54. REQUIRE(consumer->digest_res);
  55. CHECK(consumer->digest_res->payload.res.weak == 136184406u);
  56. sup->shutdown();
  57. sup->do_process();
  58. }