QUELLCODE / C
protocol_test.c
pico/tests/protocol_test.c
1/*2 * OpenAss: nur privater, experimenteller Gebrauch; auf eigene Verantwortung.3 * Niemals Unternehmensrechner, Produktivsysteme, Industrieanlagen oder4 * sicherheitskritische Systeme anschließen oder bedienen.5 * Haftungshinweis und gesetzliche Grenzen: ../../DISCLAIMER.txt.6 */7#include "protocol.h"8#include <assert.h>9#include <stdio.h>10#include <string.h>1112static size_t frame(char *out, uint32_t seq, const char *body) {13 assert(hb_response(out, HB_FRAME_MAX + 1u, seq, body));14 size_t length = strlen(out) - 1u;15 out[length] = '\0';16 return length;17}1819int main(void) {20 assert(hb_crc16("123456789", 9u) == 0x29b1u);21 hb_request_t request;22 char line[HB_FRAME_MAX + 1u];23 size_t length = frame(line, UINT32_MAX, "KEY 255 0 4 100 101 254 255");24 assert(hb_parse(line, length, &request) == HB_PARSE_OK);25 assert(request.seq == UINT32_MAX && request.argc == 7u && request.args[6] == 255);26 length = frame(line, 0, "REL -127 127 -1 0 7");27 assert(hb_parse(line, length, &request) == HB_PARSE_OK);28 assert(request.seq == 0 && request.args[0] == -127);29 length = frame(line, 1, "ABS 0 32767 0");30 line[6] = 'X';31 assert(hb_parse(line, length, &request) == HB_PARSE_CRC && request.seq == 1u);32 const char *invalid_bodies[] = {33 "KEY 0 0 0 0 0 0 0 0", "ARM ", "REL +1 0 0 0 0", "REL - 0 0 0 0",34 "REL 2147483648 0 0 0 0", "REL -2147483649 0 0 0 0", "REL 1 0 0 0 0",35 "arm", "ARM\t", "ARM\r", "REL 1.0 0 0 0 0", "ARM\n",36 };37 for (size_t i = 0; i < sizeof(invalid_bodies) / sizeof(invalid_bodies[0]); ++i) {38 length = frame(line, 1, invalid_bodies[i]);39 assert(hb_parse(line, length, &request) == HB_PARSE_FORMAT);40 }41 length = frame(line, 1, "REL -2147483648 2147483647 0 0 0");42 assert(hb_parse(line, length, &request) == HB_PARSE_OK);43 assert(request.args[0] == INT32_MIN && request.args[1] == INT32_MAX);44 assert(hb_parse("HB1 4294967296 ARM *0000", 24, &request) == HB_PARSE_FORMAT);45 length = frame(line, 12, "HELLO");46 assert(hb_parse(line, length, &request) == HB_PARSE_OK);47 hb_sequence_t sequence = {0};48 assert(hb_sequence_check(&sequence, &request, line, length, false) == HB_SEQ_NEW);49 hb_sequence_commit(&sequence, &request, line, length, "response");50 assert(hb_sequence_check(&sequence, &request, line, length, true) == HB_SEQ_DUPLICATE);51 length = frame(line, 12, "STOP");52 assert(hb_parse(line, length, &request) == HB_PARSE_OK);53 assert(hb_sequence_check(&sequence, &request, line, length, true) == HB_SEQ_CONFLICT);54 length = frame(line, 11, "STOP");55 assert(hb_parse(line, length, &request) == HB_PARSE_OK);56 assert(hb_sequence_check(&sequence, &request, line, length, true) == HB_SEQ_OLD);57 length = frame(line, 1, "HELLO");58 assert(hb_parse(line, length, &request) == HB_PARSE_OK);59 assert(hb_sequence_check(&sequence, &request, line, length, false) == HB_SEQ_OLD);60 assert(hb_sequence_check(&sequence, &request, line, length, true) == HB_SEQ_NEW);61 length = frame(line, 1, "HELLO 1");62 assert(hb_parse(line, length, &request) == HB_PARSE_OK);63 assert(hb_sequence_check(&sequence, &request, line, length, true) == HB_SEQ_OLD);64 char tiny[4];65 assert(!hb_response(tiny, sizeof(tiny), 1, "OK"));6667 // Deterministic bounded-input fuzzing; run with ASan/UBSan for memory checks.68 uint32_t random = 0x12345678u;69 char fuzz[200];70 for (size_t test = 0; test < 20000u; ++test) {71 random = random * 1664525u + 1013904223u;72 size_t n = random % sizeof(fuzz);73 for (size_t i = 0; i < n; ++i) {74 random = random * 1664525u + 1013904223u;75 fuzz[i] = (char)(random >> 24u);76 }77 (void)hb_parse(fuzz, n, &request);78 }79 puts("HB1 protocol tests passed (including 20,000 bounded fuzz cases).");80 return 0;81}