2002-02-28 Nick Drochak <ndrochak@gol.com>
[mono.git] / mcs / class / corlib / Test / System.Security.Permissions / FileIOPermissionTest.cs
1 //\r
2 // MonoTests.System.Security.Permissions.FileIOPermissionTest.cs\r
3 //\r
4 // Author:\r
5 //   Nick Drochak (ndrochak@gol.com)\r
6 //\r
7 // (C) 2001 Nick Drochak II\r
8 //\r
9 \r
10 \r
11 using System;\r
12 using System.Security;\r
13 using System.Security.Permissions;\r
14 \r
15 using NUnit.Framework;\r
16 \r
17 namespace MonoTests.System.Security.Permissions {\r
18 \r
19         public class FileIOPermissionTest : TestCase {\r
20                 \r
21                 public FileIOPermissionTest() : base ("MonoTests.System.Security.Permissions.FileIOPermissionTest testcase") { }\r
22                 public FileIOPermissionTest(String name) : base(name) {\r
23                 }\r
24                 \r
25                 public static ITest Suite {\r
26                         get {\r
27                                 return new TestSuite(typeof(FileIOPermissionTest));\r
28                         }\r
29                 }\r
30 \r
31                 protected override void SetUp() {\r
32                 }\r
33 \r
34                 private void SetDefaultData() {\r
35                 }\r
36                 \r
37                 public void TestConstructorPermissionState() {\r
38                         FileIOPermission p;\r
39                         p = new FileIOPermission(PermissionState.None);\r
40                         AssertEquals("Should be Restricted", false, p.IsUnrestricted());\r
41                         p = new FileIOPermission(PermissionState.Unrestricted);\r
42                         AssertEquals("Should be Unrestricted", true, p.IsUnrestricted());\r
43                         try{\r
44                                 p = new FileIOPermission((PermissionState)77);\r
45                                 Fail("Should have thrown an exception on invalid PermissionState");\r
46                         }\r
47                         catch{\r
48                                 // we should be here if things are working.  nothing to do\r
49                         }\r
50                 }\r
51 \r
52                 public void TestConstructorString() {\r
53                         FileIOPermission p;\r
54                         try{\r
55                                 p = new FileIOPermission(FileIOPermissionAccess.Append, "this path is not rooted");\r
56                                 Fail("Should have thrown an exception on path not rooted");\r
57                         }\r
58                         catch{}\r
59 \r
60                         try{\r
61                                 p = new FileIOPermission(FileIOPermissionAccess.Append, "<this is not a valid path>");\r
62                                 Fail("Should have thrown an exception on invalid characters in path");\r
63                         }\r
64                         catch{}\r
65                         \r
66                         try{\r
67                                 p = new FileIOPermission(FileIOPermissionAccess.Append, "\\\\mycomputer\\test*");\r
68                                 Fail("Should have thrown an exception on wildcards not allowed in path");\r
69                         }\r
70                         catch{}\r
71 \r
72                         try{\r
73                                 p = new FileIOPermission((FileIOPermissionAccess)77, "c:\\temp");\r
74                                 Fail("Should have thrown an exception on invalid access value");\r
75                         }\r
76                         catch{}\r
77 \r
78                         string pathToAdd = "c:\\temp";\r
79                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathToAdd);\r
80                         string[] pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read);\r
81                         Assert("Does not contain correct number of paths. Expected 1 but got: "+pathsInPermission.Length, pathsInPermission.Length == 1);\r
82                         Assert("Does not contain expected path from constructor: "+pathToAdd, pathsInPermission[0] == pathToAdd);\r
83                 }\r
84 \r
85                 public void TestConstructorStringArray() {\r
86                         FileIOPermission p;\r
87                         string[] pathArrayGood = {"c:\\temp1", "d:\\temp2"};\r
88                         string[] pathArrayBad = {"c:\\temp1", "d:\\temp*"};\r
89                         string[] pathsInPermission;\r
90 \r
91                         try{\r
92                                 p = new FileIOPermission(FileIOPermissionAccess.Append, pathArrayBad);\r
93                                 Fail("Should have thrown an exception on wildcards not allowed in path");\r
94                         }\r
95                         catch{}\r
96 \r
97                         try{\r
98                                 p = new FileIOPermission((FileIOPermissionAccess)77, pathArrayGood);\r
99                                 Fail("Should have thrown an exception on invalid access value");\r
100                         }\r
101                         catch{}\r
102 \r
103                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood);\r
104                         pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read);\r
105                         Assert("Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
106                         foreach (string s in pathsInPermission){\r
107                                 Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0);\r
108                         }\r
109 \r
110                 }\r
111 \r
112                 public void TestAddPathListStringArray() {\r
113                         FileIOPermission p;\r
114                         string[] pathArrayGood = {"c:\\temp1", "d:\\temp2"};\r
115                         string[] pathsInPermission;\r
116 \r
117                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood);\r
118                         pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read);\r
119                         Assert("Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
120                         foreach (string s in pathsInPermission){\r
121                                 Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0);\r
122                         }\r
123 \r
124                         p.AddPathList(FileIOPermissionAccess.Append, pathArrayGood);\r
125                         pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read);\r
126                         Assert("Should still contain correct number Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
127                         foreach (string s in pathsInPermission){\r
128                                 Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0);\r
129                         }\r
130                         pathsInPermission = p.GetPathList(FileIOPermissionAccess.Append);\r
131                         Assert("Should contain correct number of Append paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
132                         foreach (string s in pathsInPermission){\r
133                                 Assert("Unexpected path in the Permission: " + s, Array.IndexOf(pathsInPermission, s) >=0);\r
134                         }\r
135                 }\r
136 \r
137                 public void TestIntersect() {\r
138                         FileIOPermission p;\r
139                         FileIOPermission p2;\r
140                         FileIOPermission unrestricted;\r
141                         FileIOPermission intersection;\r
142                         string[] pathArrayGood = {"c:\\temp1\\", "d:\\temp2\\"};\r
143                         string[] pathArrayGood2 = {"c:\\temp1\\", "d:\\temp2\\", "z:\\something"};\r
144                         string[] pathsInPermission;\r
145 \r
146                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood);\r
147                         p.AllFiles = FileIOPermissionAccess.Append;\r
148                         p.AllLocalFiles = FileIOPermissionAccess.Write;\r
149                         \r
150                         unrestricted = new FileIOPermission(PermissionState.Unrestricted);\r
151                         \r
152                         intersection = (FileIOPermission)p.Intersect(unrestricted);\r
153                         pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read);\r
154                         Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
155                         Assert("Should have Append bit in AllFiles.", (intersection.AllFiles & FileIOPermissionAccess.Append) != 0);\r
156                         Assert("Should have Write bit in AllLocalFiles.", (intersection.AllLocalFiles & FileIOPermissionAccess.Write) != 0);\r
157 \r
158                         intersection = (FileIOPermission)unrestricted.Intersect(p);\r
159                         pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read);\r
160                         Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
161                         Assert("Should have Append bit in AllFiles.", (intersection.AllFiles & FileIOPermissionAccess.Append) != 0);\r
162                         Assert("Should have Write bit in AllLocalFiles.", (intersection.AllLocalFiles & FileIOPermissionAccess.Write) != 0);\r
163 \r
164                         p2 = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read, pathArrayGood2);\r
165                         p2.AllFiles = FileIOPermissionAccess.Append | FileIOPermissionAccess.Write;\r
166                         p2.AllLocalFiles = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read;\r
167                         intersection = (FileIOPermission)p.Intersect(p2);\r
168                         pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read);\r
169                         Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
170                         Assert("Should have only Append bit in AllFiles.", intersection.AllFiles == FileIOPermissionAccess.Append);\r
171                         Assert("Should have only Write bit in AllLocalFiles.", intersection.AllLocalFiles == FileIOPermissionAccess.Write);\r
172 \r
173                         intersection = (FileIOPermission)p2.Intersect(p);\r
174                         pathsInPermission = intersection.GetPathList(FileIOPermissionAccess.Read);\r
175                         Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission.Length, pathsInPermission.Length == 2);\r
176                         Assert("Should have only Append bit in AllFiles.", intersection.AllFiles == FileIOPermissionAccess.Append);\r
177                         Assert("Should have only Write bit in AllLocalFiles.", intersection.AllLocalFiles == FileIOPermissionAccess.Write);\r
178                 }\r
179 \r
180                 public void TestIsSubsetOf() {\r
181                         FileIOPermission p;\r
182                         FileIOPermission p2;\r
183                         FileIOPermission unrestricted;\r
184                         string[] pathArrayGood = {"c:\\temp1\\", "d:\\temp2\\"};\r
185                         string[] pathArrayGood2 = {"c:\\temp1\\", "d:\\temp2\\", "z:\\something"};\r
186 \r
187                         unrestricted = new FileIOPermission(PermissionState.Unrestricted);\r
188                         Assert("IsSubsetOf reflective test failed", unrestricted.IsSubsetOf(unrestricted));\r
189 \r
190                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood);\r
191                         p.AllFiles = FileIOPermissionAccess.Append;\r
192                         p.AllLocalFiles = FileIOPermissionAccess.Write;\r
193                         Assert("IsSubsetOf reflective test failed", p.IsSubsetOf(p));\r
194                         Assert("IsSubsetOf false test failed", !unrestricted.IsSubsetOf(p));\r
195                         Assert("IsSubsetOf true test failed", p.IsSubsetOf(unrestricted));\r
196 \r
197                         p2 = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read, pathArrayGood2);\r
198                         p2.AllFiles = FileIOPermissionAccess.Append | FileIOPermissionAccess.Write;\r
199                         p2.AllLocalFiles = FileIOPermissionAccess.Write | FileIOPermissionAccess.Read;\r
200                         Assert("IsSubsetOf reflective test failed", p2.IsSubsetOf(p2));\r
201 \r
202                         Assert("IsSubsetOf true test failed", p.IsSubsetOf(p2));\r
203                         Assert("IsSubsetOf false test failed", !p2.IsSubsetOf(p));\r
204                 }\r
205 \r
206                 public void TestUnion() {\r
207                         FileIOPermission p;\r
208                         FileIOPermission p2;\r
209                         FileIOPermission unrestricted;\r
210                         FileIOPermission union;\r
211                         string[] pathArrayGood = {"c:\\temp1\\", "d:\\temp2\\"};\r
212                         string[] pathArrayGood2 = {"c:\\temp1\\", "d:\\temp2\\", "z:\\something"};\r
213                         string[] pathsInPermission;\r
214 \r
215                         unrestricted = new FileIOPermission(PermissionState.Unrestricted);\r
216                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood);\r
217                         union = (FileIOPermission)unrestricted.Union(p);\r
218                         pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read);\r
219                         Assert("Should get an unrestricted permission", union.IsUnrestricted());\r
220                         Assert("Path list should be empty", pathsInPermission == null);\r
221 \r
222                         union = (FileIOPermission)p.Union(unrestricted);\r
223                         pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read);\r
224                         Assert("Should get an unrestricted permission", union.IsUnrestricted());\r
225                         Assert("Path list should be empty", pathsInPermission == null);\r
226 \r
227                         p2 = new FileIOPermission(FileIOPermissionAccess.Append, pathArrayGood2);\r
228 \r
229                         union = (FileIOPermission)p.Union(p2);\r
230                         pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read);\r
231                         Assert("Path list should have 2 for Read", pathsInPermission.Length == pathArrayGood.Length);\r
232                         pathsInPermission = union.GetPathList(FileIOPermissionAccess.Append);\r
233                         Assert("Path list should have 3 for Append", pathsInPermission.Length == pathArrayGood2.Length);\r
234 \r
235                         union = (FileIOPermission)p2.Union(p);\r
236                         pathsInPermission = union.GetPathList(FileIOPermissionAccess.Read);\r
237                         Assert("Path list should have 2 for Read", pathsInPermission.Length == pathArrayGood.Length);\r
238                         pathsInPermission = union.GetPathList(FileIOPermissionAccess.Append);\r
239                         Assert("Path list should have 3 for Append", pathsInPermission.Length == pathArrayGood2.Length);\r
240                 }\r
241 \r
242                 public void TestFromXML() {\r
243                         FileIOPermission p = new FileIOPermission(PermissionState.None);\r
244                         SecurityElement esd;\r
245                         string[] pathsInPermission;\r
246 \r
247                         esd = new SecurityElement("IPermission");\r
248                         esd.AddAttribute("class", "FileIOPermission");\r
249                         esd.AddAttribute("version", "1");\r
250                         esd.AddAttribute("Unrestricted", "true");\r
251                         p.FromXml(esd);\r
252                         Assert("Should get an unrestricted permission", p.IsUnrestricted());\r
253 \r
254                         esd = new SecurityElement("IPermission");\r
255                         esd.AddAttribute("class", "FileIOPermission");\r
256                         esd.AddAttribute("version", "1");\r
257                         esd.AddAttribute("Read", "c:\\temp;d:\\temp2");\r
258                         esd.AddAttribute("Write", "c:\\temp;d:\\temp2;z:\\temp3");\r
259 \r
260                         p = new FileIOPermission(PermissionState.None);\r
261                         p.FromXml(esd);\r
262                         pathsInPermission = p.GetPathList(FileIOPermissionAccess.Read);\r
263                         Assert("Path list should have 2 for Read", pathsInPermission.Length == 2);\r
264                         pathsInPermission = p.GetPathList(FileIOPermissionAccess.Write);\r
265                         Assert("Path list should have 2 for Write", pathsInPermission.Length == 3);\r
266                 }\r
267 \r
268                 public void TestToXML() {\r
269                         FileIOPermission p;\r
270                         SecurityElement esd;\r
271                         string[] pathsInPermission;\r
272                         string read;\r
273                         string[] pathArrayGood = {"c:\\temp1\\", "d:\\temp2\\"};\r
274                         p = new FileIOPermission(FileIOPermissionAccess.Read, pathArrayGood);\r
275                         esd = p.ToXml();\r
276                         Assert("Esd tag incorrect", esd.Tag == "IPermission");\r
277                         Assert("Esd version incorrect", (String)esd.Attributes["version"] == "1");\r
278                         read = (String)esd.Attributes["Read"];\r
279                         pathsInPermission = read.Split(';');\r
280                         Assert("Path list should have 2 for Read", pathsInPermission.Length == 2);\r
281                 }\r
282         }\r
283 }\r
284 \r