skip to content
==> tests/persist.c <==
1/* fleet.rs document_round_trips (the Persist part). */
2#include "mesh/check.h"
3#include "mesh/fleet_persist.h"
4
5#include <stdlib.h>
6
7int main(void) {
8    mfp_persist p = {.term = 5, .has_voted = true, .voted = 2};
9    p.accepted.version = 7;
10    p.accepted.term = 3;
11    mesh_needs n = msn_default();
12    mfd_prog_put(&p.accepted, "hello", mfd_prog_new("hello", 0xabc, true, &n));
13    mesh_needs_free(&n);
14    mt_strs w = {0};
15    mt_push(&w, "split");
16    mfd_place_put(&p.accepted, "doom", w);
17    p.committed = mfd_doc_clone(&p.accepted);
18    p.committed.version = 6;
19    char *e = mfp_encode(&p, 4);
20    mfp_persist back;
21    char *err = NULL;
22    CHECK(mfp_decode(e, 4, &back, &err));
23    CHECK(mfp_eq(&back, &p));
24    mfp_free(&back);
25    CHECK(!mfp_decode(e, 3, &back, &err));
26    CHECK(mt_contains(err, "cluster of 4"));
27    free(err);
28    free(e);
29    CHECK(!mfp_decode("term 1\n", 4, &back, &err));
30    CHECK_S(err, "incomplete (no accepted and committed documents)");
31    free(err);
32    CHECK(!mfp_decode("junk\n", 4, &back, &err));
33    CHECK_S(err, "bad line \"junk\"");
34    free(err);
35    CHECK(!mfp_decode("systems 4\naccepted 999\ndoc", 4, &back, &err));
36    CHECK_S(err, "accepted: truncated");
37    free(err);
38    /* A fresh member's state: no vote, empty documents. */
39    mfp_persist z = {0};
40    e = mfp_encode(&z, 3);
41    CHECK(mfp_decode(e, 3, &back, &err) && mfp_eq(&back, &z));
42    mfp_free(&back);
43    free(e);
44    mfp_free(&p);
45    return mesh_check_done();
46}