LCOV - code coverage report
Current view: top level - test - test-string-util.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 406 406 100.0 %
Date: 2019-08-23 13:36:53 Functions: 31 31 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 317 604 52.5 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include "alloc-util.h"
       4                 :            : #include "locale-util.h"
       5                 :            : #include "macro.h"
       6                 :            : #include "string-util.h"
       7                 :            : #include "strv.h"
       8                 :            : #include "tests.h"
       9                 :            : #include "utf8.h"
      10                 :            : #include "util.h"
      11                 :            : 
      12                 :        100 : static void test_free_and_strndup_one(char **t, const char *src, size_t l, const char *expected, bool change) {
      13                 :            :         int r;
      14                 :            : 
      15         [ +  - ]:        100 :         log_debug("%s: \"%s\", \"%s\", %zd (expect \"%s\", %s)",
      16                 :            :                   __func__, strnull(*t), strnull(src), l, strnull(expected), yes_no(change));
      17                 :            : 
      18                 :        100 :         r = free_and_strndup(t, src, l);
      19         [ -  + ]:        100 :         assert_se(streq_ptr(*t, expected));
      20         [ -  + ]:        100 :         assert_se(r == change); /* check that change occurs only when necessary */
      21                 :        100 : }
      22                 :            : 
      23                 :          4 : static void test_free_and_strndup(void) {
      24                 :            :         static const struct test_case {
      25                 :            :                 const char *src;
      26                 :            :                 size_t len;
      27                 :            :                 const char *expected;
      28                 :            :         } cases[] = {
      29                 :            :                      {"abc", 0, ""},
      30                 :            :                      {"abc", 0, ""},
      31                 :            :                      {"abc", 1, "a"},
      32                 :            :                      {"abc", 2, "ab"},
      33                 :            :                      {"abc", 3, "abc"},
      34                 :            :                      {"abc", 4, "abc"},
      35                 :            :                      {"abc", 5, "abc"},
      36                 :            :                      {"abc", 5, "abc"},
      37                 :            :                      {"abc", 4, "abc"},
      38                 :            :                      {"abc", 3, "abc"},
      39                 :            :                      {"abc", 2, "ab"},
      40                 :            :                      {"abc", 1, "a"},
      41                 :            :                      {"abc", 0, ""},
      42                 :            : 
      43                 :            :                      {"", 0, ""},
      44                 :            :                      {"", 1, ""},
      45                 :            :                      {"", 2, ""},
      46                 :            :                      {"", 0, ""},
      47                 :            :                      {"", 1, ""},
      48                 :            :                      {"", 2, ""},
      49                 :            :                      {"", 2, ""},
      50                 :            :                      {"", 1, ""},
      51                 :            :                      {"", 0, ""},
      52                 :            : 
      53                 :            :                      {NULL, 0, NULL},
      54                 :            : 
      55                 :            :                      {"foo", 3, "foo"},
      56                 :            :                      {"foobar", 6, "foobar"},
      57                 :            :         };
      58                 :            : 
      59                 :          4 :         _cleanup_free_ char *t = NULL;
      60                 :          4 :         const char *prev_expected = t;
      61                 :            : 
      62         [ +  + ]:        104 :         for (unsigned i = 0; i < ELEMENTSOF(cases); i++) {
      63                 :        100 :                 test_free_and_strndup_one(&t,
      64                 :            :                                           cases[i].src, cases[i].len, cases[i].expected,
      65                 :        100 :                                           !streq_ptr(cases[i].expected, prev_expected));
      66                 :        100 :                 prev_expected = t;
      67                 :            :         }
      68                 :          4 : }
      69                 :            : 
      70                 :          4 : static void test_ascii_strcasecmp_n(void) {
      71                 :            : 
      72         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("", "", 0) == 0);
      73         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("", "", 1) == 0);
      74         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("", "a", 1) < 0);
      75         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("", "a", 2) < 0);
      76         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("a", "", 1) > 0);
      77         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("a", "", 2) > 0);
      78         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("a", "a", 1) == 0);
      79         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("a", "a", 2) == 0);
      80         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("a", "b", 1) < 0);
      81         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("a", "b", 2) < 0);
      82         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("b", "a", 1) > 0);
      83         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("b", "a", 2) > 0);
      84         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxyxxxx", "xxxxYxxxx", 9) == 0);
      85         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxxxxxx", "xxxxyxxxx", 9) < 0);
      86         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxXxxxx", "xxxxyxxxx", 9) < 0);
      87         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxxxxxx", "xxxxYxxxx", 9) < 0);
      88         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxXxxxx", "xxxxYxxxx", 9) < 0);
      89                 :            : 
      90         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxYxxxx", 9) == 0);
      91         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxyxxxx", "xxxxxxxxx", 9) > 0);
      92         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxyxxxx", "xxxxXxxxx", 9) > 0);
      93         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxxxxxx", 9) > 0);
      94         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_n("xxxxYxxxx", "xxxxXxxxx", 9) > 0);
      95                 :          4 : }
      96                 :            : 
      97                 :          4 : static void test_ascii_strcasecmp_nn(void) {
      98         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("", 0, "", 0) == 0);
      99         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("", 0, "", 1) < 0);
     100         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("", 1, "", 0) > 0);
     101         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("", 1, "", 1) == 0);
     102                 :            : 
     103         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaaa", 4, "aaAa", 4) == 0);
     104         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaa", 3, "aaAa", 4) < 0);
     105         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaa", 4, "aaAa", 4) < 0);
     106         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaaa", 4, "aaA", 3) > 0);
     107         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaaa", 4, "AAA", 4) > 0);
     108                 :            : 
     109         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaaa", 4, "bbbb", 4) < 0);
     110         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("aaAA", 4, "BBbb", 4) < 0);
     111         [ -  + ]:          4 :         assert_se(ascii_strcasecmp_nn("BBbb", 4, "aaaa", 4) > 0);
     112                 :          4 : }
     113                 :            : 
     114                 :          4 : static void test_cellescape(void) {
     115                 :            :         char buf[40];
     116                 :            : 
     117         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 1, ""), ""));
     118         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 1, "1"), ""));
     119         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 1, "12"), ""));
     120                 :            : 
     121         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 2, ""), ""));
     122         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 2, "1"), "1"));
     123         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 2, "12"), "."));
     124         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 2, "123"), "."));
     125                 :            : 
     126         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, ""), ""));
     127         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, "1"), "1"));
     128         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, "12"), "12"));
     129         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, "123"), ".."));
     130         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, "1234"), ".."));
     131                 :            : 
     132         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, ""), ""));
     133         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "1"), "1"));
     134         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "12"), "12"));
     135         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "123"), "123"));
     136   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "1234"), is_locale_utf8() ? "…" : "..."));
     137   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "12345"), is_locale_utf8() ? "…" : "..."));
     138                 :            : 
     139         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, ""), ""));
     140         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "1"), "1"));
     141         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "12"), "12"));
     142         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "123"), "123"));
     143         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "1234"), "1234"));
     144   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "12345"), is_locale_utf8() ? "1…" : "1..."));
     145   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "123456"), is_locale_utf8() ? "1…" : "1..."));
     146                 :            : 
     147         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 1, "\020"), ""));
     148         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 2, "\020"), "."));
     149         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, "\020"), ".."));
     150         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "\020"), "…"));
     151         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "\020"), "\\020"));
     152                 :            : 
     153         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "1234\020"), "1…"));
     154         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "1234\020"), "12…"));
     155         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 7, "1234\020"), "123…"));
     156         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 8, "1234\020"), "1234…"));
     157         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 9, "1234\020"), "1234\\020"));
     158                 :            : 
     159         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 1, "\t\n"), ""));
     160         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 2, "\t\n"), "."));
     161         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 3, "\t\n"), ".."));
     162         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "\t\n"), "…"));
     163         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "\t\n"), "\\t\\n"));
     164                 :            : 
     165         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "1234\t\n"), "1…"));
     166         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "1234\t\n"), "12…"));
     167         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 7, "1234\t\n"), "123…"));
     168         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 8, "1234\t\n"), "1234…"));
     169         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 9, "1234\t\n"), "1234\\t\\n"));
     170                 :            : 
     171         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 4, "x\t\020\n"), "…"));
     172         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 5, "x\t\020\n"), "x…"));
     173         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "x\t\020\n"), "x…"));
     174         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 7, "x\t\020\n"), "x\\t…"));
     175         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 8, "x\t\020\n"), "x\\t…"));
     176         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 9, "x\t\020\n"), "x\\t…"));
     177         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 10, "x\t\020\n"), "x\\t\\020\\n"));
     178                 :            : 
     179         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "1\011"), "1\\t"));
     180         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "1\020"), "1\\020"));
     181   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "1\020x"), is_locale_utf8() ? "1…" : "1..."));
     182                 :            : 
     183         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 40, "1\020"), "1\\020"));
     184         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 40, "1\020x"), "1\\020x"));
     185                 :            : 
     186         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, 40, "\a\b\f\n\r\t\v\\\"'"), "\\a\\b\\f\\n\\r\\t\\v\\\\\\\"\\'"));
     187   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 6, "\a\b\f\n\r\t\v\\\"'"), is_locale_utf8() ? "\\a…" : "\\a..."));
     188   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 7, "\a\b\f\n\r\t\v\\\"'"), is_locale_utf8() ? "\\a…" : "\\a..."));
     189   [ +  -  -  + ]:          4 :         assert_se(streq(cellescape(buf, 8, "\a\b\f\n\r\t\v\\\"'"), is_locale_utf8() ? "\\a\\b…" : "\\a\\b..."));
     190                 :            : 
     191         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, sizeof buf, "1\020"), "1\\020"));
     192         [ -  + ]:          4 :         assert_se(streq(cellescape(buf, sizeof buf, "1\020x"), "1\\020x"));
     193                 :          4 : }
     194                 :            : 
     195                 :          4 : static void test_streq_ptr(void) {
     196         [ -  + ]:          4 :         assert_se(streq_ptr(NULL, NULL));
     197         [ -  + ]:          4 :         assert_se(!streq_ptr("abc", "cdef"));
     198                 :          4 : }
     199                 :            : 
     200                 :          4 : static void test_strstrip(void) {
     201                 :            :         char *r;
     202                 :          4 :         char input[] = "   hello, waldo.   ";
     203                 :            : 
     204                 :          4 :         r = strstrip(input);
     205         [ -  + ]:          4 :         assert_se(streq(r, "hello, waldo."));
     206                 :          4 : }
     207                 :            : 
     208                 :          4 : static void test_strextend(void) {
     209                 :          4 :         _cleanup_free_ char *str = NULL;
     210                 :            : 
     211         [ -  + ]:          4 :         assert_se(strextend(&str, NULL));
     212         [ -  + ]:          4 :         assert_se(streq_ptr(str, ""));
     213         [ -  + ]:          4 :         assert_se(strextend(&str, "", "0", "", "", "123", NULL));
     214         [ -  + ]:          4 :         assert_se(streq_ptr(str, "0123"));
     215         [ -  + ]:          4 :         assert_se(strextend(&str, "456", "78", "9", NULL));
     216         [ -  + ]:          4 :         assert_se(streq_ptr(str, "0123456789"));
     217                 :          4 : }
     218                 :            : 
     219                 :          4 : static void test_strextend_with_separator(void) {
     220                 :          4 :         _cleanup_free_ char *str = NULL;
     221                 :            : 
     222         [ -  + ]:          4 :         assert_se(strextend_with_separator(&str, NULL, NULL));
     223         [ -  + ]:          4 :         assert_se(streq_ptr(str, ""));
     224                 :          4 :         str = mfree(str);
     225                 :            : 
     226         [ -  + ]:          4 :         assert_se(strextend_with_separator(&str, "...", NULL));
     227         [ -  + ]:          4 :         assert_se(streq_ptr(str, ""));
     228         [ -  + ]:          4 :         assert_se(strextend_with_separator(&str, "...", NULL));
     229         [ -  + ]:          4 :         assert_se(streq_ptr(str, ""));
     230                 :          4 :         str = mfree(str);
     231                 :            : 
     232         [ -  + ]:          4 :         assert_se(strextend_with_separator(&str, "xyz", "a", "bb", "ccc", NULL));
     233         [ -  + ]:          4 :         assert_se(streq_ptr(str, "axyzbbxyzccc"));
     234                 :          4 :         str = mfree(str);
     235                 :            : 
     236         [ -  + ]:          4 :         assert_se(strextend_with_separator(&str, ",", "start", "", "1", "234", NULL));
     237         [ -  + ]:          4 :         assert_se(streq_ptr(str, "start,,1,234"));
     238         [ -  + ]:          4 :         assert_se(strextend_with_separator(&str, ";", "more", "5", "678", NULL));
     239         [ -  + ]:          4 :         assert_se(streq_ptr(str, "start,,1,234;more;5;678"));
     240                 :          4 : }
     241                 :            : 
     242                 :          4 : static void test_strrep(void) {
     243                 :          4 :         _cleanup_free_ char *one, *three, *zero;
     244                 :          4 :         one = strrep("waldo", 1);
     245                 :          4 :         three = strrep("waldo", 3);
     246                 :          4 :         zero = strrep("waldo", 0);
     247                 :            : 
     248         [ -  + ]:          4 :         assert_se(streq(one, "waldo"));
     249         [ -  + ]:          4 :         assert_se(streq(three, "waldowaldowaldo"));
     250         [ -  + ]:          4 :         assert_se(streq(zero, ""));
     251                 :          4 : }
     252                 :            : 
     253                 :          4 : static void test_string_has_cc(void) {
     254         [ -  + ]:          4 :         assert_se(string_has_cc("abc\1", NULL));
     255         [ -  + ]:          4 :         assert_se(string_has_cc("abc\x7f", NULL));
     256         [ -  + ]:          4 :         assert_se(string_has_cc("abc\x7f", NULL));
     257         [ -  + ]:          4 :         assert_se(string_has_cc("abc\t\x7f", "\t"));
     258         [ -  + ]:          4 :         assert_se(string_has_cc("abc\t\x7f", "\t"));
     259         [ -  + ]:          4 :         assert_se(string_has_cc("\x7f", "\t"));
     260         [ -  + ]:          4 :         assert_se(string_has_cc("\x7f", "\t\a"));
     261                 :            : 
     262         [ -  + ]:          4 :         assert_se(!string_has_cc("abc\t\t", "\t"));
     263         [ -  + ]:          4 :         assert_se(!string_has_cc("abc\t\t\a", "\t\a"));
     264         [ -  + ]:          4 :         assert_se(!string_has_cc("a\ab\tc", "\t\a"));
     265                 :          4 : }
     266                 :            : 
     267                 :          4 : static void test_ascii_strlower(void) {
     268                 :          4 :         char a[] = "AabBcC Jk Ii Od LKJJJ kkd LK";
     269         [ -  + ]:          4 :         assert_se(streq(ascii_strlower(a), "aabbcc jk ii od lkjjj kkd lk"));
     270                 :          4 : }
     271                 :            : 
     272                 :          4 : static void test_strshorten(void) {
     273                 :          4 :         char s[] = "foobar";
     274                 :            : 
     275         [ -  + ]:          4 :         assert_se(strlen(strshorten(s, 6)) == 6);
     276         [ -  + ]:          4 :         assert_se(strlen(strshorten(s, 12)) == 6);
     277         [ -  + ]:          4 :         assert_se(strlen(strshorten(s, 2)) == 2);
     278         [ -  + ]:          4 :         assert_se(strlen(strshorten(s, 0)) == 0);
     279                 :          4 : }
     280                 :            : 
     281                 :          4 : static void test_strjoina(void) {
     282                 :            :         char *actual;
     283                 :            : 
     284   [ +  +  +  -  :         28 :         actual = strjoina("", "foo", "bar");
          -  +  -  +  +  
                +  +  - ]
     285         [ -  + ]:          4 :         assert_se(streq(actual, "foobar"));
     286                 :            : 
     287   [ +  +  +  -  :         28 :         actual = strjoina("foo", "bar", "baz");
          -  +  -  +  +  
                +  +  - ]
     288         [ -  + ]:          4 :         assert_se(streq(actual, "foobarbaz"));
     289                 :            : 
     290   [ +  +  +  -  :         36 :         actual = strjoina("foo", "", "bar", "baz");
          -  +  -  +  +  
                +  +  - ]
     291         [ -  + ]:          4 :         assert_se(streq(actual, "foobarbaz"));
     292                 :            : 
     293   [ +  +  +  -  :         12 :         actual = strjoina("foo");
          -  +  -  +  +  
                +  +  - ]
     294         [ -  + ]:          4 :         assert_se(streq(actual, "foo"));
     295                 :            : 
     296   [ +  -  -  +  :          4 :         actual = strjoina(NULL);
          -  +  -  +  +  
                -  -  + ]
     297         [ -  + ]:          4 :         assert_se(streq(actual, ""));
     298                 :            : 
     299   [ +  -  -  +  :          4 :         actual = strjoina(NULL, "foo");
          -  +  -  +  +  
                -  -  + ]
     300         [ -  + ]:          4 :         assert_se(streq(actual, ""));
     301                 :            : 
     302   [ +  -  +  +  :         12 :         actual = strjoina("foo", NULL, "bar");
          -  +  -  +  +  
                -  +  + ]
     303         [ -  + ]:          4 :         assert_se(streq(actual, "foo"));
     304                 :          4 : }
     305                 :            : 
     306                 :          4 : static void test_strcmp_ptr(void) {
     307         [ -  + ]:          4 :         assert_se(strcmp_ptr(NULL, NULL) == 0);
     308         [ -  + ]:          4 :         assert_se(strcmp_ptr("", NULL) > 0);
     309         [ -  + ]:          4 :         assert_se(strcmp_ptr("foo", NULL) > 0);
     310         [ -  + ]:          4 :         assert_se(strcmp_ptr(NULL, "") < 0);
     311         [ -  + ]:          4 :         assert_se(strcmp_ptr(NULL, "bar") < 0);
     312         [ -  + ]:          4 :         assert_se(strcmp_ptr("foo", "bar") > 0);
     313         [ -  + ]:          4 :         assert_se(strcmp_ptr("bar", "baz") < 0);
     314         [ -  + ]:          4 :         assert_se(strcmp_ptr("foo", "foo") == 0);
     315         [ -  + ]:          4 :         assert_se(strcmp_ptr("", "") == 0);
     316                 :          4 : }
     317                 :            : 
     318                 :          4 : static void test_foreach_word(void) {
     319                 :            :         const char *word, *state;
     320                 :            :         size_t l;
     321                 :          4 :         int i = 0;
     322                 :          4 :         const char test[] = "test abc d\te   f   ";
     323                 :          4 :         const char * const expected[] = {
     324                 :            :                 "test",
     325                 :            :                 "abc",
     326                 :            :                 "d",
     327                 :            :                 "e",
     328                 :            :                 "f",
     329                 :            :                 "",
     330                 :            :                 NULL
     331                 :            :         };
     332                 :            : 
     333         [ +  + ]:         24 :         FOREACH_WORD(word, l, test, state)
     334         [ -  + ]:         20 :                 assert_se(strneq(expected[i++], word, l));
     335                 :          4 : }
     336                 :            : 
     337                 :         12 : static void check(const char *test, char** expected, bool trailing) {
     338                 :         12 :         int i = 0, r;
     339                 :            : 
     340                 :         12 :         printf("<<<%s>>>\n", test);
     341                 :         52 :         for (;;) {
     342         [ +  + ]:         64 :                 _cleanup_free_ char *word = NULL;
     343                 :            : 
     344                 :         64 :                 r = extract_first_word(&test, &word, NULL, EXTRACT_UNQUOTE);
     345         [ +  + ]:         64 :                 if (r == 0) {
     346         [ -  + ]:          4 :                         assert_se(!trailing);
     347                 :          4 :                         break;
     348         [ +  + ]:         60 :                 } else if (r < 0) {
     349         [ -  + ]:          8 :                         assert_se(trailing);
     350                 :          8 :                         break;
     351                 :            :                 }
     352                 :            : 
     353         [ -  + ]:         52 :                 assert_se(streq(word, expected[i++]));
     354                 :         52 :                 printf("<%s>\n", word);
     355                 :            :         }
     356         [ -  + ]:         12 :         assert_se(expected[i] == NULL);
     357                 :         12 : }
     358                 :            : 
     359                 :          4 : static void test_foreach_word_quoted(void) {
     360                 :          4 :         check("test a b c 'd' e '' '' hhh '' '' \"a b c\"",
     361                 :          4 :               STRV_MAKE("test",
     362                 :            :                         "a",
     363                 :            :                         "b",
     364                 :            :                         "c",
     365                 :            :                         "d",
     366                 :            :                         "e",
     367                 :            :                         "",
     368                 :            :                         "",
     369                 :            :                         "hhh",
     370                 :            :                         "",
     371                 :            :                         "",
     372                 :            :                         "a b c"),
     373                 :            :               false);
     374                 :            : 
     375                 :          4 :         check("test \"xxx",
     376                 :          4 :               STRV_MAKE("test"),
     377                 :            :               true);
     378                 :            : 
     379                 :          4 :         check("test\\",
     380                 :          4 :               STRV_MAKE_EMPTY,
     381                 :            :               true);
     382                 :          4 : }
     383                 :            : 
     384                 :          4 : static void test_endswith(void) {
     385         [ -  + ]:          4 :         assert_se(endswith("foobar", "bar"));
     386         [ -  + ]:          4 :         assert_se(endswith("foobar", ""));
     387         [ -  + ]:          4 :         assert_se(endswith("foobar", "foobar"));
     388         [ -  + ]:          4 :         assert_se(endswith("", ""));
     389                 :            : 
     390         [ -  + ]:          4 :         assert_se(!endswith("foobar", "foo"));
     391         [ -  + ]:          4 :         assert_se(!endswith("foobar", "foobarfoofoo"));
     392                 :          4 : }
     393                 :            : 
     394                 :          4 : static void test_endswith_no_case(void) {
     395         [ -  + ]:          4 :         assert_se(endswith_no_case("fooBAR", "bar"));
     396         [ -  + ]:          4 :         assert_se(endswith_no_case("foobar", ""));
     397         [ -  + ]:          4 :         assert_se(endswith_no_case("foobar", "FOOBAR"));
     398         [ -  + ]:          4 :         assert_se(endswith_no_case("", ""));
     399                 :            : 
     400         [ -  + ]:          4 :         assert_se(!endswith_no_case("foobar", "FOO"));
     401         [ -  + ]:          4 :         assert_se(!endswith_no_case("foobar", "FOOBARFOOFOO"));
     402                 :          4 : }
     403                 :            : 
     404                 :          4 : static void test_delete_chars(void) {
     405                 :          4 :         char *s, input[] = "   hello, waldo.   abc";
     406                 :            : 
     407                 :          4 :         s = delete_chars(input, WHITESPACE);
     408         [ -  + ]:          4 :         assert_se(streq(s, "hello,waldo.abc"));
     409         [ -  + ]:          4 :         assert_se(s == input);
     410                 :          4 : }
     411                 :            : 
     412                 :          4 : static void test_delete_trailing_chars(void) {
     413                 :            : 
     414                 :            :         char *s,
     415                 :          4 :                 input1[] = " \n \r k \n \r ",
     416                 :          4 :                 input2[] = "kkkkthiskkkiskkkaktestkkk",
     417                 :          4 :                 input3[] = "abcdef";
     418                 :            : 
     419                 :          4 :         s = delete_trailing_chars(input1, WHITESPACE);
     420         [ -  + ]:          4 :         assert_se(streq(s, " \n \r k"));
     421         [ -  + ]:          4 :         assert_se(s == input1);
     422                 :            : 
     423                 :          4 :         s = delete_trailing_chars(input2, "kt");
     424         [ -  + ]:          4 :         assert_se(streq(s, "kkkkthiskkkiskkkaktes"));
     425         [ -  + ]:          4 :         assert_se(s == input2);
     426                 :            : 
     427                 :          4 :         s = delete_trailing_chars(input3, WHITESPACE);
     428         [ -  + ]:          4 :         assert_se(streq(s, "abcdef"));
     429         [ -  + ]:          4 :         assert_se(s == input3);
     430                 :            : 
     431                 :          4 :         s = delete_trailing_chars(input3, "fe");
     432         [ -  + ]:          4 :         assert_se(streq(s, "abcd"));
     433         [ -  + ]:          4 :         assert_se(s == input3);
     434                 :          4 : }
     435                 :            : 
     436                 :          4 : static void test_delete_trailing_slashes(void) {
     437                 :          4 :         char s1[] = "foobar//",
     438                 :          4 :              s2[] = "foobar/",
     439                 :          4 :              s3[] = "foobar",
     440                 :          4 :              s4[] = "";
     441                 :            : 
     442         [ -  + ]:          4 :         assert_se(streq(delete_trailing_chars(s1, "_"), "foobar//"));
     443         [ -  + ]:          4 :         assert_se(streq(delete_trailing_chars(s1, "/"), "foobar"));
     444         [ -  + ]:          4 :         assert_se(streq(delete_trailing_chars(s2, "/"), "foobar"));
     445         [ -  + ]:          4 :         assert_se(streq(delete_trailing_chars(s3, "/"), "foobar"));
     446         [ -  + ]:          4 :         assert_se(streq(delete_trailing_chars(s4, "/"), ""));
     447                 :          4 : }
     448                 :            : 
     449                 :          4 : static void test_skip_leading_chars(void) {
     450                 :          4 :         char input1[] = " \n \r k \n \r ",
     451                 :          4 :                 input2[] = "kkkkthiskkkiskkkaktestkkk",
     452                 :          4 :                 input3[] = "abcdef";
     453                 :            : 
     454         [ -  + ]:          4 :         assert_se(streq(skip_leading_chars(input1, WHITESPACE), "k \n \r "));
     455         [ -  + ]:          4 :         assert_se(streq(skip_leading_chars(input2, "k"), "thiskkkiskkkaktestkkk"));
     456         [ -  + ]:          4 :         assert_se(streq(skip_leading_chars(input2, "tk"), "hiskkkiskkkaktestkkk"));
     457         [ -  + ]:          4 :         assert_se(streq(skip_leading_chars(input3, WHITESPACE), "abcdef"));
     458         [ -  + ]:          4 :         assert_se(streq(skip_leading_chars(input3, "bcaef"), "def"));
     459                 :          4 : }
     460                 :            : 
     461                 :          4 : static void test_in_charset(void) {
     462         [ -  + ]:          4 :         assert_se(in_charset("dddaaabbbcccc", "abcd"));
     463         [ -  + ]:          4 :         assert_se(!in_charset("dddaaabbbcccc", "abc f"));
     464                 :          4 : }
     465                 :            : 
     466                 :          4 : static void test_split_pair(void) {
     467                 :          4 :         _cleanup_free_ char *a = NULL, *b = NULL;
     468                 :            : 
     469         [ -  + ]:          4 :         assert_se(split_pair("", "", &a, &b) == -EINVAL);
     470         [ -  + ]:          4 :         assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
     471         [ -  + ]:          4 :         assert_se(split_pair("", "=", &a, &b) == -EINVAL);
     472         [ -  + ]:          4 :         assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
     473         [ -  + ]:          4 :         assert_se(streq(a, "foo"));
     474         [ -  + ]:          4 :         assert_se(streq(b, "bar"));
     475                 :          4 :         free(a);
     476                 :          4 :         free(b);
     477         [ -  + ]:          4 :         assert_se(split_pair("==", "==", &a, &b) >= 0);
     478         [ -  + ]:          4 :         assert_se(streq(a, ""));
     479         [ -  + ]:          4 :         assert_se(streq(b, ""));
     480                 :          4 :         free(a);
     481                 :          4 :         free(b);
     482                 :            : 
     483         [ -  + ]:          4 :         assert_se(split_pair("===", "==", &a, &b) >= 0);
     484         [ -  + ]:          4 :         assert_se(streq(a, ""));
     485         [ -  + ]:          4 :         assert_se(streq(b, "="));
     486                 :          4 : }
     487                 :            : 
     488                 :          4 : static void test_first_word(void) {
     489         [ -  + ]:          4 :         assert_se(first_word("Hello", ""));
     490         [ -  + ]:          4 :         assert_se(first_word("Hello", "Hello"));
     491         [ -  + ]:          4 :         assert_se(first_word("Hello world", "Hello"));
     492         [ -  + ]:          4 :         assert_se(first_word("Hello\tworld", "Hello"));
     493         [ -  + ]:          4 :         assert_se(first_word("Hello\nworld", "Hello"));
     494         [ -  + ]:          4 :         assert_se(first_word("Hello\rworld", "Hello"));
     495         [ -  + ]:          4 :         assert_se(first_word("Hello ", "Hello"));
     496                 :            : 
     497         [ -  + ]:          4 :         assert_se(!first_word("Hello", "Hellooo"));
     498         [ -  + ]:          4 :         assert_se(!first_word("Hello", "xxxxx"));
     499         [ -  + ]:          4 :         assert_se(!first_word("Hellooo", "Hello"));
     500                 :          4 : }
     501                 :            : 
     502                 :          4 : static void test_strlen_ptr(void) {
     503         [ -  + ]:          4 :         assert_se(strlen_ptr("foo") == 3);
     504         [ -  + ]:          4 :         assert_se(strlen_ptr("") == 0);
     505         [ -  + ]:          4 :         assert_se(strlen_ptr(NULL) == 0);
     506                 :          4 : }
     507                 :            : 
     508                 :          4 : static void test_memory_startswith(void) {
     509         [ -  + ]:          4 :         assert_se(streq(memory_startswith("", 0, ""), ""));
     510         [ -  + ]:          4 :         assert_se(streq(memory_startswith("", 1, ""), ""));
     511         [ -  + ]:          4 :         assert_se(streq(memory_startswith("x", 2, ""), "x"));
     512         [ -  + ]:          4 :         assert_se(!memory_startswith("", 1, "x"));
     513         [ -  + ]:          4 :         assert_se(!memory_startswith("", 1, "xxxxxxxx"));
     514         [ -  + ]:          4 :         assert_se(streq(memory_startswith("xxx", 4, "x"), "xx"));
     515         [ -  + ]:          4 :         assert_se(streq(memory_startswith("xxx", 4, "xx"), "x"));
     516         [ -  + ]:          4 :         assert_se(streq(memory_startswith("xxx", 4, "xxx"), ""));
     517         [ -  + ]:          4 :         assert_se(!memory_startswith("xxx", 4, "xxxx"));
     518                 :          4 : }
     519                 :            : 
     520                 :          4 : static void test_memory_startswith_no_case(void) {
     521         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("", 0, ""), ""));
     522         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("", 1, ""), ""));
     523         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("x", 2, ""), "x"));
     524         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("X", 2, ""), "X"));
     525         [ -  + ]:          4 :         assert_se(!memory_startswith_no_case("", 1, "X"));
     526         [ -  + ]:          4 :         assert_se(!memory_startswith_no_case("", 1, "xxxxXXXX"));
     527         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("xxx", 4, "X"), "xx"));
     528         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("XXX", 4, "x"), "XX"));
     529         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("XXX", 4, "X"), "XX"));
     530         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("xxx", 4, "XX"), "x"));
     531         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("XXX", 4, "xx"), "X"));
     532         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("XXX", 4, "XX"), "X"));
     533         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("xxx", 4, "XXX"), ""));
     534         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("XXX", 4, "xxx"), ""));
     535         [ -  + ]:          4 :         assert_se(streq(memory_startswith_no_case("XXX", 4, "XXX"), ""));
     536                 :            : 
     537         [ -  + ]:          4 :         assert_se(memory_startswith_no_case((char[2]){'x', 'x'}, 2, "xx"));
     538         [ -  + ]:          4 :         assert_se(memory_startswith_no_case((char[2]){'x', 'X'}, 2, "xX"));
     539         [ -  + ]:          4 :         assert_se(memory_startswith_no_case((char[2]){'X', 'x'}, 2, "Xx"));
     540         [ -  + ]:          4 :         assert_se(memory_startswith_no_case((char[2]){'X', 'X'}, 2, "XX"));
     541                 :          4 : }
     542                 :            : 
     543                 :          4 : int main(int argc, char *argv[]) {
     544                 :          4 :         test_setup_logging(LOG_DEBUG);
     545                 :            : 
     546                 :          4 :         test_free_and_strndup();
     547                 :          4 :         test_ascii_strcasecmp_n();
     548                 :          4 :         test_ascii_strcasecmp_nn();
     549                 :          4 :         test_cellescape();
     550                 :          4 :         test_streq_ptr();
     551                 :          4 :         test_strstrip();
     552                 :          4 :         test_strextend();
     553                 :          4 :         test_strextend_with_separator();
     554                 :          4 :         test_strrep();
     555                 :          4 :         test_string_has_cc();
     556                 :          4 :         test_ascii_strlower();
     557                 :          4 :         test_strshorten();
     558                 :          4 :         test_strjoina();
     559                 :          4 :         test_strcmp_ptr();
     560                 :          4 :         test_foreach_word();
     561                 :          4 :         test_foreach_word_quoted();
     562                 :          4 :         test_endswith();
     563                 :          4 :         test_endswith_no_case();
     564                 :          4 :         test_delete_chars();
     565                 :          4 :         test_delete_trailing_chars();
     566                 :          4 :         test_delete_trailing_slashes();
     567                 :          4 :         test_skip_leading_chars();
     568                 :          4 :         test_in_charset();
     569                 :          4 :         test_split_pair();
     570                 :          4 :         test_first_word();
     571                 :          4 :         test_strlen_ptr();
     572                 :          4 :         test_memory_startswith();
     573                 :          4 :         test_memory_startswith_no_case();
     574                 :            : 
     575                 :          4 :         return 0;
     576                 :            : }

Generated by: LCOV version 1.14