t_refuse_opt.c revision 1.8 1 1.8 christos /* $NetBSD: t_refuse_opt.c,v 1.8 2017/01/13 21:30:41 christos Exp $ */
2 1.1 pho
3 1.1 pho /*-
4 1.2 pho * Copyright (c) 2016 The NetBSD Foundation, Inc.
5 1.1 pho * All rights reserved.
6 1.1 pho *
7 1.1 pho * Redistribution and use in source and binary forms, with or without
8 1.1 pho * modification, are permitted provided that the following conditions
9 1.1 pho * are met:
10 1.1 pho * 1. Redistributions of source code must retain the above copyright
11 1.1 pho * notice, this list of conditions and the following disclaimer.
12 1.1 pho * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 pho * notice, this list of conditions and the following disclaimer in the
14 1.1 pho * documentation and/or other materials provided with the distribution.
15 1.1 pho *
16 1.1 pho * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1 pho * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 pho * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 pho * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1 pho * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 pho * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 pho * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 pho * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 pho * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 pho * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 pho * POSSIBILITY OF SUCH DAMAGE.
27 1.1 pho */
28 1.1 pho #include <sys/cdefs.h>
29 1.8 christos __RCSID("$NetBSD: t_refuse_opt.c,v 1.8 2017/01/13 21:30:41 christos Exp $");
30 1.5 martin
31 1.5 martin #define _KERNTYPES
32 1.7 christos #include <sys/types.h>
33 1.1 pho
34 1.1 pho #include <atf-c.h>
35 1.1 pho
36 1.1 pho #include <fuse.h>
37 1.1 pho
38 1.8 christos #include "h_macros.h"
39 1.1 pho
40 1.4 pho ATF_TC(t_fuse_opt_add_arg);
41 1.4 pho ATF_TC_HEAD(t_fuse_opt_add_arg, tc)
42 1.1 pho {
43 1.1 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_arg(3) works");
44 1.1 pho }
45 1.1 pho
46 1.4 pho ATF_TC_BODY(t_fuse_opt_add_arg, tc)
47 1.1 pho {
48 1.1 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
49 1.1 pho
50 1.1 pho RZ(fuse_opt_add_arg(&args, "foo"));
51 1.1 pho RZ(fuse_opt_add_arg(&args, "bar"));
52 1.1 pho
53 1.1 pho ATF_REQUIRE_EQ(args.argc, 2);
54 1.1 pho ATF_CHECK_STREQ(args.argv[0], "foo");
55 1.1 pho ATF_CHECK_STREQ(args.argv[1], "bar");
56 1.1 pho ATF_CHECK(args.allocated != 0);
57 1.1 pho }
58 1.1 pho
59 1.4 pho ATF_TC(t_fuse_opt_insert_arg);
60 1.4 pho ATF_TC_HEAD(t_fuse_opt_insert_arg, tc)
61 1.1 pho {
62 1.1 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_insert_arg(3) works");
63 1.1 pho }
64 1.1 pho
65 1.4 pho ATF_TC_BODY(t_fuse_opt_insert_arg, tc)
66 1.1 pho {
67 1.1 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
68 1.1 pho
69 1.1 pho RZ(fuse_opt_insert_arg(&args, 0, "foo"));
70 1.1 pho RZ(fuse_opt_insert_arg(&args, 0, "bar"));
71 1.1 pho
72 1.1 pho ATF_REQUIRE_EQ(args.argc, 2);
73 1.1 pho ATF_CHECK_STREQ(args.argv[0], "bar");
74 1.1 pho ATF_CHECK_STREQ(args.argv[1], "foo");
75 1.1 pho ATF_CHECK(args.allocated != 0);
76 1.1 pho }
77 1.1 pho
78 1.4 pho ATF_TC(t_fuse_opt_add_opt);
79 1.4 pho ATF_TC_HEAD(t_fuse_opt_add_opt, tc)
80 1.1 pho {
81 1.1 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_opt(3) works");
82 1.1 pho }
83 1.1 pho
84 1.4 pho ATF_TC_BODY(t_fuse_opt_add_opt, tc)
85 1.1 pho {
86 1.1 pho char* opt = NULL;
87 1.1 pho
88 1.2 pho RZ(fuse_opt_add_opt(&opt, "fo\\o"));
89 1.2 pho ATF_CHECK_STREQ(opt, "fo\\o");
90 1.2 pho
91 1.2 pho RZ(fuse_opt_add_opt(&opt, "ba,r"));
92 1.2 pho ATF_CHECK_STREQ(opt, "fo\\o,ba,r");
93 1.2 pho }
94 1.2 pho
95 1.4 pho ATF_TC(t_fuse_opt_add_opt_escaped);
96 1.4 pho ATF_TC_HEAD(t_fuse_opt_add_opt_escaped, tc)
97 1.2 pho {
98 1.2 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_add_opt_escaped(3) works");
99 1.2 pho }
100 1.2 pho
101 1.4 pho ATF_TC_BODY(t_fuse_opt_add_opt_escaped, tc)
102 1.2 pho {
103 1.2 pho char* opt = NULL;
104 1.1 pho
105 1.2 pho RZ(fuse_opt_add_opt_escaped(&opt, "fo\\o"));
106 1.2 pho ATF_CHECK_STREQ(opt, "fo\\\\o");
107 1.1 pho
108 1.2 pho RZ(fuse_opt_add_opt_escaped(&opt, "ba,r"));
109 1.2 pho ATF_CHECK_STREQ(opt, "fo\\\\o,ba\\,r");
110 1.1 pho }
111 1.1 pho
112 1.4 pho ATF_TC(t_fuse_opt_match);
113 1.4 pho ATF_TC_HEAD(t_fuse_opt_match, tc)
114 1.3 pho {
115 1.3 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_match(3) works"
116 1.3 pho " for every form of templates");
117 1.3 pho }
118 1.3 pho
119 1.4 pho ATF_TC_BODY(t_fuse_opt_match, tc)
120 1.3 pho {
121 1.3 pho struct fuse_opt o1[] = { FUSE_OPT_KEY("-x" , 0), FUSE_OPT_END };
122 1.3 pho struct fuse_opt o2[] = { FUSE_OPT_KEY("foo" , 0), FUSE_OPT_END };
123 1.3 pho struct fuse_opt o3[] = { FUSE_OPT_KEY("foo=" , 0), FUSE_OPT_END };
124 1.3 pho struct fuse_opt o4[] = { FUSE_OPT_KEY("foo=%s", 0), FUSE_OPT_END };
125 1.3 pho struct fuse_opt o5[] = { FUSE_OPT_KEY("-x " , 0), FUSE_OPT_END };
126 1.3 pho struct fuse_opt o6[] = { FUSE_OPT_KEY("-x %s" , 0), FUSE_OPT_END };
127 1.3 pho
128 1.3 pho ATF_CHECK(fuse_opt_match(o1, "-x") == 1);
129 1.3 pho ATF_CHECK(fuse_opt_match(o1, "x") == 0);
130 1.3 pho
131 1.3 pho ATF_CHECK(fuse_opt_match(o2, "foo") == 1);
132 1.3 pho ATF_CHECK(fuse_opt_match(o2, "-foo") == 0);
133 1.3 pho
134 1.3 pho ATF_CHECK(fuse_opt_match(o3, "foo=bar") == 1);
135 1.3 pho ATF_CHECK(fuse_opt_match(o3, "foo" ) == 0);
136 1.3 pho
137 1.3 pho ATF_CHECK(fuse_opt_match(o4, "foo=bar") == 1);
138 1.3 pho ATF_CHECK(fuse_opt_match(o4, "foo" ) == 0);
139 1.3 pho
140 1.3 pho ATF_CHECK(fuse_opt_match(o5, "-xbar" ) == 1);
141 1.3 pho ATF_CHECK(fuse_opt_match(o5, "-x" ) == 1);
142 1.3 pho ATF_CHECK(fuse_opt_match(o5, "-x=bar") == 1);
143 1.3 pho ATF_CHECK(fuse_opt_match(o5, "bar" ) == 0);
144 1.3 pho
145 1.3 pho ATF_CHECK(fuse_opt_match(o6, "-xbar" ) == 1);
146 1.3 pho ATF_CHECK(fuse_opt_match(o6, "-x" ) == 1);
147 1.3 pho ATF_CHECK(fuse_opt_match(o6, "-x=bar") == 1);
148 1.3 pho ATF_CHECK(fuse_opt_match(o6, "bar" ) == 0);
149 1.3 pho }
150 1.3 pho
151 1.6 pho struct foofs_config {
152 1.6 pho int number;
153 1.6 pho char *string;
154 1.6 pho char* nonopt;
155 1.6 pho };
156 1.6 pho
157 1.6 pho #define FOOFS_OPT(t, p, v) { t, offsetof(struct foofs_config, p), v }
158 1.6 pho
159 1.6 pho static struct fuse_opt foofs_opts[] = {
160 1.6 pho FOOFS_OPT("number=%i" , number, 0),
161 1.6 pho FOOFS_OPT("-n %i" , number, 0),
162 1.6 pho FOOFS_OPT("string=%s" , string, 0),
163 1.6 pho FOOFS_OPT("number1" , number, 1),
164 1.6 pho FOOFS_OPT("number2" , number, 2),
165 1.6 pho FOOFS_OPT("--number=three", number, 3),
166 1.6 pho FOOFS_OPT("--number=four" , number, 4),
167 1.6 pho FUSE_OPT_END
168 1.6 pho };
169 1.6 pho
170 1.6 pho static int foo_opt_proc(void *data, const char *arg, int key, struct fuse_args *outargs) {
171 1.6 pho struct foofs_config *config = data;
172 1.6 pho
173 1.6 pho if (key == FUSE_OPT_KEY_NONOPT && config->nonopt == NULL) {
174 1.6 pho config->nonopt = strdup(arg);
175 1.6 pho return 0;
176 1.6 pho }
177 1.6 pho else {
178 1.6 pho return 1;
179 1.6 pho }
180 1.6 pho }
181 1.6 pho
182 1.6 pho ATF_TC(t_fuse_opt_parse_null_args);
183 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse_null_args, tc)
184 1.6 pho {
185 1.6 pho atf_tc_set_md_var(tc, "descr", "NULL args means an empty arguments vector");
186 1.6 pho }
187 1.6 pho
188 1.6 pho ATF_TC_BODY(t_fuse_opt_parse_null_args, tc)
189 1.6 pho {
190 1.6 pho struct foofs_config config;
191 1.6 pho
192 1.6 pho memset(&config, 0, sizeof(config));
193 1.6 pho ATF_CHECK(fuse_opt_parse(NULL, &config, NULL, NULL) == 0);
194 1.6 pho ATF_CHECK_EQ(config.number, 0);
195 1.6 pho ATF_CHECK_EQ(config.string, NULL);
196 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
197 1.6 pho }
198 1.6 pho
199 1.6 pho ATF_TC(t_fuse_opt_parse_null_opts);
200 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse_null_opts, tc)
201 1.6 pho {
202 1.6 pho atf_tc_set_md_var(tc, "descr", "NULL opts means an opts array which only has FUSE_OPT_END");
203 1.6 pho }
204 1.6 pho
205 1.6 pho ATF_TC_BODY(t_fuse_opt_parse_null_opts, tc)
206 1.6 pho {
207 1.6 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
208 1.6 pho struct foofs_config config;
209 1.6 pho
210 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
211 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
212 1.6 pho RZ(fuse_opt_add_arg(&args, "number=1,string=foo"));
213 1.6 pho RZ(fuse_opt_add_arg(&args, "bar"));
214 1.6 pho
215 1.6 pho memset(&config, 0, sizeof(config));
216 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, NULL, NULL) == 0);
217 1.6 pho ATF_CHECK_EQ(config.number, 0);
218 1.6 pho ATF_CHECK_EQ(config.string, NULL);
219 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
220 1.6 pho ATF_CHECK_EQ(args.argc, 4);
221 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
222 1.6 pho ATF_CHECK_STREQ(args.argv[1], "-o");
223 1.6 pho ATF_CHECK_STREQ(args.argv[2], "number=1,string=foo");
224 1.6 pho ATF_CHECK_STREQ(args.argv[3], "bar");
225 1.6 pho }
226 1.6 pho
227 1.6 pho ATF_TC(t_fuse_opt_parse_null_proc);
228 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse_null_proc, tc)
229 1.6 pho {
230 1.6 pho atf_tc_set_md_var(tc, "descr", "NULL proc means a processor function always returning 1,"
231 1.6 pho " i.e. keep the argument");
232 1.6 pho }
233 1.6 pho
234 1.6 pho ATF_TC_BODY(t_fuse_opt_parse_null_proc, tc)
235 1.6 pho {
236 1.6 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
237 1.6 pho struct foofs_config config;
238 1.6 pho
239 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
240 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
241 1.6 pho RZ(fuse_opt_add_arg(&args, "number=1,string=foo"));
242 1.6 pho RZ(fuse_opt_add_arg(&args, "bar"));
243 1.6 pho
244 1.6 pho memset(&config, 0, sizeof(config));
245 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, NULL) == 0);
246 1.6 pho ATF_CHECK_EQ(config.number, 1);
247 1.6 pho ATF_CHECK_STREQ(config.string, "foo");
248 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
249 1.6 pho ATF_CHECK_EQ(args.argc, 2);
250 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
251 1.6 pho ATF_CHECK_STREQ(args.argv[1], "bar");
252 1.6 pho }
253 1.6 pho
254 1.6 pho ATF_TC(t_fuse_opt_parse);
255 1.6 pho ATF_TC_HEAD(t_fuse_opt_parse, tc)
256 1.6 pho {
257 1.6 pho atf_tc_set_md_var(tc, "descr", "Check that fuse_opt_parse(3) fully works");
258 1.6 pho }
259 1.6 pho
260 1.6 pho ATF_TC_BODY(t_fuse_opt_parse, tc)
261 1.6 pho {
262 1.6 pho struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
263 1.6 pho struct foofs_config config;
264 1.6 pho
265 1.6 pho /* Standard form */
266 1.6 pho fuse_opt_free_args(&args);
267 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
268 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
269 1.6 pho RZ(fuse_opt_add_arg(&args, "number=1,string=foo"));
270 1.6 pho RZ(fuse_opt_add_arg(&args, "bar"));
271 1.6 pho
272 1.6 pho memset(&config, 0, sizeof(config));
273 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
274 1.6 pho ATF_CHECK_EQ(config.number, 1);
275 1.6 pho ATF_CHECK_STREQ(config.string, "foo");
276 1.6 pho ATF_CHECK_STREQ(config.nonopt, "bar");
277 1.6 pho ATF_CHECK_EQ(args.argc, 1);
278 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
279 1.6 pho
280 1.6 pho /* Concatenated -o */
281 1.6 pho fuse_opt_free_args(&args);
282 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
283 1.6 pho RZ(fuse_opt_add_arg(&args, "-onumber=1,unknown,string=foo"));
284 1.6 pho RZ(fuse_opt_add_arg(&args, "bar"));
285 1.6 pho
286 1.6 pho memset(&config, 0, sizeof(config));
287 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
288 1.6 pho ATF_CHECK_EQ(config.number, 1);
289 1.6 pho ATF_CHECK_STREQ(config.string, "foo");
290 1.6 pho ATF_CHECK_STREQ(config.nonopt, "bar");
291 1.6 pho ATF_CHECK_EQ(args.argc, 3);
292 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
293 1.6 pho ATF_CHECK_STREQ(args.argv[1], "-o");
294 1.6 pho ATF_CHECK_STREQ(args.argv[2], "unknown");
295 1.6 pho
296 1.6 pho /* Sparse -o */
297 1.6 pho fuse_opt_free_args(&args);
298 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
299 1.6 pho RZ(fuse_opt_add_arg(&args, "bar"));
300 1.6 pho RZ(fuse_opt_add_arg(&args, "baz"));
301 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
302 1.6 pho RZ(fuse_opt_add_arg(&args, "number=1"));
303 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
304 1.6 pho RZ(fuse_opt_add_arg(&args, "unknown"));
305 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
306 1.6 pho RZ(fuse_opt_add_arg(&args, "string=foo"));
307 1.6 pho
308 1.6 pho memset(&config, 0, sizeof(config));
309 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
310 1.6 pho ATF_CHECK_EQ(config.number, 1);
311 1.6 pho ATF_CHECK_STREQ(config.string, "foo");
312 1.6 pho ATF_CHECK_STREQ(config.nonopt, "bar");
313 1.6 pho ATF_CHECK_EQ(args.argc, 4);
314 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
315 1.6 pho ATF_CHECK_STREQ(args.argv[1], "-o");
316 1.6 pho ATF_CHECK_STREQ(args.argv[2], "unknown");
317 1.6 pho ATF_CHECK_STREQ(args.argv[3], "baz");
318 1.6 pho
319 1.6 pho /* Separate -n %i */
320 1.6 pho fuse_opt_free_args(&args);
321 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
322 1.6 pho RZ(fuse_opt_add_arg(&args, "-n"));
323 1.6 pho RZ(fuse_opt_add_arg(&args, "3"));
324 1.6 pho
325 1.6 pho memset(&config, 0, sizeof(config));
326 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
327 1.6 pho ATF_CHECK_EQ(config.number, 3);
328 1.6 pho ATF_CHECK_EQ(config.string, NULL);
329 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
330 1.6 pho ATF_CHECK_EQ(args.argc, 1);
331 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
332 1.6 pho
333 1.6 pho /* Concatenated -n %i */
334 1.6 pho fuse_opt_free_args(&args);
335 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
336 1.6 pho RZ(fuse_opt_add_arg(&args, "-n3"));
337 1.6 pho
338 1.6 pho memset(&config, 0, sizeof(config));
339 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
340 1.6 pho ATF_CHECK_EQ(config.number, 3);
341 1.6 pho ATF_CHECK_EQ(config.string, NULL);
342 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
343 1.6 pho ATF_CHECK_EQ(args.argc, 1);
344 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
345 1.6 pho
346 1.6 pho /* -o constant */
347 1.6 pho fuse_opt_free_args(&args);
348 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
349 1.6 pho RZ(fuse_opt_add_arg(&args, "-o"));
350 1.6 pho RZ(fuse_opt_add_arg(&args, "number2"));
351 1.6 pho
352 1.6 pho memset(&config, 0, sizeof(config));
353 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
354 1.6 pho ATF_CHECK_EQ(config.number, 2);
355 1.6 pho ATF_CHECK_EQ(config.string, NULL);
356 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
357 1.6 pho ATF_CHECK_EQ(args.argc, 1);
358 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
359 1.6 pho
360 1.6 pho /* -x constant */
361 1.6 pho fuse_opt_free_args(&args);
362 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
363 1.6 pho RZ(fuse_opt_add_arg(&args, "--number=four"));
364 1.6 pho
365 1.6 pho memset(&config, 0, sizeof(config));
366 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
367 1.6 pho ATF_CHECK_EQ(config.number, 4);
368 1.6 pho ATF_CHECK_EQ(config.string, NULL);
369 1.6 pho ATF_CHECK_EQ(config.nonopt, NULL);
370 1.6 pho ATF_CHECK_EQ(args.argc, 1);
371 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
372 1.6 pho
373 1.6 pho /* end-of-options "--" marker */
374 1.6 pho fuse_opt_free_args(&args);
375 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
376 1.6 pho RZ(fuse_opt_add_arg(&args, "--"));
377 1.6 pho RZ(fuse_opt_add_arg(&args, "-onumber=1"));
378 1.6 pho RZ(fuse_opt_add_arg(&args, "-ostring=foo"));
379 1.6 pho
380 1.6 pho memset(&config, 0, sizeof(config));
381 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
382 1.6 pho ATF_CHECK_EQ(config.number, 0);
383 1.6 pho ATF_CHECK_EQ(config.string, NULL);
384 1.6 pho ATF_CHECK_STREQ(config.nonopt, "-onumber=1");
385 1.6 pho ATF_CHECK_EQ(args.argc, 3);
386 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
387 1.6 pho ATF_CHECK_STREQ(args.argv[1], "--");
388 1.6 pho ATF_CHECK_STREQ(args.argv[2], "-ostring=foo");
389 1.6 pho
390 1.6 pho /* The "--" marker at the last of outargs should be removed */
391 1.6 pho fuse_opt_free_args(&args);
392 1.6 pho RZ(fuse_opt_add_arg(&args, "foofs"));
393 1.6 pho RZ(fuse_opt_add_arg(&args, "--"));
394 1.6 pho RZ(fuse_opt_add_arg(&args, "-onumber=1"));
395 1.6 pho
396 1.6 pho memset(&config, 0, sizeof(config));
397 1.6 pho ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
398 1.6 pho ATF_CHECK_EQ(config.number, 0);
399 1.6 pho ATF_CHECK_EQ(config.string, NULL);
400 1.6 pho ATF_CHECK_STREQ(config.nonopt, "-onumber=1");
401 1.6 pho ATF_CHECK_EQ(args.argc, 1);
402 1.6 pho ATF_CHECK_STREQ(args.argv[0], "foofs");
403 1.6 pho }
404 1.6 pho
405 1.1 pho ATF_TP_ADD_TCS(tp)
406 1.1 pho {
407 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_add_arg);
408 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_insert_arg);
409 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_add_opt);
410 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_add_opt_escaped);
411 1.4 pho ATF_TP_ADD_TC(tp, t_fuse_opt_match);
412 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse_null_args);
413 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse_null_opts);
414 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse_null_proc);
415 1.6 pho ATF_TP_ADD_TC(tp, t_fuse_opt_parse);
416 1.1 pho
417 1.1 pho return atf_no_error();
418 1.1 pho }
419