1 /* SPDX-License-Identifier: LGPL-2.1+ */
5 #include <sys/utsname.h>
10 #include "alloc-util.h"
11 #include "apparmor-util.h"
12 #include "architecture.h"
13 #include "audit-util.h"
14 #include "cgroup-util.h"
15 #include "condition.h"
16 #include "cpu-set-util.h"
17 #include "efi-loader.h"
18 #include "errno-util.h"
19 #include "hostname-util.h"
20 #include "id128-util.h"
22 #include "limits-util.h"
25 #include "nulstr-util.h"
26 #include "process-util.h"
27 #include "selinux-util.h"
29 #include "smack-util.h"
30 #include "string-util.h"
33 #include "tomoyo-util.h"
34 #include "user-util.h"
37 static void test_condition_test_path(void) {
40 condition
= condition_new(CONDITION_PATH_EXISTS
, "/bin/sh", false, false);
42 assert_se(condition_test(condition
));
43 condition_free(condition
);
45 condition
= condition_new(CONDITION_PATH_EXISTS
, "/bin/s?", false, false);
47 assert_se(condition_test(condition
) == 0);
48 condition_free(condition
);
50 condition
= condition_new(CONDITION_PATH_EXISTS_GLOB
, "/bin/s?", false, false);
52 assert_se(condition_test(condition
) > 0);
53 condition_free(condition
);
55 condition
= condition_new(CONDITION_PATH_EXISTS_GLOB
, "/bin/s?", false, true);
57 assert_se(condition_test(condition
) == 0);
58 condition_free(condition
);
60 condition
= condition_new(CONDITION_PATH_EXISTS
, "/thiscertainlywontexist", false, false);
62 assert_se(condition_test(condition
) == 0);
63 condition_free(condition
);
65 condition
= condition_new(CONDITION_PATH_EXISTS
, "/thiscertainlywontexist", false, true);
67 assert_se(condition_test(condition
) > 0);
68 condition_free(condition
);
70 condition
= condition_new(CONDITION_PATH_IS_DIRECTORY
, "/bin", false, false);
72 assert_se(condition_test(condition
) > 0);
73 condition_free(condition
);
75 condition
= condition_new(CONDITION_DIRECTORY_NOT_EMPTY
, "/bin", false, false);
77 assert_se(condition_test(condition
) > 0);
78 condition_free(condition
);
80 condition
= condition_new(CONDITION_FILE_NOT_EMPTY
, "/bin/sh", false, false);
82 assert_se(condition_test(condition
) > 0);
83 condition_free(condition
);
85 condition
= condition_new(CONDITION_FILE_IS_EXECUTABLE
, "/bin/sh", false, false);
87 assert_se(condition_test(condition
) > 0);
88 condition_free(condition
);
90 condition
= condition_new(CONDITION_FILE_IS_EXECUTABLE
, "/etc/passwd", false, false);
92 assert_se(condition_test(condition
) == 0);
93 condition_free(condition
);
95 condition
= condition_new(CONDITION_PATH_IS_MOUNT_POINT
, "/proc", false, false);
97 assert_se(condition_test(condition
) > 0);
98 condition_free(condition
);
100 condition
= condition_new(CONDITION_PATH_IS_MOUNT_POINT
, "/", false, false);
101 assert_se(condition
);
102 assert_se(condition_test(condition
) > 0);
103 condition_free(condition
);
105 condition
= condition_new(CONDITION_PATH_IS_MOUNT_POINT
, "/bin", false, false);
106 assert_se(condition
);
107 assert_se(condition_test(condition
) == 0);
108 condition_free(condition
);
110 condition
= condition_new(CONDITION_PATH_IS_READ_WRITE
, "/tmp", false, false);
111 assert_se(condition
);
112 assert_se(condition_test(condition
) > 0);
113 condition_free(condition
);
115 condition
= condition_new(CONDITION_PATH_IS_SYMBOLIC_LINK
, "/dev/stdout", false, false);
116 assert_se(condition
);
117 assert_se(condition_test(condition
) > 0);
118 condition_free(condition
);
121 static void test_condition_test_control_group_controller(void) {
122 Condition
*condition
;
123 CGroupMask system_mask
;
124 CGroupController controller
;
125 _cleanup_free_
char *controller_name
= NULL
;
130 log_notice_errno(r
, "Skipping ConditionControlGroupController tests: %m");
134 /* Invalid controllers are ignored */
135 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, "thisisnotarealcontroller", false, false);
136 assert_se(condition
);
137 assert_se(condition_test(condition
) > 0);
138 condition_free(condition
);
140 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, "thisisnotarealcontroller", false, true);
141 assert_se(condition
);
142 assert_se(condition_test(condition
) == 0);
143 condition_free(condition
);
145 assert_se(cg_mask_supported(&system_mask
) >= 0);
147 /* Individual valid controllers one by one */
148 for (controller
= 0; controller
< _CGROUP_CONTROLLER_MAX
; controller
++) {
149 const char *local_controller_name
= cgroup_controller_to_string(controller
);
150 log_info("chosen controller is '%s'", local_controller_name
);
151 if (system_mask
& CGROUP_CONTROLLER_TO_MASK(controller
)) {
152 log_info("this controller is available");
153 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, local_controller_name
, false, false);
154 assert_se(condition
);
155 assert_se(condition_test(condition
) > 0);
156 condition_free(condition
);
158 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, local_controller_name
, false, true);
159 assert_se(condition
);
160 assert_se(condition_test(condition
) == 0);
161 condition_free(condition
);
163 log_info("this controller is unavailable");
164 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, local_controller_name
, false, false);
165 assert_se(condition
);
166 assert_se(condition_test(condition
) == 0);
167 condition_free(condition
);
169 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, local_controller_name
, false, true);
170 assert_se(condition
);
171 assert_se(condition_test(condition
) > 0);
172 condition_free(condition
);
176 /* Multiple valid controllers at the same time */
177 assert_se(cg_mask_to_string(system_mask
, &controller_name
) >= 0);
179 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, strempty(controller_name
), false, false);
180 assert_se(condition
);
181 assert_se(condition_test(condition
) > 0);
182 condition_free(condition
);
184 condition
= condition_new(CONDITION_CONTROL_GROUP_CONTROLLER
, strempty(controller_name
), false, true);
185 assert_se(condition
);
186 assert_se(condition_test(condition
) == 0);
187 condition_free(condition
);
190 static void test_condition_test_ac_power(void) {
191 Condition
*condition
;
193 condition
= condition_new(CONDITION_AC_POWER
, "true", false, false);
194 assert_se(condition
);
195 assert_se(condition_test(condition
) == on_ac_power());
196 condition_free(condition
);
198 condition
= condition_new(CONDITION_AC_POWER
, "false", false, false);
199 assert_se(condition
);
200 assert_se(condition_test(condition
) != on_ac_power());
201 condition_free(condition
);
203 condition
= condition_new(CONDITION_AC_POWER
, "false", false, true);
204 assert_se(condition
);
205 assert_se(condition_test(condition
) == on_ac_power());
206 condition_free(condition
);
209 static void test_condition_test_host(void) {
210 _cleanup_free_
char *hostname
= NULL
;
211 char sid
[SD_ID128_STRING_MAX
];
212 Condition
*condition
;
216 r
= sd_id128_get_machine(&id
);
218 assert_se(sd_id128_to_string(id
, sid
));
220 condition
= condition_new(CONDITION_HOST
, sid
, false, false);
221 assert_se(condition
);
222 assert_se(condition_test(condition
) > 0);
223 condition_free(condition
);
225 condition
= condition_new(CONDITION_HOST
, "garbage value jjjjjjjjjjjjjj", false, false);
226 assert_se(condition
);
227 assert_se(condition_test(condition
) == 0);
228 condition_free(condition
);
230 condition
= condition_new(CONDITION_HOST
, sid
, false, true);
231 assert_se(condition
);
232 assert_se(condition_test(condition
) == 0);
233 condition_free(condition
);
235 hostname
= gethostname_malloc();
238 /* if hostname looks like an id128 then skip testing it */
239 if (id128_is_valid(hostname
))
240 log_notice("hostname is an id128, skipping test");
242 condition
= condition_new(CONDITION_HOST
, hostname
, false, false);
243 assert_se(condition
);
244 assert_se(condition_test(condition
) > 0);
245 condition_free(condition
);
249 static void test_condition_test_architecture(void) {
250 Condition
*condition
;
254 a
= uname_architecture();
257 sa
= architecture_to_string(a
);
260 condition
= condition_new(CONDITION_ARCHITECTURE
, sa
, false, false);
261 assert_se(condition
);
262 assert_se(condition_test(condition
) > 0);
263 condition_free(condition
);
265 condition
= condition_new(CONDITION_ARCHITECTURE
, "garbage value", false, false);
266 assert_se(condition
);
267 assert_se(condition_test(condition
) == 0);
268 condition_free(condition
);
270 condition
= condition_new(CONDITION_ARCHITECTURE
, sa
, false, true);
271 assert_se(condition
);
272 assert_se(condition_test(condition
) == 0);
273 condition_free(condition
);
276 static void test_condition_test_kernel_command_line(void) {
277 Condition
*condition
;
280 condition
= condition_new(CONDITION_KERNEL_COMMAND_LINE
, "thisreallyshouldntbeonthekernelcommandline", false, false);
281 assert_se(condition
);
282 r
= condition_test(condition
);
283 if (ERRNO_IS_PRIVILEGE(r
))
286 condition_free(condition
);
288 condition
= condition_new(CONDITION_KERNEL_COMMAND_LINE
, "andthis=neither", false, false);
289 assert_se(condition
);
290 assert_se(condition_test(condition
) == 0);
291 condition_free(condition
);
294 static void test_condition_test_kernel_version(void) {
295 Condition
*condition
;
299 condition
= condition_new(CONDITION_KERNEL_VERSION
, "*thisreallyshouldntbeinthekernelversion*", false, false);
300 assert_se(condition
);
301 assert_se(condition_test(condition
) == 0);
302 condition_free(condition
);
304 condition
= condition_new(CONDITION_KERNEL_VERSION
, "*", false, false);
305 assert_se(condition
);
306 assert_se(condition_test(condition
) > 0);
307 condition_free(condition
);
309 /* An artificially empty condition. It evaluates to true, but normally
310 * such condition cannot be created, because the condition list is reset instead. */
311 condition
= condition_new(CONDITION_KERNEL_VERSION
, "", false, false);
312 assert_se(condition
);
313 assert_se(condition_test(condition
) > 0);
314 condition_free(condition
);
316 assert_se(uname(&u
) >= 0);
318 condition
= condition_new(CONDITION_KERNEL_VERSION
, u
.release
, false, false);
319 assert_se(condition
);
320 assert_se(condition_test(condition
) > 0);
321 condition_free(condition
);
323 strshorten(u
.release
, 4);
324 strcpy(strchr(u
.release
, 0), "*");
326 condition
= condition_new(CONDITION_KERNEL_VERSION
, u
.release
, false, false);
327 assert_se(condition
);
328 assert_se(condition_test(condition
) > 0);
329 condition_free(condition
);
331 /* 0.1.2 would be a very very very old kernel */
332 condition
= condition_new(CONDITION_KERNEL_VERSION
, "> 0.1.2", false, false);
333 assert_se(condition
);
334 assert_se(condition_test(condition
) > 0);
335 condition_free(condition
);
337 condition
= condition_new(CONDITION_KERNEL_VERSION
, ">0.1.2", false, false);
338 assert_se(condition
);
339 assert_se(condition_test(condition
) > 0);
340 condition_free(condition
);
342 condition
= condition_new(CONDITION_KERNEL_VERSION
, "'>0.1.2' '<9.0.0'", false, false);
343 assert_se(condition
);
344 assert_se(condition_test(condition
) > 0);
345 condition_free(condition
);
347 condition
= condition_new(CONDITION_KERNEL_VERSION
, "> 0.1.2 < 9.0.0", false, false);
348 assert_se(condition
);
349 assert_se(condition_test(condition
) == -EINVAL
);
350 condition_free(condition
);
352 condition
= condition_new(CONDITION_KERNEL_VERSION
, ">", false, false);
353 assert_se(condition
);
354 assert_se(condition_test(condition
) == -EINVAL
);
355 condition_free(condition
);
357 condition
= condition_new(CONDITION_KERNEL_VERSION
, ">= 0.1.2", false, false);
358 assert_se(condition
);
359 assert_se(condition_test(condition
) > 0);
360 condition_free(condition
);
362 condition
= condition_new(CONDITION_KERNEL_VERSION
, "< 0.1.2", false, false);
363 assert_se(condition
);
364 assert_se(condition_test(condition
) == 0);
365 condition_free(condition
);
367 condition
= condition_new(CONDITION_KERNEL_VERSION
, "<= 0.1.2", false, false);
368 assert_se(condition
);
369 assert_se(condition_test(condition
) == 0);
370 condition_free(condition
);
372 condition
= condition_new(CONDITION_KERNEL_VERSION
, "= 0.1.2", false, false);
373 assert_se(condition
);
374 assert_se(condition_test(condition
) == 0);
375 condition_free(condition
);
377 /* 4711.8.15 is a very very very future kernel */
378 condition
= condition_new(CONDITION_KERNEL_VERSION
, "< 4711.8.15", false, false);
379 assert_se(condition
);
380 assert_se(condition_test(condition
) > 0);
381 condition_free(condition
);
383 condition
= condition_new(CONDITION_KERNEL_VERSION
, "<= 4711.8.15", false, false);
384 assert_se(condition
);
385 assert_se(condition_test(condition
) > 0);
386 condition_free(condition
);
388 condition
= condition_new(CONDITION_KERNEL_VERSION
, "= 4711.8.15", false, false);
389 assert_se(condition
);
390 assert_se(condition_test(condition
) == 0);
391 condition_free(condition
);
393 condition
= condition_new(CONDITION_KERNEL_VERSION
, "> 4711.8.15", false, false);
394 assert_se(condition
);
395 assert_se(condition_test(condition
) == 0);
396 condition_free(condition
);
398 condition
= condition_new(CONDITION_KERNEL_VERSION
, ">= 4711.8.15", false, false);
399 assert_se(condition
);
400 assert_se(condition_test(condition
) == 0);
401 condition_free(condition
);
403 assert_se(uname(&u
) >= 0);
405 v
= strjoina(">=", u
.release
);
406 condition
= condition_new(CONDITION_KERNEL_VERSION
, v
, false, false);
407 assert_se(condition
);
408 assert_se(condition_test(condition
) > 0);
409 condition_free(condition
);
411 v
= strjoina("= ", u
.release
);
412 condition
= condition_new(CONDITION_KERNEL_VERSION
, v
, false, false);
413 assert_se(condition
);
414 assert_se(condition_test(condition
) > 0);
415 condition_free(condition
);
417 v
= strjoina("<=", u
.release
);
418 condition
= condition_new(CONDITION_KERNEL_VERSION
, v
, false, false);
419 assert_se(condition
);
420 assert_se(condition_test(condition
) > 0);
421 condition_free(condition
);
423 v
= strjoina("> ", u
.release
);
424 condition
= condition_new(CONDITION_KERNEL_VERSION
, v
, false, false);
425 assert_se(condition
);
426 assert_se(condition_test(condition
) == 0);
427 condition_free(condition
);
429 v
= strjoina("< ", u
.release
);
430 condition
= condition_new(CONDITION_KERNEL_VERSION
, v
, false, false);
431 assert_se(condition
);
432 assert_se(condition_test(condition
) == 0);
433 condition_free(condition
);
436 static void test_condition_test_null(void) {
437 Condition
*condition
;
439 condition
= condition_new(CONDITION_NULL
, NULL
, false, false);
440 assert_se(condition
);
441 assert_se(condition_test(condition
) > 0);
442 condition_free(condition
);
444 condition
= condition_new(CONDITION_NULL
, NULL
, false, true);
445 assert_se(condition
);
446 assert_se(condition_test(condition
) == 0);
447 condition_free(condition
);
450 static void test_condition_test_security(void) {
451 Condition
*condition
;
453 condition
= condition_new(CONDITION_SECURITY
, "garbage oifdsjfoidsjoj", false, false);
454 assert_se(condition
);
455 assert_se(condition_test(condition
) == 0);
456 condition_free(condition
);
458 condition
= condition_new(CONDITION_SECURITY
, "selinux", false, true);
459 assert_se(condition
);
460 assert_se(condition_test(condition
) != mac_selinux_use());
461 condition_free(condition
);
463 condition
= condition_new(CONDITION_SECURITY
, "apparmor", false, false);
464 assert_se(condition
);
465 assert_se(condition_test(condition
) == mac_apparmor_use());
466 condition_free(condition
);
468 condition
= condition_new(CONDITION_SECURITY
, "tomoyo", false, false);
469 assert_se(condition
);
470 assert_se(condition_test(condition
) == mac_tomoyo_use());
471 condition_free(condition
);
473 condition
= condition_new(CONDITION_SECURITY
, "ima", false, false);
474 assert_se(condition
);
475 assert_se(condition_test(condition
) == use_ima());
476 condition_free(condition
);
478 condition
= condition_new(CONDITION_SECURITY
, "smack", false, false);
479 assert_se(condition
);
480 assert_se(condition_test(condition
) == mac_smack_use());
481 condition_free(condition
);
483 condition
= condition_new(CONDITION_SECURITY
, "audit", false, false);
484 assert_se(condition
);
485 assert_se(condition_test(condition
) == use_audit());
486 condition_free(condition
);
488 condition
= condition_new(CONDITION_SECURITY
, "uefi-secureboot", false, false);
489 assert_se(condition
);
490 assert_se(condition_test(condition
) == is_efi_secure_boot());
491 condition_free(condition
);
494 static void print_securities(void) {
495 log_info("------ enabled security technologies ------");
496 log_info("SELinux: %s", yes_no(mac_selinux_use()));
497 log_info("AppArmor: %s", yes_no(mac_apparmor_use()));
498 log_info("Tomoyo: %s", yes_no(mac_tomoyo_use()));
499 log_info("IMA: %s", yes_no(use_ima()));
500 log_info("SMACK: %s", yes_no(mac_smack_use()));
501 log_info("Audit: %s", yes_no(use_audit()));
502 log_info("UEFI secure boot: %s", yes_no(is_efi_secure_boot()));
503 log_info("-------------------------------------------");
506 static void test_condition_test_virtualization(void) {
507 Condition
*condition
;
511 condition
= condition_new(CONDITION_VIRTUALIZATION
, "garbage oifdsjfoidsjoj", false, false);
512 assert_se(condition
);
513 r
= condition_test(condition
);
514 if (ERRNO_IS_PRIVILEGE(r
))
516 log_info("ConditionVirtualization=garbage → %i", r
);
518 condition_free(condition
);
520 condition
= condition_new(CONDITION_VIRTUALIZATION
, "container", false, false);
521 assert_se(condition
);
522 r
= condition_test(condition
);
523 log_info("ConditionVirtualization=container → %i", r
);
524 assert_se(r
== !!detect_container());
525 condition_free(condition
);
527 condition
= condition_new(CONDITION_VIRTUALIZATION
, "vm", false, false);
528 assert_se(condition
);
529 r
= condition_test(condition
);
530 log_info("ConditionVirtualization=vm → %i", r
);
531 assert_se(r
== (detect_vm() && !detect_container()));
532 condition_free(condition
);
534 condition
= condition_new(CONDITION_VIRTUALIZATION
, "private-users", false, false);
535 assert_se(condition
);
536 r
= condition_test(condition
);
537 log_info("ConditionVirtualization=private-users → %i", r
);
538 assert_se(r
== !!running_in_userns());
539 condition_free(condition
);
555 condition
= condition_new(CONDITION_VIRTUALIZATION
, virt
, false, false);
556 assert_se(condition
);
557 r
= condition_test(condition
);
558 log_info("ConditionVirtualization=%s → %i", virt
, r
);
560 condition_free(condition
);
564 static void test_condition_test_user(void) {
565 Condition
*condition
;
570 condition
= condition_new(CONDITION_USER
, "garbage oifdsjfoidsjoj", false, false);
571 assert_se(condition
);
572 r
= condition_test(condition
);
573 log_info("ConditionUser=garbage → %i", r
);
575 condition_free(condition
);
577 assert_se(asprintf(&uid
, "%"PRIu32
, UINT32_C(0xFFFF)) > 0);
578 condition
= condition_new(CONDITION_USER
, uid
, false, false);
579 assert_se(condition
);
580 r
= condition_test(condition
);
581 log_info("ConditionUser=%s → %i", uid
, r
);
583 condition_free(condition
);
586 assert_se(asprintf(&uid
, "%u", (unsigned)getuid()) > 0);
587 condition
= condition_new(CONDITION_USER
, uid
, false, false);
588 assert_se(condition
);
589 r
= condition_test(condition
);
590 log_info("ConditionUser=%s → %i", uid
, r
);
592 condition_free(condition
);
595 assert_se(asprintf(&uid
, "%u", (unsigned)getuid()+1) > 0);
596 condition
= condition_new(CONDITION_USER
, uid
, false, false);
597 assert_se(condition
);
598 r
= condition_test(condition
);
599 log_info("ConditionUser=%s → %i", uid
, r
);
601 condition_free(condition
);
604 username
= getusername_malloc();
606 condition
= condition_new(CONDITION_USER
, username
, false, false);
607 assert_se(condition
);
608 r
= condition_test(condition
);
609 log_info("ConditionUser=%s → %i", username
, r
);
611 condition_free(condition
);
614 username
= (char*)(geteuid() == 0 ? NOBODY_USER_NAME
: "root");
615 condition
= condition_new(CONDITION_USER
, username
, false, false);
616 assert_se(condition
);
617 r
= condition_test(condition
);
618 log_info("ConditionUser=%s → %i", username
, r
);
620 condition_free(condition
);
622 condition
= condition_new(CONDITION_USER
, "@system", false, false);
623 assert_se(condition
);
624 r
= condition_test(condition
);
625 log_info("ConditionUser=@system → %i", r
);
626 if (uid_is_system(getuid()) || uid_is_system(geteuid()))
630 condition_free(condition
);
633 static void test_condition_test_group(void) {
634 Condition
*condition
;
637 gid_t
*gids
, max_gid
;
638 int ngroups_max
, ngroups
, r
, i
;
640 assert_se(0 < asprintf(&gid
, "%u", UINT32_C(0xFFFF)));
641 condition
= condition_new(CONDITION_GROUP
, gid
, false, false);
642 assert_se(condition
);
643 r
= condition_test(condition
);
644 log_info("ConditionGroup=%s → %i", gid
, r
);
646 condition_free(condition
);
649 assert_se(0 < asprintf(&gid
, "%u", getgid()));
650 condition
= condition_new(CONDITION_GROUP
, gid
, false, false);
651 assert_se(condition
);
652 r
= condition_test(condition
);
653 log_info("ConditionGroup=%s → %i", gid
, r
);
655 condition_free(condition
);
658 ngroups_max
= sysconf(_SC_NGROUPS_MAX
);
659 assert(ngroups_max
> 0);
661 gids
= newa(gid_t
, ngroups_max
);
663 ngroups
= getgroups(ngroups_max
, gids
);
664 assert(ngroups
>= 0);
667 for (i
= 0; i
< ngroups
; i
++) {
668 assert_se(0 < asprintf(&gid
, "%u", gids
[i
]));
669 condition
= condition_new(CONDITION_GROUP
, gid
, false, false);
670 assert_se(condition
);
671 r
= condition_test(condition
);
672 log_info("ConditionGroup=%s → %i", gid
, r
);
674 condition_free(condition
);
676 max_gid
= gids
[i
] > max_gid
? gids
[i
] : max_gid
;
678 groupname
= gid_to_name(gids
[i
]);
679 assert_se(groupname
);
680 condition
= condition_new(CONDITION_GROUP
, groupname
, false, false);
681 assert_se(condition
);
682 r
= condition_test(condition
);
683 log_info("ConditionGroup=%s → %i", groupname
, r
);
685 condition_free(condition
);
687 max_gid
= gids
[i
] > max_gid
? gids
[i
] : max_gid
;
690 assert_se(0 < asprintf(&gid
, "%u", max_gid
+1));
691 condition
= condition_new(CONDITION_GROUP
, gid
, false, false);
692 assert_se(condition
);
693 r
= condition_test(condition
);
694 log_info("ConditionGroup=%s → %i", gid
, r
);
696 condition_free(condition
);
699 groupname
= (char*)(getegid() == 0 ? NOBODY_GROUP_NAME
: "root");
700 condition
= condition_new(CONDITION_GROUP
, groupname
, false, false);
701 assert_se(condition
);
702 r
= condition_test(condition
);
703 log_info("ConditionGroup=%s → %i", groupname
, r
);
705 condition_free(condition
);
708 static void test_condition_test_cpus_one(const char *s
, bool result
) {
709 Condition
*condition
;
712 log_debug("%s=%s", condition_type_to_string(CONDITION_CPUS
), s
);
714 condition
= condition_new(CONDITION_CPUS
, s
, false, false);
715 assert_se(condition
);
717 r
= condition_test(condition
);
719 assert_se(r
== result
);
720 condition_free(condition
);
723 static void test_condition_test_cpus(void) {
724 _cleanup_free_
char *t
= NULL
;
727 cpus
= cpus_in_affinity_mask();
728 assert_se(cpus
>= 0);
730 test_condition_test_cpus_one("> 0", true);
731 test_condition_test_cpus_one(">= 0", true);
732 test_condition_test_cpus_one("!= 0", true);
733 test_condition_test_cpus_one("<= 0", false);
734 test_condition_test_cpus_one("< 0", false);
735 test_condition_test_cpus_one("= 0", false);
737 test_condition_test_cpus_one("> 100000", false);
738 test_condition_test_cpus_one("= 100000", false);
739 test_condition_test_cpus_one(">= 100000", false);
740 test_condition_test_cpus_one("< 100000", true);
741 test_condition_test_cpus_one("!= 100000", true);
742 test_condition_test_cpus_one("<= 100000", true);
744 assert_se(asprintf(&t
, "= %i", cpus
) >= 0);
745 test_condition_test_cpus_one(t
, true);
748 assert_se(asprintf(&t
, "<= %i", cpus
) >= 0);
749 test_condition_test_cpus_one(t
, true);
752 assert_se(asprintf(&t
, ">= %i", cpus
) >= 0);
753 test_condition_test_cpus_one(t
, true);
756 assert_se(asprintf(&t
, "!= %i", cpus
) >= 0);
757 test_condition_test_cpus_one(t
, false);
760 assert_se(asprintf(&t
, "< %i", cpus
) >= 0);
761 test_condition_test_cpus_one(t
, false);
764 assert_se(asprintf(&t
, "> %i", cpus
) >= 0);
765 test_condition_test_cpus_one(t
, false);
769 static void test_condition_test_memory_one(const char *s
, bool result
) {
770 Condition
*condition
;
773 log_debug("%s=%s", condition_type_to_string(CONDITION_MEMORY
), s
);
775 condition
= condition_new(CONDITION_MEMORY
, s
, false, false);
776 assert_se(condition
);
778 r
= condition_test(condition
);
780 assert_se(r
== result
);
781 condition_free(condition
);
784 static void test_condition_test_memory(void) {
785 _cleanup_free_
char *t
= NULL
;
788 memory
= physical_memory();
790 test_condition_test_memory_one("> 0", true);
791 test_condition_test_memory_one(">= 0", true);
792 test_condition_test_memory_one("!= 0", true);
793 test_condition_test_memory_one("<= 0", false);
794 test_condition_test_memory_one("< 0", false);
795 test_condition_test_memory_one("= 0", false);
797 test_condition_test_memory_one("> 18446744073709547520", false);
798 test_condition_test_memory_one("= 18446744073709547520", false);
799 test_condition_test_memory_one(">= 18446744073709547520", false);
800 test_condition_test_memory_one("< 18446744073709547520", true);
801 test_condition_test_memory_one("!= 18446744073709547520", true);
802 test_condition_test_memory_one("<= 18446744073709547520", true);
804 assert_se(asprintf(&t
, "= %" PRIu64
, memory
) >= 0);
805 test_condition_test_memory_one(t
, true);
808 assert_se(asprintf(&t
, "<= %" PRIu64
, memory
) >= 0);
809 test_condition_test_memory_one(t
, true);
812 assert_se(asprintf(&t
, ">= %" PRIu64
, memory
) >= 0);
813 test_condition_test_memory_one(t
, true);
816 assert_se(asprintf(&t
, "!= %" PRIu64
, memory
) >= 0);
817 test_condition_test_memory_one(t
, false);
820 assert_se(asprintf(&t
, "< %" PRIu64
, memory
) >= 0);
821 test_condition_test_memory_one(t
, false);
824 assert_se(asprintf(&t
, "> %" PRIu64
, memory
) >= 0);
825 test_condition_test_memory_one(t
, false);
829 int main(int argc
, char *argv
[]) {
830 test_setup_logging(LOG_DEBUG
);
832 test_condition_test_path();
833 test_condition_test_ac_power();
834 test_condition_test_host();
835 test_condition_test_architecture();
836 test_condition_test_kernel_command_line();
837 test_condition_test_kernel_version();
838 test_condition_test_null();
839 test_condition_test_security();
841 test_condition_test_virtualization();
842 test_condition_test_user();
843 test_condition_test_group();
844 test_condition_test_control_group_controller();
845 test_condition_test_cpus();
846 test_condition_test_memory();