085-scan-scheduler.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. // SPDX-FileCopyrightText: 2019-2024 Ivan Baidakou
  3. #include "test-utils.h"
  4. #include "access.h"
  5. #include "test_supervisor.h"
  6. #include "diff-builder.h"
  7. #include "model/cluster.h"
  8. #include "fs/scan_scheduler.h"
  9. using namespace syncspirit;
  10. using namespace syncspirit::test;
  11. using namespace syncspirit::model;
  12. struct fixture_t {
  13. using target_ptr_t = r::intrusive_ptr_t<fs::scan_scheduler_t>;
  14. fixture_t() noexcept {
  15. utils::set_default("trace");
  16. log = utils::get_logger("fixture");
  17. }
  18. void run() noexcept {
  19. auto my_id =
  20. device_id_t::from_string("KHQNO2S-5QSILRK-YX4JZZ4-7L77APM-QNVGZJT-EKU7IFI-PNEPBMY-4MXFMQD").value();
  21. my_device = device_t::create(my_id, "my-device").value();
  22. cluster = new cluster_t(my_device, 1);
  23. cluster->get_devices().put(my_device);
  24. r::system_context_t ctx;
  25. sup = ctx.create_supervisor<supervisor_t>().timeout(timeout).create_registry().finish();
  26. sup->cluster = cluster;
  27. sup->start();
  28. sup->do_process();
  29. folder_id = "1234-5678";
  30. CHECK(static_cast<r::actor_base_t *>(sup.get())->access<to::state>() == r::state_t::OPERATIONAL);
  31. sup->do_process();
  32. target = sup->create_actor<fs::scan_scheduler_t>().timeout(timeout).cluster(cluster).finish();
  33. sup->do_process();
  34. REQUIRE(static_cast<r::actor_base_t *>(target.get())->access<to::state>() == r::state_t::OPERATIONAL);
  35. main();
  36. sup->do_process();
  37. sup->shutdown();
  38. sup->do_process();
  39. CHECK(static_cast<r::actor_base_t *>(sup.get())->access<to::state>() == r::state_t::SHUT_DOWN);
  40. }
  41. virtual void main() noexcept {}
  42. utils::logger_t log;
  43. r::pt::time_duration timeout = r::pt::millisec{10};
  44. r::intrusive_ptr_t<supervisor_t> sup;
  45. cluster_ptr_t cluster;
  46. device_ptr_t my_device;
  47. std::string folder_id;
  48. target_ptr_t target;
  49. model::folder_ptr_t folder;
  50. };
  51. void test_1_folder() {
  52. struct F : fixture_t {
  53. void main() noexcept override {
  54. auto db_folder = db::Folder();
  55. db_folder.set_id(folder_id);
  56. auto builder = diff_builder_t(*cluster);
  57. SECTION("zero rescan time => no scan") {
  58. builder.upsert_folder(db_folder).apply(*sup);
  59. auto folder = cluster->get_folders().by_id(folder_id);
  60. CHECK(!folder->is_scanning());
  61. }
  62. SECTION("non-zero rescan time") {
  63. db_folder.set_rescan_interval(3600);
  64. builder.upsert_folder(db_folder).apply(*sup);
  65. auto folder = cluster->get_folders().by_id(folder_id);
  66. CHECK(folder->is_scanning());
  67. SECTION("scan start/finish") {
  68. builder.scan_finish(folder_id).upsert_folder(db_folder).apply(*sup);
  69. REQUIRE(!folder->is_scanning());
  70. REQUIRE(sup->timers.size() == 1);
  71. sup->do_invoke_timer((*sup->timers.begin())->request_id);
  72. sup->do_process();
  73. REQUIRE(folder->is_scanning());
  74. }
  75. }
  76. }
  77. };
  78. F().run();
  79. };
  80. void test_2_folders() {
  81. struct F : fixture_t {
  82. void main() noexcept override {
  83. auto f1_id = "1111";
  84. auto f2_id = "2222";
  85. auto db_folder_1 = db::Folder();
  86. auto db_folder_2 = db::Folder();
  87. db_folder_1.set_id(f1_id);
  88. db_folder_2.set_id(f2_id);
  89. db_folder_1.set_rescan_interval(4000);
  90. db_folder_2.set_rescan_interval(2000);
  91. auto builder = diff_builder_t(*cluster);
  92. builder.upsert_folder(db_folder_1)
  93. .upsert_folder(db_folder_2)
  94. .apply(*sup)
  95. .scan_finish(f2_id)
  96. .apply(*sup)
  97. .scan_finish(f1_id)
  98. .apply(*sup);
  99. REQUIRE(sup->timers.size() == 1);
  100. sup->do_invoke_timer((*sup->timers.begin())->request_id);
  101. sup->do_process();
  102. auto f1 = cluster->get_folders().by_id(f1_id);
  103. auto f2 = cluster->get_folders().by_id(f2_id);
  104. REQUIRE(!f1->is_scanning());
  105. REQUIRE(f2->is_scanning());
  106. auto at = r::pt::microsec_clock::local_time() + r::pt::seconds{db_folder_2.rescan_interval() + 1};
  107. builder.scan_finish(f2_id, at).apply(*sup);
  108. REQUIRE(sup->timers.size() == 1);
  109. sup->do_invoke_timer((*sup->timers.begin())->request_id);
  110. sup->do_process();
  111. REQUIRE(f1->is_scanning());
  112. REQUIRE(!f2->is_scanning());
  113. f2->set_scan_finish({});
  114. builder.scan_finish(f1_id, at).scan_request(f2_id).apply(*sup);
  115. REQUIRE(!f1->is_scanning());
  116. REQUIRE(f2->is_scanning());
  117. }
  118. };
  119. F().run();
  120. };
  121. int _init() {
  122. REGISTER_TEST_CASE(test_1_folder, "test_1_folder", "[fs]");
  123. REGISTER_TEST_CASE(test_2_folders, "test_2_folders", "[fs]");
  124. return 1;
  125. }
  126. static int v = _init();