LCOV - code coverage report
Current view: top level - test - test-proc-cmdline.c (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 176 177 99.4 %
Date: 2019-08-22 15:41:25 Functions: 12 12 100.0 %

          Line data    Source code
       1             : /* SPDX-License-Identifier: LGPL-2.1+ */
       2             : 
       3             : #include "alloc-util.h"
       4             : #include "env-util.h"
       5             : #include "log.h"
       6             : #include "macro.h"
       7             : #include "proc-cmdline.h"
       8             : #include "special.h"
       9             : #include "string-util.h"
      10             : #include "util.h"
      11             : 
      12             : static int obj;
      13             : 
      14           6 : static int parse_item(const char *key, const char *value, void *data) {
      15           6 :         assert_se(key);
      16           6 :         assert_se(data == &obj);
      17             : 
      18           6 :         log_info("kernel cmdline option <%s> = <%s>", key, strna(value));
      19           6 :         return 0;
      20             : }
      21             : 
      22           1 : static void test_proc_cmdline_parse(void) {
      23           1 :         log_info("/* %s */", __func__);
      24             : 
      25           1 :         assert_se(proc_cmdline_parse(parse_item, &obj, PROC_CMDLINE_STRIP_RD_PREFIX) >= 0);
      26           1 : }
      27             : 
      28           1 : static void test_proc_cmdline_override(void) {
      29           1 :         log_info("/* %s */", __func__);
      30             : 
      31           1 :         assert_se(putenv((char*) "SYSTEMD_PROC_CMDLINE=foo_bar=quux wuff-piep=tuet zumm some_arg_with_space='foo bar' and_one_more=\"zzz aaa\"") == 0);
      32             : 
      33             :         /* Test if the override works */
      34           1 :         _cleanup_free_ char *line = NULL, *value = NULL;
      35           1 :         assert_se(proc_cmdline(&line) >= 0);
      36             : 
      37             :         /* Test if parsing makes uses of the override */
      38           1 :         assert_se(streq(line, "foo_bar=quux wuff-piep=tuet zumm some_arg_with_space='foo bar' and_one_more=\"zzz aaa\""));
      39           1 :         assert_se(proc_cmdline_get_key("foo_bar", 0, &value) > 0 && streq_ptr(value, "quux"));
      40           1 :         value = mfree(value);
      41             : 
      42           1 :         assert_se(proc_cmdline_get_key("some_arg_with_space", 0, &value) > 0 && streq_ptr(value, "foo bar"));
      43           1 :         value = mfree(value);
      44             : 
      45           1 :         assert_se(proc_cmdline_get_key("and_one_more", 0, &value) > 0 && streq_ptr(value, "zzz aaa"));
      46           1 :         value = mfree(value);
      47           1 : }
      48             : 
      49          18 : static int parse_item_given(const char *key, const char *value, void *data) {
      50          18 :         assert_se(key);
      51          18 :         assert_se(data);
      52             : 
      53          18 :         bool *strip = data;
      54             : 
      55          18 :         log_info("%s: option <%s> = <%s>", __func__, key, strna(value));
      56          18 :         if (proc_cmdline_key_streq(key, "foo_bar"))
      57           4 :                 assert_se(streq(value, "quux"));
      58          14 :         else if (proc_cmdline_key_streq(key, "wuff-piep"))
      59           4 :                 assert_se(streq(value, "tuet "));
      60          10 :         else if (proc_cmdline_key_streq(key, "space"))
      61           4 :                 assert_se(streq(value, "x y z"));
      62           6 :         else if (proc_cmdline_key_streq(key, "miepf"))
      63           4 :                 assert_se(streq(value, "uuu"));
      64           2 :         else if (in_initrd() && *strip && proc_cmdline_key_streq(key, "zumm"))
      65           1 :                 assert_se(!value);
      66           1 :         else if (in_initrd() && !*strip && proc_cmdline_key_streq(key, "rd.zumm"))
      67           1 :                 assert_se(!value);
      68             :         else
      69           0 :                 assert_not_reached("Bad key!");
      70             : 
      71          18 :         return 0;
      72             : }
      73             : 
      74           2 : static void test_proc_cmdline_given(bool flip_initrd) {
      75           2 :         log_info("/* %s (flip: %s) */", __func__, yes_no(flip_initrd));
      76             : 
      77           2 :         if (flip_initrd)
      78           1 :                 in_initrd_force(!in_initrd());
      79             : 
      80           2 :         bool t = true, f = false;
      81           2 :         assert_se(proc_cmdline_parse_given("foo_bar=quux wuff-piep=\"tuet \" rd.zumm space='x y z' miepf=\"uuu\"",
      82             :                                            parse_item_given, &t, PROC_CMDLINE_STRIP_RD_PREFIX) >= 0);
      83             : 
      84           2 :         assert_se(proc_cmdline_parse_given("foo_bar=quux wuff-piep=\"tuet \" rd.zumm space='x y z' miepf=\"uuu\"",
      85             :                                            parse_item_given, &f, 0) >= 0);
      86             : 
      87           2 :         if (flip_initrd)
      88           1 :                 in_initrd_force(!in_initrd());
      89           2 : }
      90             : 
      91           1 : static void test_proc_cmdline_get_key(void) {
      92           1 :         _cleanup_free_ char *value = NULL;
      93             : 
      94           1 :         log_info("/* %s */", __func__);
      95           1 :         assert_se(putenv((char*) "SYSTEMD_PROC_CMDLINE=foo_bar=quux wuff-piep=tuet zumm spaaace='ö ü ß' ticks=\"''\"\n\nkkk=uuu\n\n\n") == 0);
      96             : 
      97           1 :         assert_se(proc_cmdline_get_key("", 0, &value) == -EINVAL);
      98           1 :         assert_se(proc_cmdline_get_key("abc", 0, NULL) == 0);
      99           1 :         assert_se(proc_cmdline_get_key("abc", 0, &value) == 0 && value == NULL);
     100           1 :         assert_se(proc_cmdline_get_key("abc", PROC_CMDLINE_VALUE_OPTIONAL, &value) == 0 && value == NULL);
     101             : 
     102           1 :         assert_se(proc_cmdline_get_key("foo_bar", 0, &value) > 0 && streq_ptr(value, "quux"));
     103           1 :         value = mfree(value);
     104           1 :         assert_se(proc_cmdline_get_key("foo_bar", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "quux"));
     105           1 :         value = mfree(value);
     106           1 :         assert_se(proc_cmdline_get_key("foo-bar", 0, &value) > 0 && streq_ptr(value, "quux"));
     107           1 :         value = mfree(value);
     108           1 :         assert_se(proc_cmdline_get_key("foo-bar", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "quux"));
     109           1 :         value = mfree(value);
     110           1 :         assert_se(proc_cmdline_get_key("foo-bar", 0, NULL) == 0);
     111           1 :         assert_se(proc_cmdline_get_key("foo-bar", PROC_CMDLINE_VALUE_OPTIONAL, NULL) == -EINVAL);
     112             : 
     113           1 :         assert_se(proc_cmdline_get_key("wuff-piep", 0, &value) > 0 && streq_ptr(value, "tuet"));
     114           1 :         value = mfree(value);
     115           1 :         assert_se(proc_cmdline_get_key("wuff-piep", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "tuet"));
     116           1 :         value = mfree(value);
     117           1 :         assert_se(proc_cmdline_get_key("wuff_piep", 0, &value) > 0 && streq_ptr(value, "tuet"));
     118           1 :         value = mfree(value);
     119           1 :         assert_se(proc_cmdline_get_key("wuff_piep", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && streq_ptr(value, "tuet"));
     120           1 :         value = mfree(value);
     121           1 :         assert_se(proc_cmdline_get_key("wuff_piep", 0, NULL) == 0);
     122           1 :         assert_se(proc_cmdline_get_key("wuff_piep", PROC_CMDLINE_VALUE_OPTIONAL, NULL) == -EINVAL);
     123             : 
     124           1 :         assert_se(proc_cmdline_get_key("zumm", 0, &value) == 0 && value == NULL);
     125           1 :         assert_se(proc_cmdline_get_key("zumm", PROC_CMDLINE_VALUE_OPTIONAL, &value) > 0 && value == NULL);
     126           1 :         assert_se(proc_cmdline_get_key("zumm", 0, NULL) > 0);
     127             : 
     128           1 :         assert_se(proc_cmdline_get_key("spaaace", 0, &value) > 0 && streq_ptr(value, "ö ü ß"));
     129           1 :         value = mfree(value);
     130             : 
     131           1 :         assert_se(proc_cmdline_get_key("ticks", 0, &value) > 0 && streq_ptr(value, "''"));
     132           1 :         value = mfree(value);
     133             : 
     134           1 :         assert_se(proc_cmdline_get_key("kkk", 0, &value) > 0 && streq_ptr(value, "uuu"));
     135           1 : }
     136             : 
     137           1 : static void test_proc_cmdline_get_bool(void) {
     138           1 :         bool value = false;
     139             : 
     140           1 :         log_info("/* %s */", __func__);
     141           1 :         assert_se(putenv((char*) "SYSTEMD_PROC_CMDLINE=foo_bar bar-waldo=1 x_y-z=0 quux=miep\nda=yes\nthe=1") == 0);
     142             : 
     143           1 :         assert_se(proc_cmdline_get_bool("", &value) == -EINVAL);
     144           1 :         assert_se(proc_cmdline_get_bool("abc", &value) == 0 && value == false);
     145           1 :         assert_se(proc_cmdline_get_bool("foo_bar", &value) > 0 && value == true);
     146           1 :         assert_se(proc_cmdline_get_bool("foo-bar", &value) > 0 && value == true);
     147           1 :         assert_se(proc_cmdline_get_bool("bar-waldo", &value) > 0 && value == true);
     148           1 :         assert_se(proc_cmdline_get_bool("bar_waldo", &value) > 0 && value == true);
     149           1 :         assert_se(proc_cmdline_get_bool("x_y-z", &value) > 0 && value == false);
     150           1 :         assert_se(proc_cmdline_get_bool("x-y-z", &value) > 0 && value == false);
     151           1 :         assert_se(proc_cmdline_get_bool("x-y_z", &value) > 0 && value == false);
     152           1 :         assert_se(proc_cmdline_get_bool("x_y_z", &value) > 0 && value == false);
     153           1 :         assert_se(proc_cmdline_get_bool("quux", &value) == -EINVAL && value == false);
     154           1 :         assert_se(proc_cmdline_get_bool("da", &value) > 0 && value == true);
     155           1 :         assert_se(proc_cmdline_get_bool("the", &value) > 0 && value == true);
     156           1 : }
     157             : 
     158           1 : static void test_proc_cmdline_get_key_many(void) {
     159           1 :         _cleanup_free_ char *value1 = NULL, *value2 = NULL, *value3 = NULL, *value4 = NULL, *value5 = NULL, *value6 = NULL, *value7 = NULL;
     160             : 
     161           1 :         log_info("/* %s */", __func__);
     162           1 :         assert_se(putenv((char*) "SYSTEMD_PROC_CMDLINE=foo_bar=quux wuff-piep=tuet zumm SPACE='one two' doubleticks=\" aaa aaa \"\n\nzummm='\n'\n") == 0);
     163             : 
     164           1 :         assert_se(proc_cmdline_get_key_many(0,
     165             :                                             "wuff-piep", &value3,
     166             :                                             "foo_bar", &value1,
     167             :                                             "idontexist", &value2,
     168             :                                             "zumm", &value4,
     169             :                                             "SPACE", &value5,
     170             :                                             "doubleticks", &value6,
     171             :                                             "zummm", &value7) == 5);
     172             : 
     173           1 :         assert_se(streq_ptr(value1, "quux"));
     174           1 :         assert_se(!value2);
     175           1 :         assert_se(streq_ptr(value3, "tuet"));
     176           1 :         assert_se(!value4);
     177           1 :         assert_se(streq_ptr(value5, "one two"));
     178           1 :         assert_se(streq_ptr(value6, " aaa aaa "));
     179           1 :         assert_se(streq_ptr(value7, "\n"));
     180           1 : }
     181             : 
     182           1 : static void test_proc_cmdline_key_streq(void) {
     183           1 :         log_info("/* %s */", __func__);
     184             : 
     185           1 :         assert_se(proc_cmdline_key_streq("", ""));
     186           1 :         assert_se(proc_cmdline_key_streq("a", "a"));
     187           1 :         assert_se(!proc_cmdline_key_streq("", "a"));
     188           1 :         assert_se(!proc_cmdline_key_streq("a", ""));
     189           1 :         assert_se(proc_cmdline_key_streq("a", "a"));
     190           1 :         assert_se(!proc_cmdline_key_streq("a", "b"));
     191           1 :         assert_se(proc_cmdline_key_streq("x-y-z", "x-y-z"));
     192           1 :         assert_se(proc_cmdline_key_streq("x-y-z", "x_y_z"));
     193           1 :         assert_se(proc_cmdline_key_streq("x-y-z", "x-y_z"));
     194           1 :         assert_se(proc_cmdline_key_streq("x-y-z", "x_y-z"));
     195           1 :         assert_se(proc_cmdline_key_streq("x_y-z", "x-y_z"));
     196           1 :         assert_se(!proc_cmdline_key_streq("x_y-z", "x-z_z"));
     197           1 : }
     198             : 
     199           1 : static void test_proc_cmdline_key_startswith(void) {
     200           1 :         log_info("/* %s */", __func__);
     201             : 
     202           1 :         assert_se(proc_cmdline_key_startswith("", ""));
     203           1 :         assert_se(proc_cmdline_key_startswith("x", ""));
     204           1 :         assert_se(!proc_cmdline_key_startswith("", "x"));
     205           1 :         assert_se(proc_cmdline_key_startswith("x", "x"));
     206           1 :         assert_se(!proc_cmdline_key_startswith("x", "y"));
     207           1 :         assert_se(!proc_cmdline_key_startswith("foo-bar", "quux"));
     208           1 :         assert_se(proc_cmdline_key_startswith("foo-bar", "foo"));
     209           1 :         assert_se(proc_cmdline_key_startswith("foo-bar", "foo-bar"));
     210           1 :         assert_se(proc_cmdline_key_startswith("foo-bar", "foo_bar"));
     211           1 :         assert_se(proc_cmdline_key_startswith("foo-bar", "foo_"));
     212           1 :         assert_se(!proc_cmdline_key_startswith("foo-bar", "foo_xx"));
     213           1 : }
     214             : 
     215           1 : static void test_runlevel_to_target(void) {
     216           1 :         log_info("/* %s */", __func__);
     217             : 
     218           1 :         in_initrd_force(false);
     219           1 :         assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
     220           1 :         assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
     221           1 :         assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL));
     222           1 :         assert_se(streq_ptr(runlevel_to_target("3"), SPECIAL_MULTI_USER_TARGET));
     223           1 :         assert_se(streq_ptr(runlevel_to_target("rd.rescue"), NULL));
     224             : 
     225           1 :         in_initrd_force(true);
     226           1 :         assert_se(streq_ptr(runlevel_to_target(NULL), NULL));
     227           1 :         assert_se(streq_ptr(runlevel_to_target("unknown-runlevel"), NULL));
     228           1 :         assert_se(streq_ptr(runlevel_to_target("rd.unknown-runlevel"), NULL));
     229           1 :         assert_se(streq_ptr(runlevel_to_target("3"), NULL));
     230           1 :         assert_se(streq_ptr(runlevel_to_target("rd.rescue"), SPECIAL_RESCUE_TARGET));
     231           1 : }
     232             : 
     233           1 : int main(void) {
     234           1 :         log_parse_environment();
     235           1 :         log_open();
     236             : 
     237           1 :         test_proc_cmdline_parse();
     238           1 :         test_proc_cmdline_override();
     239           1 :         test_proc_cmdline_given(false);
     240             :         /* Repeat the same thing, but now flip our ininitrdness */
     241           1 :         test_proc_cmdline_given(true);
     242           1 :         test_proc_cmdline_key_streq();
     243           1 :         test_proc_cmdline_key_startswith();
     244           1 :         test_proc_cmdline_get_key();
     245           1 :         test_proc_cmdline_get_bool();
     246           1 :         test_proc_cmdline_get_key_many();
     247           1 :         test_runlevel_to_target();
     248             : 
     249           1 :         return 0;
     250             : }

Generated by: LCOV version 1.14