==> 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}