LCOV - code coverage report
Current view: top level - path_utils - path_utils_ut.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 393 393 100.0 %
Date: 2014-04-01 Functions: 30 30 100.0 %

          Line data    Source code
       1             : /*
       2             :    path_utils - unit tests
       3             : 
       4             :    Authors:
       5             :        Jakub Hrozek <jhrozek@redhat.com>
       6             : 
       7             :    Copyright (C) 2009 Red Hat
       8             : 
       9             :    This program is free software; you can redistribute it and/or modify
      10             :    it under the terms of the GNU General Public License as published by
      11             :    the Free Software Foundation; either version 3 of the License, or
      12             :    (at your option) any later version.
      13             : 
      14             :    This program is distributed in the hope that it will be useful,
      15             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      16             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17             :    GNU General Public License for more details.
      18             : 
      19             :    You should have received a copy of the GNU General Public License
      20             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      21             : */
      22             : 
      23             : #include "config.h"
      24             : 
      25             : #include <check.h>
      26             : #include <stdlib.h>
      27             : #include <stdio.h>
      28             : #include <unistd.h>
      29             : #include <errno.h>
      30             : 
      31             : #include "path_utils.h"
      32             : 
      33             : #define fail_unless_str_equal(a, b) do { \
      34             :     fail_unless(strcmp(a, b) == 0, \
      35             :                 "The strings '%s' and '%s' are different, expected same", \
      36             :                 a, b); \
      37             : } while(0);
      38             : 
      39             : #define DIR_TEMPLATE        "test-directory-list-dir-XXXXXX"
      40             : #define SUBDIR              "test-directory-list-subdir"
      41             : #define SUBSUBDIR           "test-directory-list-subsubdir"
      42             : char *dlist_dir;
      43             : char *dlist_subdir;
      44             : char *dlist_subsubdir;
      45             : 
      46             : /**** get_dirname ****/
      47           1 : START_TEST(test_dirname)
      48             : {
      49             :     char p[PATH_MAX];
      50             :     char cwd[PATH_MAX];
      51             : 
      52           1 :     fail_unless(get_dirname(p, PATH_MAX, "/foo/bar") == SUCCESS);
      53           1 :     fail_unless_str_equal(p, "/foo");
      54             : 
      55           1 :     fail_unless(get_dirname(p, PATH_MAX, "/") == SUCCESS);
      56           1 :     fail_unless_str_equal(p, "/");
      57             : 
      58           1 :     fail_unless(get_dirname(p, PATH_MAX, "/foo") == SUCCESS);
      59           1 :     fail_unless_str_equal(p, "/");
      60             : 
      61           1 :     fail_unless(get_dirname(p, PATH_MAX, "//foo//bar") == SUCCESS);
      62           1 :     fail_unless_str_equal(p, "//foo");
      63             : 
      64           1 :     fail_unless(get_dirname(p, PATH_MAX, "//foo//") == SUCCESS);
      65           1 :     fail_unless_str_equal(p, "//");
      66             : 
      67           1 :     fail_unless(get_dirname(p, PATH_MAX, "foo//bar") == SUCCESS);
      68           1 :     fail_unless_str_equal(p, "foo");
      69             : 
      70           1 :     fail_unless(get_dirname(p, PATH_MAX, "foo//////bar") == SUCCESS);
      71           1 :     fail_unless_str_equal(p, "foo");
      72             : 
      73             :     /* if pathname does not contain a slash, dirname returns cwd */
      74           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
      75             : 
      76           1 :     fail_unless(get_dirname(p, PATH_MAX, "foo") == SUCCESS);
      77           1 :     fail_unless_str_equal(p, cwd);
      78             : 
      79           1 :     fail_unless(get_dirname(p, PATH_MAX, ".") == SUCCESS);
      80           1 :     fail_unless_str_equal(p, cwd);
      81             : 
      82           1 :     fail_unless(get_dirname(p, PATH_MAX, "..") == SUCCESS);
      83           1 :     fail_unless_str_equal(p, cwd);
      84             : 
      85           1 :     fail_unless(get_dirname(p, PATH_MAX, "") == SUCCESS);
      86           1 :     fail_unless_str_equal(p, cwd);
      87             : }
      88           1 : END_TEST
      89             : 
      90           1 : START_TEST(test_dirname_neg)
      91             : {
      92             :     char neg[3];
      93             :     char p[PATH_MAX];
      94             : 
      95           1 :     fail_if(get_dirname(neg, 3, "/foo/bar") == SUCCESS);
      96           1 :     fail_unless(get_dirname(p, PATH_MAX, NULL) == EINVAL);
      97             : }
      98           1 : END_TEST
      99             : 
     100             : /**** get_basename ****/
     101           1 : START_TEST(test_basename)
     102             : {
     103             :     char p[PATH_MAX];
     104             :     char cwd[PATH_MAX];
     105             : 
     106           1 :     fail_unless(get_basename(p, PATH_MAX, "/foo/bar") == SUCCESS);
     107           1 :     fail_unless_str_equal(p, "bar");
     108             : 
     109           1 :     fail_unless(get_basename(p, PATH_MAX, "/foo/") == SUCCESS);
     110           1 :     fail_unless_str_equal(p, "foo");
     111             : 
     112           1 :     fail_unless(get_basename(p, PATH_MAX, "foo") == SUCCESS);
     113           1 :     fail_unless_str_equal(p, "foo");
     114             : 
     115           1 :     fail_unless(get_basename(p, PATH_MAX, "/") == SUCCESS);
     116           1 :     fail_unless_str_equal(p, "/");
     117             : 
     118           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
     119             : 
     120           1 :     fail_unless(get_basename(p, PATH_MAX, ".") == SUCCESS);
     121           1 :     fail_unless_str_equal(p, cwd);
     122             : 
     123           1 :     fail_unless(get_basename(p, PATH_MAX, "") == SUCCESS);
     124           1 :     fail_unless_str_equal(p, cwd);
     125             : }
     126           1 : END_TEST
     127             : 
     128           1 : START_TEST(test_basename_neg)
     129             : {
     130             :     char neg[3];
     131             :     char p[PATH_MAX];
     132             : 
     133           1 :     fail_if(get_basename(neg, 3, "/foo/bar") == SUCCESS);
     134             : 
     135           1 :     fail_unless(get_basename(p, PATH_MAX, NULL) == EINVAL);
     136             : }
     137           1 : END_TEST
     138             : 
     139             : /**** is_absolute_path ****/
     140           1 : START_TEST(test_is_absolute_path)
     141             : {
     142           1 :     fail_unless(is_absolute_path("") == false);
     143           1 :     fail_unless(is_absolute_path("foo/bar") == false);
     144             : 
     145           1 :     fail_unless(is_absolute_path("/foo/bar") == true);
     146           1 :     fail_unless(is_absolute_path("/foo") == true);
     147           1 :     fail_unless(is_absolute_path("/") == true);
     148             : }
     149           1 : END_TEST
     150             : 
     151             : /**** get_dirname_and_basename ****/
     152             : /* Just a couple of basic tests - get_dirname_and_basename()
     153             :  * uses get_dirname() and get_basename() under the hood which
     154             :  * are tested enough in their specific tests
     155             :  */
     156           1 : START_TEST(test_dirname_and_basename)
     157             : {
     158             :     char dir[PATH_MAX];
     159             :     char base[PATH_MAX];
     160             :     char cwd[PATH_MAX];
     161             :     int ret;
     162             : 
     163           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, "/foo/bar");
     164           1 :     fail_unless(ret == SUCCESS);
     165           1 :     fail_unless_str_equal(dir, "/foo");
     166           1 :     fail_unless_str_equal(base, "bar");
     167             : 
     168           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, "/foo");
     169           1 :     fail_unless(ret == SUCCESS);
     170           1 :     fail_unless_str_equal(dir, "/");
     171           1 :     fail_unless_str_equal(base, "foo");
     172             : 
     173           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, "/");
     174           1 :     fail_unless(ret == SUCCESS);
     175           1 :     fail_unless_str_equal(dir, "/");
     176           1 :     fail_unless_str_equal(base, "/");
     177             : 
     178           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
     179             : 
     180           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, "foo");
     181           1 :     fail_unless(ret == SUCCESS);
     182           1 :     fail_unless_str_equal(dir, cwd);
     183           1 :     fail_unless_str_equal(base, "foo");
     184             : 
     185           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, "");
     186           1 :     fail_unless(ret == SUCCESS);
     187           1 :     fail_unless_str_equal(dir, cwd);
     188           1 :     fail_unless_str_equal(base, "");
     189             : 
     190           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, ".");
     191           1 :     fail_unless(ret == SUCCESS);
     192           1 :     fail_unless_str_equal(dir, cwd);
     193           1 :     fail_unless_str_equal(base, "");
     194             : }
     195           1 : END_TEST
     196             : 
     197           1 : START_TEST(test_dirname_and_basename_neg)
     198             : {
     199             :     char dir[PATH_MAX];
     200             :     char base[PATH_MAX];
     201             :     int ret;
     202             : 
     203           1 :     ret = get_directory_and_base_name(dir, PATH_MAX, base, PATH_MAX, NULL);
     204           1 :     fail_unless(ret == EINVAL);
     205             : }
     206           1 : END_TEST
     207             : 
     208             : /**** path_concat ****/
     209           1 : START_TEST(test_path_concat)
     210             : {
     211             :     char p[PATH_MAX];
     212             :     char p2[9];
     213             : 
     214           1 :     fail_unless(path_concat(p, PATH_MAX, "/foo", "bar") == SUCCESS);
     215           1 :     fail_unless_str_equal(p, "/foo/bar");
     216             : 
     217           1 :     fail_unless(path_concat(p, PATH_MAX, "/foo", "/bar") == SUCCESS);
     218           1 :     fail_unless_str_equal(p, "/foo/bar");
     219             : 
     220           1 :     fail_unless(path_concat(p, PATH_MAX, "/foo/", "/bar") == SUCCESS);
     221           1 :     fail_unless_str_equal(p, "/foo/bar");
     222             : 
     223           1 :     fail_unless(path_concat(p, PATH_MAX, "/foo", "") == SUCCESS);
     224           1 :     fail_unless_str_equal(p, "/foo");
     225             : 
     226           1 :     fail_unless(path_concat(p, PATH_MAX, "foo", NULL) == SUCCESS);
     227           1 :     fail_unless_str_equal(p, "foo");
     228             : 
     229           1 :     fail_unless(path_concat(p, PATH_MAX, "", "foo") == SUCCESS);
     230           1 :     fail_unless_str_equal(p, "foo");
     231             : 
     232           1 :     fail_unless(path_concat(p, PATH_MAX, "/", "foo") == SUCCESS);
     233           1 :     fail_unless_str_equal(p, "/foo");
     234             : 
     235           1 :     fail_unless(path_concat(p, PATH_MAX, "/foo", "/") == SUCCESS);
     236           1 :     fail_unless_str_equal(p, "/foo/");
     237             : 
     238           1 :     fail_unless(path_concat(p, PATH_MAX, "/foo", "bar/") == SUCCESS);
     239           1 :     fail_unless_str_equal(p, "/foo/bar/");
     240             : 
     241           1 :     fail_unless(path_concat(p, PATH_MAX, NULL, "foo") == SUCCESS);
     242           1 :     fail_unless_str_equal(p, "foo");
     243             : 
     244             :     /* on-by-one */
     245           1 :     fail_unless(path_concat(p2, 9, "/foo", "bar") == SUCCESS);
     246           1 :     fail_unless_str_equal(p2, "/foo/bar");
     247             : }
     248           1 : END_TEST
     249             : 
     250           1 : START_TEST(test_path_concat_neg)
     251             : {
     252             :     char small[3];
     253             :     char small2[5];
     254             :     char small3[7];
     255             :     char p2[10];
     256             : 
     257             :     /* these two test different conditions */
     258             : 
     259             :     /* Test if head is longer than the buffer */
     260           1 :     fail_unless(path_concat(small, 3, "/foo", "bar") == ENOBUFS);
     261             :     /* On ENOBUFS, path should be empty */
     262           1 :     fail_unless_str_equal(small, "");
     263             : 
     264             :     /* Test if head is the same length as the buffer */
     265           1 :     fail_unless(path_concat(small2, 5, "/foo", "bar") == ENOBUFS);
     266             :     /* On ENOBUFS, path should be empty */
     267           1 :     fail_unless_str_equal(small2, "");
     268             : 
     269             :     /* Test if head+tail is the longer than the buffer */
     270           1 :     fail_unless(path_concat(small3, 7, "/foo", "bar") == ENOBUFS);
     271             :     /* On ENOBUFS, path should be empty */
     272           1 :     fail_unless_str_equal(small3, "");
     273             : 
     274             :     /* off-by-one */
     275             :     /* Fill with garbage data for now */
     276           1 :     memset(p2, 'Z', 9);
     277           1 :     p2[9] = '\0';
     278             : 
     279           1 :     fail_unless(path_concat(p2, 8, "/foo", "bar") == ENOBUFS);
     280             :     /* Make sure we don't write past the end of the buffer */
     281           1 :     fail_unless(p2[8] == 'Z', "Got [%d]", p2[8]);
     282             :     /* On ENOBUFS, path should be empty */
     283           1 :     fail_unless_str_equal(p2, "");
     284             : }
     285           1 : END_TEST
     286             : 
     287             : /**** make_path_absolute ****/
     288           1 : START_TEST(test_make_path_absolute)
     289             : {
     290             :     char p[PATH_MAX];
     291             :     char p2[PATH_MAX];
     292             :     char cwd[PATH_MAX];
     293             :     char *buf;
     294             :     size_t buf_len;
     295             : 
     296           1 :     fail_unless(make_path_absolute(p, PATH_MAX, "/foo") == SUCCESS);
     297           1 :     fail_unless_str_equal(p, "/foo");
     298             : 
     299           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
     300             : 
     301           1 :     fail_unless(make_path_absolute(p, PATH_MAX, "foo") == SUCCESS);
     302           1 :     snprintf(p2, PATH_MAX, "%s/foo", cwd);
     303           1 :     fail_unless_str_equal(p, p2);
     304             : 
     305           1 :     fail_unless(make_path_absolute(p, PATH_MAX, "") == SUCCESS);
     306           1 :     fail_unless_str_equal(p, cwd);
     307             : 
     308             :     /* on-by-one; 2 = terminating null + path delimeter */
     309           1 :     buf_len = strlen(cwd) + strlen("foo") + 2;
     310           1 :     buf = malloc(buf_len);
     311           1 :     fail_if(buf == NULL);
     312           1 :     fail_unless(make_path_absolute(buf, buf_len, "foo") == SUCCESS);
     313           1 :     free(buf);
     314             : }
     315           1 : END_TEST
     316             : 
     317           1 : START_TEST(test_make_path_absolute_neg)
     318             : {
     319             :     char small[1];
     320             :     char cwd[PATH_MAX];
     321             :     char *small2;
     322             :     int small_len;
     323             : 
     324           1 :     fail_unless(make_path_absolute(small, 1, "/foo") == ENOBUFS);
     325           1 :     fail_unless(make_path_absolute(NULL, 1, "/foo") == ENOBUFS);
     326             : 
     327             :     /* off-by-one */
     328           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
     329           1 :     small_len = strlen(cwd) + strlen("foo") + 1;
     330           1 :     small2 = malloc(small_len);
     331           1 :     fail_if(small2 == NULL);
     332           1 :     fail_unless(make_path_absolute(small2, small_len, "foo") == ENOBUFS);
     333           1 :     free(small2);
     334             : 
     335             :     /* just enough space for cwd */
     336           1 :     small_len = strlen(cwd) + 1;
     337           1 :     small2 = malloc(small_len);
     338           1 :     fail_if(small2 == NULL);
     339           1 :     fail_unless(make_path_absolute(small2, small_len, "foo") == ENOBUFS);
     340           1 :     free(small2);
     341             : }
     342           1 : END_TEST
     343             : 
     344             : /**** make_normalized_absolute_path ****/
     345           1 : START_TEST(test_make_normalized_absolute_path)
     346             : {
     347             :     char p[PATH_MAX];
     348             :     char p2[PATH_MAX];
     349             :     char cwd[PATH_MAX];
     350             : 
     351           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
     352             : 
     353           1 :     fail_unless(make_normalized_absolute_path(p, PATH_MAX, "foo/baz/../bar") == SUCCESS);
     354           1 :     snprintf(p2, PATH_MAX, "%s/foo/bar", cwd);
     355           1 :     fail_unless_str_equal(p, p2);
     356             : 
     357           1 :     fail_unless(make_normalized_absolute_path(p, PATH_MAX, "/foo/../bar") == SUCCESS);
     358           1 :     fail_unless_str_equal(p, "/bar");
     359             : 
     360           1 :     fail_unless(make_normalized_absolute_path(p, PATH_MAX, "/foo/../baz/../bar") == SUCCESS);
     361           1 :     fail_unless_str_equal(p, "/bar");
     362             : }
     363           1 : END_TEST
     364             : 
     365           1 : START_TEST(test_make_normalized_absolute_path_neg)
     366             : {
     367             :     char small[1];
     368             : 
     369           1 :     fail_unless(make_path_absolute(small, 1, "/foo") == ENOBUFS);
     370           1 :     fail_unless(make_path_absolute(NULL, 1, "/foo") == ENOBUFS);
     371             : }
     372           1 : END_TEST
     373             : 
     374             : /**** split_path ****/
     375           1 : START_TEST(test_split_path)
     376             : {
     377             :     char **array;
     378             :     int n;
     379             : 
     380           1 :     array = split_path("/foo/bar", &n);
     381           1 :     fail_if(array == NULL);
     382           1 :     fail_unless(n == 3);
     383           1 :     if (array) {
     384           1 :         fail_unless_str_equal(array[0], "/");
     385           1 :         fail_unless_str_equal(array[1], "foo");
     386           1 :         fail_unless_str_equal(array[2], "bar");
     387           1 :         free(array);
     388             :     }
     389             : 
     390           1 :     array = split_path("/foo/../bar", &n);
     391           1 :     fail_if(array == NULL);
     392           1 :     fail_unless(n == 4);
     393           1 :     if (array) {
     394           1 :         fail_unless_str_equal(array[0], "/");
     395           1 :         fail_unless_str_equal(array[1], "foo");
     396           1 :         fail_unless_str_equal(array[2], "..");
     397           1 :         fail_unless_str_equal(array[3], "bar");
     398           1 :         free(array);
     399             :     }
     400             : 
     401           1 :     array = split_path("/foo/bar", NULL);
     402           1 :     fail_if(array == NULL);
     403           1 :     if (array) {
     404           1 :         fail_unless_str_equal(array[0], "/");
     405           1 :         fail_unless_str_equal(array[1], "foo");
     406           1 :         fail_unless_str_equal(array[2], "bar");
     407           1 :         free(array);
     408             :     }
     409             : 
     410           1 :     array = split_path("foo/bar", &n);
     411           1 :     fail_if(array == NULL);
     412           1 :     fail_unless(n == 2);
     413           1 :     if (array) {
     414           1 :         fail_unless_str_equal(array[0], "foo");
     415           1 :         fail_unless_str_equal(array[1], "bar");
     416           1 :         free(array);
     417             :     }
     418             : 
     419           1 :     array = split_path(".", &n);
     420           1 :     fail_if(array == NULL);
     421           1 :     fail_unless(n == 1);
     422           1 :     if (array) {
     423           1 :         fail_unless_str_equal(array[0], ".");
     424           1 :         free(array);
     425             :     }
     426             : 
     427           1 :     array = split_path("foo", &n);
     428           1 :     fail_if(array == NULL);
     429           1 :     fail_unless(n == 1);
     430           1 :     if (array) {
     431           1 :         fail_unless_str_equal(array[0], "foo");
     432           1 :         free(array);
     433             :     }
     434             : 
     435             :     /* one might expect { "" } or outright NULL, but we agreed not to
     436             :      * do changes beyond bugfixes at this point */
     437           1 :     array = split_path("", &n);
     438           1 :     fail_if(array == NULL);
     439           1 :     fail_unless(n == 0);
     440           1 :     if (array) {
     441           1 :         fail_unless(array[0] == NULL);
     442           1 :         free(array);
     443             :     }
     444             : }
     445           1 : END_TEST
     446             : 
     447           1 : START_TEST(test_split_path_neg)
     448             : {
     449             :     char **array;
     450             :     int n;
     451             : 
     452           1 :     array = split_path(NULL, &n);
     453           1 :     fail_unless(array == NULL);
     454             : 
     455           1 :     array = split_path(NULL, NULL);
     456           1 :     fail_unless(array == NULL);
     457             : }
     458           1 : END_TEST
     459             : 
     460             : /**** normalize_path ****/
     461           1 : START_TEST(test_normalize_path)
     462             : {
     463             :     char norm[PATH_MAX];
     464             :     char small[8];
     465             : 
     466           1 :     fail_unless(normalize_path(norm, PATH_MAX, "/foo/../bar") == SUCCESS);
     467           1 :     fail_unless_str_equal(norm, "/bar");
     468             : 
     469           1 :     fail_unless(normalize_path(norm, PATH_MAX, "/foo/../baz/../bar") == SUCCESS);
     470           1 :     fail_unless_str_equal(norm, "/bar");
     471             : 
     472           1 :     fail_unless(normalize_path(norm, PATH_MAX, "foo/baz/../bar") == SUCCESS);
     473           1 :     fail_unless_str_equal(norm, "foo/bar");
     474             : 
     475           1 :     fail_unless(normalize_path(norm, PATH_MAX, "/foo/./bar") == SUCCESS);
     476           1 :     fail_unless_str_equal(norm, "/foo/bar");
     477             : 
     478           1 :     fail_unless(normalize_path(norm, PATH_MAX, "/foo//bar") == SUCCESS);
     479           1 :     fail_unless_str_equal(norm, "/foo/bar");
     480             : 
     481           1 :     fail_unless(normalize_path(norm, PATH_MAX, "/foo//bar") == SUCCESS);
     482           1 :     fail_unless_str_equal(norm, "/foo/bar");
     483             : 
     484           1 :     fail_unless(normalize_path(norm, PATH_MAX, "") == SUCCESS);
     485           1 :     fail_unless_str_equal(norm, ".");
     486             : 
     487           1 :     fail_unless(normalize_path(norm, PATH_MAX, "/../..") == SUCCESS);
     488           1 :     fail_unless_str_equal(norm, "/");
     489             : 
     490             :     /* on-by-one */
     491           1 :     fail_unless(normalize_path(small, 8, "foo/baz/../bar") == SUCCESS);
     492           1 :     fail_unless_str_equal(small, "foo/bar");
     493             : }
     494           1 : END_TEST
     495             : 
     496           1 : START_TEST(test_normalize_path_neg)
     497             : {
     498             :     char norm[PATH_MAX];
     499             :     char small[4];
     500             : 
     501           1 :     fail_unless(normalize_path(norm, PATH_MAX, "foo/../..") == PATH_UTILS_ERROR_NOT_FULLY_NORMALIZED);
     502             : 
     503             :     /* with a buffer of 4 chars, this would test off-by-one error */
     504           1 :     fail_unless(normalize_path(small, 4, "/foo/../bar") == ENOBUFS);
     505             : }
     506           1 : END_TEST
     507             : 
     508             : /**** common_path_prefix ****/
     509           1 : START_TEST(test_common_path_prefix)
     510             : {
     511             :     char common[PATH_MAX];
     512             :     char small[5];
     513             :     int count;
     514             : 
     515           1 :     fail_unless(common_path_prefix(common, PATH_MAX, &count, "/usr/lib", "/usr/share") == SUCCESS);
     516           1 :     fail_unless_str_equal(common, "/usr");
     517           1 :     fail_unless(count == 2);
     518             : 
     519           1 :     fail_unless(common_path_prefix(common, PATH_MAX, NULL, "/usr/lib", "/usr/share") == SUCCESS);
     520           1 :     fail_unless_str_equal(common, "/usr");
     521             : 
     522           1 :     fail_unless(common_path_prefix(common, PATH_MAX, &count, "/usr/lib", "/usr/lab") == SUCCESS);
     523           1 :     fail_unless_str_equal(common, "/usr");
     524           1 :     fail_unless(count == 2);
     525             : 
     526           1 :     fail_unless(common_path_prefix(common, PATH_MAX, &count, "foo", "bar") == SUCCESS);
     527           1 :     fail_unless_str_equal(common, "");
     528           1 :     fail_unless(count == 0);
     529             : 
     530           1 :     fail_unless(common_path_prefix(common, PATH_MAX, &count, "/", "/") == SUCCESS);
     531           1 :     fail_unless_str_equal(common, "/");
     532           1 :     fail_unless(count == 1);
     533             : 
     534           1 :     fail_unless(common_path_prefix(common, PATH_MAX, &count, NULL, "/usr/share") == SUCCESS);
     535           1 :     fail_unless_str_equal(common, "");
     536           1 :     fail_unless(count == 0);
     537             : 
     538             :     /* on-by-one */
     539           1 :     fail_unless(common_path_prefix(small, 5, NULL, "/usr/lib", "/usr/share") == SUCCESS);
     540           1 :     fail_unless_str_equal(small, "/usr");
     541             : }
     542           1 : END_TEST
     543             : 
     544           1 : START_TEST(test_common_path_prefix_neg)
     545             : {
     546             :     char small[1];
     547             :     char small2[4];
     548             :     int count;
     549             : 
     550           1 :     fail_unless(common_path_prefix(small, 1, &count, "/usr/lib", "/usr/share") == ENOBUFS);
     551           1 :     fail_unless(common_path_prefix(NULL, PATH_MAX, &count, "/usr/lib", "/usr/share") == ENOBUFS);
     552             :     /* off-by-one */
     553           1 :     fail_unless(common_path_prefix(small2, 4, NULL, "/usr/lib", "/usr/share") == ENOBUFS);
     554             : }
     555           1 : END_TEST
     556             : 
     557             : /**** find_existing_directory_ancestor ****/
     558           1 : START_TEST(test_find_existing_directory_ancestor)
     559             : {
     560             :     char p[PATH_MAX];
     561             :     char cwd[PATH_MAX];
     562             : 
     563           1 :     fail_unless(find_existing_directory_ancestor(p, PATH_MAX, "/etc/passwd") == SUCCESS);
     564           1 :     fail_unless_str_equal(p, "/etc");
     565             : 
     566             :     /* if pathname does not contain a slash, the parent is cwd */
     567           1 :     fail_if(getcwd(cwd, PATH_MAX) == NULL, "getcwd failed");
     568             : 
     569           1 :     fail_unless(find_existing_directory_ancestor(p, PATH_MAX, "foo/bar") == SUCCESS);
     570           1 :     fail_unless_str_equal(p, cwd);
     571             : }
     572           1 : END_TEST
     573             : 
     574           1 : START_TEST(test_find_existing_directory_ancestor_neg)
     575             : {
     576             :     char small[4];
     577           1 :     fail_unless(find_existing_directory_ancestor(small, 4, "/etc/passwd") == ENOBUFS);
     578           1 :     fail_unless(find_existing_directory_ancestor(NULL, 4, "/etc/passwd") == ENOBUFS);
     579             : }
     580           1 : END_TEST
     581             : 
     582             : /**** directory_list ****/
     583           2 : static void setup_directory_list(void)
     584             : {
     585           2 :     char *s = NULL;
     586             :     int ret;
     587             : 
     588           2 :     s = strdup(DIR_TEMPLATE);
     589           2 :     fail_unless(s != NULL, "strdup failed\n");
     590           4 :     if (!s) return;
     591           2 :     dlist_dir = mkdtemp(s);
     592           2 :     fail_unless(dlist_dir != NULL, "mkstemp failed [%d][%s]", errno, strerror(errno));
     593             : 
     594           2 :     ret = asprintf(&dlist_subdir, "%s/%s", dlist_dir, SUBDIR);
     595           2 :     fail_unless(ret != 1, "strdup failed\n");
     596           2 :     ret = mkdir(dlist_subdir, 0700);
     597           2 :     fail_unless(ret != -1, "mkdir %s failed [%d][%s]", dlist_subdir, errno, strerror(errno));
     598             : 
     599           2 :     ret = asprintf(&dlist_subsubdir, "%s/%s", dlist_subdir, SUBSUBDIR);
     600           2 :     fail_unless(ret != 1, "strdup failed\n");
     601           2 :     ret = mkdir(dlist_subsubdir, 0700);
     602           2 :     fail_unless(ret != -1, "mkdir %s failed [%d][%s]", dlist_subsubdir, errno, strerror(errno));
     603             : }
     604             : 
     605           2 : static void teardown_directory_list(void)
     606             : {
     607             :     int ret;
     608             : 
     609           2 :     if (dlist_subsubdir) {
     610           2 :         ret = rmdir(dlist_subsubdir);
     611           2 :         fail_unless(ret != -1, "unlink %s failed [%d][%s]", dlist_subsubdir, errno, strerror(errno));
     612           2 :         free(dlist_subsubdir);
     613           2 :         dlist_subsubdir = NULL;
     614             :     }
     615             : 
     616           2 :     if (dlist_subdir) {
     617           2 :         ret = rmdir(dlist_subdir);
     618           2 :         fail_unless(ret != -1, "unlink %s failed [%d][%s]", dlist_subdir, errno, strerror(errno));
     619           2 :         free(dlist_subdir);
     620           2 :         dlist_subdir = NULL;
     621             :     }
     622             : 
     623           2 :     if (dlist_dir) {
     624           2 :         ret = rmdir(dlist_dir);
     625           2 :         fail_unless(ret != -1, "unlink %s failed [%d][%s]", dlist_dir, errno, strerror(errno));
     626           2 :         free(dlist_dir);
     627           2 :         dlist_dir = NULL;
     628             :     }
     629           2 : }
     630             : 
     631           1 : static bool dirlist_cb_nonrecursive(const char *directory,
     632             :                                     const char *base_name,
     633             :                                     const char *path,
     634             :                                     struct stat *info,
     635             :                                     void *user_data)
     636             : {
     637           1 :     int *data = (int *) user_data;
     638             : 
     639           1 :     fail_unless_str_equal(path, dlist_subdir);
     640           1 :     fail_unless(*data == 123);
     641             : 
     642           1 :     return true;
     643             : }
     644             : 
     645           3 : static bool dirlist_cb_recursive(const char *directory, const char *base_name,
     646             :                                  const char *path, struct stat *info,
     647             :                                  void *user_data)
     648             : {
     649           3 :     bool *seen_child = (bool *) user_data;
     650             :     static bool seen_parent = false;
     651             : 
     652           3 :     if (!seen_parent) {
     653           2 :         fail_unless_str_equal(path, dlist_subdir);
     654           2 :         seen_parent = true;
     655             :     } else {
     656           1 :         *seen_child = true;
     657           1 :         fail_unless_str_equal(path, dlist_subsubdir);
     658           1 :         seen_parent = false;
     659             :     }
     660             : 
     661           3 :     return true;
     662             : }
     663             : 
     664           1 : START_TEST(test_directory_list)
     665             : {
     666           1 :     int data = 123;
     667             :     bool seen_child;
     668             : 
     669           1 :     fail_unless(directory_list(dlist_dir, false, dirlist_cb_nonrecursive, &data) == SUCCESS);
     670             : 
     671           1 :     seen_child = false;
     672           1 :     fail_unless(directory_list(dlist_dir, true, dirlist_cb_recursive, &seen_child) == SUCCESS);
     673           1 :     fail_unless(seen_child == true);
     674             : 
     675           1 :     seen_child = false;
     676           1 :     fail_unless(directory_list(dlist_dir, false, dirlist_cb_recursive, &seen_child) == SUCCESS);
     677           1 :     fail_unless(seen_child == false);
     678             : }
     679           1 : END_TEST
     680             : 
     681           1 : START_TEST(test_directory_list_neg)
     682             : {
     683           1 :     fail_if(directory_list("/not/here", false, dirlist_cb_nonrecursive, NULL) == SUCCESS);
     684           1 :     fail_if(directory_list("/etc/passwd", false, dirlist_cb_nonrecursive, NULL) == SUCCESS);
     685             : }
     686           1 : END_TEST
     687             : 
     688             : /**** is_ancestor_path ****/
     689           1 : START_TEST(test_is_ancestor_path)
     690             : {
     691           1 :   fail_unless(is_ancestor_path("/a/b/c", "/a/b/c/d") == true);
     692             :   /* equal, not ancestor */
     693           1 :   fail_unless(is_ancestor_path("/a/b/c/d", "/a/b/c/d") == false);
     694           1 :   fail_unless(is_ancestor_path("/a/x/c", "/a/b/c/d") == false);
     695           1 :   fail_unless(is_ancestor_path(NULL, "/a/b/c/d") == false);
     696           1 :   fail_unless(is_ancestor_path("/a/x/c", NULL) == false);
     697           1 :   fail_unless(is_ancestor_path(NULL, NULL) == false);
     698           1 :   fail_unless(is_ancestor_path("", "") == false);
     699             : }
     700           1 : END_TEST
     701             : 
     702             : 
     703          25 : static Suite *path_utils_suite(void)
     704             : {
     705          25 :     Suite *s = suite_create("path_utils");
     706             : 
     707          25 :     TCase *tc_path_utils = tcase_create("path_utils");
     708          25 :     TCase *tc_directory_list = tcase_create("path_utils_directory_list");
     709             : 
     710          25 :     tcase_add_test(tc_path_utils, test_dirname);
     711          25 :     tcase_add_test(tc_path_utils, test_dirname_neg);
     712             : 
     713          25 :     tcase_add_test(tc_path_utils, test_basename);
     714          25 :     tcase_add_test(tc_path_utils, test_basename_neg);
     715             : 
     716          25 :     tcase_add_test(tc_path_utils, test_dirname_and_basename);
     717          25 :     tcase_add_test(tc_path_utils, test_dirname_and_basename_neg);
     718             : 
     719          25 :     tcase_add_test(tc_path_utils, test_is_absolute_path);
     720             : 
     721          25 :     tcase_add_test(tc_path_utils, test_path_concat);
     722          25 :     tcase_add_test(tc_path_utils, test_path_concat_neg);
     723             : 
     724          25 :     tcase_add_test(tc_path_utils, test_split_path);
     725          25 :     tcase_add_test(tc_path_utils, test_split_path_neg);
     726             : 
     727          25 :     tcase_add_test(tc_path_utils, test_make_path_absolute);
     728          25 :     tcase_add_test(tc_path_utils, test_make_path_absolute_neg);
     729             : 
     730          25 :     tcase_add_test(tc_path_utils, test_normalize_path);
     731          25 :     tcase_add_test(tc_path_utils, test_normalize_path_neg);
     732             : 
     733          25 :     tcase_add_test(tc_path_utils, test_make_normalized_absolute_path);
     734          25 :     tcase_add_test(tc_path_utils, test_make_normalized_absolute_path_neg);
     735             : 
     736          25 :     tcase_add_test(tc_path_utils, test_common_path_prefix);
     737          25 :     tcase_add_test(tc_path_utils, test_common_path_prefix_neg);
     738             : 
     739          25 :     tcase_add_test(tc_path_utils, test_find_existing_directory_ancestor);
     740          25 :     tcase_add_test(tc_path_utils, test_find_existing_directory_ancestor_neg);
     741             : 
     742          25 :     tcase_add_test(tc_path_utils, test_is_ancestor_path);
     743             : 
     744          25 :     tcase_add_checked_fixture(tc_directory_list,
     745             :                               setup_directory_list,
     746             :                               teardown_directory_list);
     747          25 :     tcase_add_test(tc_directory_list, test_directory_list);
     748          25 :     tcase_add_test(tc_directory_list, test_directory_list_neg);
     749             : 
     750          25 :     suite_add_tcase(s, tc_path_utils);
     751          25 :     suite_add_tcase(s, tc_directory_list);
     752             : 
     753          25 :     return s;
     754             : }
     755             : 
     756          25 : int main(void)
     757             : {
     758             :   int number_failed;
     759             : 
     760          25 :   Suite *s = path_utils_suite();
     761          25 :   SRunner *sr = srunner_create(s);
     762             :   /* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */
     763          25 :   srunner_run_all(sr, CK_ENV);
     764           1 :   number_failed = srunner_ntests_failed(sr);
     765           1 :   srunner_free(sr);
     766           1 :   return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
     767             : }
     768             : 

Generated by: LCOV version 1.10