Line data Source code
1 : /*
2 : * Unix SMB/CIFS implementation.
3 : *
4 : * Copyright (C) 2020 Andreas Schneider <asn@samba.org>
5 : *
6 : * This program is free software; you can redistribute it and/or modify
7 : * it under the terms of the GNU General Public License as published by
8 : * the Free Software Foundation; either version 3 of the License, or
9 : * (at your option) any later version.
10 : *
11 : * This program is distributed in the hope that it will be useful,
12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : * GNU General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License
17 : * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include <stdarg.h>
21 : #include <stddef.h>
22 : #include <stdint.h>
23 : #include <setjmp.h>
24 : #include <cmocka.h>
25 :
26 : #include "lib/replace/replace.h"
27 : #include <talloc.h>
28 :
29 : #include "lib/util/util_paths.c"
30 :
31 1 : static int setup(void **state)
32 : {
33 1 : TALLOC_CTX *mem_ctx = talloc_new(NULL);
34 :
35 1 : assert_non_null(mem_ctx);
36 1 : *state = mem_ctx;
37 :
38 1 : return 0;
39 : }
40 :
41 1 : static int teardown(void **state)
42 : {
43 1 : TALLOC_CTX *mem_ctx = *state;
44 1 : TALLOC_FREE(mem_ctx);
45 :
46 1 : return 0;
47 : }
48 :
49 1 : static void test_get_user_home_dir(void **state)
50 : {
51 1 : TALLOC_CTX *mem_ctx = *state;
52 1 : struct passwd *pwd = getpwuid(getuid());
53 : char *user;
54 :
55 1 : user = get_user_home_dir(mem_ctx);
56 1 : assert_non_null(user);
57 1 : assert_string_equal(user, pwd->pw_dir);
58 :
59 1 : TALLOC_FREE(user);
60 1 : }
61 :
62 1 : static void test_path_expand_tilde(void **state)
63 : {
64 1 : TALLOC_CTX *mem_ctx = *state;
65 1 : char h[256] = {0};
66 1 : char *d = NULL;
67 1 : const char *user = NULL;
68 1 : char *home = NULL;
69 :
70 1 : user = getenv("USER");
71 1 : if (user == NULL){
72 0 : user = getenv("LOGNAME");
73 : }
74 :
75 : /* In certain CIs there no such variables */
76 1 : if (user == NULL) {
77 0 : struct passwd *pw = getpwuid(getuid());
78 0 : if (pw){
79 0 : user = pw->pw_name;
80 : }
81 : }
82 :
83 1 : home = getenv("HOME");
84 1 : assert_non_null(home);
85 1 : snprintf(h, sizeof(h), "%s/.cache", home);
86 :
87 1 : d = path_expand_tilde(mem_ctx, "~/.cache");
88 1 : assert_non_null(d);
89 1 : assert_string_equal(d, h);
90 1 : TALLOC_FREE(d);
91 :
92 1 : snprintf(h, sizeof(h), "%s/.cache/X~", home);
93 1 : d = path_expand_tilde(mem_ctx, "~/.cache/X~");
94 1 : assert_string_equal(d, h);
95 1 : TALLOC_FREE(d);
96 :
97 1 : d = path_expand_tilde(mem_ctx, "/guru/meditation");
98 1 : assert_non_null(d);
99 1 : assert_string_equal(d, "/guru/meditation");
100 1 : TALLOC_FREE(d);
101 :
102 1 : snprintf(h, sizeof(h), "~%s/.cache", user);
103 1 : d = path_expand_tilde(mem_ctx, h);
104 1 : assert_non_null(d);
105 :
106 1 : snprintf(h, sizeof(h), "%s/.cache", home);
107 1 : assert_string_equal(d, h);
108 1 : TALLOC_FREE(d);
109 1 : }
110 :
111 1 : int main(int argc, char *argv[])
112 : {
113 : int rc;
114 1 : const struct CMUnitTest tests[] = {
115 : cmocka_unit_test(test_get_user_home_dir),
116 : cmocka_unit_test(test_path_expand_tilde),
117 : };
118 :
119 1 : if (argc == 2) {
120 0 : cmocka_set_test_filter(argv[1]);
121 : }
122 1 : cmocka_set_message_output(CM_OUTPUT_SUBUNIT);
123 :
124 1 : rc = cmocka_run_group_tests(tests, setup, teardown);
125 :
126 : return rc;
127 : }
|