test-path-util.c revision d7a2f56cd0e550a92cb160b346f33a84b0daa75e
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2016-2017 Dovecot authors, see the included COPYING file */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic const char *tmpdir;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic const char *cwd;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic const char *link1;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic const char *link2;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic const char *link3;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic const char *link4;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_local_path(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *expected = t_strconcat(cwd, "/README.md", NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("README.md", cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("/", "/", &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(cwd, cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic int path_height(const char *p)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen for (n = 0; *p != '\0'; ++p)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen n += *p == '/';
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_travel_to_root(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(t_normpath_to("../", npath, &npath, &error) == 0, l);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_extra_slashes(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(".", cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("./", cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(".////", cwd, &npath, &error) == 0);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen const char *expected = t_strconcat(cwd, "/nonexistent", NULL);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen test_assert(t_normpath_to("nonexistent", cwd, &npath, &error) == 0);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen test_assert(t_realpath_to("nonexistent", cwd, &npath, &error) == -1);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(rel_path, tmpdir, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("..", tmpdir, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("../", tmpdir, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("../.", tmpdir, &npath, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_link1(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *old_dir, *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_realpath_to(link1, "/", &npath, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_realpath_to(t_strconcat(link1, "/link1/child", NULL),
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert_strcmp(npath, t_strconcat(tmpdir, "/child", NULL));
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* relative link1/link1/child */
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen i_fatal("t_get_working_dir() failed: %s", error);
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen test_assert(t_realpath(t_strconcat("link1", "/link1/child", NULL),
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_link4(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_realpath_to(t_strconcat(link1, "/link4/child", NULL),
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, t_strconcat(tmpdir, "/child", NULL));
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_link_loop(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_realpath_to(link2, "/", &npath, &error) == -1);
6d2b3ce2c6ef62334985ece4f0ab8b154e0e9560Timo Sirainen const char *abs = t_abspath_to("../../bin", "/usr/lib/");
6d2b3ce2c6ef62334985ece4f0ab8b154e0e9560Timo Sirainen test_assert_strcmp(abs, "/usr/lib//../../bin");
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_normpath_to("../../bin", "/usr///lib/", &norm, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_fatal("symlink(%s, %s) failed: %m", tmpdir, link1);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *link1_child = t_strconcat(link1, "/child", NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* link2 and link3 point to each other to create a loop */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("symlink(%s, %s) failed: %m", link3, link2);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("symlink(%s, %s) failed: %m", link2, link3);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* link4 points to link1 */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("symlink(link1, %s) failed: %m", link4);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_link_alloc(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#define COMPONENT_COMPONENT "/component-component"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* idea here is to make sure component-component
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen would optimally hit to the nearest_power value.
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen it has to be big enough to cause requirement for
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen allocation in t_realpath. */
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen size_t len = nearest_power(I_MAX(127, str_len(basedir) + strlen(COMPONENT_COMPONENT) + 1)) -
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_cleanup(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (unlink_directory(tmpdir, UNLINK_DIRECTORY_FLAG_RMDIR, &error) < 0)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_error("unlink_directory() failed: %s", error);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_init(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_get_working_dir(&cwd, &error) == 0);