]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/sys/fs/fuse/utils.cc
fuse(4) use a global environment check.
[FreeBSD/FreeBSD.git] / tests / sys / fs / fuse / utils.cc
1 /*-
2  * Copyright (c) 2019 The FreeBSD Foundation
3  * All rights reserved.
4  *
5  * This software was developed by BFF Storage Systems, LLC under sponsorship
6  * from the FreeBSD Foundation.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include <sys/param.h>
31 #include <sys/module.h>
32 #include <sys/sysctl.h>
33
34 #include <gtest/gtest.h>
35 #include <unistd.h>
36
37 #include "mockfs.hh"
38 #include "utils.hh"
39
40 class FuseEnv: public ::testing::Environment {
41         virtual void SetUp() {
42                 const char *mod_name = "fuse";
43                 const char *devnode = "/dev/fuse";
44                 const char *usermount_node = "vfs.usermount";
45                 int usermount_val = 0;
46                 size_t usermount_size = sizeof(usermount_val);
47                 if (modfind(mod_name) == -1) {
48                         FAIL() << "Module " << mod_name <<
49                                 " could not be resolved";
50                 }
51                 if (eaccess(devnode, R_OK | W_OK)) {
52                         if (errno == ENOENT) {
53                                 FAIL() << devnode << " does not exist";
54                         } else if (errno == EACCES) {
55                                 FAIL() << devnode <<
56                                     " is not accessible by the current user";
57                         } else {
58                                 FAIL() << strerror(errno);
59                         }
60                 }
61                 sysctlbyname(usermount_node, &usermount_val, &usermount_size,
62                              NULL, 0);
63                 if (geteuid() != 0 && !usermount_val)
64                         FAIL() << "current user is not allowed to mount";
65         }
66 };
67
68 static void usage(char* progname) {
69         fprintf(stderr, "Usage: %s [-v]\n\t-v increase verbosity\n", progname);
70         exit(2);
71 }
72
73 int main(int argc, char **argv) {
74         int ch;
75         FuseEnv *fuse_env = new FuseEnv;
76
77         ::testing::InitGoogleTest(&argc, argv);
78         ::testing::AddGlobalTestEnvironment(fuse_env);
79
80         while ((ch = getopt(argc, argv, "v")) != -1) {
81                 switch (ch) {
82                         case 'v':
83                                 verbosity++;
84                                 break;
85                         default:
86                                 usage(argv[0]);
87                                 break;
88                 }
89         }
90
91         return (RUN_ALL_TESTS());
92 }