skip to content
==> tests/text.c <==
1/* The jobs answers over a single meshd's node that runs a job (leases fed back as results). */
2#include "mesh/jobd/text.h"
3#include "mesh/check.h"
4
5#include <stdlib.h>
6#include <string.h>
7
8static mj_view single = {1, true, 0, 1, 1};
9
10/* Runs every lease the outputs hold (results item*7+1, item 3 failing), returns the leases seen. */
11static void act(mj_node *n, mj_outs o, uint64_t now) {
12    for (size_t i = 0; i < o.n; i++) {
13        if (o.v[i].kind != MJ_OUT_RUN) continue;
14        mj_lease_msg *l = &o.v[i].run;
15        for (size_t r = 0; r < l->items.n; r++)
16            for (uint64_t x = l->items.v[r][0]; x < l->items.v[r][1]; x++) {
17                mj_item_res res = {.lease = l->lease, .job = l->job, .item = x, .status = x == 3 ? MESH_JOBS_RS_FAIL : MESH_JOBS_RS_OK,
18                                   .result = (uint32_t)(x * 7 + 1)};
19                if (x == 3) {
20                    res.out = (uint8_t *)mstrdup("boom");
21                    res.out_len = 4;
22                }
23                mj_outs ro = mj_node_result(n, res, now);
24                mj_outs_free(&ro);
25            }
26    }
27    mj_outs_free(&o);
28}
29
30int main(void) {
31    mj_replica r;
32    mj_replica_init(&r);
33    mj_node *n = mj_node_new((mj_cfg){0, 1, 1, 3000}, r);
34    uint64_t now = 1, unix_ms = 1000000;
35    act(n, mj_node_set_view(n, single, now, unix_ms), now);
36    mj_prog *p = mxalloc(sizeof *p);
37    *p = (mj_prog){mstrdup("p"), 0, 8};
38    mj_node_set_progs(n, p, 1);
39    now++;
40    unix_ms++;
41    act(n, mj_node_tick(n, now, unix_ms), now);
42    const char *w[] = {"submit", "p", "items", "10", "attempts", "1"};
43    mj_req req;
44    CHECK(mj_req_parse(w, 6, &req, NULL));
45    act(n, mj_node_request(n, req, 1, now, unix_ms), now);
46    mjd_text_cx cx = {n, single, false, unix_ms};
47    char *t = mjd_jobs_text(&cx);
48    CHECK(strncmp(t, "jobs system 0 leader 0 role leader lid 10000000000 ", 51) == 0);
49    CHECK(strstr(t, "job 1.1 program p state running priority 0 items 10 done 0 failed 0 leased ") != NULL);
50    free(t);
51    for (int i = 0; i < 400; i++) {
52        now += 5;
53        unix_ms += 5;
54        act(n, mj_node_tick(n, now, unix_ms), now);
55    }
56    cx.unix_ms = unix_ms;
57    t = mjd_jobs_text(&cx);
58    CHECK(strstr(t, "job 1.1 program p state done-with-failures priority 0 items 10 done 9 failed 1 leased 0 queued - dupes 0 mode collect elapsed_ms ") != NULL);
59    CHECK(strstr(t, "rate system 0 program p items_per_s ") != NULL);
60    free(t);
61    char *s = NULL;
62    CHECK(mjd_status_text(&cx, (uint64_t)1 << 32 | 1, &s));
63    CHECK(strstr(s, "\nspec id 4294967297 program p op 254 items 0-10 priority 0 attempts 1 deadline 0 mode collect setup - submitted ") != NULL);
64    CHECK(strstr(s, "\nmember 0 done 9\n") != NULL);
65    CHECK(strstr(s, "\nfailed 3 tries 1 system 0: boom\n") != NULL);
66    CHECK(strstr(s, "\nretried 1 item(s)\n") != NULL);
67    free(s);
68    CHECK(mjd_results_text(&cx, (uint64_t)1 << 32 | 1, 2, 3, &s));
69    CHECK_S(s, "results 1.1 total 9 from 2 count 3 done 9 failed 1 dupes 0 state done-with-failures\n2 15 lease 10000000001 member 0\n4 29 lease 10000000001 member 0\n5 36 lease 10000000002 member 0\n");
70    free(s);
71    CHECK(!mjd_status_text(&cx, 7, &s));
72    CHECK_S(s, "no job 0.7 (committed here)");
73    free(s);
74    mj_node_free(n);
75    return mesh_check_done();
76}