1 //
2 // UrlIdentityPermissionTest.cs - NUnit Test Cases for UrlIdentityPermission
3 //
4 // Author:
5 //	Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2004-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 using NUnit.Framework;
30 using System;
31 using System.Security;
32 using System.Security.Permissions;
33 
34 using System.Diagnostics;
35 
36 namespace MonoTests.System.Security.Permissions {
37 
38 	[TestFixture]
39 	public class UrlIdentityPermissionTest {
40 
41 		static string[] GoodUrls = {
42 			"http://www.mono-project.com:80/",
43 			"http://www.mono-project.com/",
44 			"http://www.mono-project.com",
45 			"www.mono-project.com",
46 			"www.novell.com",
47 			"*.mono-project.com",
48 			"*www.mono-project.com",
49 			"*-project.com",
50 			"*.com",
51 			"*",
52 		};
53 
54 		[Test]
PermissionState_None()55 		public void PermissionState_None ()
56 		{
57 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
58 			// that cause a NullReferenceException before 2.0
59 			Assert.AreEqual (String.Empty, uip.Url, "Url");
60 			SecurityElement se = uip.ToXml ();
61 			// only class and version are present
62 			Assert.AreEqual (2, se.Attributes.Count, "Xml-Attributes");
63 			Assert.IsNull (se.Children, "Xml-Children");
64 			UrlIdentityPermission copy = (UrlIdentityPermission)uip.Copy ();
65 			Assert.IsFalse (Object.ReferenceEquals (uip, copy), "ReferenceEquals");
66 		}
67 
68 
69 		[Test]
70 		[Category ("NotWorking")]
PermissionStateUnrestricted()71 		public void PermissionStateUnrestricted ()
72 		{
73 			// In 2.0 Unrestricted are permitted for identity permissions
74 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.Unrestricted);
75 			Assert.AreEqual (String.Empty, uip.Url, "Url");
76 			SecurityElement se = uip.ToXml ();
77 			// only class and version are present
78 			Assert.AreEqual (3, se.Attributes.Count, "Xml-Attributes");
79 			Assert.IsNull (se.Children, "Xml-Children");
80 			// and they aren't equals to None
81 			Assert.IsFalse (uip.Equals (new UrlIdentityPermission (PermissionState.None)));
82 		}
83 		[Test]
84 		[ExpectedException (typeof (ArgumentException))]
PermissionState_Bad()85 		public void PermissionState_Bad ()
86 		{
87 			UrlIdentityPermission uip = new UrlIdentityPermission ((PermissionState)Int32.MinValue);
88 		}
89 
90 		[Test]
91 		[ExpectedException (typeof (ArgumentNullException))]
UrlIdentityPermission_NullUrl()92 		public void UrlIdentityPermission_NullUrl ()
93 		{
94 			UrlIdentityPermission uip = new UrlIdentityPermission (null);
95 		}
96 
97 		[Test]
Url()98 		public void Url ()
99 		{
100 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
101 			foreach (string s in GoodUrls) {
102 				uip.Url = s;
103 				Assert.AreEqual (s, uip.Url, s);
104 			}
105 		}
106 
107 		[Test]
Url_Null()108 		public void Url_Null ()
109 		{
110 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
111 			uip.Url = null;
112 			Assert.AreEqual (String.Empty, uip.Url, "Url");
113 		}
114 
115 		[Test]
Copy()116 		public void Copy ()
117 		{
118 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
119 			foreach (string s in GoodUrls) {
120 				uip.Url = s;
121 				UrlIdentityPermission copy = (UrlIdentityPermission)uip.Copy ();
122 				// Fx 1.0/1.1 adds a '/' at the end, while 2.0 keeps the original format
123 				// so we only compare the start of the url
124 				Assert.AreEqual (uip.Url, copy.Url, "Url");
125 			}
126 		}
127 
128 		[Test]
Copy_None()129 		public void Copy_None ()
130 		{
131 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
132 			UrlIdentityPermission copy = (UrlIdentityPermission)uip.Copy ();
133 		}
134 
135 		[Test]
Intersect_Null()136 		public void Intersect_Null ()
137 		{
138 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
139 			// No intersection with null
140 			foreach (string s in GoodUrls) {
141 				uip.Url = s;
142 				Assert.IsNull (uip.Intersect (null), s);
143 			}
144 		}
145 		[Category ("NotWorking")]
146 		[Test]
Intersect_None()147 		public void Intersect_None ()
148 		{
149 			UrlIdentityPermission uip1 = new UrlIdentityPermission (PermissionState.None);
150 			UrlIdentityPermission uip2 = new UrlIdentityPermission (PermissionState.None);
151 			UrlIdentityPermission result = (UrlIdentityPermission)uip1.Intersect (uip2);
152 			Assert.IsNull (result, "None N None");
153 			foreach (string s in GoodUrls) {
154 				uip1.Url = s;
155 				// 1. Intersect None with Url
156 				result = (UrlIdentityPermission)uip1.Intersect (uip2);
157 				Assert.IsNull (result, "None N " + s);
158 				// 2. Intersect Url with None
159 				result = (UrlIdentityPermission)uip2.Intersect (uip1);
160 				Assert.IsNull (result, s + "N None");
161 			}
162 		}
163 
164 		[Test]
Intersect_Self()165 		public void Intersect_Self ()
166 		{
167 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
168 			foreach (string s in GoodUrls) {
169 				uip.Url = s;
170 				UrlIdentityPermission result = (UrlIdentityPermission)uip.Intersect (uip);
171 				// Fx 1.0/1.1 adds a '/' at the end, while 2.0 keeps the original format
172 				// so we only compare the start of the url
173 				Assert.IsTrue (result.Url.StartsWith (uip.Url), s);
174 			}
175 		}
176 
177 		[Test]
Intersect_Different()178 		public void Intersect_Different ()
179 		{
180 			UrlIdentityPermission uip1 = new UrlIdentityPermission (GoodUrls [0]);
181 			UrlIdentityPermission uip2 = new UrlIdentityPermission (GoodUrls [1]);
182 			UrlIdentityPermission result = (UrlIdentityPermission)uip1.Intersect (uip2);
183 			Assert.IsNull (result, "Mono N Novell");
184 		}
185 
186 		[Test]
IsSubset_Null()187 		public void IsSubset_Null ()
188 		{
189 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
190 			Assert.IsTrue (uip.IsSubsetOf (null), "Empty");
191 			foreach (string s in GoodUrls) {
192 				uip.Url = s;
193 				Assert.IsFalse (uip.IsSubsetOf (null), s);
194 			}
195 		}
196 
197 		[Category ("NotWorking")]
198 		[Test]
IsSubset_None()199 		public void IsSubset_None ()
200 		{
201 			// IsSubset with none
202 			// a. source (this) is none -> target is never a subset
203 			UrlIdentityPermission uip1 = new UrlIdentityPermission (PermissionState.None);
204 			UrlIdentityPermission uip2 = new UrlIdentityPermission (PermissionState.None);
205 			foreach (string s in GoodUrls) {
206 				uip1.Url = s;
207 				Assert.IsFalse (uip1.IsSubsetOf (uip2), "target " + s);
208 			}
209 			uip1 = new UrlIdentityPermission (PermissionState.None);
210 			// b. destination (target) is none -> target is always a subset
211 			foreach (string s in GoodUrls) {
212 				uip2.Url = s;
213 				Assert.IsFalse (uip2.IsSubsetOf (uip1), "source " + s);
214 			}
215 		}
216 
217 		[Test]
IsSubset_Self()218 		public void IsSubset_Self ()
219 		{
220 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
221 			Assert.IsTrue (uip.IsSubsetOf (uip), "None");
222 			foreach (string s in GoodUrls) {
223 				uip.Url = s;
224 				Assert.IsTrue (uip.IsSubsetOf (uip), s);
225 			}
226 		}
227 
228 		[Test]
IsSubset_Different()229 		public void IsSubset_Different ()
230 		{
231 			UrlIdentityPermission uip1 = new UrlIdentityPermission (GoodUrls [0]);
232 			UrlIdentityPermission uip2 = new UrlIdentityPermission (GoodUrls [1]);
233 			Assert.IsFalse (uip1.IsSubsetOf (uip2), "Mono subset Novell");
234 			Assert.IsFalse (uip2.IsSubsetOf (uip1), "Novell subset Mono");
235 		}
236 
237 		[Test]
Union_Null()238 		public void Union_Null ()
239 		{
240 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
241 			// Union with null is a simple copy
242 			foreach (string s in GoodUrls) {
243 				uip.Url = s;
244 				UrlIdentityPermission union = (UrlIdentityPermission)uip.Union (null);
245 				// Fx 1.0/1.1 adds a '/' at the end, while 2.0 keeps the original format
246 				// so we only compare the start of the url
247 				Assert.IsTrue (union.Url.StartsWith (uip.Url), s);
248 			}
249 		}
250 
251 		[Test]
Union_None()252 		public void Union_None ()
253 		{
254 			// Union with none is same
255 			UrlIdentityPermission uip1 = new UrlIdentityPermission (PermissionState.None);
256 			UrlIdentityPermission uip2 = new UrlIdentityPermission (PermissionState.None);
257 			// a. source (this) is none
258 			foreach (string s in GoodUrls) {
259 				uip1.Url = s;
260 				UrlIdentityPermission union = (UrlIdentityPermission)uip1.Union (uip2);
261 				// Fx 1.0/1.1 adds a '/' at the end, while 2.0 keeps the original format
262 				// so we only compare the start of the url
263 				Assert.IsTrue (union.Url.StartsWith (uip1.Url), s);
264 			}
265 			uip1 = new UrlIdentityPermission (PermissionState.None);
266 			// b. destination (target) is none
267 			foreach (string s in GoodUrls) {
268 				uip2.Url = s;
269 				UrlIdentityPermission union = (UrlIdentityPermission)uip2.Union (uip1);
270 				// Fx 1.0/1.1 adds a '/' at the end, while 2.0 keeps the original format
271 				// so we only compare the start of the url
272 				Assert.IsTrue (union.Url.StartsWith (uip2.Url), s);
273 			}
274 		}
275 
276 		[Test]
Union_Self()277 		public void Union_Self ()
278 		{
279 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
280 			UrlIdentityPermission union = (UrlIdentityPermission)uip.Union (uip);
281 			Assert.IsNull (union, "None U None");
282 			foreach (string s in GoodUrls) {
283 				uip.Url = s;
284 				union = (UrlIdentityPermission)uip.Union (uip);
285 				// Fx 1.0/1.1 adds a '/' at the end, while 2.0 keeps the original format
286 				// so we only compare the start of the url
287 				Assert.IsTrue (union.Url.StartsWith (uip.Url), s);
288 			}
289 		}
290 		[Category ("NotWorking")]
291 		[Test]
Union_Different()292 		public void Union_Different ()
293 		{
294 			UrlIdentityPermission uip1 = new UrlIdentityPermission (GoodUrls [0]);
295 			UrlIdentityPermission uip2 = new UrlIdentityPermission (GoodUrls [1]);
296 			UrlIdentityPermission result = (UrlIdentityPermission)uip1.Union (uip2);
297 			Assert.IsNotNull (result, "Mono U Novell");
298 			// new XML format is used to contain more than one site
299 			SecurityElement se = result.ToXml ();
300 			Assert.AreEqual (2, se.Children.Count, "Childs");
301 			Assert.AreEqual (GoodUrls [0], (se.Children [0] as SecurityElement).Attribute ("Url"), "Url#1");
302 			Assert.AreEqual (GoodUrls [1], (se.Children [1] as SecurityElement).Attribute ("Url"), "Url#2");
303 			// strangely it is still versioned as 'version="1"'.
304 			Assert.AreEqual ("1", se.Attribute ("version"), "Version");
305 		}
306 
307 		[Test]
308 		[ExpectedException (typeof (ArgumentNullException))]
FromXml_Null()309 		public void FromXml_Null ()
310 		{
311 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
312 			uip.FromXml (null);
313 		}
314 
315 		[Test]
316 		[ExpectedException (typeof (ArgumentException))]
FromXml_WrongTag()317 		public void FromXml_WrongTag ()
318 		{
319 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
320 			SecurityElement se = uip.ToXml ();
321 			se.Tag = "IMono";
322 			uip.FromXml (se);
323 		}
324 
325 		[Test]
326 		[ExpectedException (typeof (ArgumentException))]
FromXml_WrongTagCase()327 		public void FromXml_WrongTagCase ()
328 		{
329 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
330 			SecurityElement se = uip.ToXml ();
331 			se.Tag = "IPERMISSION"; // instead of IPermission
332 			uip.FromXml (se);
333 		}
334 
335 		[Test]
FromXml_WrongClass()336 		public void FromXml_WrongClass ()
337 		{
338 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
339 			SecurityElement se = uip.ToXml ();
340 
341 			SecurityElement w = new SecurityElement (se.Tag);
342 			w.AddAttribute ("class", "Wrong" + se.Attribute ("class"));
343 			w.AddAttribute ("version", se.Attribute ("version"));
344 			uip.FromXml (w);
345 			// doesn't care of the class name at that stage
346 			// anyway the class has already be created so...
347 		}
348 
349 		[Test]
FromXml_NoClass()350 		public void FromXml_NoClass ()
351 		{
352 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
353 			SecurityElement se = uip.ToXml ();
354 
355 			SecurityElement w = new SecurityElement (se.Tag);
356 			w.AddAttribute ("version", se.Attribute ("version"));
357 			uip.FromXml (w);
358 			// doesn't even care of the class attribute presence
359 		}
360 
361 		[Test]
362 		[ExpectedException (typeof (ArgumentException))]
FromXml_WrongVersion()363 		public void FromXml_WrongVersion ()
364 		{
365 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
366 			SecurityElement se = uip.ToXml ();
367 			se.Attributes.Remove ("version");
368 			se.Attributes.Add ("version", "2");
369 			uip.FromXml (se);
370 		}
371 
372 		[Test]
FromXml_NoVersion()373 		public void FromXml_NoVersion ()
374 		{
375 			UrlIdentityPermission uip = new UrlIdentityPermission (PermissionState.None);
376 			SecurityElement se = uip.ToXml ();
377 
378 			SecurityElement w = new SecurityElement (se.Tag);
379 			w.AddAttribute ("class", se.Attribute ("class"));
380 			uip.FromXml (w);
381 		}
382 	}
383 }
384