BindingFlags.Public needed here as Exception.HResult is now public in .NET 4.5. This...
[mono.git] / mcs / class / corlib / Test / System.Security.Permissions / FileIOPermissionAttributeTest.cs
1 //
2 // FileIOPermissionAttributeTest.cs -
3 //      NUnit Test Cases for FileIOPermissionAttribute
4 //
5 // Author:
6 //      Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using NUnit.Framework;
32 using System;
33 using System.IO;
34 using System.Reflection;
35 using System.Security;
36 using System.Security.Permissions;
37 using System.Text;
38
39 namespace MonoTests.System.Security.Permissions {
40
41         [TestFixture]
42         public class FileIOPermissionAttributeTest {
43
44                 [Test]
45                 public void Default () 
46                 {
47                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
48                         Assert.IsNull (a.Append, "Append");
49                         Assert.IsNull (a.PathDiscovery, "PathDiscovery");
50                         Assert.IsNull (a.Read, "Read");
51                         Assert.IsNull (a.Write, "Write");
52 #if NET_2_0
53                         Assert.IsNotNull (a.AllFiles, "AllFiles");
54                         Assert.IsNotNull (a.AllLocalFiles, "AllLocalFiles");
55                         Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
56                         Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
57 #endif
58
59                         Assert.AreEqual (a.ToString (), a.TypeId.ToString (), "TypeId");
60                         Assert.IsFalse (a.Unrestricted, "Unrestricted");
61
62                         FileIOPermission perm = (FileIOPermission) a.CreatePermission ();
63                         Assert.AreEqual (FileIOPermissionAccess.NoAccess, perm.AllFiles, "CreatePermission-AllFiles");
64                         Assert.AreEqual (FileIOPermissionAccess.NoAccess, perm.AllLocalFiles, "CreatePermission-AllLocalFiles");
65                         Assert.IsFalse (perm.IsUnrestricted (), "perm-Unrestricted");
66                 }
67
68                 [Test]
69                 public void Action () 
70                 {
71                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
72                         Assert.AreEqual (SecurityAction.Assert, a.Action, "Action=Assert");
73                         a.Action = SecurityAction.Demand;
74                         Assert.AreEqual (SecurityAction.Demand, a.Action, "Action=Demand");
75                         a.Action = SecurityAction.Deny;
76                         Assert.AreEqual (SecurityAction.Deny, a.Action, "Action=Deny");
77                         a.Action = SecurityAction.InheritanceDemand;
78                         Assert.AreEqual (SecurityAction.InheritanceDemand, a.Action, "Action=InheritanceDemand");
79                         a.Action = SecurityAction.LinkDemand;
80                         Assert.AreEqual (SecurityAction.LinkDemand, a.Action, "Action=LinkDemand");
81                         a.Action = SecurityAction.PermitOnly;
82                         Assert.AreEqual (SecurityAction.PermitOnly, a.Action, "Action=PermitOnly");
83                         a.Action = SecurityAction.RequestMinimum;
84                         Assert.AreEqual (SecurityAction.RequestMinimum, a.Action, "Action=RequestMinimum");
85                         a.Action = SecurityAction.RequestOptional;
86                         Assert.AreEqual (SecurityAction.RequestOptional, a.Action, "Action=RequestOptional");
87                         a.Action = SecurityAction.RequestRefuse;
88                         Assert.AreEqual (SecurityAction.RequestRefuse, a.Action, "Action=RequestRefuse");
89                 }
90
91                 [Test]
92                 public void Action_Invalid ()
93                 {
94                         FileDialogPermissionAttribute a = new FileDialogPermissionAttribute ((SecurityAction)Int32.MinValue);
95                         // no validation in attribute
96                 }
97
98                 [Test]
99                 public void All () 
100                 {
101                         string filename = Assembly.GetCallingAssembly ().Location;
102                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
103                         attr.All = filename;
104                         Assert.AreEqual (filename, attr.Append, "All=Append");
105                         Assert.AreEqual (filename, attr.PathDiscovery, "All=PathDiscovery");
106                         Assert.AreEqual (filename, attr.Read, "All=Read");
107                         Assert.AreEqual (filename, attr.Write, "All=Write");
108 #if NET_2_0
109                         Assert.IsNotNull (attr.AllFiles, "AllFiles");
110                         Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
111                         Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
112                         Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
113 #endif
114                         FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
115                         filename = Path.GetFullPath (filename);
116                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Append) [0], "All=FileIOPermissionAttribute-Append");
117                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.PathDiscovery) [0], "All=FileIOPermissionAttribute-PathDiscovery");
118                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Read) [0], "All=FileIOPermissionAttribute-Read");
119                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Write) [0], "All=FileIOPermissionAttribute-Write");
120                 }
121 #if NET_1_1
122                 [Test]
123                 [ExpectedException (typeof (NotSupportedException))]
124                 public void All_Get () 
125                 {
126                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
127                         string s = attr.All;
128                 }
129 #endif
130                 [Test]
131                 public void Append ()
132                 {
133                         string filename = Assembly.GetCallingAssembly ().Location;
134                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
135                         attr.Append = filename;
136                         Assert.AreEqual (filename, attr.Append, "Append=Append");
137                         Assert.IsNull (attr.PathDiscovery, "PathDiscovery=null");
138                         Assert.IsNull (attr.Read, "Read=null");
139                         Assert.IsNull (attr.Write, "Write=null");
140 #if NET_2_0
141                         Assert.IsNotNull (attr.AllFiles, "AllFiles");
142                         Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
143                         Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
144                         Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
145 #endif
146                         FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
147                         filename = Path.GetFullPath (filename);
148                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Append) [0], "Append=FileIOPermissionAttribute-Append");
149                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.PathDiscovery), "Append=FileIOPermissionAttribute-PathDiscovery");
150                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Read), "Append=FileIOPermissionAttribute-Read");
151                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Write), "Append=FileIOPermissionAttribute-Write");
152                 }
153
154                 [Test]
155                 public void PathDiscovery () 
156                 {
157                         string filename = Assembly.GetCallingAssembly ().Location;
158                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
159                         attr.PathDiscovery = filename;
160                         Assert.IsNull (attr.Append, "Append=null");
161                         Assert.AreEqual (filename, attr.PathDiscovery, "PathDiscovery=PathDiscovery");
162                         Assert.IsNull (attr.Read, "Read=null");
163                         Assert.IsNull (attr.Write, "Write=null");
164 #if NET_2_0
165                         Assert.IsNotNull (attr.AllFiles, "AllFiles");
166                         Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
167                         Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
168                         Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
169 #endif
170                         FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
171                         filename = Path.GetFullPath (filename);
172                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Append), "PathDiscovery=FileIOPermissionAttribute-Append");
173                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.PathDiscovery) [0], "PathDiscovery=FileIOPermissionAttribute-PathDiscovery");
174                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Read), "PathDiscovery=FileIOPermissionAttribute-Read");
175                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Write), "PathDiscovery=FileIOPermissionAttribute-Write");
176                 }
177
178                 [Test]
179                 public void Read () 
180                 {
181                         string filename = Assembly.GetCallingAssembly ().Location;
182                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
183                         attr.Read = filename;
184                         Assert.IsNull (attr.Append, "Append=null");
185                         Assert.IsNull (attr.PathDiscovery, "PathDiscovery=null");
186                         Assert.AreEqual (filename, attr.Read, "Read=Read");
187                         Assert.IsNull (attr.Write, "Write=null");
188 #if NET_2_0
189                         Assert.IsNotNull (attr.AllFiles, "AllFiles");
190                         Assert.IsNotNull (attr.AllLocalFiles, "AllLocalFiles");
191                         Assert.IsNull (attr.ChangeAccessControl, "ChangeAccessControl");
192                         Assert.IsNull (attr.ViewAccessControl, "ViewAccessControl");
193 #endif
194                         FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
195                         filename = Path.GetFullPath (filename);
196                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Append), "PathDiscovery=FileIOPermissionAttribute-Append");
197                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.PathDiscovery), "PathDiscovery=FileIOPermissionAttribute-PathDiscovery");
198                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Read) [0], "PathDiscovery=FileIOPermissionAttribute-Read");
199                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Write), "PathDiscovery=FileIOPermissionAttribute-Write");
200                 }
201
202 #if NET_2_0
203                 [Test]
204                 public void ChangeAccessControl ()
205                 {
206                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
207                         a.ChangeAccessControl = "mono";
208                         Assert.IsNull (a.Append, "Append");
209                         Assert.AreEqual ("mono", a.ChangeAccessControl, "ChangeAccessControl");
210                         Assert.IsNull (a.PathDiscovery, "PathDiscovery");
211                         Assert.IsNull (a.Read, "Read");
212                         Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
213                         Assert.IsNull (a.Write, "Write");
214
215                         a.ChangeAccessControl = null;
216                         Assert.IsNull (a.Append, "Append");
217                         Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
218                         Assert.IsNull (a.PathDiscovery, "PathDiscovery");
219                         Assert.IsNull (a.Read, "Read");
220                         Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
221                         Assert.IsNull (a.Write, "Write");
222                 }
223
224                 [Test]
225                 public void ViewAccessControl ()
226                 {
227                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
228                         a.ViewAccessControl = "mono";
229                         Assert.IsNull (a.Append, "Append");
230                         Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
231                         Assert.IsNull (a.PathDiscovery, "PathDiscovery");
232                         Assert.IsNull (a.Read, "Read");
233                         Assert.AreEqual ("mono", a.ViewAccessControl, "ViewAccessControl");
234                         Assert.IsNull (a.Write, "Write");
235
236                         a.ViewAccessControl = null;
237                         Assert.IsNull (a.Append, "Append");
238                         Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
239                         Assert.IsNull (a.PathDiscovery, "PathDiscovery");
240                         Assert.IsNull (a.Read, "Read");
241                         Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
242                         Assert.IsNull (a.Write, "Write");
243                 }
244
245                 [Test]
246                 public void ViewAndModify_Set ()
247                 {
248                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
249                         a.ViewAndModify = "mono";
250                         Assert.AreEqual ("mono", a.Append, "Append");
251                         Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
252                         Assert.AreEqual ("mono", a.PathDiscovery, "PathDiscovery");
253                         Assert.AreEqual ("mono", a.Read, "Read");
254                         Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
255                         Assert.AreEqual ("mono", a.Write, "Write");
256
257                         a.ViewAndModify = null;
258                         Assert.IsNull (a.Append, "Append");
259                         Assert.IsNull (a.ChangeAccessControl, "ChangeAccessControl");
260                         Assert.IsNull (a.PathDiscovery, "PathDiscovery");
261                         Assert.IsNull (a.Read, "Read");
262                         Assert.IsNull (a.ViewAccessControl, "ViewAccessControl");
263                         Assert.IsNull (a.Write, "Write");
264                 }
265
266                 [Test]
267                 [ExpectedException (typeof (NotSupportedException))]
268                 public void ViewAndModify_Get ()
269                 {
270                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
271                         a.ViewAndModify = "mono";
272                         Assert.AreEqual ("ViewAndModify", "mono", a.ViewAndModify);
273                 }
274 #endif
275
276                 [Test]
277                 public void Write () 
278                 {
279                         string filename = Assembly.GetCallingAssembly ().Location;
280                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
281                         attr.Write = filename;
282                         Assert.IsNull (attr.Append, "Append=null");
283                         Assert.IsNull (attr.PathDiscovery, "PathDiscovery=null");
284                         Assert.IsNull (attr.Read, "Read=null");
285                         Assert.AreEqual (filename, attr.Write, "Write=Write");
286                         FileIOPermission p = (FileIOPermission) attr.CreatePermission ();
287                         filename = Path.GetFullPath (filename);
288                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Append), "PathDiscovery=FileIOPermissionAttribute-Append");
289                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.PathDiscovery), "PathDiscovery=FileIOPermissionAttribute-PathDiscovery");
290                         Assert.IsNull (p.GetPathList (FileIOPermissionAccess.Read), "PathDiscovery=FileIOPermissionAttribute-Read");
291                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Write) [0], "PathDiscovery=FileIOPermissionAttribute-Write");
292                 }
293
294                 [Test]
295                 public void Unrestricted () 
296                 {
297                         FileIOPermissionAttribute a = new FileIOPermissionAttribute (SecurityAction.Assert);
298                         a.Unrestricted = true;
299
300                         FileIOPermission perm = (FileIOPermission) a.CreatePermission ();
301                         Assert.IsTrue (perm.IsUnrestricted (), "CreatePermission.IsUnrestricted");
302                         Assert.AreEqual (FileIOPermissionAccess.AllAccess, perm.AllFiles, "CreatePermission.AllFiles");
303                         Assert.AreEqual (FileIOPermissionAccess.AllAccess, perm.AllLocalFiles, "CreatePermission.AllLocalFiles");
304                 }
305
306                 [Test]
307                 public void Attributes ()
308                 {
309                         Type t = typeof (FileDialogPermissionAttribute);
310                         Assert.IsTrue (t.IsSerializable, "IsSerializable");
311
312                         object [] attrs = t.GetCustomAttributes (typeof (AttributeUsageAttribute), false);
313                         Assert.AreEqual (1, attrs.Length, "AttributeUsage");
314                         AttributeUsageAttribute aua = (AttributeUsageAttribute)attrs [0];
315                         Assert.IsTrue (aua.AllowMultiple, "AllowMultiple");
316                         Assert.IsFalse (aua.Inherited, "Inherited");
317                         AttributeTargets at = (AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method);
318                         Assert.AreEqual (at, aua.ValidOn, "ValidOn");
319                 }
320
321                 [Test]
322                 [Category("NotDotNet")]
323                 public void NonC14NPath ()
324                 {
325                         string filename = Path.Combine (Path.GetTempPath (), "test");
326                         filename = Path.Combine (filename, "..");
327                         filename = Path.Combine (filename, "here");
328                         FileIOPermissionAttribute attr = new FileIOPermissionAttribute (SecurityAction.Assert);
329                         // attribute class will keep the .. in the path
330                         attr.All = filename;
331                         Assert.AreEqual (filename, attr.Append, "All=Append");
332                         Assert.AreEqual (filename, attr.PathDiscovery, "All=PathDiscovery");
333                         Assert.AreEqual (filename, attr.Read, "All=Read");
334                         Assert.AreEqual (filename, attr.Write, "All=Write");
335                         // but the permission class will c14n it
336                         filename = Path.GetFullPath (filename);
337                         FileIOPermission p = (FileIOPermission)attr.CreatePermission ();
338                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Append) [0], "All=FileIOPermissionAttribute-Append");
339                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.PathDiscovery) [0], "All=FileIOPermissionAttribute-PathDiscovery");
340                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Read) [0], "All=FileIOPermissionAttribute-Read");
341                         Assert.AreEqual (filename, p.GetPathList (FileIOPermissionAccess.Write) [0], "All=FileIOPermissionAttribute-Write");
342                 }
343         }
344 }