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