==> tests/wire.c <==1/* mps.rs's frames test, through a pipe, plus the size refusals. */
2#include "mesh/check.h"
3#include "mesh/mps_wire.h"
4
5#include <stdlib.h>
6#include <string.h>
7#include <unistd.h>
8
9int main(void) {
10 const uint8_t body[] = {1, 0, 0, 0, 2, 0, 0, 0};
11 uint8_t *f;
12 size_t n;
13 mesh_mps_frame(MESH_W_LAUNCH, body, 8, &f, &n);
14 CHECK(n == 13 && f[0] == 9 && f[1] == 0 && f[2] == 0 && f[3] == 0 && f[4] == MESH_W_LAUNCH);
15 int p[2];
16 CHECK(pipe(p) == 0);
17 CHECK(write(p[1], f, n) == (ssize_t)n);
18 free(f);
19 uint8_t op, *b;
20 size_t bn;
21 CHECK(mesh_mps_read_frame(p[0], &op, &b, &bn));
22 CHECK(op == MESH_W_LAUNCH && bn == 8);
23 CHECK_U(mesh_mps_u32_at(b, bn, 0), 1);
24 CHECK_U(mesh_mps_u32_at(b, bn, 4), 2);
25 CHECK_U(mesh_mps_u32_at(b, bn, 8), 0);
26 free(b);
27 /* A zero-length frame ends the stream. */
28 const uint8_t zero[4] = {0, 0, 0, 0};
29 CHECK(write(p[1], zero, 4) == 4);
30 CHECK(!mesh_mps_read_frame(p[0], &op, &b, &bn));
31 /* write_frame and EOF. */
32 uint8_t *body2 = NULL;
33 size_t b2 = 0;
34 mesh_mps_put_u32(&body2, &b2, 7);
35 mesh_mps_put_u64(&body2, &b2, UINT64_C(0x1122334455667788));
36 mesh_mps_put_bytes(&body2, &b2, "xy", 2);
37 CHECK(mesh_mps_write_frame(p[1], MESH_W_DONE, body2, b2));
38 free(body2);
39 close(p[1]);
40 CHECK(mesh_mps_read_frame(p[0], &op, &b, &bn));
41 CHECK(op == MESH_W_DONE && bn == 14);
42 CHECK_U(mesh_mps_u32_at(b, bn, 0), 7);
43 CHECK_U(mesh_mps_u64_at(b, bn, 4), UINT64_C(0x1122334455667788));
44 CHECK(memcmp(b + 12, "xy", 2) == 0);
45 free(b);
46 CHECK(!mesh_mps_read_frame(p[0], &op, &b, &bn));
47 close(p[0]);
48 return mesh_check_done();
49}