skip to content
==> 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}