Branch data Line data Source code
1 : : /*
2 : : * Copyright (C) 2010-2014 Joel Rosdahl
3 : : *
4 : : * This program is free software; you can redistribute it and/or modify it
5 : : * under the terms of the GNU General Public License as published by the Free
6 : : * Software Foundation; either version 3 of the License, or (at your option)
7 : : * any later version.
8 : : *
9 : : * This program is distributed in the hope that it will be useful, but WITHOUT
10 : : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 : : * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 : : * more details.
13 : : *
14 : : * You should have received a copy of the GNU General Public License along with
15 : : * this program; if not, write to the Free Software Foundation, Inc., 51
16 : : * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 : : */
18 : :
19 : : /*
20 : : * This file contains tests for functions in util.c.
21 : : */
22 : :
23 : : #include "ccache.h"
24 : : #include "test/framework.h"
25 : :
26 : 1 : TEST_SUITE(util)
27 : :
28 [ + - ]: 1 : TEST(basename)
29 : : {
30 [ - + ]: 1 : CHECK_STR_EQ_FREE2("foo.c", basename("foo.c"));
31 [ - + ]: 1 : CHECK_STR_EQ_FREE2("foo.c", basename("dir1/dir2/foo.c"));
32 [ - + ]: 1 : CHECK_STR_EQ_FREE2("foo.c", basename("/dir/foo.c"));
33 [ - + ]: 1 : CHECK_STR_EQ_FREE2("", basename("dir1/dir2/"));
34 : : }
35 : :
36 [ + - ]: 1 : TEST(dirname)
37 : : {
38 [ - + ]: 1 : CHECK_STR_EQ_FREE2(".", dirname("foo.c"));
39 [ - + ]: 1 : CHECK_STR_EQ_FREE2(".", dirname(""));
40 [ - + ]: 1 : CHECK_STR_EQ_FREE2("/", dirname("/"));
41 [ - + ]: 1 : CHECK_STR_EQ_FREE2("/", dirname("/foo.c"));
42 [ - + ]: 1 : CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/foo.c"));
43 [ - + ]: 1 : CHECK_STR_EQ_FREE2("/dir", dirname("/dir/foo.c"));
44 [ - + ]: 1 : CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/"));
45 : : }
46 : :
47 [ + - ]: 1 : TEST(common_dir_prefix_length)
48 : : {
49 [ - + ]: 1 : CHECK_INT_EQ(0, common_dir_prefix_length("", ""));
50 [ - + ]: 1 : CHECK_INT_EQ(0, common_dir_prefix_length("/", "/"));
51 [ - + ]: 1 : CHECK_INT_EQ(0, common_dir_prefix_length("/", "/b"));
52 [ - + ]: 1 : CHECK_INT_EQ(0, common_dir_prefix_length("/a", "/b"));
53 [ - + ]: 1 : CHECK_INT_EQ(2, common_dir_prefix_length("/a", "/a"));
54 [ - + ]: 1 : CHECK_INT_EQ(2, common_dir_prefix_length("/a", "/a/b"));
55 [ - + ]: 1 : CHECK_INT_EQ(2, common_dir_prefix_length("/a/b", "/a/c"));
56 [ - + ]: 1 : CHECK_INT_EQ(4, common_dir_prefix_length("/a/b", "/a/b"));
57 [ - + ]: 1 : CHECK_INT_EQ(2, common_dir_prefix_length("/a/bc", "/a/b"));
58 [ - + ]: 1 : CHECK_INT_EQ(2, common_dir_prefix_length("/a/b", "/a/bc"));
59 : : }
60 : :
61 [ + - ]: 1 : TEST(get_relative_path)
62 : : {
63 [ - + ]: 1 : CHECK_STR_EQ_FREE2("a", get_relative_path("/doesn't matter", "a"));
64 [ - + ]: 1 : CHECK_STR_EQ_FREE2("a/b", get_relative_path("/doesn't matter", "a/b"));
65 [ - + ]: 1 : CHECK_STR_EQ_FREE2(".", get_relative_path("/a", "/a"));
66 [ - + ]: 1 : CHECK_STR_EQ_FREE2("..", get_relative_path("/a/b", "/a"));
67 [ - + ]: 1 : CHECK_STR_EQ_FREE2("b", get_relative_path("/a", "/a/b"));
68 [ - + ]: 1 : CHECK_STR_EQ_FREE2("b/c", get_relative_path("/a", "/a/b/c"));
69 [ - + ]: 1 : CHECK_STR_EQ_FREE2("../c", get_relative_path("/a/b", "/a/c"));
70 [ - + ]: 1 : CHECK_STR_EQ_FREE2("../c/d", get_relative_path("/a/b", "/a/c/d"));
71 [ - + ]: 1 : CHECK_STR_EQ_FREE2("../../c/d", get_relative_path("/a/b/c", "/a/c/d"));
72 [ - + ]: 1 : CHECK_STR_EQ_FREE2("../..", get_relative_path("/a/b", "/"));
73 [ - + ]: 1 : CHECK_STR_EQ_FREE2("../../c", get_relative_path("/a/b", "/c"));
74 [ - + ]: 1 : CHECK_STR_EQ_FREE2("a/b", get_relative_path("/", "/a/b"));
75 : : }
76 : :
77 [ + - ]: 1 : TEST(format_hash_as_string)
78 : : {
79 : : unsigned char hash[16] = {
80 : 1 : "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"};
81 : :
82 [ - + ]: 1 : CHECK_STR_EQ_FREE2("00000000000000000000000000000000",
83 : : format_hash_as_string(hash, -1));
84 [ - + ]: 1 : CHECK_STR_EQ_FREE2("00000000000000000000000000000000-0",
85 : : format_hash_as_string(hash, 0));
86 : 1 : hash[0] = 17;
87 : 1 : hash[15] = 42;
88 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1100000000000000000000000000002a-12345",
89 : : format_hash_as_string(hash, 12345));
90 : : }
91 : :
92 [ + - ]: 1 : TEST(subst_env_in_string)
93 : : {
94 : : char *errmsg;
95 : 1 : const char *shell = getenv("SHELL");
96 : :
97 : 1 : errmsg = "";
98 [ - + ]: 1 : CHECK_STR_EQ_FREE2(shell,
99 : : subst_env_in_string("$SHELL", &errmsg));
100 [ + - ]: 1 : CHECK(!errmsg);
101 : :
102 : 1 : errmsg = "";
103 [ - + ]: 1 : CHECK_STR_EQ_FREE2("$",
104 : : subst_env_in_string("$", &errmsg));
105 [ + - ]: 1 : CHECK(!errmsg);
106 : :
107 : 1 : errmsg = "";
108 [ - + ]: 1 : CHECK_STR_EQ_FREE12(format("%s %s:%s", shell, shell, shell),
109 : : subst_env_in_string("$SHELL $SHELL:$SHELL", &errmsg));
110 [ + - ]: 1 : CHECK(!errmsg);
111 : :
112 : 1 : errmsg = "";
113 [ - + ]: 1 : CHECK_STR_EQ_FREE12(format("x%s", shell),
114 : : subst_env_in_string("x$SHELL", &errmsg));
115 [ + - ]: 1 : CHECK(!errmsg);
116 : :
117 : 1 : errmsg = "";
118 [ - + ]: 1 : CHECK_STR_EQ_FREE12(format("%sx", shell),
119 : : subst_env_in_string("${SHELL}x", &errmsg));
120 [ + - ]: 1 : CHECK(!errmsg);
121 : :
122 [ + - ]: 1 : CHECK(!subst_env_in_string("$surelydoesntexist", &errmsg));
123 [ - + ]: 1 : CHECK_STR_EQ_FREE2("environment variable \"surelydoesntexist\" not set",
124 : : errmsg);
125 : :
126 [ + - ]: 1 : CHECK(!subst_env_in_string("${SHELL", &errmsg));
127 [ - + ]: 1 : CHECK_STR_EQ_FREE2("syntax error: missing '}' after \"SHELL\"", errmsg);
128 : : }
129 : :
130 [ + - ]: 1 : TEST(format_human_readable_size)
131 : : {
132 [ - + ]: 1 : CHECK_STR_EQ_FREE2("0.0 kB", format_human_readable_size(0));
133 [ - + ]: 1 : CHECK_STR_EQ_FREE2("0.0 kB", format_human_readable_size(49));
134 [ - + ]: 1 : CHECK_STR_EQ_FREE2("0.1 kB", format_human_readable_size(50));
135 [ - + ]: 1 : CHECK_STR_EQ_FREE2("42.0 kB", format_human_readable_size(42 * 1000));
136 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1.0 MB", format_human_readable_size(1000 * 1000));
137 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1.2 MB", format_human_readable_size(1234 * 1000));
138 [ - + ]: 1 : CHECK_STR_EQ_FREE2("438.5 MB",
139 : : format_human_readable_size(438.5 * 1000 * 1000));
140 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1.0 GB",
141 : : format_human_readable_size(1000 * 1000 * 1000));
142 [ - + ]: 1 : CHECK_STR_EQ_FREE2("17.1 GB",
143 : : format_human_readable_size(17.11 * 1000 * 1000 * 1000));
144 : : }
145 : :
146 [ + - ]: 1 : TEST(format_parsable_size_with_suffix)
147 : : {
148 [ - + ]: 1 : CHECK_STR_EQ_FREE2("0", format_parsable_size_with_suffix(0));
149 [ - + ]: 1 : CHECK_STR_EQ_FREE2("42.0k", format_parsable_size_with_suffix(42 * 1000));
150 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1.0M", format_parsable_size_with_suffix(1000 * 1000));
151 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1.2M", format_parsable_size_with_suffix(1234 * 1000));
152 [ - + ]: 1 : CHECK_STR_EQ_FREE2("438.5M",
153 : : format_parsable_size_with_suffix(438.5 * 1000 * 1000));
154 [ - + ]: 1 : CHECK_STR_EQ_FREE2("1.0G",
155 : : format_parsable_size_with_suffix(1000 * 1000 * 1000));
156 [ - + ]: 1 : CHECK_STR_EQ_FREE2(
157 : : "17.1G",
158 : : format_parsable_size_with_suffix(17.11 * 1000 * 1000 * 1000));
159 : : }
160 : :
161 [ + - ]: 1 : TEST(parse_size_with_suffix)
162 : : {
163 : : uint64_t size;
164 : : size_t i;
165 : : struct { const char *size; int64_t expected; } sizes[] = {
166 : : {"0", 0},
167 : : {"42", (int64_t)42 * 1000 * 1000 * 1000}, /* Default suffix: G */
168 : :
169 : : {"78k", 78 * 1000},
170 : : {"78K", 78 * 1000},
171 : : {"1.1 M", 1.1 * 1000 * 1000},
172 : : {"438.55M", 438.55 * 1000 * 1000},
173 : : {"1 G", 1 * 1000 * 1000 * 1000},
174 : : {"2T", (int64_t)2 * 1000 * 1000 * 1000 * 1000},
175 : :
176 : : {"78 Ki", 78 * 1024},
177 : : {"1.1Mi", 1.1 * 1024 * 1024},
178 : : {"438.55 Mi", 438.55 * 1024 * 1024},
179 : : {"1Gi", 1 * 1024 * 1024 * 1024},
180 : : {"2 Ti", (int64_t)2 * 1024 * 1024 * 1024 * 1024},
181 : :
182 : 1 : };
183 : :
184 [ + + ]: 14 : for (i = 0; i < sizeof(sizes) / sizeof(sizes[0]); ++i) {
185 [ + - ]: 13 : CHECKM(parse_size_with_suffix(sizes[i].size, &size), sizes[i].size);
186 [ - + ]: 13 : CHECK_INT_EQ(sizes[i].expected, size);
187 : : }
188 : : }
189 : :
190 : 1 : TEST_SUITE_END
|