1 //
2 // AppDomainCas.cs - CAS unit tests for System.AppDomain
3 //
4 // Author:
5 //	Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 
29 #if MONO_FEATURE_MULTIPLE_APPDOMAINS
30 
31 using NUnit.Framework;
32 
33 using System;
34 using System.IO;
35 using System.Reflection;
36 using System.Runtime.Serialization;
37 using System.Security;
38 using System.Security.Permissions;
39 using System.Security.Principal;
40 
41 namespace MonoCasTests.System {
42 
43 	[TestFixture]
44 	[Category ("CAS")]
45 	public class AppDomainCas {
46 
47 		private AppDomain ad;
48 
49 		[TestFixtureSetUp]
FixtureSetUp()50 		public void FixtureSetUp ()
51 		{
52 			// it's safe to create the AppDomain here
53 			string temp = Path.GetTempPath ();
54 			AppDomainSetup setup = new AppDomainSetup ();
55 			setup.ApplicationName = "CAS";
56 			setup.PrivateBinPath = temp;
57 			setup.DynamicBase = temp;
58 			ad = AppDomain.CreateDomain ("CAS", null, setup);
59 		}
60 
61 		[SetUp]
SetUp()62 		public void SetUp ()
63 		{
64 			if (!SecurityManager.SecurityEnabled)
65 				Assert.Ignore ("SecurityManager.SecurityEnabled is OFF");
66 		}
67 
68 		// Partial Trust Tests
69 
70 		[Test]
71 		[PermissionSet (SecurityAction.Deny, Unrestricted = true)]
PartialTrust_Deny_Unrestricted()72 		public void PartialTrust_Deny_Unrestricted ()
73 		{
74 			// static
75 			Assert.IsNotNull (AppDomain.CurrentDomain, "CurrentDomain");
76 			// instance
77 			Assert.IsNotNull (ad.FriendlyName, "FriendlyName");
78 			Assert.IsNotNull (ad.SetupInformation, "SetupInformation");
79 			Assert.IsFalse (ad.ShadowCopyFiles, "ShadowCopyFiles");
80 		}
81 
82 // see http://bugzilla.ximian.com/show_bug.cgi?id=74411
83 		[Category ("NotWorking")]
84 		[Test]
85 		[FileIOPermission (SecurityAction.Deny, Unrestricted = true)]
86 		[ExpectedException (typeof (SecurityException))]
BaseDirectory_Deny_FileIOPermission()87 		public void BaseDirectory_Deny_FileIOPermission ()
88 		{
89 			Assert.IsNotNull (ad.BaseDirectory, "BaseDirectory");
90 		}
91 
92 		[Test]
93 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
94 		[ExpectedException (typeof (SecurityException))]
CreateDomain1_Deny_ControlAppDomain()95 		public void CreateDomain1_Deny_ControlAppDomain ()
96 		{
97 			AppDomain.CreateDomain (null);
98 		}
99 
100 		[Test]
101 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
102 		[ExpectedException (typeof (SecurityException))]
CreateDomain2_Deny_ControlAppDomain()103 		public void CreateDomain2_Deny_ControlAppDomain ()
104 		{
105 			AppDomain.CreateDomain (null, null);
106 		}
107 
108 		[Test]
109 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
110 		[ExpectedException (typeof (SecurityException))]
CreateDomain3_Deny_ControlAppDomain()111 		public void CreateDomain3_Deny_ControlAppDomain ()
112 		{
113 			AppDomain.CreateDomain (null, null, null);
114 		}
115 
116 		[Test]
117 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
118 		[ExpectedException (typeof (SecurityException))]
CreateDomain5_Deny_ControlAppDomain()119 		public void CreateDomain5_Deny_ControlAppDomain ()
120 		{
121 			AppDomain.CreateDomain (null, null, null, null, false);
122 		}
123 		[Test]
124 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
125 		[ExpectedException (typeof (SecurityException))]
CreateDomain7_Deny_ControlAppDomain()126 		public void CreateDomain7_Deny_ControlAppDomain ()
127 		{
128 			AppDomain.CreateDomain (null, null, null, null, false, null, null);
129 		}
130 // see http://bugzilla.ximian.com/show_bug.cgi?id=74411
131 		[Category ("NotWorking")]
132 		[Test]
133 		[FileIOPermission (SecurityAction.Deny, Unrestricted = true)]
134 		[ExpectedException (typeof (SecurityException))]
DynamicDirectory_Deny_FileIOPermission()135 		public void DynamicDirectory_Deny_FileIOPermission ()
136 		{
137 			Assert.IsNotNull (ad.DynamicDirectory, "DynamicDirectory");
138 		}
139 
140 		[Category ("NotWorking")] // check not yet implemented
141 		[Test]
142 		[SecurityPermission (SecurityAction.Deny, ControlEvidence = true)]
143 		[ExpectedException (typeof (SecurityException))]
Evidence_Deny_ControlEvidence()144 		public void Evidence_Deny_ControlEvidence ()
145 		{
146 			Assert.IsNotNull (ad.Evidence, "Evidence");
147 		}
148 
149 // see http://bugzilla.ximian.com/show_bug.cgi?id=74411
150 		[Category ("NotWorking")]
151 		[Test]
152 		[FileIOPermission (SecurityAction.Deny, Unrestricted = true)]
153 		[ExpectedException (typeof (SecurityException))]
RelativeSearchPath_Deny_FileIOPermission()154 		public void RelativeSearchPath_Deny_FileIOPermission ()
155 		{
156 			Assert.IsNotNull (ad.RelativeSearchPath, "RelativeSearchPath");
157 		}
158 
159 // see http://bugzilla.ximian.com/show_bug.cgi?id=74411
160 		[Category ("NotWorking")]
161 		[Test]
162 		[SecurityPermission (SecurityAction.Deny, ControlPrincipal = true)]
163 		[ExpectedException (typeof (SecurityException))]
SetPrincipalPolicy_Deny_ControlPrincipal()164 		public void SetPrincipalPolicy_Deny_ControlPrincipal ()
165 		{
166 			ad.SetPrincipalPolicy (PrincipalPolicy.NoPrincipal);
167 		}
168 
169 // see http://bugzilla.ximian.com/show_bug.cgi?id=74411
170 		[Category ("NotWorking")]
171 		[Test]
172 		[SecurityPermission (SecurityAction.Deny, ControlPrincipal = true)]
173 		[ExpectedException (typeof (SecurityException))]
SetThreadPrincipal_Deny_ControlPrincipal()174 		public void SetThreadPrincipal_Deny_ControlPrincipal ()
175 		{
176 			ad.SetThreadPrincipal (new GenericPrincipal (new GenericIdentity ("me"), null));
177 		}
178 
179 		[Test]
180 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
181 		[ExpectedException (typeof (SecurityException))]
Unload_Deny_ControlAppDomain()182 		public void Unload_Deny_ControlAppDomain ()
183 		{
184 			AppDomain.Unload (null);
185 		}
186 
187 
188 		[Test]
189 		[FileIOPermission (SecurityAction.PermitOnly, Unrestricted = true)]
PermitOnly_FileIOPermission()190 		public void PermitOnly_FileIOPermission ()
191 		{
192 			Assert.IsNotNull (ad.BaseDirectory, "BaseDirectory");
193 			Assert.IsNotNull (ad.DynamicDirectory, "DynamicDirectory");
194 			Assert.IsNotNull (ad.RelativeSearchPath, "RelativeSearchPath");
195 		}
196 
197 		[Test]
198 		[SecurityPermission (SecurityAction.PermitOnly, ControlEvidence = true)]
PermitOnly_ControlEvidence()199 		public void PermitOnly_ControlEvidence ()
200 		{
201 			// other permissions required to get evidence from another domain
202 			Assert.IsNotNull (AppDomain.CurrentDomain.Evidence, "Evidence");
203 		}
204 
205 		[Test]
206 		[SecurityPermission (SecurityAction.PermitOnly, ControlPrincipal = true)]
PermitOnly_ControlPrincipal()207 		public void PermitOnly_ControlPrincipal ()
208 		{
209 			ad.SetPrincipalPolicy (PrincipalPolicy.NoPrincipal);
210 			ad.SetThreadPrincipal (new GenericPrincipal (new GenericIdentity ("me"), null));
211 		}
212 
213 		// we use reflection to call AppDomain as some methods and events are protected
214 		// by LinkDemand (which will be converted into full demand, i.e. a stack walk)
215 		// when reflection is used (i.e. it gets testable).
216 
217 		[Test]
218 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
219 		[ExpectedException (typeof (SecurityException))]
AppendPrivatePath()220 		public void AppendPrivatePath ()
221 		{
222 			MethodInfo mi = typeof (AppDomain).GetMethod ("AppendPrivatePath");
223 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { String.Empty });
224 		}
225 
226 		[Test]
227 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
228 		[ExpectedException (typeof (SecurityException))]
ClearPrivatePath()229 		public void ClearPrivatePath ()
230 		{
231 			MethodInfo mi = typeof (AppDomain).GetMethod ("ClearPrivatePath");
232 			mi.Invoke (AppDomain.CurrentDomain, null);
233 		}
234 
235 		[Test]
236 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
237 		[ExpectedException (typeof (SecurityException))]
ClearShadowCopyPath()238 		public void ClearShadowCopyPath ()
239 		{
240 			MethodInfo mi = typeof (AppDomain).GetMethod ("ClearShadowCopyPath");
241 			mi.Invoke (AppDomain.CurrentDomain, null);
242 		}
243 
244 		[Test]
245 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
246 		[ExpectedException (typeof (SecurityException))]
SetCachePath()247 		public void SetCachePath ()
248 		{
249 			MethodInfo mi = typeof (AppDomain).GetMethod ("SetCachePath");
250 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { String.Empty });
251 		}
252 
253 		[Test]
254 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
255 		[ExpectedException (typeof (SecurityException))]
SetData()256 		public void SetData ()
257 		{
258 			MethodInfo mi = typeof (AppDomain).GetMethod ("SetData");
259 			mi.Invoke (AppDomain.CurrentDomain, new object [2] { String.Empty, null });
260 		}
261 
262 		[Test]
263 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
264 		[ExpectedException (typeof (SecurityException))]
SetShadowCopyFiles()265 		public void SetShadowCopyFiles ()
266 		{
267 			MethodInfo mi = typeof (AppDomain).GetMethod ("SetShadowCopyFiles");
268 			mi.Invoke (AppDomain.CurrentDomain, null);
269 		}
270 
271 		[Test]
272 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
273 		[ExpectedException (typeof (SecurityException))]
SetDynamicBase()274 		public void SetDynamicBase ()
275 		{
276 			MethodInfo mi = typeof (AppDomain).GetMethod ("SetDynamicBase");
277 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { String.Empty });
278 		}
279 
280 		// events
281 
282 		[Test]
283 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
284 		[ExpectedException (typeof (SecurityException))]
AddDomainUnload()285 		public void AddDomainUnload ()
286 		{
287 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_DomainUnload");
288 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
289 		}
290 
291 		[Test]
292 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
293 		[ExpectedException (typeof (SecurityException))]
RemoveDomainUnload()294 		public void RemoveDomainUnload ()
295 		{
296 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_DomainUnload");
297 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
298 		}
299 
300 		[Test]
301 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
302 		[ExpectedException (typeof (SecurityException))]
AddAssemblyLoad()303 		public void AddAssemblyLoad ()
304 		{
305 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_AssemblyLoad");
306 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
307 		}
308 
309 		[Test]
310 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
311 		[ExpectedException (typeof (SecurityException))]
RemoveAssemblyLoad()312 		public void RemoveAssemblyLoad ()
313 		{
314 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_AssemblyLoad");
315 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
316 		}
317 
318 		[Test]
319 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
320 		[ExpectedException (typeof (SecurityException))]
AddProcessExit()321 		public void AddProcessExit ()
322 		{
323 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_ProcessExit");
324 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
325 		}
326 
327 		[Test]
328 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
329 		[ExpectedException (typeof (SecurityException))]
RemoveProcessExit()330 		public void RemoveProcessExit ()
331 		{
332 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_ProcessExit");
333 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
334 		}
335 
336 		[Test]
337 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
338 		[ExpectedException (typeof (SecurityException))]
AddTypeResolve()339 		public void AddTypeResolve ()
340 		{
341 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_TypeResolve");
342 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
343 		}
344 
345 		[Test]
346 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
347 		[ExpectedException (typeof (SecurityException))]
RemoveTypeResolve()348 		public void RemoveTypeResolve ()
349 		{
350 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_TypeResolve");
351 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
352 		}
353 
354 		[Test]
355 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
356 		[ExpectedException (typeof (SecurityException))]
AddResourceResolve()357 		public void AddResourceResolve ()
358 		{
359 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_ResourceResolve");
360 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
361 		}
362 
363 		[Test]
364 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
365 		[ExpectedException (typeof (SecurityException))]
RemoveResourceResolve()366 		public void RemoveResourceResolve ()
367 		{
368 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_ResourceResolve");
369 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
370 		}
371 
372 		[Test]
373 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
374 		[ExpectedException (typeof (SecurityException))]
AddAssemblyResolve()375 		public void AddAssemblyResolve ()
376 		{
377 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_AssemblyResolve");
378 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
379 		}
380 
381 		[Test]
382 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
383 		[ExpectedException (typeof (SecurityException))]
RemoveAssemblyResolve()384 		public void RemoveAssemblyResolve ()
385 		{
386 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_AssemblyResolve");
387 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
388 		}
389 
390 		[Test]
391 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
392 		[ExpectedException (typeof (SecurityException))]
AddUnhandledException()393 		public void AddUnhandledException ()
394 		{
395 			MethodInfo mi = typeof (AppDomain).GetMethod ("add_UnhandledException");
396 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
397 		}
398 
399 		[Test]
400 		[SecurityPermission (SecurityAction.Deny, ControlAppDomain = true)]
401 		[ExpectedException (typeof (SecurityException))]
RemoveUnhandledException()402 		public void RemoveUnhandledException ()
403 		{
404 			MethodInfo mi = typeof (AppDomain).GetMethod ("remove_UnhandledException");
405 			mi.Invoke (AppDomain.CurrentDomain, new object [1] { null });
406 		}
407 	}
408 }
409 
410 #endif // MONO_FEATURE_MULTIPLE_APPDOMAINS
411