]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/sys/fs/fuse/utils.cc
fuse(4): add tests for FUSE_READ
[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 void FuseTest::SetUp() {
69         const char *node = "vfs.maxbcachebuf";
70         int val = 0;
71         size_t size = sizeof(val);
72
73         ASSERT_EQ(0, sysctlbyname(node, &val, &size, NULL, 0))
74                 << strerror(errno);
75         m_maxbcachebuf = val;
76
77         try {
78                 m_mock = new MockFS(m_maxreadahead);
79         } catch (std::system_error err) {
80                 FAIL() << err.what();
81         }
82 }
83
84 static void usage(char* progname) {
85         fprintf(stderr, "Usage: %s [-v]\n\t-v increase verbosity\n", progname);
86         exit(2);
87 }
88
89 int main(int argc, char **argv) {
90         int ch;
91         FuseEnv *fuse_env = new FuseEnv;
92
93         ::testing::InitGoogleTest(&argc, argv);
94         ::testing::AddGlobalTestEnvironment(fuse_env);
95
96         while ((ch = getopt(argc, argv, "v")) != -1) {
97                 switch (ch) {
98                         case 'v':
99                                 verbosity++;
100                                 break;
101                         default:
102                                 usage(argv[0]);
103                                 break;
104                 }
105         }
106
107         return (RUN_ALL_TESTS());
108 }