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