Ground-Zerro / HydraRoute Public
Code Issues Pull requests Actions Releases View on GitHub ↗
3.3 KB c
#include "../src/rci.c"
#include <assert.h>

static const char SHOW_OUTPUT[] =
    "\033[K\n"
    "            token: \n"
    "                   id: 3\n"
    "          fingerprint: 03...cd\n"
    "      truncated-value: VCN...YWy\n"
    "              service: Core::Security::Authenticator\n"
    "                local: yes\n"
    "                 user: admin\n"
    "            user-data: HydraRoute\n"
    "              expires: never\n"
    "          last-access: 236\n"
    "\n"
    "            token: \n"
    "                   id: 9\n"
    "          fingerprint: 61...af\n"
    "      truncated-value: cDK...stq\n"
    "                 user: admin\n"
    "            user-data: someone-else\n"
    "              expires: never\n"
    "          last-access: 4\n"
    "\n\033[K";

static const char GENERATE_OUTPUT[] =
    "\033[K\n"
    "               id: 8\n"
    "            value: \n"
    "                   ksPNNRb3RGRMowrJDsZhC92yu3SIBA16iXVduJziQD0V51N8kCEzaMzo\n"
    "\n"
    "Core::Security::Authenticator: Added a token for user \"admin\".\n"
    "\033[K";

static void check_strip_ansi(void) {
    char out[512];
    strip_ansi("\033[Kid: 3\033[K\n", out, sizeof(out));
    assert(strcmp(out, "id: 3\n") == 0);

    strip_ansi("plain", out, sizeof(out));
    assert(strcmp(out, "plain") == 0);

    strip_ansi("\033[", out, sizeof(out));
    assert(out[0] == '\0');
}

static void check_parse_token_value(void) {
    char clean[NDMC_OUT_MAX];
    char token[MAX_RCI_TOKEN];

    strip_ansi(GENERATE_OUTPUT, clean, sizeof(clean));
    assert(ndmc_parse_token_value(clean, token, sizeof(token)) == 1);
    assert(strcmp(token, "ksPNNRb3RGRMowrJDsZhC92yu3SIBA16iXVduJziQD0V51N8kCEzaMzo") == 0);

    strip_ansi(SHOW_OUTPUT, clean, sizeof(clean));
    assert(ndmc_parse_token_value(clean, token, sizeof(token)) == 0);

    assert(ndmc_parse_token_value("value: short\n", token, sizeof(token)) == 0);
    assert(ndmc_parse_token_value("nothing here\n", token, sizeof(token)) == 0);
}

static void check_collect_token_ids(void) {
    char clean[NDMC_OUT_MAX];
    int ids[TOKEN_MAX_OWNED];

    strip_ansi(SHOW_OUTPUT, clean, sizeof(clean));

    int n = ndmc_collect_token_ids(clean, TOKEN_LABEL, ids, TOKEN_MAX_OWNED);
    assert(n == 1);
    assert(ids[0] == 3);

    n = ndmc_collect_token_ids(clean, "someone-else", ids, TOKEN_MAX_OWNED);
    assert(n == 1);
    assert(ids[0] == 9);

    n = ndmc_collect_token_ids(clean, "absent", ids, TOKEN_MAX_OWNED);
    assert(n == 0);

    n = ndmc_collect_token_ids("", TOKEN_LABEL, ids, TOKEN_MAX_OWNED);
    assert(n == 0);
}

static void check_token_send_rules(void) {
    rci_set_token("");
    assert(rci_mode() == RCI_MODE_LOCAL);
    assert(rci_should_send_token() == 0);

    rci_set_token("ksPNNRb3RGRMowrJDsZhC92yu3SIBA16iXVduJziQD0V51N8kCEzaMzo");
    assert(rci_mode() == RCI_MODE_TOKEN);
    assert(rci_should_send_token() != 0);

    g_mode = RCI_MODE_LOCAL;
    assert(rci_should_send_token() == 0);

    g_mode = RCI_MODE_BLOCKED;
    assert(rci_should_send_token() != 0);

    rci_set_token("good\ttail");
    assert(strcmp(g_rci_token, "good") == 0);

    rci_set_token("");
}

int main(void) {
    check_strip_ansi();
    check_parse_token_value();
    check_collect_token_ids();
    check_token_send_rules();
    printf("check_rci: OK\n");
    return 0;
}