1 /*
2 lib - realpath
3
4 Copyright (C) 2017-2025
5 Free Software Foundation, Inc.
6
7 Written by:
8 Andrew Borodin <aborodin@vmail.ru>, 2017
9
10 This file is part of the Midnight Commander.
11
12 The Midnight Commander is free software: you can redistribute it
13 and/or modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation, either version 3 of the License,
15 or (at your option) any later version.
16
17 The Midnight Commander is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
26 #define TEST_SUITE_NAME "/lib/util"
27
28 #include "tests/mctest.h"
29
30 #include "lib/strutil.h"
31 #include "lib/vfs/vfs.h" // VFS_ENCODING_PREFIX, vfs_init(), vfs_shut()
32 #include "src/vfs/local/local.c"
33
34 #include "lib/util.h" // mc_realpath()
35
36 /* --------------------------------------------------------------------------------------------- */
37
38 static char resolved_path[PATH_MAX];
39
40 /* --------------------------------------------------------------------------------------------- */
41
42 /* @Before */
43 static void
44 setup (void)
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
45 {
46 str_init_strings (NULL);
47 vfs_init ();
48 vfs_init_localfs ();
49 vfs_setup_work_dir ();
50 }
51
52 /* @After */
53 static void
54 teardown (void)
/* ![[previous]](../icons/left.png)
![[next]](../icons/right.png)
![[first]](../icons/first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
55 {
56 vfs_shut ();
57 str_uninit_strings ();
58 }
59
60 /* --------------------------------------------------------------------------------------------- */
61
62 /* @DataSource("data_source") */
63 static const struct data_source
64 {
65 const char *input_string;
66 const char *expected_string;
67 } data_source[] = {
68 // absolute paths
69 { "/", "/" },
70 { "/usr/bin", "/usr/bin" },
71 { "/" VFS_ENCODING_PREFIX "UTF-8/", "/" },
72 { "/" VFS_ENCODING_PREFIX "UTF-8/usr/bin", "/usr/bin" },
73
74 // relative paths are relative to /
75 { "usr/bin", "/usr/bin" },
76 { VFS_ENCODING_PREFIX "UTF-8/", "/" },
77 { VFS_ENCODING_PREFIX "UTF-8/usr/bin", "/usr/bin" },
78 };
79
80 /* @Test(dataSource = "data_source") */
81 START_PARAMETRIZED_TEST (realpath_test, data_source)
/* ![[previous]](../icons/left.png)
![[next]](../icons/right.png)
![[first]](../icons/first.png)
![[last]](../icons/last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
82 {
83 int ret;
84
85 /* realpath(3) produces a canonicalized absolute pathname using current directory.
86 * Change the current directory to produce correct pathname. */
87 ret = chdir ("/");
88
89 // when
90 if (mc_realpath (data->input_string, resolved_path) == NULL)
91 resolved_path[0] = '\0';
92
93 // then
94 mctest_assert_str_eq (resolved_path, data->expected_string);
95
96 (void) ret;
97 }
98 END_PARAMETRIZED_TEST
99
100 /* --------------------------------------------------------------------------------------------- */
101
102 int
103 main (void)
/* ![[previous]](../icons/left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
104 {
105 TCase *tc_core;
106 char *cwd;
107
108 tc_core = tcase_create ("Core");
109
110 // writable directory where check creates temporary files
111 cwd = my_get_current_dir ();
112 g_setenv ("TEMP", cwd, TRUE);
113 g_free (cwd);
114
115 tcase_add_checked_fixture (tc_core, setup, teardown);
116
117 // Add new tests here: ***************
118 mctest_add_parameterized_test (tc_core, realpath_test, data_source);
119 // ***********************************
120
121 return mctest_run_all (tc_core);
122 }
123
124 /* --------------------------------------------------------------------------------------------- */