2 // MonoTests.System.Security.Permissions.FileIOPermissionTest.cs
5 // Nick Drochak (ndrochak@gol.com)
7 // (C) 2001-2002 Nick Drochak II
9 // Note: Only Unix and Windows file paths are tested. To run the tests on Mac OS's
10 // search for the "FIXME" notes below and adjust accordingly.
14 using System
.Runtime
.InteropServices
;
15 using System
.Security
;
16 using System
.Security
.Permissions
;
19 using NUnit
.Framework
;
21 namespace MonoTests
.System
.Security
.Permissions
{
23 public class FilePathUtil
{
24 [DllImport("kernel32.dll")]
25 private static extern uint GetLongPathName (string shortPath
,
26 StringBuilder buffer
, uint bufLength
);
28 static public string GetLongPathName (string somePath
)
30 StringBuilder buffer
= new StringBuilder(260);
31 if (0 != GetLongPathName (somePath
, buffer
, (uint) buffer
.Capacity
))
32 return buffer
.ToString ();
39 public class FileIOPermissionTest
: Assertion
{
41 string[] pathArrayGood
;
42 string[] pathArrayBad
;
45 string[] pathsInPermission
;
46 string[] pathArrayGood2
;
47 FileIOPermission unrestricted
;
49 private string filename
;
54 Environment
.CurrentDirectory
= Path
.GetTempPath();
55 filename
= Path
.GetTempFileName ();
58 pathsInPermission
= null;
59 pathArrayGood
= new string[2];
60 pathArrayBad
= new string[2];
61 pathArrayGood2
= new string[3];
62 // FIXME: Adjust to run on Mac OS's
63 if (Path
.VolumeSeparatorChar
== ':') {
64 pathArrayGood
[0] = "c:\\temp1";
65 pathArrayGood
[1] = "d:\\temp2";
66 pathArrayBad
[0] = "c:\\temp1";
67 pathArrayBad
[1] = "d:\\temp*";
68 pathArrayGood2
[0] = "c:\\temp1";
69 pathArrayGood2
[1] = "d:\\temp2";
70 pathArrayGood2
[2] = "z:\\something";
73 pathArrayGood
[0] = "/temp1";
74 pathArrayGood
[1] = "/usr/temp2";
75 pathArrayBad
[0] = "/temp1";
76 pathArrayBad
[1] = "/usr/temp*";
77 pathArrayGood2
[0] = "/temp1";
78 pathArrayGood2
[1] = "/usr/temp2";
79 pathArrayGood2
[2] = "/usr/bin/something";
84 public void TearDown ()
86 if (File
.Exists (filename
))
87 File
.Delete (filename
);
91 public void ConstructorPermissionState ()
93 p
= new FileIOPermission(PermissionState
.None
);
94 AssertEquals("Should be Restricted", false, p
.IsUnrestricted());
95 p
= new FileIOPermission(PermissionState
.Unrestricted
);
96 AssertEquals("Should be Unrestricted", true, p
.IsUnrestricted());
98 p
= new FileIOPermission((PermissionState
)77);
99 Fail("Should have thrown an exception on invalid PermissionState");
102 // we should be here if things are working. nothing to do
107 [ExpectedException (typeof (ArgumentNullException
))]
108 public void ConstructorString_Null ()
110 p
= new FileIOPermission(FileIOPermissionAccess
.Append
, (string)null);
114 [ExpectedException (typeof (ArgumentException
))]
115 public void ConstructorString_NotRooted ()
117 p
= new FileIOPermission(FileIOPermissionAccess
.Append
, "this path is not rooted");
121 [ExpectedException (typeof (ArgumentException
))]
122 public void ConstructorString_InvalidPath ()
124 p
= new FileIOPermission(FileIOPermissionAccess
.Append
, "<this is not a valid path>");
128 [ExpectedException (typeof (ArgumentException
))]
129 public void ConstructorString_Wildcard ()
131 p
= new FileIOPermission(FileIOPermissionAccess
.Append
, "\\\\mycomputer\\test*");
135 [ExpectedException (typeof (ArgumentException
))]
136 public void ConstructorString_InvalidAccess ()
138 p
= new FileIOPermission((FileIOPermissionAccess
)77, "c:\\temp");
142 public void ConstructorString ()
145 // FIXME: Adjust to run on Mac OS's
146 if (Path
.VolumeSeparatorChar
== ':')
147 pathToAdd
= "c:\\temp";
151 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathToAdd
);
152 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Read
);
153 Assert("Does not contain correct number of paths. Expected 1 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 1);
154 Assert("Does not contain expected path from constructor: "+pathToAdd
, pathsInPermission
[0] == pathToAdd
);
158 [ExpectedException (typeof (ArgumentNullException
))]
159 public void ConstructorStringArray_Null ()
161 p
= new FileIOPermission(FileIOPermissionAccess
.Append
, (string[])null);
165 [ExpectedException (typeof (ArgumentException
))]
166 public void ConstructorStringArray_Wildcard ()
168 p
= new FileIOPermission(FileIOPermissionAccess
.Append
, pathArrayBad
);
172 [ExpectedException (typeof (ArgumentException
))]
173 public void ConstructorStringArray_InvalidAccess ()
175 p
= new FileIOPermission((FileIOPermissionAccess
)77, pathArrayGood
);
179 public void ConstructorStringArray ()
181 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathArrayGood
);
182 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Read
);
183 Assert("Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
184 foreach (string s
in pathsInPermission
){
185 Assert("Unexpected path in the Permission: " + s
, Array
.IndexOf(pathsInPermission
, s
) >=0);
190 public void AddPathListStringArray ()
192 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathArrayGood
);
193 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Read
);
194 Assert("Does not contain correct number of paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
195 foreach (string s
in pathsInPermission
){
196 Assert("Unexpected path in the Permission: " + s
, Array
.IndexOf(pathsInPermission
, s
) >=0);
199 p
.AddPathList(FileIOPermissionAccess
.Append
, pathArrayGood
);
200 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Read
);
201 Assert("Should still contain correct number Read paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
202 foreach (string s
in pathsInPermission
){
203 Assert("Unexpected path in the Permission: " + s
, Array
.IndexOf(pathsInPermission
, s
) >=0);
205 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Append
);
206 Assert("Should contain correct number of Append paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
207 foreach (string s
in pathsInPermission
){
208 Assert("Unexpected path in the Permission: " + s
, Array
.IndexOf(pathsInPermission
, s
) >=0);
213 public void Intersect ()
215 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathArrayGood
);
216 p
.AllFiles
= FileIOPermissionAccess
.Append
;
217 p
.AllLocalFiles
= FileIOPermissionAccess
.Write
;
219 unrestricted
= new FileIOPermission(PermissionState
.Unrestricted
);
221 FileIOPermission intersection
= (FileIOPermission
)p
.Intersect(unrestricted
);
222 pathsInPermission
= intersection
.GetPathList(FileIOPermissionAccess
.Read
);
223 Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
224 Assert("Should have Append bit in AllFiles.", (intersection
.AllFiles
& FileIOPermissionAccess
.Append
) != 0);
225 Assert("Should have Write bit in AllLocalFiles.", (intersection
.AllLocalFiles
& FileIOPermissionAccess
.Write
) != 0);
227 intersection
= (FileIOPermission
)unrestricted
.Intersect(p
);
228 pathsInPermission
= intersection
.GetPathList(FileIOPermissionAccess
.Read
);
229 Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
230 Assert("Should have Append bit in AllFiles.", (intersection
.AllFiles
& FileIOPermissionAccess
.Append
) != 0);
231 Assert("Should have Write bit in AllLocalFiles.", (intersection
.AllLocalFiles
& FileIOPermissionAccess
.Write
) != 0);
233 p2
= new FileIOPermission(FileIOPermissionAccess
.Append
| FileIOPermissionAccess
.Read
, pathArrayGood2
);
234 p2
.AllFiles
= FileIOPermissionAccess
.Append
| FileIOPermissionAccess
.Write
;
235 p2
.AllLocalFiles
= FileIOPermissionAccess
.Write
| FileIOPermissionAccess
.Read
;
236 intersection
= (FileIOPermission
)p
.Intersect(p2
);
237 pathsInPermission
= intersection
.GetPathList(FileIOPermissionAccess
.Read
);
238 AssertNotNull ("Should have some paths", pathsInPermission
);
239 AssertEquals ("Should contain correct number of Read paths", 2, pathsInPermission
.Length
);
240 AssertEquals ("Should have only Append bit in AllFiles.", FileIOPermissionAccess
.Append
, intersection
.AllFiles
);
241 AssertEquals ("Should have only Write bit in AllLocalFiles.", FileIOPermissionAccess
.Write
, intersection
.AllLocalFiles
);
243 intersection
= (FileIOPermission
)p2
.Intersect(p
);
244 pathsInPermission
= intersection
.GetPathList(FileIOPermissionAccess
.Read
);
245 Assert("Should contain correct number of Read paths. Expected 2 but got: "+pathsInPermission
.Length
, pathsInPermission
.Length
== 2);
246 Assert("Should have only Append bit in AllFiles.", intersection
.AllFiles
== FileIOPermissionAccess
.Append
);
247 Assert("Should have only Write bit in AllLocalFiles.", intersection
.AllLocalFiles
== FileIOPermissionAccess
.Write
);
251 public void IsSubsetOf ()
253 unrestricted
= new FileIOPermission(PermissionState
.Unrestricted
);
254 Assert("IsSubsetOf reflective test failed", unrestricted
.IsSubsetOf(unrestricted
));
256 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathArrayGood
);
257 p
.AllFiles
= FileIOPermissionAccess
.Append
;
258 p
.AllLocalFiles
= FileIOPermissionAccess
.Write
;
259 Assert("#1 IsSubsetOf reflective test failed", p
.IsSubsetOf(p
));
260 Assert("#1 IsSubsetOf false test failed", !unrestricted
.IsSubsetOf(p
));
261 Assert("#1 IsSubsetOf true test failed", p
.IsSubsetOf(unrestricted
));
263 p2
= new FileIOPermission(FileIOPermissionAccess
.Append
| FileIOPermissionAccess
.Read
, pathArrayGood2
);
264 p2
.AllFiles
= FileIOPermissionAccess
.Append
| FileIOPermissionAccess
.Write
;
265 p2
.AllLocalFiles
= FileIOPermissionAccess
.Write
| FileIOPermissionAccess
.Read
;
266 Assert("#2 IsSubsetOf reflective test failed", p2
.IsSubsetOf(p2
));
267 Assert("#2 IsSubsetOf true test failed", p
.IsSubsetOf(p2
));
268 Assert("#2 IsSubsetOf false test failed", !p2
.IsSubsetOf(p
));
274 unrestricted
= new FileIOPermission(PermissionState
.Unrestricted
);
275 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathArrayGood
);
277 FileIOPermission union
= (FileIOPermission
)unrestricted
.Union(p
);
278 pathsInPermission
= union
.GetPathList(FileIOPermissionAccess
.Read
);
279 Assert("Should get an unrestricted permission", union
.IsUnrestricted());
280 Assert("Path list should be empty", pathsInPermission
== null);
282 union
= (FileIOPermission
)p
.Union(unrestricted
);
283 pathsInPermission
= union
.GetPathList(FileIOPermissionAccess
.Read
);
284 Assert("Should get an unrestricted permission", union
.IsUnrestricted());
285 Assert("Path list should be empty", pathsInPermission
== null);
287 p2
= new FileIOPermission(FileIOPermissionAccess
.Append
, pathArrayGood2
);
289 union
= (FileIOPermission
)p
.Union(p2
);
290 pathsInPermission
= union
.GetPathList(FileIOPermissionAccess
.Read
);
291 Assert("Path list should have 2 for Read", pathsInPermission
.Length
== pathArrayGood
.Length
);
292 pathsInPermission
= union
.GetPathList(FileIOPermissionAccess
.Append
);
293 Assert("Path list should have 3 for Append", pathsInPermission
.Length
== pathArrayGood2
.Length
);
295 union
= (FileIOPermission
)p2
.Union(p
);
296 pathsInPermission
= union
.GetPathList(FileIOPermissionAccess
.Read
);
297 Assert("Path list should have 2 for Read", pathsInPermission
.Length
== pathArrayGood
.Length
);
298 pathsInPermission
= union
.GetPathList(FileIOPermissionAccess
.Append
);
299 Assert("Path list should have 3 for Append", pathsInPermission
.Length
== pathArrayGood2
.Length
);
303 public void FromXML ()
305 p
= new FileIOPermission(PermissionState
.None
);
306 SecurityElement esd
= new SecurityElement("IPermission");
307 esd
.AddAttribute("class", "FileIOPermission");
308 esd
.AddAttribute("version", "1");
309 esd
.AddAttribute("Unrestricted", "true");
311 Assert("Should get an unrestricted permission", p
.IsUnrestricted());
313 esd
= new SecurityElement("IPermission");
314 esd
.AddAttribute("class", "FileIOPermission");
315 esd
.AddAttribute("version", "1");
316 // FIXME: Adjust to run on Mac OS's
317 if (Path
.VolumeSeparatorChar
== ':') {
318 esd
.AddAttribute("Read", "c:\\temp;d:\\temp2");
319 esd
.AddAttribute("Write", "c:\\temp;d:\\temp2;z:\\temp3");
322 esd
.AddAttribute("Read", "/temp;/usr/temp2");
323 esd
.AddAttribute("Write", "/temp;/usr/temp2;/usr/bin/temp3");
325 p
= new FileIOPermission(PermissionState
.None
);
327 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Read
);
328 Assert("Path list should have 2 for Read", pathsInPermission
.Length
== 2);
329 pathsInPermission
= p
.GetPathList(FileIOPermissionAccess
.Write
);
330 Assert("Path list should have 2 for Write", pathsInPermission
.Length
== 3);
336 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, pathArrayGood
);
337 SecurityElement esd
= p
.ToXml();
338 Assert("Esd tag incorrect", esd
.Tag
== "IPermission");
339 Assert("Esd version incorrect", (String
)esd
.Attributes
["version"] == "1");
340 string read
= (String
)esd
.Attributes
["Read"];
341 pathsInPermission
= read
.Split(';');
342 Assert("Path list should have 2 for Read", pathsInPermission
.Length
== 2);
346 [Ignore("should compatibility go that far ?")]
347 public void ShortToLong ()
349 // on windows this returns a "short" (8.3) path and filename
350 string filename
= Path
.GetTempFileName ();
351 p
= new FileIOPermission(FileIOPermissionAccess
.Read
, filename
);
352 string[] files
= p
.GetPathList (FileIOPermissionAccess
.Read
);
353 AssertEquals ("GetPathList.Count", 1, files
.Length
);
354 // FIXME: here GetTempFileName != GetPathList[0] for MS but == for Mono
355 AssertEquals ("Path.GetFileName(GetTempFileName)==Path.GetFileName(GetPathList[0])", Path
.GetFileName (filename
), Path
.GetFileName (files
[0]));
356 // note: this will fail on Linux as kernel32.dll isn't available
357 AssertEquals ("GetLongPathName(GetTempFileName)==GetPathList[0]", FilePathUtil
.GetLongPathName (filename
), files
[0]);