skip to content
==> tests/frame.c <==
1/* The blob frames' bytes (as blobd.rs writes them) and their reading back. */
2#include "mesh/blobs/frame.h"
3#include "mesh/abi/peer_frames.h"
4#include "mesh/check.h"
5
6#include <string.h>
7
8int main(void) {
9    mj_hash h;
10    for (int i = 0; i < 32; i++) h.b[i] = (uint8_t)i;
11    msb o = {0};
12    mbf_put(&o, &h, 0x0102030405060708u, "abc", 3);
13    CHECK(o.n == 1 + 4 + 47 && (uint8_t)o.p[0] == MESH_F_BLOB_PUT && (uint8_t)o.p[1] == 47);
14    mbf_body b;
15    CHECK(mbf_decode(MESH_F_BLOB_PUT, (const uint8_t *)o.p + 5, o.n - 5, &b));
16    CHECK(mj_hash_eq(&b.hash, &h) && b.job == 0x0102030405060708u && b.len == 3 && b.nbytes == 3 && memcmp(b.bytes, "abc", 3) == 0);
17    msb_clear(&o);
18    mbf_ack(&o, &h, true, 9);
19    CHECK(o.n == 49 && (uint8_t)o.p[1] == 44);
20    CHECK(mbf_decode(MESH_F_BLOB_ACK, (const uint8_t *)o.p + 5, o.n - 5, &b) && b.ok && b.job == 9);
21    msb_clear(&o);
22    mbf_get(&o, &h, 9);
23    CHECK(o.n == 45 && (uint8_t)o.p[1] == 40 && mbf_decode(MESH_F_BLOB_GET, (const uint8_t *)o.p + 5, o.n - 5, &b));
24    msb_clear(&o);
25    mbf_blob(&o, &h, "xy", 2, true);
26    CHECK(o.n == 43 && (uint8_t)o.p[1] == 38 && mbf_decode(MESH_F_BLOB, (const uint8_t *)o.p + 5, o.n - 5, &b) && b.ok && b.nbytes == 2);
27    msb_clear(&o);
28    mbf_blob(&o, &h, NULL, 0, false);
29    CHECK(o.n == 41 && mbf_decode(MESH_F_BLOB, (const uint8_t *)o.p + 5, o.n - 5, &b) && !b.ok);
30    /* Short bodies are dropped. */
31    CHECK(!mbf_decode(MESH_F_BLOB_PUT, (const uint8_t *)o.p, 31, &b) && !mbf_decode(MESH_F_BLOB_ACK, (const uint8_t *)o.p, 40, &b));
32    msb_free(&o);
33    return mesh_check_done();
34}