@@ -23,7 +23,14 @@ using namespace std;
2323
2424entity_addr_t addr;
2525
26- const char *parse_good[] = {
26+ string fsnamecap = " fsname=a" ;
27+ string pathcap = " path=/dir1" ;
28+ string rscap = " root_squash" ;
29+ string uidcap = " uid=1000" ;
30+ string gidscap = " gids=1000,1001,1002" ;
31+
32+
33+ vector<string> parse_good = {
2734 " allow rw uid=1 gids=1" ,
2835 " allow * path=\" /foo\" " ,
2936 " allow * path=/foo" ,
@@ -34,8 +41,6 @@ const char *parse_good[] = {
3441 " allow *" ,
3542 " allow r" ,
3643 " allow rw" ,
37- " allow rw uid=1 gids=1,2,3" ,
38- " allow rw path=/foo uid=1 gids=1,2,3" ,
3944 " allow r, allow rw path=/foo" ,
4045 " allow r, allow * uid=1" ,
4146 " allow r ,allow * uid=1" ,
@@ -45,23 +50,82 @@ const char *parse_good[] = {
4550 " allow r uid=1 gids=1,2,3, allow * uid=2" ,
4651 " allow r network 1.2.3.4/8" ,
4752 " allow rw path=/foo uid=1 gids=1,2,3 network 2.3.4.5/16" ,
48- " allow r root_squash" ,
49- " allow rw path=/foo root_squash" ,
50- " allow rw fsname=a root_squash" ,
51- " allow rw fsname=a path=/foo root_squash" ,
52- " allow rw fsname=a root_squash, allow rwp fsname=a path=/volumes" ,
53- 0
53+
54+ // Following are all types of MDS caps, or in other words, all
55+ // (mathematical) combinations of fsnamecap, pathcap, rscap, uidcap, and
56+ // gidscaps.
57+ " allow rw " + fsnamecap,
58+ " allow rw " + pathcap,
59+ " allow rw " + rscap,
60+ " allow rw " + uidcap,
61+ " allow rw " + gidscap,
62+
63+ " allow rw " + fsnamecap + " " + pathcap,
64+ " allow rw " + fsnamecap + " " + rscap,
65+ " allow rw " + fsnamecap + " " + uidcap,
66+ " allow rw " + fsnamecap + " " + gidscap,
67+ " allow rw " + pathcap + " " + rscap,
68+ " allow rw " + pathcap + " " + uidcap,
69+ " allow rw " + pathcap + " " + gidscap,
70+ " allow rw " + rscap + " " + uidcap,
71+ " allow rw " + rscap + " " + gidscap,
72+ " allow rw " + uidcap + " " + gidscap,
73+
74+ " allow rw " + fsnamecap + " " + pathcap + " " + rscap,
75+ " allow rw " + fsnamecap + " " + pathcap + " " + uidcap,
76+ " allow rw " + fsnamecap + " " + pathcap + " " + gidscap,
77+ " allow rw " + fsnamecap + " " + rscap + " " + uidcap,
78+ " allow rw " + fsnamecap + " " + rscap + " " + gidscap,
79+ " allow rw " + fsnamecap + " " + uidcap + " " + gidscap,
80+ " allow rw " + pathcap + " " + rscap + " " + uidcap,
81+ " allow rw " + pathcap + " " + rscap + " " + gidscap,
82+ " allow rw " + pathcap + " " + uidcap + " " + gidscap,
83+ " allow rw " + rscap + " " + uidcap + " " + gidscap,
84+
85+ " allow rw " + fsnamecap + " " + pathcap + " " + rscap + " " + uidcap,
86+ " allow rw " + fsnamecap + " " + pathcap + " " + rscap + " " + gidscap,
87+ " allow rw " + fsnamecap + " " + pathcap + " " + uidcap + " " + gidscap,
88+ " allow rw " + fsnamecap + " " + rscap + " " + uidcap + " " + gidscap,
89+ " allow rw " + pathcap + " " + rscap + " " + uidcap + " " + gidscap,
90+
91+ " allow rw " + fsnamecap + " " + pathcap + " " + rscap + " " + uidcap +
92+ " " + gidscap
5493};
5594
5695TEST (MDSAuthCaps, ParseGood) {
57- for (int i=0 ; parse_good[i]; i++) {
58- string str = parse_good[i];
96+ for (auto str : parse_good) {
5997 MDSAuthCaps cap;
6098 std::cout << " Testing good input: '" << str << " '" << std::endl;
6199 ASSERT_TRUE (cap.parse (str, &cout));
62100 }
63101}
64102
103+ TEST (MDSAuthCaps, ParseDumpReparseCaps) {
104+ for (auto str : parse_good) {
105+ MDSAuthCaps cap1;
106+ ASSERT_TRUE (cap1.parse (str, &cout));
107+
108+ std::cout << " Testing by parsing caps, dumping to string, reparsing "
109+ " string and then redumping and checking strings from "
110+ " first and second dumps: '" << str << " '" << std::endl;
111+ // Convert cap object to string, reparse and check if converting again
112+ // gives same string as before.
113+ MDSAuthCaps cap2;
114+ std::ostringstream cap1_ostream;
115+ cap1_ostream << cap1;
116+ string cap1_str = cap1_ostream.str ();
117+ // Removing "MDSAuthCaps[" from cap1_str
118+ cap1_str.replace (0 , 12 , " " );
119+ // Removing "]" from cap1_str
120+ cap1_str.replace (cap1_str.length () - 1 , 1 , " " );
121+ ASSERT_TRUE (cap2.parse (cap1_str, &cout));
122+
123+ std::ostringstream cap2_ostream;
124+ cap2_ostream << cap2;
125+ ASSERT_TRUE (cap1_ostream.str ().compare (cap2_ostream.str ()) == 0 );
126+ }
127+ }
128+
65129const char *parse_bad[] = {
66130 " allow r poolfoo" ,
67131 " allow r w" ,
@@ -85,8 +149,6 @@ const char *parse_bad[] = {
85149 " allow namespace=foo" ,
86150 " allow rwx auid 123 namespace asdf" ,
87151 " allow wwx pool ''" ,
88- " allow rw gids=1" ,
89- " allow rw gids=1,2,3" ,
90152 " allow rw uid=123 gids=asdf" ,
91153 " allow rw uid=123 gids=1,2,asdf" ,
92154 0
@@ -98,6 +160,8 @@ TEST(MDSAuthCaps, ParseBad) {
98160 MDSAuthCaps cap;
99161 std::cout << " Testing bad input: '" << str << " '" << std::endl;
100162 ASSERT_FALSE (cap.parse (str, &cout));
163+ // error message from parse() doesn't have newline char at the end of it
164+ std::cout << std::endl;
101165 }
102166}
103167
0 commit comments