summaryrefslogtreecommitdiffstats
path: root/src/test/test-os-util.c
blob: d6336c53e9dfaddc1b238fdce7b6204b51c60786 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* SPDX-License-Identifier: LGPL-2.1-or-later */

#include <errno.h>

#include "fs-util.h"
#include "log.h"
#include "os-util.h"
#include "string-util.h"
#include "strv.h"
#include "tests.h"

TEST(path_is_os_tree) {
        assert_se(path_is_os_tree("/") > 0);
        assert_se(path_is_os_tree("/etc") == 0);
        assert_se(path_is_os_tree("/idontexist") == -ENOENT);
}

TEST(parse_os_release) {
        /* Let's assume that we're running in a valid system, so os-release is available */
        _cleanup_free_ char *id = NULL, *id2 = NULL, *name = NULL, *foobar = NULL;
        assert_se(parse_os_release(NULL, "ID", &id) == 1);
        log_info("ID: %s", id);

        assert_se(setenv("SYSTEMD_OS_RELEASE", "/dev/null", 1) == 0);
        assert_se(parse_os_release(NULL, "ID", &id2) == 0);
        log_info("ID: %s", strnull(id2));

        _cleanup_(unlink_tempfilep) char tmpfile[] = "/tmp/test-os-util.XXXXXX";
        assert_se(write_tmpfile(tmpfile,
                                "ID=the-id  \n"
                                "NAME=the-name") == 0);

        assert_se(setenv("SYSTEMD_OS_RELEASE", tmpfile, 1) == 0);
        assert_se(parse_os_release(NULL, "ID", &id, "NAME", &name) == 2);
        log_info("ID: %s NAME: %s", id, name);
        assert_se(streq(id, "the-id"));
        assert_se(streq(name, "the-name"));

        _cleanup_(unlink_tempfilep) char tmpfile2[] = "/tmp/test-os-util.XXXXXX";
        assert_se(write_tmpfile(tmpfile2,
                                "ID=\"ignored\"  \n"
                                "ID=\"the-id\"  \n"
                                "NAME='the-name'") == 0);

        assert_se(setenv("SYSTEMD_OS_RELEASE", tmpfile2, 1) == 0);
        // FIXME: we return 3, which means that the return value is useless in face of repeats
        assert_se(parse_os_release(NULL, "ID", &id, "NAME", &name) == 3);
        log_info("ID: %s NAME: %s", id, name);
        assert_se(streq(id, "the-id"));
        assert_se(streq(name, "the-name"));

        assert_se(parse_os_release(NULL, "FOOBAR", &foobar) == 0);
        log_info("FOOBAR: %s", strnull(foobar));
        assert_se(foobar == NULL);

        assert_se(unsetenv("SYSTEMD_OS_RELEASE") == 0);
}

TEST(load_os_release_pairs) {
        _cleanup_(unlink_tempfilep) char tmpfile[] = "/tmp/test-os-util.XXXXXX";
        assert_se(write_tmpfile(tmpfile,
                                "ID=\"ignored\"  \n"
                                "ID=\"the-id\"  \n"
                                "NAME='the-name'") == 0);

        assert_se(setenv("SYSTEMD_OS_RELEASE", tmpfile, 1) == 0);

        _cleanup_strv_free_ char **pairs = NULL;
        assert_se(load_os_release_pairs(NULL, &pairs) == 0);
        assert_se(strv_equal(pairs, STRV_MAKE("ID", "the-id",
                                              "NAME", "the-name")));

        assert_se(unsetenv("SYSTEMD_OS_RELEASE") == 0);
}

DEFINE_TEST_MAIN(LOG_DEBUG);