]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-os-util.c
Merge pull request #25608 from poettering/dissect-moar
[thirdparty/systemd.git] / src / test / test-os-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include <errno.h>
4 #include "fileio.h"
5 #include "fs-util.h"
6 #include "log.h"
7 #include "mkdir.h"
8 #include "os-util.h"
9 #include "path-util.h"
10 #include "rm-rf.h"
11 #include "string-util.h"
12 #include "strv.h"
13 #include "tests.h"
14 #include "tmpfile-util.h"
15
16 TEST(path_is_os_tree) {
17 assert_se(path_is_os_tree("/") > 0);
18 assert_se(path_is_os_tree("/etc") == 0);
19 assert_se(path_is_os_tree("/idontexist") == -ENOENT);
20 }
21
22 TEST(parse_os_release) {
23 /* Let's assume that we're running in a valid system, so os-release is available */
24 _cleanup_free_ char *id = NULL, *id2 = NULL, *name = NULL, *foobar = NULL;
25 assert_se(parse_os_release(NULL, "ID", &id) == 0);
26 log_info("ID: %s", id);
27
28 assert_se(setenv("SYSTEMD_OS_RELEASE", "/dev/null", 1) == 0);
29 assert_se(parse_os_release(NULL, "ID", &id2) == 0);
30 log_info("ID: %s", strnull(id2));
31
32 _cleanup_(unlink_tempfilep) char tmpfile[] = "/tmp/test-os-util.XXXXXX";
33 assert_se(write_tmpfile(tmpfile,
34 "ID=the-id \n"
35 "NAME=the-name") == 0);
36
37 assert_se(setenv("SYSTEMD_OS_RELEASE", tmpfile, 1) == 0);
38 assert_se(parse_os_release(NULL, "ID", &id, "NAME", &name) == 0);
39 log_info("ID: %s NAME: %s", id, name);
40 assert_se(streq(id, "the-id"));
41 assert_se(streq(name, "the-name"));
42
43 _cleanup_(unlink_tempfilep) char tmpfile2[] = "/tmp/test-os-util.XXXXXX";
44 assert_se(write_tmpfile(tmpfile2,
45 "ID=\"ignored\" \n"
46 "ID=\"the-id\" \n"
47 "NAME='the-name'") == 0);
48
49 assert_se(setenv("SYSTEMD_OS_RELEASE", tmpfile2, 1) == 0);
50 assert_se(parse_os_release(NULL, "ID", &id, "NAME", &name) == 0);
51 log_info("ID: %s NAME: %s", id, name);
52 assert_se(streq(id, "the-id"));
53 assert_se(streq(name, "the-name"));
54
55 assert_se(parse_os_release(NULL, "FOOBAR", &foobar) == 0);
56 log_info("FOOBAR: %s", strnull(foobar));
57 assert_se(foobar == NULL);
58
59 assert_se(unsetenv("SYSTEMD_OS_RELEASE") == 0);
60 }
61
62 TEST(parse_extension_release) {
63 /* Let's assume that we have a valid extension image */
64 _cleanup_free_ char *id = NULL, *version_id = NULL, *foobar = NULL, *a = NULL, *b = NULL;
65 _cleanup_(rm_rf_physical_and_freep) char *tempdir = NULL;
66
67 int r = mkdtemp_malloc("/tmp/test-os-util.XXXXXX", &tempdir);
68 if (r < 0)
69 log_error_errno(r, "Failed to setup working directory: %m");
70
71 assert_se(a = path_join(tempdir, "/usr/lib/extension-release.d/extension-release.test"));
72 assert_se(mkdir_parents(a, 0777) >= 0);
73
74 r = write_string_file(a, "ID=the-id \n VERSION_ID=the-version-id", WRITE_STRING_FILE_CREATE);
75 if (r < 0)
76 log_error_errno(r, "Failed to write file: %m");
77
78 assert_se(parse_extension_release(tempdir, IMAGE_SYSEXT, "test", false, "ID", &id, "VERSION_ID", &version_id) == 0);
79 log_info("ID: %s VERSION_ID: %s", id, version_id);
80 assert_se(streq(id, "the-id"));
81 assert_se(streq(version_id, "the-version-id"));
82
83 assert_se(b = path_join(tempdir, "/etc/extension-release.d/extension-release.tester"));
84 assert_se(mkdir_parents(b, 0777) >= 0);
85
86 r = write_string_file(b, "ID=\"ignored\" \n ID=\"the-id\" \n VERSION_ID='the-version-id'", WRITE_STRING_FILE_CREATE);
87 if (r < 0)
88 log_error_errno(r, "Failed to write file: %m");
89
90 assert_se(parse_extension_release(tempdir, IMAGE_CONFEXT, "tester", false, "ID", &id, "VERSION_ID", &version_id) == 0);
91 log_info("ID: %s VERSION_ID: %s", id, version_id);
92 assert_se(streq(id, "the-id"));
93 assert_se(streq(version_id, "the-version-id"));
94
95 assert_se(parse_extension_release(tempdir, IMAGE_CONFEXT, "tester", false, "FOOBAR", &foobar) == 0);
96 log_info("FOOBAR: %s", strnull(foobar));
97 assert_se(foobar == NULL);
98
99 assert_se(parse_extension_release(tempdir, IMAGE_SYSEXT, "test", false, "FOOBAR", &foobar) == 0);
100 log_info("FOOBAR: %s", strnull(foobar));
101 assert_se(foobar == NULL);
102 }
103
104 TEST(load_os_release_pairs) {
105 _cleanup_(unlink_tempfilep) char tmpfile[] = "/tmp/test-os-util.XXXXXX";
106 assert_se(write_tmpfile(tmpfile,
107 "ID=\"ignored\" \n"
108 "ID=\"the-id\" \n"
109 "NAME='the-name'") == 0);
110
111 assert_se(setenv("SYSTEMD_OS_RELEASE", tmpfile, 1) == 0);
112
113 _cleanup_strv_free_ char **pairs = NULL;
114 assert_se(load_os_release_pairs(NULL, &pairs) == 0);
115 assert_se(strv_equal(pairs, STRV_MAKE("ID", "the-id",
116 "NAME", "the-name")));
117
118 assert_se(unsetenv("SYSTEMD_OS_RELEASE") == 0);
119 }
120
121 TEST(os_release_support_ended) {
122 int r;
123
124 assert_se(os_release_support_ended("1999-01-01", false, NULL) == true);
125 assert_se(os_release_support_ended("2037-12-31", false, NULL) == false);
126 assert_se(os_release_support_ended("-1-1-1", true, NULL) == -EINVAL);
127
128 r = os_release_support_ended(NULL, false, NULL);
129 if (r < 0)
130 log_info_errno(r, "Failed to check host: %m");
131 else
132 log_info_errno(r, "Host is supported: %s", yes_no(!r));
133 }
134
135 DEFINE_TEST_MAIN(LOG_DEBUG);