xref: /aosp_15_r20/bionic/tests/glob_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <glob.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker #include <dirent.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
21*8d67ca89SAndroid Build Coastguard Worker 
22*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
23*8d67ca89SAndroid Build Coastguard Worker 
24*8d67ca89SAndroid Build Coastguard Worker #include <string>
25*8d67ca89SAndroid Build Coastguard Worker #include <vector>
26*8d67ca89SAndroid Build Coastguard Worker 
27*8d67ca89SAndroid Build Coastguard Worker #include <android-base/file.h>
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
30*8d67ca89SAndroid Build Coastguard Worker #define ASSERT_MATCH_COUNT(n_,g_) ASSERT_EQ(n_, g_.gl_matchc)
31*8d67ca89SAndroid Build Coastguard Worker #else
32*8d67ca89SAndroid Build Coastguard Worker #define ASSERT_MATCH_COUNT(n_,g_)
33*8d67ca89SAndroid Build Coastguard Worker #endif
34*8d67ca89SAndroid Build Coastguard Worker 
35*8d67ca89SAndroid Build Coastguard Worker //
36*8d67ca89SAndroid Build Coastguard Worker // Helper for use with GLOB_ALTDIRFUNC to iterate over the elements of `fake_dir`.
37*8d67ca89SAndroid Build Coastguard Worker //
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
40*8d67ca89SAndroid Build Coastguard Worker static std::vector<std::string> fake_dir;
41*8d67ca89SAndroid Build Coastguard Worker static size_t fake_dir_offset;
fake_closedir(void *)42*8d67ca89SAndroid Build Coastguard Worker static void fake_closedir(void*) {
43*8d67ca89SAndroid Build Coastguard Worker }
fake_readdir(void *)44*8d67ca89SAndroid Build Coastguard Worker static dirent* fake_readdir(void*) {
45*8d67ca89SAndroid Build Coastguard Worker   static dirent d;
46*8d67ca89SAndroid Build Coastguard Worker   if (fake_dir_offset >= fake_dir.size()) return nullptr;
47*8d67ca89SAndroid Build Coastguard Worker   strcpy(d.d_name, fake_dir[fake_dir_offset++].c_str());
48*8d67ca89SAndroid Build Coastguard Worker   return &d;
49*8d67ca89SAndroid Build Coastguard Worker }
fake_opendir(const char * path)50*8d67ca89SAndroid Build Coastguard Worker static void* fake_opendir(const char* path) {
51*8d67ca89SAndroid Build Coastguard Worker   fake_dir_offset = 0;
52*8d67ca89SAndroid Build Coastguard Worker   if (strcmp(path, "/opendir-fail/") == 0) {
53*8d67ca89SAndroid Build Coastguard Worker     errno = EINVAL;
54*8d67ca89SAndroid Build Coastguard Worker     return nullptr;
55*8d67ca89SAndroid Build Coastguard Worker   }
56*8d67ca89SAndroid Build Coastguard Worker   return &fake_dir;
57*8d67ca89SAndroid Build Coastguard Worker }
fake_lstat(const char *,struct stat *)58*8d67ca89SAndroid Build Coastguard Worker static int fake_lstat(const char*, struct stat*) {
59*8d67ca89SAndroid Build Coastguard Worker   return 0;
60*8d67ca89SAndroid Build Coastguard Worker }
fake_stat(const char *,struct stat *)61*8d67ca89SAndroid Build Coastguard Worker static int fake_stat(const char*, struct stat*) {
62*8d67ca89SAndroid Build Coastguard Worker   return 0;
63*8d67ca89SAndroid Build Coastguard Worker }
InstallFake(glob_t * g)64*8d67ca89SAndroid Build Coastguard Worker static void InstallFake(glob_t* g) {
65*8d67ca89SAndroid Build Coastguard Worker   g->gl_closedir = fake_closedir;
66*8d67ca89SAndroid Build Coastguard Worker   g->gl_readdir = fake_readdir;
67*8d67ca89SAndroid Build Coastguard Worker   g->gl_opendir = fake_opendir;
68*8d67ca89SAndroid Build Coastguard Worker   g->gl_lstat = fake_lstat;
69*8d67ca89SAndroid Build Coastguard Worker   g->gl_stat = fake_stat;
70*8d67ca89SAndroid Build Coastguard Worker }
71*8d67ca89SAndroid Build Coastguard Worker #endif
72*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_result_GLOB_NOMATCH)73*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_result_GLOB_NOMATCH) {
74*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
75*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_NOMATCH, glob("/will/match/nothing", 0, nullptr, &g));
76*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0U, g.gl_pathc);
77*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(0U, g);
78*8d67ca89SAndroid Build Coastguard Worker }
79*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_APPEND)80*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_APPEND) {
81*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
82*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob("/proc/version", 0, nullptr, &g));
83*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1U, g.gl_pathc);
84*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(1U, g);
85*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("/proc/version", g.gl_pathv[0]);
86*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[1]);
87*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob("/proc/version", GLOB_APPEND, nullptr, &g));
88*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(2U, g.gl_pathc);
89*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(1U, g);
90*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("/proc/version", g.gl_pathv[0]);
91*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("/proc/version", g.gl_pathv[1]);
92*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[2]);
93*8d67ca89SAndroid Build Coastguard Worker   globfree(&g);
94*8d67ca89SAndroid Build Coastguard Worker }
95*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_DOOFFS)96*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_DOOFFS) {
97*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
98*8d67ca89SAndroid Build Coastguard Worker   g.gl_offs = 2;
99*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob("/proc/version", GLOB_DOOFFS, nullptr, &g));
100*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1U, g.gl_pathc);
101*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(1U, g);
102*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[0]);
103*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[1]);
104*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("/proc/version", g.gl_pathv[2]);
105*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[3]);
106*8d67ca89SAndroid Build Coastguard Worker   globfree(&g);
107*8d67ca89SAndroid Build Coastguard Worker }
108*8d67ca89SAndroid Build Coastguard Worker 
109*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
110*8d67ca89SAndroid Build Coastguard Worker static std::string g_failure_path;
111*8d67ca89SAndroid Build Coastguard Worker static int g_failure_errno;
112*8d67ca89SAndroid Build Coastguard Worker static int test_error_callback_result;
test_error_callback(const char * failure_path,int failure_errno)113*8d67ca89SAndroid Build Coastguard Worker static int test_error_callback(const char* failure_path, int failure_errno) {
114*8d67ca89SAndroid Build Coastguard Worker   g_failure_path = failure_path;
115*8d67ca89SAndroid Build Coastguard Worker   g_failure_errno = failure_errno;
116*8d67ca89SAndroid Build Coastguard Worker   return test_error_callback_result;
117*8d67ca89SAndroid Build Coastguard Worker }
118*8d67ca89SAndroid Build Coastguard Worker #endif
119*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_gl_errfunc)120*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_gl_errfunc) {
121*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
122*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
123*8d67ca89SAndroid Build Coastguard Worker   InstallFake(&g);
124*8d67ca89SAndroid Build Coastguard Worker 
125*8d67ca89SAndroid Build Coastguard Worker   test_error_callback_result = 0;
126*8d67ca89SAndroid Build Coastguard Worker   g_failure_errno = 0;
127*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_NOMATCH, glob("/opendir-fail/x*", GLOB_ALTDIRFUNC, test_error_callback, &g));
128*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ("/opendir-fail/", g_failure_path);
129*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(EINVAL, g_failure_errno);
130*8d67ca89SAndroid Build Coastguard Worker 
131*8d67ca89SAndroid Build Coastguard Worker   test_error_callback_result = 1;
132*8d67ca89SAndroid Build Coastguard Worker   g_failure_errno = 0;
133*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_ABORTED, glob("/opendir-fail/x*", GLOB_ALTDIRFUNC, test_error_callback, &g));
134*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ("/opendir-fail/", g_failure_path);
135*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(EINVAL, g_failure_errno);
136*8d67ca89SAndroid Build Coastguard Worker #else
137*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't support GLOB_ALTDIRFUNC";
138*8d67ca89SAndroid Build Coastguard Worker #endif
139*8d67ca89SAndroid Build Coastguard Worker }
140*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_ERR)141*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_ERR) {
142*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
143*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
144*8d67ca89SAndroid Build Coastguard Worker   InstallFake(&g);
145*8d67ca89SAndroid Build Coastguard Worker 
146*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_NOMATCH, glob("/opendir-fail/x*", GLOB_ALTDIRFUNC, nullptr, &g));
147*8d67ca89SAndroid Build Coastguard Worker 
148*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_ABORTED, glob("/opendir-fail/x*", GLOB_ALTDIRFUNC | GLOB_ERR, nullptr, &g));
149*8d67ca89SAndroid Build Coastguard Worker #else
150*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't support GLOB_ALTDIRFUNC";
151*8d67ca89SAndroid Build Coastguard Worker #endif
152*8d67ca89SAndroid Build Coastguard Worker }
153*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_MARK)154*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_MARK) {
155*8d67ca89SAndroid Build Coastguard Worker   TemporaryDir td;
156*8d67ca89SAndroid Build Coastguard Worker   // The pattern we're about to pass doesn't have a trailing '/'...
157*8d67ca89SAndroid Build Coastguard Worker   ASSERT_NE('/', std::string(td.path).back());
158*8d67ca89SAndroid Build Coastguard Worker 
159*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
160*8d67ca89SAndroid Build Coastguard Worker   // Using GLOB_MARK gets you a trailing '/' on a directory...
161*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob(td.path, GLOB_MARK, nullptr, &g));
162*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1U, g.gl_pathc);
163*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(1U, g);
164*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(std::string(td.path) + "/", g.gl_pathv[0]);
165*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[1]);
166*8d67ca89SAndroid Build Coastguard Worker 
167*8d67ca89SAndroid Build Coastguard Worker   TemporaryFile tf;
168*8d67ca89SAndroid Build Coastguard Worker   // But not on a file...
169*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob(tf.path, GLOB_MARK, nullptr, &g));
170*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1U, g.gl_pathc);
171*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(1U, g);
172*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ(tf.path, g.gl_pathv[0]);
173*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[1]);
174*8d67ca89SAndroid Build Coastguard Worker 
175*8d67ca89SAndroid Build Coastguard Worker   globfree(&g);
176*8d67ca89SAndroid Build Coastguard Worker }
177*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_NOCHECK)178*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_NOCHECK) {
179*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
180*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob("/will/match/nothing", GLOB_NOCHECK, nullptr, &g));
181*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(1U, g.gl_pathc);
182*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(0U, g);
183*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("/will/match/nothing", g.gl_pathv[0]);
184*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[1]);
185*8d67ca89SAndroid Build Coastguard Worker   globfree(&g);
186*8d67ca89SAndroid Build Coastguard Worker }
187*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_NOSORT)188*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_NOSORT) {
189*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
190*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { "c", "a", "d", "b" };
191*8d67ca89SAndroid Build Coastguard Worker 
192*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
193*8d67ca89SAndroid Build Coastguard Worker   InstallFake(&g);
194*8d67ca89SAndroid Build Coastguard Worker 
195*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob("*", GLOB_ALTDIRFUNC, nullptr, &g));
196*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(4U, g.gl_pathc);
197*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(4U, g);
198*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("a", g.gl_pathv[0]);
199*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("b", g.gl_pathv[1]);
200*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("c", g.gl_pathv[2]);
201*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("d", g.gl_pathv[3]);
202*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[4]);
203*8d67ca89SAndroid Build Coastguard Worker 
204*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(0, glob("*", GLOB_ALTDIRFUNC | GLOB_NOSORT, nullptr, &g));
205*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(4U, g.gl_pathc);
206*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(4U, g);
207*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("c", g.gl_pathv[0]);
208*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("a", g.gl_pathv[1]);
209*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("d", g.gl_pathv[2]);
210*8d67ca89SAndroid Build Coastguard Worker   ASSERT_STREQ("b", g.gl_pathv[3]);
211*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, g.gl_pathv[4]);
212*8d67ca89SAndroid Build Coastguard Worker #else
213*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't support GLOB_ALTDIRFUNC";
214*8d67ca89SAndroid Build Coastguard Worker #endif
215*8d67ca89SAndroid Build Coastguard Worker }
216*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_GLOB_MAGCHAR)217*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_GLOB_MAGCHAR) {
218*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
219*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
220*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_NOMATCH, glob("/does-not-exist", 0, nullptr, &g));
221*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((g.gl_flags & GLOB_MAGCHAR) == 0);
222*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_NOMATCH, glob("/does-not-exist*", 0, nullptr, &g));
223*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((g.gl_flags & GLOB_MAGCHAR) != 0);
224*8d67ca89SAndroid Build Coastguard Worker 
225*8d67ca89SAndroid Build Coastguard Worker   // We can lie, but glob(3) will turn that into truth...
226*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(GLOB_NOMATCH, glob("/does-not-exist", GLOB_MAGCHAR, nullptr, &g));
227*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE((g.gl_flags & GLOB_MAGCHAR) == 0);
228*8d67ca89SAndroid Build Coastguard Worker #else
229*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't support GLOB_MAGCHAR";
230*8d67ca89SAndroid Build Coastguard Worker #endif
231*8d67ca89SAndroid Build Coastguard Worker }
232*8d67ca89SAndroid Build Coastguard Worker 
233*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
CheckGlob(const char * pattern,const std::vector<std::string> & expected_matches)234*8d67ca89SAndroid Build Coastguard Worker static void CheckGlob(const char* pattern, const std::vector<std::string>& expected_matches) {
235*8d67ca89SAndroid Build Coastguard Worker   glob_t g = {};
236*8d67ca89SAndroid Build Coastguard Worker   InstallFake(&g);
237*8d67ca89SAndroid Build Coastguard Worker 
238*8d67ca89SAndroid Build Coastguard Worker   int expected_result = expected_matches.empty() ? GLOB_NOMATCH : 0;
239*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(expected_result, glob(pattern, GLOB_ALTDIRFUNC, nullptr, &g)) << pattern;
240*8d67ca89SAndroid Build Coastguard Worker   ASSERT_EQ(expected_matches.size(), g.gl_pathc);
241*8d67ca89SAndroid Build Coastguard Worker   ASSERT_MATCH_COUNT(expected_matches.size(), g);
242*8d67ca89SAndroid Build Coastguard Worker   for (size_t i = 0; i < expected_matches.size(); ++i) {
243*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(expected_matches[i], g.gl_pathv[i]);
244*8d67ca89SAndroid Build Coastguard Worker   }
245*8d67ca89SAndroid Build Coastguard Worker   if (!expected_matches.empty()) {
246*8d67ca89SAndroid Build Coastguard Worker     ASSERT_EQ(nullptr, g.gl_pathv[expected_matches.size()]);
247*8d67ca89SAndroid Build Coastguard Worker   }
248*8d67ca89SAndroid Build Coastguard Worker   globfree(&g);
249*8d67ca89SAndroid Build Coastguard Worker }
250*8d67ca89SAndroid Build Coastguard Worker #endif
251*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_globbing)252*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_globbing) {
253*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
254*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { "f1", "f2", "f30", "f40" };
255*8d67ca89SAndroid Build Coastguard Worker 
256*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("f?", { "f1", "f2" });
257*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("f??", { "f30", "f40" });
258*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("f*", { "f1", "f2", "f30", "f40" });
259*8d67ca89SAndroid Build Coastguard Worker #else
260*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't support GLOB_ALTDIRFUNC";
261*8d67ca89SAndroid Build Coastguard Worker #endif
262*8d67ca89SAndroid Build Coastguard Worker }
263*8d67ca89SAndroid Build Coastguard Worker 
TEST(glob,glob_globbing_rsc)264*8d67ca89SAndroid Build Coastguard Worker TEST(glob, glob_globbing_rsc) {
265*8d67ca89SAndroid Build Coastguard Worker #if !defined(ANDROID_HOST_MUSL)
266*8d67ca89SAndroid Build Coastguard Worker   // https://research.swtch.com/glob
267*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { "axbxcxdxe" };
268*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("a*b*c*d*e*", { "axbxcxdxe" });
269*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { "axbxcxdxexxx" };
270*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("a*b*c*d*e*", { "axbxcxdxexxx" });
271*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { "abxbbxdbxebxczzx" };
272*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("a*b?c*x", { "abxbbxdbxebxczzx" });
273*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { "abxbbxdbxebxczzy" };
274*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("a*b?c*x", {});
275*8d67ca89SAndroid Build Coastguard Worker 
276*8d67ca89SAndroid Build Coastguard Worker   fake_dir = { std::string(100, 'a') };
277*8d67ca89SAndroid Build Coastguard Worker   CheckGlob("a*a*a*a*b", {});
278*8d67ca89SAndroid Build Coastguard Worker #else
279*8d67ca89SAndroid Build Coastguard Worker   GTEST_SKIP() << "musl doesn't support GLOB_ALTDIRFUNC";
280*8d67ca89SAndroid Build Coastguard Worker #endif
281*8d67ca89SAndroid Build Coastguard Worker }
282