map_generator_auth_test.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <array>
  2. #include <cassert>
  3. #include <cstdint>
  4. #include <cstdio>
  5. #include "core/logging/log.h"
  6. #include "middleware/bap/activity_message/sensor_auth_update.h"
  7. #include "middleware/encoding/bit_reader.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 bits = sunrise::middleware::encoding::bits;
  13. namespace auth = sunrise::middleware::bap::activity_message::sensor_auth_update;
  14. static std::uint64_t take(bits::Reader& reader, std::uint8_t width) {
  15. std::uint64_t value{};
  16. assert(reader.read(width, value));
  17. return value;
  18. }
  19. // Independent wire walk of the empty native 86657 map-generator body. The trailing
  20. // schemas 0x8080956C and 0x8080954D have array lengths 32 and 64, not scalar u8s.
  21. static void empty_generator(bits::Reader& reader) {
  22. for (int side = 0; side < 2; ++side) {
  23. assert(take(reader, 32) == 0);
  24. assert(take(reader, 8) == 0);
  25. for (int anchor = 0; anchor < 4; ++anchor) {
  26. assert(take(reader, 8) == 0);
  27. assert(take(reader, 8) == 0);
  28. assert(take(reader, 32) == 0);
  29. assert(take(reader, 1) == 0);
  30. }
  31. assert(take(reader, 7) == 0);
  32. assert(take(reader, 1) == 0);
  33. assert(take(reader, 32) == 0);
  34. assert(take(reader, 32) == 0);
  35. for (int field = 0; field < 5; ++field) assert(take(reader, 32) == 0);
  36. assert(take(reader, 7) == 0); // Dynamic array count; no elements follow.
  37. }
  38. assert(take(reader, 32) == 0);
  39. for (int element = 0; element < 32; ++element) assert(take(reader, 8) == 0);
  40. for (int element = 0; element < 64; ++element) assert(take(reader, 8) == 0);
  41. }
  42. int main() {
  43. std::array<std::byte, 512> output{};
  44. bits::Writer writer(output);
  45. auth::Snapshot snapshot{};
  46. snapshot.authorWideRecordBodies = true;
  47. constexpr std::uint32_t key = 0x34D23982;
  48. assert(auth::write_object_block(writer, snapshot, 0x8155213E, key, 37, 81,
  49. auth::kSlotAuthFlag | auth::kSlotSenseFlag, false, false));
  50. // A following nonzero field must not be consumed as part of the generator.
  51. assert(writer.write(0xA5B6C7D8, 32));
  52. std::size_t written{};
  53. assert(writer.finish(written));
  54. bits::Reader reader(std::span(output).first(written));
  55. assert(take(reader, auth::kPresenceWidth) == 1);
  56. assert(take(reader, auth::kKeyWidth) == key);
  57. assert(take(reader, auth::kSlotTypeWidth) == 37 + auth::kSlotTypeBias);
  58. assert(take(reader, auth::kSlotIndexWidth) == 81 + auth::kSlotIndexBias);
  59. assert(take(reader, auth::kKeyWidth) == 1753); // Reset, root, body, absent sense.
  60. assert(take(reader, 1) == 1);
  61. assert(take(reader, 1) == 1);
  62. empty_generator(reader);
  63. assert(take(reader, 1) == 0);
  64. assert(take(reader, 32) == 0xA5B6C7D8);
  65. assert(reader.remaining_bits() < 8);
  66. // The old 998-bit buffer must be refused, rather than reported as a complete body.
  67. std::array<std::byte, 125> shortOutput{};
  68. bits::Writer shortWriter(shortOutput);
  69. assert(!auth::write_auth_body(shortWriter, snapshot, 37, false));
  70. std::puts("map generator fixed arrays and following-field alignment passed");
  71. }