20static const uint8_t
GOLDEN_ARM[] = {0x01, 0x10, 0x01, 0x00, 0x09, 0x5A,
21 0x96, 0xC3, 0xA5, 0xA5, 0x69, 0x3C,
22 0x5A, 0x07, 0xFA, 0xCF};
24 0x03, 0xE8, 0x1C, 0x40, 0xE2,
25 0x01, 0x00, 0xFD, 0x1B};
28static size_t raw_frame(uint8_t* out, uint8_t type, uint16_t seq,
29 const uint8_t*
payload, uint8_t plen) {
42 TEST_ASSERT_EQUAL_HEX16(
43 0x29B1,
crc16(
reinterpret_cast<const uint8_t*
>(
"123456789"), 9));
47 TEST_ASSERT_EQUAL_HEX16(0xFFFF,
48 crc16(
reinterpret_cast<const uint8_t*
>(
""), 0));
54 TEST_ASSERT_EQUAL_HEX8(0x04,
b[0]);
55 TEST_ASSERT_EQUAL_HEX8(0x01,
b[3]);
56 TEST_ASSERT_EQUAL_HEX32(0x01020304u,
get_u32(
b));
58 TEST_ASSERT_EQUAL_HEX8(0xEF,
b[0]);
59 TEST_ASSERT_EQUAL_HEX16(0xBEEF,
get_u16(
b));
80 9, out,
sizeof out,
n));
91 TEST_ASSERT_EQUAL_HEX16(0xBEEF, f.
seq);
93 TEST_ASSERT_EQUAL_UINT8(3, f.
payload[0]);
106 for (
unsigned i = 0; i <
sizeof cases /
sizeof cases[0]; i++) {
108 for (
unsigned k = 0; k <
sizeof payload; k++) {
109 payload[k] =
static_cast<uint8_t
>(0x30 + k);
116 cases[i].len, out,
sizeof out,
n));
117 TEST_ASSERT_EQUAL_UINT(7u + cases[i].len,
n);
119 TEST_ASSERT_EQUAL(cases[i].type, f.
type);
120 TEST_ASSERT_EQUAL_HEX16(0xFFFF, f.
seq);
121 TEST_ASSERT_EQUAL_UINT8(cases[i].len, f.
payload_len);
122 if (cases[i].len > 0) {
165 memset(
b, 0,
sizeof b);
178 for (
unsigned i = 0; i <
sizeof b; i++) {
179 for (
unsigned bit = 0; bit < 8; bit++) {
181 b[i] ^=
static_cast<uint8_t
>(1u << bit);
182 TEST_ASSERT_NOT_EQUAL_MESSAGE(
185 "corrupted frame was accepted");
192 const size_t n =
raw_frame(
b, 0x7F, 1,
nullptr, 0);
216 out,
sizeof out,
n));
*brief create JSON pointer *sa reference_tokens const string_t const string_t & b
*brief user defined string literal for JSON values *sa std::size_t n
void put_u16(uint8_t *p, uint16_t v)
FrameStatus encode_frame(FrameType type, uint16_t seq, const uint8_t *payload, uint8_t payload_len, uint8_t *out, size_t out_cap, size_t &out_len)
Build a frame into out[0..out_cap).
void put_u32(uint8_t *p, uint32_t v)
uint16_t crc16(const uint8_t *data, size_t len)
CRC-16/CCITT-FALSE: poly 0x1021, init 0xFFFF, no reflection, no xorout.
constexpr uint8_t kFrameVersion
FrameStatus decode_frame(const uint8_t *buf, size_t len, Frame &out)
Parse and validate a received packet.
uint32_t get_u32(const uint8_t *p)
uint16_t get_u16(const uint8_t *p)
constexpr size_t kFrameMaxLen
uint8_t payload[kFrameMaxPayload]
static void test_roundtrip_every_type(void)
static void test_decode_rejects_too_short(void)
static void test_decode_rejects_null_buffer(void)
static void test_encode_matches_golden_un_arm(void)
static const uint8_t GOLDEN_UN_ARM[]
static size_t raw_frame(uint8_t *out, uint8_t type, uint16_t seq, const uint8_t *payload, uint8_t plen)
static void test_decode_rejects_oversize_length_field(void)
static void test_decode_rejects_extra_or_missing_bytes(void)
static void test_decode_rejects_any_single_bit_flip(void)
static void test_encode_matches_golden_arm(void)
static void test_decode_rejects_wrong_payload_size_with_valid_crc(void)
static void test_little_endian_helpers(void)
static void test_decode_rejects_wrong_version(void)
static const uint8_t GOLDEN_HEARTBEAT[]
static void test_decode_golden_heartbeat(void)
static const uint8_t GOLDEN_ARM[]
static void test_decode_rejects_unknown_type_with_valid_crc(void)
static void test_crc16_standard_check_value(void)
static void test_encode_rejects_bad_inputs(void)
static void test_crc16_empty_is_init_value(void)