ending_retirement_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <array>
  2. #include <cassert>
  3. #include "../Sunrise/src/client/hooks/mission_retirement/mission_retirement.h"
  4. #include "../Sunrise/src/middleware/bap/activity_message/roster_presence.h"
  5. #include "../Sunrise/src/middleware/encoding/bit_reader.h"
  6. #include "../Sunrise/src/state/activity/membership/teleport_rules.h"
  7. #include "../Sunrise/src/core/logging/log.h"
  8. namespace sunrise::core::log {
  9. bool accepts(Channel, Level) noexcept { return false; }
  10. void write(Channel, Level, std::string_view) noexcept {}
  11. }
  12. namespace wire = sunrise::middleware::bap::activity_message::sensor_auth_update;
  13. namespace retire = sunrise::client::hooks::mission_retirement;
  14. namespace member = sunrise::state::activity::membership;
  15. using sunrise::middleware::encoding::bits::Reader;
  16. static void expect(Reader& reader, unsigned width, std::uint64_t expected) {
  17. std::uint64_t value{};
  18. assert(reader.read(static_cast<std::uint8_t>(width), value) && value == expected);
  19. }
  20. int main() {
  21. std::array<std::uint32_t, 5> history{102, 103, 104};
  22. std::size_t historyCount = 3;
  23. const std::array<std::uint32_t, 3> movieOne{105, 102, 104};
  24. const std::array<std::uint32_t, 3> movieTwo{106, 105, 104};
  25. assert(wire::extend_key_order(history, historyCount, movieOne));
  26. assert(wire::extend_key_order(history, historyCount, movieTwo));
  27. assert(historyCount == 5 && (history == std::array<std::uint32_t, 5>{102,103,104,105,106}));
  28. assert(wire::extend_key_order(history, historyCount, movieOne));
  29. const std::array<std::uint32_t, 1> overflow{107};
  30. assert(!wire::extend_key_order(history, historyCount, overflow));
  31. // Unknown/empty worlds and a different owner cannot masquerade as cleanup.
  32. retire::Progress progress{retire::Status::baselinePending, 0};
  33. progress.observe(0, 1234, 4, 0);
  34. assert(progress.value == retire::Status::baselinePending);
  35. progress.observe(0, 1234, 8, 4);
  36. assert(progress.value == retire::Status::retiring);
  37. progress.observe(1, 1234, 4, 0);
  38. progress.observe(0, 5678, 4, 0);
  39. progress.observe(0, 1234, 0, 0);
  40. progress.observe(0, 1234, 5, 1);
  41. assert(progress.value == retire::Status::retiring);
  42. progress.observe(0, 1234, 4, 0);
  43. assert(progress.value == retire::Status::complete);
  44. // Exercise the actual encoder: old keys retain their ordinal, a clear bit removes
  45. // only the retired key, and phase two contains no body for that removed group.
  46. static wire::Snapshot snapshot{};
  47. std::array<std::uint8_t, 1> types{1}, flags{0};
  48. std::array<std::uint16_t, 1> indices{0};
  49. std::array<std::uint32_t, 3> keys{102, 103, 104};
  50. std::array<wire::BubbleSubBlock, 1> blocks{{{0, keys}}};
  51. snapshot.roster.groupCount = 4; snapshot.roster.topLevelGroupCount = 1;
  52. snapshot.roster.bubbleSubBlocks = blocks;
  53. for (unsigned i = 0; i < 4; ++i) {
  54. auto& group = snapshot.roster.groups[i];
  55. group.key = 101 + i; group.slotTypes = types; group.slotFlags = flags; group.slotIndices = indices;
  56. }
  57. snapshot.roster.groups[2].retired = true;
  58. std::array<std::byte, 4096> bytes{}; std::size_t size{};
  59. assert(wire::encode_sensor_auth_update(snapshot, bytes, size));
  60. Reader mask{std::span(bytes).first(size)};
  61. assert(mask.skip(wire::kLatchBitWithoutGrant + 1 + wire::delta_bits(1, {}) - 1));
  62. expect(mask, 1, 1); expect(mask, 7, 1); // Field one, one bubble.
  63. expect(mask, 1, 1); expect(mask, 32, 0x80000000U);
  64. expect(mask, 1, 1); expect(mask, 1, 1); expect(mask, 7, 3);
  65. for (auto key : keys) expect(mask, 32, key);
  66. expect(mask, 1, 1); expect(mask, 32, 5); // Keep ordinals 0 and 2.
  67. expect(mask, 32, 0); expect(mask, 32, 0);
  68. Reader bodies{std::span(bytes).first(size)};
  69. assert(bodies.skip(wire::kLatchBitWithoutGrant + 1 + wire::delta_bits(1, blocks)));
  70. for (auto key : {101U, 102U, 104U}) {
  71. expect(bodies, 1, 1); expect(bodies, 32, key); expect(bodies, 32, 0);
  72. expect(bodies, 1, 1); expect(bodies, 32, key); expect(bodies, 7, 2);
  73. expect(bodies, 16, 32768); expect(bodies, 32, 0); expect(bodies, 1, 0);
  74. }
  75. expect(bodies, 1, 0); expect(bodies, 1, 0);
  76. snapshot.roster.groups[0].retired = true;
  77. assert(!wire::encode_sensor_auth_update(snapshot, bytes, size));
  78. member::MembershipState state{};
  79. state.hasHostTeleport = true; state.hostTeleportQualified = true;
  80. state.hostTeleport = {1, 8, 1, 123}; state.teleport = {2, 8, 1, 123};
  81. state.region.index = 1; state.currentReported = true; state.currentRegion.index = 0;
  82. member::observe_qualified_teleport(state);
  83. assert(state.hostTeleport.state == 1); // Pending-region advertisement is not arrival.
  84. state.teleport.state = 3; state.currentRegion.index = 1;
  85. state.teleport.sliceSetHash = 124;
  86. member::observe_qualified_teleport(state); assert(state.hostTeleport.state == 1);
  87. state.teleport.sliceSetHash = 123; state.teleport.token = 7;
  88. member::observe_qualified_teleport(state); assert(state.hostTeleport.state == 1);
  89. state.teleport.token = 8;
  90. member::observe_qualified_teleport(state); assert(state.hostTeleport.state == 3);
  91. state.teleport.state = 0;
  92. member::observe_qualified_teleport(state); assert(!state.hasHostTeleport);
  93. assert(member::next_teleport_token(255) == 1 && member::next_teleport_token(8) == 9);
  94. }