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}