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