membership_replication_test.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <array>
  2. #include <cassert>
  3. #include <cstdint>
  4. #include "../Sunrise/src/middleware/bap/activity_message/replicate_membership.h"
  5. #include "../Sunrise/src/middleware/encoding/bit_reader.h"
  6. namespace membership = sunrise::middleware::bap::activity_message::replicate_membership;
  7. using sunrise::middleware::encoding::bits::Reader;
  8. // Read the native top-level fields after the member/region body. Field 6 must
  9. // be explicitly present: absence preserves the previous disabled send gate.
  10. static void check(const membership::MembershipSnapshot& snapshot,
  11. std::uint32_t occupied, std::uint32_t transmitting) {
  12. std::array<std::byte, 8192> bytes{};
  13. std::size_t size{};
  14. assert(membership::encode_replicate_membership(snapshot, bytes, size));
  15. assert(size == membership::encoded_size(snapshot));
  16. Reader reader{std::span(bytes).first(size)};
  17. assert(reader.skip(membership::region_block_end_bit(snapshot)));
  18. std::uint64_t value{};
  19. for (const auto expected : {occupied, occupied, transmitting}) {
  20. assert(reader.read(1, value) && value == 1);
  21. assert(reader.read(32, value) && value == expected);
  22. }
  23. assert(reader.read(1, value) && value == 0); // field 7
  24. assert(reader.read(1, value) && value == 0); // field 8
  25. assert(reader.remaining_bits() < 8);
  26. while (reader.remaining_bits()) assert(reader.read(1, value) && value == 0);
  27. size = 99;
  28. assert(!membership::encode_replicate_membership(
  29. snapshot, std::span(bytes).first(membership::encoded_size(snapshot) - 1), size));
  30. assert(size == 0);
  31. }
  32. int main() {
  33. membership::MembershipSnapshot snapshot{};
  34. check(snapshot, 1, 0);
  35. auto& remote = snapshot.remoteViewMember;
  36. remote.present = true;
  37. remote.identity.memberKey = 2;
  38. remote.identity.field1 = 0;
  39. remote.identity.field3 = 3;
  40. remote.identity.accountSoid = 4;
  41. remote.identity.field5 = 5;
  42. remote.identity.field6 = 6;
  43. remote.address[0] = std::byte{1};
  44. remote.processSessionIdHash = 0xCBF29CE484222325ULL; // FNV of empty terminated string
  45. check(snapshot, 3, 2);
  46. snapshot.selfHosted = true;
  47. snapshot.selfHostedRegion = 64;
  48. snapshot.currentLeg.present = true;
  49. snapshot.currentLeg.sliceSetIndex = 8;
  50. snapshot.currentLeg.regionIndex = 64;
  51. snapshot.pendingLeg = snapshot.currentLeg;
  52. snapshot.pendingLeg.regionIndex = 72;
  53. check(snapshot, 3, 2);
  54. snapshot.citizenCount = 1;
  55. snapshot.citizens[0].present = true;
  56. snapshot.citizens[0].regionIndex = 72;
  57. snapshot.citizens[0].ambassadorSlot = 1;
  58. check(snapshot, 3, 2);
  59. snapshot.remoteViewMember.present = false;
  60. check(snapshot, 1, 0); // Explicitly clear a previously published remote gate.
  61. }