test-path-util.c revision d7a2f56cd0e550a92cb160b346f33a84b0daa75e
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen/* Copyright (c) 2016-2017 Dovecot authors, see the included COPYING file */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "test-lib.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "path-util.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include "unlink-directory.h"
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen#include "str.h"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include <unistd.h>
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include <fcntl.h>
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#include <stdlib.h>
c99fe55d4535d839a6ad0735c4719e076a1adb2cTimo Sirainen#include <sys/stat.h>
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#define TEMP_DIRNAME ".test-path-util"
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
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 Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_local_path(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *expected = t_strconcat(cwd, "/README.md", NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("README.md", cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, expected);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_absolute_path_no_change(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("/", "/", &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, "/");
17fe695b985e9d6e9dc39c05b24e6b3c3b7e1ba1Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(cwd, cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic int path_height(const char *p)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen int n;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen for (n = 0; *p != '\0'; ++p)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen n += *p == '/';
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen return n;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_travel_to_root(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen int l = path_height(cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *npath = cwd;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen for (npath = cwd; l != 0; l--) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *error;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_idx(t_normpath_to("../", npath, &npath, &error) == 0, l);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, "/");
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_extra_slashes(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(".", cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("./", cwd, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(".////", cwd, &npath, &error) == 0);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_nonexistent_path(void)
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen{
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen const char *npath = NULL, *error = NULL;
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_strcmp(npath, expected);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen test_assert(t_realpath_to("nonexistent", cwd, &npath, &error) == -1);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen test_assert(error != NULL);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen}
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainenstatic void test_relative_dotdot(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *rel_path = "../"TEMP_DIRNAME;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to(rel_path, tmpdir, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, tmpdir);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("..", tmpdir, &npath, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("../", tmpdir, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_normpath_to("../.", tmpdir, &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, cwd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_link1(void)
01230de017cd273de41143d88e9c18df1243ae8aTimo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *old_dir, *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_realpath_to(link1, "/", &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, tmpdir);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* .../link1/link1/child */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_realpath_to(t_strconcat(link1, "/link1/child", NULL),
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen "/", &npath, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert_strcmp(npath, t_strconcat(tmpdir, "/child", NULL));
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* relative link1/link1/child */
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (t_get_working_dir(&old_dir, &error) < 0)
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen i_fatal("t_get_working_dir() failed: %s", error);
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen if (chdir(tmpdir) < 0)
78fa3c578c14ee8a612f86cf73b6181c7f16463fTimo Sirainen i_fatal("chdir(%s) failed: %m", tmpdir);
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen test_assert(t_realpath(t_strconcat("link1", "/link1/child", NULL),
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen &npath, &error) == 0);
7487ff578435377bbeefffdbfb78ca09ed1292dfTimo Sirainen if (chdir(old_dir) < 0)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("chdir(%s) failed: %m", old_dir);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_link4(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(t_realpath_to(t_strconcat(link1, "/link4/child", NULL),
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen "/", &npath, &error) == 0);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert_strcmp(npath, t_strconcat(tmpdir, "/child", NULL));
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_link_loop(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *npath = NULL, *error = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen errno = 0;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_realpath_to(link2, "/", &npath, &error) == -1);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(errno == ELOOP);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_assert(error != NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
c6335901c67a4c9365319190a111a2168f3b06f5Timo Sirainenstatic void test_abspath_vs_normpath(void)
c6335901c67a4c9365319190a111a2168f3b06f5Timo Sirainen{
6d2b3ce2c6ef62334985ece4f0ab8b154e0e9560Timo Sirainen const char *abs = t_abspath_to("../../bin", "/usr/lib/");
6d2b3ce2c6ef62334985ece4f0ab8b154e0e9560Timo Sirainen test_assert_strcmp(abs, "/usr/lib//../../bin");
6d2b3ce2c6ef62334985ece4f0ab8b154e0e9560Timo Sirainen
6d2b3ce2c6ef62334985ece4f0ab8b154e0e9560Timo Sirainen const char *norm = NULL, *error = NULL;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_normpath_to("../../bin", "/usr///lib/", &norm, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert_strcmp(norm, "/bin");
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void create_links(const char *tmpdir)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen link1 = t_strconcat(tmpdir, "/link1", NULL);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (symlink(tmpdir, link1) < 0) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_fatal("symlink(%s, %s) failed: %m", tmpdir, link1);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *link1_child = t_strconcat(link1, "/child", NULL);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen int fd = creat(link1_child, 0600);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (fd == -1)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("creat(%s) failed: %m", link1_child);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_close_fd(&fd);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* link2 and link3 point to each other to create a loop */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen link2 = t_strconcat(tmpdir, "/link2", NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen link3 = t_strconcat(tmpdir, "/link3", NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (symlink(link3, link2) < 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("symlink(%s, %s) failed: %m", link3, link2);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (symlink(link2, link3) < 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("symlink(%s, %s) failed: %m", link2, link3);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* link4 points to link1 */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen link4 = t_strconcat(tmpdir, "/link4", NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (symlink("link1", link4) < 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_fatal("symlink(link1, %s) failed: %m", link4);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen }
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_link_alloc(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen#define COMPONENT_COMPONENT "/component-component"
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *o_tmpdir;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* idea here is to make sure component-component
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen would optimally hit to the nearest_power value.
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen it has to be big enough to cause requirement for
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen allocation in t_realpath. */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen string_t *basedir = t_str_new(256);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen str_append(basedir, cwd);
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen str_append(basedir, "/"TEMP_DIRNAME);
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen size_t len = nearest_power(I_MAX(127, str_len(basedir) + strlen(COMPONENT_COMPONENT) + 1)) -
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen strlen(COMPONENT_COMPONENT);
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen
d39a04db2f4d0599cb9b5f03a9aa10a3c234453cTimo Sirainen while(str_len(basedir) < len) {
17fe695b985e9d6e9dc39c05b24e6b3c3b7e1ba1Timo Sirainen str_append(basedir, COMPONENT_COMPONENT);
17fe695b985e9d6e9dc39c05b24e6b3c3b7e1ba1Timo Sirainen (void)mkdir(str_c(basedir), 0700);
17fe695b985e9d6e9dc39c05b24e6b3c3b7e1ba1Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen o_tmpdir = tmpdir;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tmpdir = str_c(basedir);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen create_links(tmpdir);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_link1();
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen test_link_loop();
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen tmpdir = o_tmpdir;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen}
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void test_cleanup(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen{
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const char *error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (unlink_directory(tmpdir, UNLINK_DIRECTORY_FLAG_RMDIR, &error) < 0)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_error("unlink_directory() failed: %s", error);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenstatic void test_init(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen const char *error;
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_assert(t_get_working_dir(&cwd, &error) == 0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen tmpdir = t_strconcat(cwd, "/"TEMP_DIRNAME, NULL);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_cleanup();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen if (mkdir(tmpdir, 0700) < 0) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen i_fatal("mkdir: %m");
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen }
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen create_links(tmpdir);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenvoid test_path_util(void)
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen{
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_begin("test_path_util");
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen alarm(20);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_init();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_local_path();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_absolute_path_no_change();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_travel_to_root();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_extra_slashes();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_nonexistent_path();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_relative_dotdot();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_link1();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_link4();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_link_loop();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_abspath_vs_normpath();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_link_alloc();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_cleanup();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen alarm(0);
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen test_end();
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen}
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen