1 // Copyright (C) 2010-2016 Joel Rosdahl
3 // This program is free software; you can redistribute it and/or modify it
4 // under the terms of the GNU General Public License as published by the Free
5 // Software Foundation; either version 3 of the License, or (at your option)
8 // This program is distributed in the hope that it will be useful, but WITHOUT
9 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 // You should have received a copy of the GNU General Public License along with
14 // this program; if not, write to the Free Software Foundation, Inc., 51
15 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 // This file contains tests for functions in util.c.
19 #include "../ccache.h"
20 #include "framework.h"
26 CHECK_STR_EQ_FREE2("foo.c", basename("foo.c"));
27 CHECK_STR_EQ_FREE2("foo.c", basename("dir1/dir2/foo.c"));
28 CHECK_STR_EQ_FREE2("foo.c", basename("/dir/foo.c"));
29 CHECK_STR_EQ_FREE2("", basename("dir1/dir2/"));
34 CHECK_STR_EQ_FREE2(".", dirname("foo.c"));
35 CHECK_STR_EQ_FREE2(".", dirname(""));
36 CHECK_STR_EQ_FREE2("/", dirname("/"));
37 CHECK_STR_EQ_FREE2("/", dirname("/foo.c"));
38 CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/foo.c"));
39 CHECK_STR_EQ_FREE2("/dir", dirname("/dir/foo.c"));
40 CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/"));
43 TEST(common_dir_prefix_length)
45 CHECK_INT_EQ(0, common_dir_prefix_length("", ""));
46 CHECK_INT_EQ(0, common_dir_prefix_length("/", "/"));
47 CHECK_INT_EQ(0, common_dir_prefix_length("/", "/b"));
48 CHECK_INT_EQ(0, common_dir_prefix_length("/a", "/b"));
49 CHECK_INT_EQ(2, common_dir_prefix_length("/a", "/a"));
50 CHECK_INT_EQ(2, common_dir_prefix_length("/a", "/a/b"));
51 CHECK_INT_EQ(2, common_dir_prefix_length("/a/b", "/a/c"));
52 CHECK_INT_EQ(4, common_dir_prefix_length("/a/b", "/a/b"));
53 CHECK_INT_EQ(2, common_dir_prefix_length("/a/bc", "/a/b"));
54 CHECK_INT_EQ(2, common_dir_prefix_length("/a/b", "/a/bc"));
57 TEST(get_relative_path)
60 CHECK_STR_EQ_FREE2("a", get_relative_path("C:/doesn't matter", "a"));
61 CHECK_STR_EQ_FREE2("a/b", get_relative_path("C:/doesn't matter", "a/b"));
62 CHECK_STR_EQ_FREE2(".", get_relative_path("C:/a", "C:/a"));
63 CHECK_STR_EQ_FREE2("..", get_relative_path("C:/a/b", "C:/a"));
64 CHECK_STR_EQ_FREE2("b", get_relative_path("C:/a", "C:/a/b"));
65 CHECK_STR_EQ_FREE2("b/c", get_relative_path("C:/a", "C:/a/b/c"));
66 CHECK_STR_EQ_FREE2("../c", get_relative_path("C:/a/b", "C:/a/c"));
67 CHECK_STR_EQ_FREE2("../c/d", get_relative_path("C:/a/b", "C:/a/c/d"));
68 CHECK_STR_EQ_FREE2("../../c/d", get_relative_path("C:/a/b/c", "C:/a/c/d"));
69 CHECK_STR_EQ_FREE2("../..", get_relative_path("C:/a/b", "C:/"));
70 CHECK_STR_EQ_FREE2("../../c", get_relative_path("C:/a/b", "C:/c"));
71 CHECK_STR_EQ_FREE2("a/b", get_relative_path("C:/", "C:/a/b"));
73 CHECK_STR_EQ_FREE2("a", get_relative_path("/doesn't matter", "a"));
74 CHECK_STR_EQ_FREE2("a/b", get_relative_path("/doesn't matter", "a/b"));
75 CHECK_STR_EQ_FREE2(".", get_relative_path("/a", "/a"));
76 CHECK_STR_EQ_FREE2("..", get_relative_path("/a/b", "/a"));
77 CHECK_STR_EQ_FREE2("b", get_relative_path("/a", "/a/b"));
78 CHECK_STR_EQ_FREE2("b/c", get_relative_path("/a", "/a/b/c"));
79 CHECK_STR_EQ_FREE2("../c", get_relative_path("/a/b", "/a/c"));
80 CHECK_STR_EQ_FREE2("../c/d", get_relative_path("/a/b", "/a/c/d"));
81 CHECK_STR_EQ_FREE2("../../c/d", get_relative_path("/a/b/c", "/a/c/d"));
82 CHECK_STR_EQ_FREE2("../..", get_relative_path("/a/b", "/"));
83 CHECK_STR_EQ_FREE2("../../c", get_relative_path("/a/b", "/c"));
84 CHECK_STR_EQ_FREE2("a/b", get_relative_path("/", "/a/b"));
88 TEST(format_hash_as_string)
90 unsigned char hash[16] = {
91 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
94 CHECK_STR_EQ_FREE2("00000000000000000000000000000000",
95 format_hash_as_string(hash, -1));
96 CHECK_STR_EQ_FREE2("00000000000000000000000000000000-0",
97 format_hash_as_string(hash, 0));
100 CHECK_STR_EQ_FREE2("1100000000000000000000000000002a-12345",
101 format_hash_as_string(hash, 12345));
104 TEST(subst_env_in_string)
110 CHECK_STR_EQ_FREE2("bar",
111 subst_env_in_string("$FOO", &errmsg));
115 CHECK_STR_EQ_FREE2("$",
116 subst_env_in_string("$", &errmsg));
120 CHECK_STR_EQ_FREE2("bar bar:bar",
121 subst_env_in_string("$FOO $FOO:$FOO", &errmsg));
125 CHECK_STR_EQ_FREE2("xbar",
126 subst_env_in_string("x$FOO", &errmsg));
130 CHECK_STR_EQ_FREE2("barx",
131 subst_env_in_string("${FOO}x", &errmsg));
134 CHECK(!subst_env_in_string("$surelydoesntexist", &errmsg));
135 CHECK_STR_EQ_FREE2("environment variable \"surelydoesntexist\" not set",
138 CHECK(!subst_env_in_string("${FOO", &errmsg));
139 CHECK_STR_EQ_FREE2("syntax error: missing '}' after \"FOO\"", errmsg);
142 TEST(format_human_readable_size)
144 CHECK_STR_EQ_FREE2("0.0 kB", format_human_readable_size(0));
145 CHECK_STR_EQ_FREE2("0.0 kB", format_human_readable_size(49));
146 CHECK_STR_EQ_FREE2("0.1 kB", format_human_readable_size(50));
147 CHECK_STR_EQ_FREE2("42.0 kB", format_human_readable_size(42 * 1000));
148 CHECK_STR_EQ_FREE2("1.0 MB", format_human_readable_size(1000 * 1000));
149 CHECK_STR_EQ_FREE2("1.2 MB", format_human_readable_size(1234 * 1000));
150 CHECK_STR_EQ_FREE2("438.5 MB",
151 format_human_readable_size(438.5 * 1000 * 1000));
152 CHECK_STR_EQ_FREE2("1.0 GB",
153 format_human_readable_size(1000 * 1000 * 1000));
154 CHECK_STR_EQ_FREE2("17.1 GB",
155 format_human_readable_size(17.11 * 1000 * 1000 * 1000));
158 TEST(format_parsable_size_with_suffix)
160 CHECK_STR_EQ_FREE2("0", format_parsable_size_with_suffix(0));
161 CHECK_STR_EQ_FREE2("42.0k", format_parsable_size_with_suffix(42 * 1000));
162 CHECK_STR_EQ_FREE2("1.0M", format_parsable_size_with_suffix(1000 * 1000));
163 CHECK_STR_EQ_FREE2("1.2M", format_parsable_size_with_suffix(1234 * 1000));
164 CHECK_STR_EQ_FREE2("438.5M",
165 format_parsable_size_with_suffix(438.5 * 1000 * 1000));
166 CHECK_STR_EQ_FREE2("1.0G",
167 format_parsable_size_with_suffix(1000 * 1000 * 1000));
170 format_parsable_size_with_suffix(17.11 * 1000 * 1000 * 1000));
173 TEST(parse_size_with_suffix)
177 struct { const char *size; int64_t expected; } sizes[] = {
179 {"42", (int64_t)42 * 1000 * 1000 * 1000}, // Default suffix: G
183 {"1.1 M", 1.1 * 1000 * 1000},
184 {"438.55M", 438.55 * 1000 * 1000},
185 {"1 G", 1 * 1000 * 1000 * 1000},
186 {"2T", (int64_t)2 * 1000 * 1000 * 1000 * 1000},
188 {"78 Ki", 78 * 1024},
189 {"1.1Mi", 1.1 * 1024 * 1024},
190 {"438.55 Mi", 438.55 * 1024 * 1024},
191 {"1Gi", 1 * 1024 * 1024 * 1024},
192 {"2 Ti", (int64_t)2 * 1024 * 1024 * 1024 * 1024},
196 for (i = 0; i < sizeof(sizes) / sizeof(sizes[0]); ++i) {
197 CHECKM(parse_size_with_suffix(sizes[i].size, &size), sizes[i].size);
198 CHECK_INT_EQ(sizes[i].expected, size);