==> tests/cluster.c <==1/* cluster.rs's tests: three_systems and errors, ported one for one. */
2#include "mesh/check.h"
3#include "mesh/cluster_conf.h"
4#include "mesh/mt.h"
5
6#include <stdlib.h>
7
8#define C3 "# test\nsystems = 3\n0.peer = 10.0.0.1:27800\n0.ssh = local\n1.peer = 10.0.0.1:27801 # same host\n1.listen = 0.0.0.0:27801\n2.peer = \"10.0.0.2:27802\"\n"
9
10static bool fails(const char *text, uint32_t me) {
11 mcc_topology t;
12 char *err = NULL;
13 if (mcc_topology_parse(text, me, &t, &err)) {
14 mcc_topology_free(&t);
15 return false;
16 }
17 free(err);
18 return true;
19}
20
21int main(void) {
22 char *err = NULL;
23 mcc_topology t;
24 /* three_systems */
25 CHECK(mcc_topology_parse(C3, 0, &t, &err));
26 CHECK(t.n == 3 && t.listen == NULL && t.ndial == 2 && t.dial_k[0] == 1 && t.dial_k[1] == 2);
27 CHECK_S(t.dial_addr[0], "10.0.0.1:27801");
28 CHECK_S(t.dial_addr[1], "10.0.0.2:27802");
29 mcc_topology_free(&t);
30 CHECK(mcc_topology_parse(C3, 1, &t, &err));
31 CHECK_S(t.listen, "0.0.0.0:27801");
32 CHECK(t.ndial == 1 && t.dial_k[0] == 2);
33 CHECK_S(t.dial_addr[0], "10.0.0.2:27802");
34 mcc_topology_free(&t);
35 CHECK(mcc_topology_parse(C3, 2, &t, &err));
36 CHECK_S(t.listen, "10.0.0.2:27802");
37 CHECK_U(t.ndial, 0);
38 mcc_topology_free(&t);
39 mcc_topology p = mcc_pair_dialer("h:1");
40 mcc_topology want = {.me = 0, .n = 2, .ndial = 1, .tun = mcc_tunables_default()};
41 want.dial_k[0] = 1;
42 want.dial_addr[0] = mt_strdup("h:1");
43 CHECK(mcc_topology_eq(&p, &want));
44 mcc_topology_free(&p);
45 mcc_topology_free(&want);
46 char *c = mt_fmt("%sdead_ms = 1500\nping_ms = 100\n", C3);
47 CHECK(mcc_topology_parse(c, 1, &t, &err));
48 msw_weights d = msw_default();
49 CHECK(t.tun.ping_ms == 100 && t.tun.dead_ms == 1500 && msw_eq(&t.tun.sched, &d));
50 mcc_topology_free(&t);
51 free(c);
52 c = mt_fmt("%ssched_hold_ms = 2000\nsched_improve = 0.5\n", C3);
53 CHECK(mcc_topology_parse(c, 1, &t, &err));
54 CHECK(t.tun.sched.hold_ms == 2000 && t.tun.sched.improve == 0.5);
55 mcc_topology_free(&t);
56 free(c);
57 c = mt_fmt("%ssched_hold_ms = x\n", C3);
58 CHECK(fails(c, 1));
59 free(c);
60 c = mt_fmt("%sdead_ms = 200\n", C3);
61 CHECK(!mcc_topology_parse(c, 1, &t, &err));
62 CHECK_S(err, "cluster: dead_ms 200 must be at least 3 x ping_ms 250");
63 free(err);
64 free(c);
65 /* errors */
66 CHECK(fails(C3, 3));
67 CHECK(fails("systems = 1\n0.peer = a:1", 0));
68 CHECK(fails("systems = 9", 0));
69 CHECK(fails("systems = 2\n0.peer = a:1", 0));
70 CHECK(!mcc_topology_parse("systems = 2\n0.peer = a:1\n1.peer = a:1", 0, &t, &err));
71 CHECK_S(err, "cluster: systems 0 and 1 share the peer address a:1");
72 free(err);
73 CHECK(!mcc_topology_parse("systems = 2\n0.peer = a\n1.peer = b:2", 0, &t, &err));
74 CHECK_S(err, "cluster: 0.peer = \"a\": expected host:port");
75 free(err);
76 ms_map m;
77 CHECK(!mcc_keys("systems = 2\nsystems = 3", &m, &err));
78 CHECK_S(err, "line 2: systems given twice");
79 free(err);
80 CHECK(!mcc_keys("junk", &m, &err));
81 CHECK_S(err, "line 1: expected key = value, got \"junk\"");
82 free(err);
83 CHECK(!mcc_keys(" = x", &m, &err));
84 CHECK_S(err, "line 1: empty key");
85 free(err);
86 CHECK(!mcc_topology_parse("systems = 2\n1.peer = b:2", 0, &t, &err));
87 CHECK_S(err, "cluster: no `0.peer = host:port`");
88 free(err);
89 return mesh_check_done();
90}