2 // System.Web.SiteMapProviderTest.cs - Unit tests for System.Web.SiteMapProvider
5 // Marek Habersack <mhabersack@novell.com>
7 // Copyright (C) 2009 Novell, Inc (http://novell.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
32 using System.Collections.Generic;
33 using System.Collections.Specialized;
34 using System.Configuration;
35 using System.Configuration.Provider;
36 using System.Diagnostics;
37 using System.Reflection;
41 using System.Web.Hosting;
42 using NUnit.Framework;
44 using MonoTests.stand_alone.WebHarness;
45 using MonoTests.SystemWeb.Framework;
49 namespace MonoTests.System.Web
52 public class XmlSiteMapProviderTest
58 Type myType = GetType ();
60 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_01.sitemap", "test_map_01.sitemap");
61 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_02.sitemap", "test_map_02.sitemap");
62 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_03.sitemap", "test_map_03.sitemap");
63 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_04.sitemap", "test_map_04.sitemap");
64 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_05.sitemap", "test_map_05.sitemap");
65 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_06.sitemap", "test_map_06.sitemap");
66 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_07.sitemap", "test_map_07.sitemap");
67 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_08.sitemap", "test_map_08.sitemap");
68 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.test_map_09.sitemap", "test_map_09.sitemap");
69 WebTest.CopyResource (myType, "System.Web_test.mainsoft.NunitWeb.NunitWeb.Resources.sub_map_01.sitemap", "sub_map_01.sitemap");
71 WebTest.CopyResource (myType, "test_map_01.sitemap", "test_map_01.sitemap");
72 WebTest.CopyResource (myType, "test_map_02.sitemap", "test_map_02.sitemap");
73 WebTest.CopyResource (myType, "test_map_03.sitemap", "test_map_03.sitemap");
74 WebTest.CopyResource (myType, "test_map_04.sitemap", "test_map_04.sitemap");
75 WebTest.CopyResource (myType, "test_map_05.sitemap", "test_map_05.sitemap");
76 WebTest.CopyResource (myType, "test_map_06.sitemap", "test_map_06.sitemap");
77 WebTest.CopyResource (myType, "test_map_07.sitemap", "test_map_07.sitemap");
78 WebTest.CopyResource (myType, "test_map_08.sitemap", "test_map_08.sitemap");
79 WebTest.CopyResource (myType, "test_map_09.sitemap", "test_map_09.sitemap");
80 WebTest.CopyResource (myType, "sub_map_01.sitemap", "sub_map_01.sitemap");
85 [ExpectedException (typeof (ArgumentNullException))]
86 public void AddNode_Null_1 ()
88 var provider = new XmlSiteMapProviderPoker ();
89 var node = new SiteMapNode (provider, "/test.aspx");
91 provider.DoAddNode (null, node);
95 [ExpectedException (typeof (ArgumentNullException))]
96 public void AddNode_Null_2 ()
98 var provider = new XmlSiteMapProviderPoker ();
99 var node = new SiteMapNode (provider, "/test.aspx");
101 provider.DoAddNode (node, null);
105 [ExpectedException (typeof (ArgumentException))]
106 public void AddNode_DifferentProviders_01 ()
108 var provider = new XmlSiteMapProviderPoker ();
109 var node = new SiteMapNode (new TestSiteMapProvider (), "/test.aspx");
110 var parentNode = new SiteMapNode (provider, "/test2.aspx");
112 // SiteMapNode cannot be found in current provider, only nodes in the same provider can be added.
113 provider.DoAddNode (node, parentNode);
117 [ExpectedException (typeof (ArgumentException))]
118 public void AddNode_DifferentProviders_02 ()
120 var provider = new XmlSiteMapProviderPoker ();
121 var node = new SiteMapNode (provider, "/test.aspx");
122 var parentNode = new SiteMapNode (new TestSiteMapProvider (), "/test2.aspx");
124 // SiteMapNode cannot be found in current provider, only nodes in the same provider can be added.
125 provider.DoAddNode (node, parentNode);
129 [ExpectedException (typeof (HttpException))]
130 public void AddNode_01 ()
132 var provider = new XmlSiteMapProviderPoker ();
133 var node = new SiteMapNode (provider, "/test.aspx");
134 var parentNode = new SiteMapNode (provider, "/test2.aspx");
136 var nvc = new NameValueCollection ();
137 nvc.Add ("siteMapFile", "~/test_map_01.sitemap");
138 provider.Initialize ("TestMap", nvc);
140 // The application relative virtual path '~/test_map_01.sitemap' cannot be made absolute, because the path to the application is not known.
141 provider.DoAddNode (node, parentNode);
145 public void AddNode_02 ()
147 new WebTest (PageInvoker.CreateOnLoad (AddNode_02_OnLoad)).Run ();
150 public static void AddNode_02_OnLoad (Page p)
152 var provider = new XmlSiteMapProviderPoker ();
153 provider.CallTrace = null;
154 var nvc = new NameValueCollection ();
155 nvc.Add ("siteMapFile", "~/test_map_01.sitemap");
156 provider.Initialize ("TestMap", nvc);
158 SiteMapNode rootNode = provider.RootNode;
159 provider.CallTrace = null;
161 var node = new SiteMapNode (provider, "test3.aspx", "~/test3.aspx");
162 provider.DoAddNode (node, rootNode);
164 Assert.IsNotNull (provider.CallTrace, "#A1");
165 Assert.Greater (provider.CallTrace.Length, 1, "#A1-1");
166 Assert.AreEqual (provider.CallTrace[0].Name, "BuildSiteMap", "#A1-2");
170 public void Initialize_1 ()
172 var provider = new XmlSiteMapProviderPoker ();
174 provider.Initialize ("TestMap", null);
175 Assert.AreEqual ("TestMap", provider.Name, "#A1");
179 public void Initialize_2 ()
181 var provider = new XmlSiteMapProviderPoker ();
183 provider.Initialize ("TestMap", new NameValueCollection ());
184 Assert.AreEqual ("TestMap", provider.Name, "#A1");
188 public void Initialize_3 ()
190 var provider = new XmlSiteMapProviderPoker ();
191 var nvc = new NameValueCollection ();
192 nvc.Add ("siteMapFile", "test.sitemap");
193 provider.Initialize ("TestMap", nvc);
194 Assert.AreEqual ("TestMap", provider.Name, "#A1");
198 public void Initialize_4 ()
200 var provider = new XmlSiteMapProviderPoker ();
201 var nvc = new NameValueCollection ();
202 nvc.Add ("siteMapFile", "test.sitemap");
203 nvc.Add ("description", "Test XML provider");
204 provider.Initialize ("TestMap", nvc);
205 Assert.AreEqual ("TestMap", provider.Name, "#A1");
206 Assert.AreEqual ("Test XML provider", provider.Description, "#A2");
210 [ExpectedException (typeof (ConfigurationErrorsException))]
211 public void Initialize_5 ()
213 var provider = new XmlSiteMapProviderPoker ();
214 var nvc = new NameValueCollection ();
215 nvc.Add ("siteMapFile", "test.sitemap");
216 nvc.Add ("description", "Test XML provider");
218 // The attribute 'acme' is unexpected in the configuration of the 'TestMap' provider.
219 nvc.Add ("acme", "test provider");
220 provider.Initialize ("TestMap", nvc);
224 [ExpectedException (typeof (InvalidOperationException))]
225 public void Initialize_6 ()
227 var provider = new XmlSiteMapProviderPoker ();
229 provider.Initialize ("TestMap", null);
231 // XmlSiteMapProvider cannot be initialized twice
232 provider.Initialize ("TestMap2", null);
236 [ExpectedException (typeof (ArgumentException))]
237 public void RootNode_1 ()
239 var provider = new XmlSiteMapProviderPoker ();
241 // Thrown from internal GetConfigDocument ():
242 // The siteMapFile attribute must be specified on the XmlSiteMapProvider
243 provider.Initialize ("TestMap", null);
244 var rn = provider.RootNode;
248 public void RootNode_2 ()
250 new WebTest (PageInvoker.CreateOnLoad (RootNode_2_OnLoad)).Run ();
253 public static void RootNode_2_OnLoad (Page p)
255 var provider = new XmlSiteMapProviderPoker ();
256 provider.CallTrace = null;
257 var nvc = new NameValueCollection ();
258 nvc.Add ("siteMapFile", "~/test_map_01.sitemap");
259 provider.CallTrace = null;
260 provider.Initialize ("TestMap", nvc);
261 Assert.IsNotNull (provider.RootNode, "#A1");
262 Assert.AreEqual (provider.RootNode.Provider, provider, "#A2");
263 Assert.IsNotNull (provider.CallTrace, "#A3");
264 Assert.Greater (provider.CallTrace.Length, 1, "#A3-1");
265 Assert.AreEqual (provider.CallTrace[0].Name, "BuildSiteMap", "#A3-2");
266 Assert.AreEqual (provider.CallTrace[1].Name, "get_RootNode", "#A3-3");
270 [ExpectedException (typeof (InvalidOperationException))]
271 public void InvalidFileExtension ()
273 // The file /NunitWeb/test_map_01.extension has an invalid extension, only .sitemap files are allowed in XmlSiteMapProvider.
274 new WebTest (PageInvoker.CreateOnLoad (InvalidFileExtension_OnLoad)).Run ();
277 public static void InvalidFileExtension_OnLoad (Page p)
279 var provider = new XmlSiteMapProviderPoker ();
280 var nvc = new NameValueCollection ();
281 nvc.Add ("siteMapFile", "~/test_map_01.extension");
283 provider.Initialize ("TestMap", nvc);
284 var rn = provider.RootNode;
288 [ExpectedException (typeof (InvalidOperationException))]
289 public void MissingMapFile ()
291 new WebTest (PageInvoker.CreateOnLoad (MissingMapFile_OnLoad)).Run ();
294 public static void MissingMapFile_OnLoad (Page p)
296 var provider = new XmlSiteMapProviderPoker ();
297 var nvc = new NameValueCollection ();
298 nvc.Add ("siteMapFile", "~/missing_map_file.sitemap");
300 provider.Initialize ("TestMap", nvc);
301 var rn = provider.RootNode;
305 public void NodeWithSiteMapFile_01 ()
307 var test = new WebTest (PageInvoker.CreateOnLoad (NodeWithSiteMapFile_01_OnLoad)).Run ();
310 public static void NodeWithSiteMapFile_01_OnLoad (Page p)
312 var provider = new XmlSiteMapProviderPoker ();
313 var nvc = new NameValueCollection ();
314 nvc.Add ("siteMapFile", "~/test_map_02.sitemap");
316 provider.Initialize ("TestMap", nvc);
317 var rn = provider.RootNode;
319 string expectedTreeString = "UNTITLED_0[0]; Test 1[1]; Sub 1 [/NunitWeb/sub_map_01.sitemap][1]; Sub Sub 1 [/NunitWeb/sub_map_01.sitemap][2]";
320 string treeString = provider.GetTreeString ();
322 Assert.AreEqual (expectedTreeString, treeString, "#A1");
326 public void NodeWithProvider_01 ()
328 var test = new WebTest (PageInvoker.CreateOnLoad ((Page p) => {
329 NodeWithProvider_OnLoad ("~/test_map_07.sitemap", p);
334 [ExpectedException (typeof (ProviderException))]
335 public void NodeWithProvider_02 ()
337 new WebTest (PageInvoker.CreateOnLoad ((Page p) => {
338 NodeWithProvider_OnLoad ("~/test_map_08.sitemap", p);
342 public static void NodeWithProvider_OnLoad (string filePath, Page p)
344 var provider = new XmlSiteMapProviderPoker ();
345 var nvc = new NameValueCollection ();
346 nvc.Add ("siteMapFile", filePath);
348 provider.Initialize ("TestMap", nvc);
349 var rn = provider.RootNode;
351 string expectedTreeString = "UNTITLED_0[0]; Test 1[1]; Test [TestSiteMapProvider][1]";
352 string treeString = provider.GetTreeString ();
353 Assert.AreEqual (expectedTreeString, treeString, "#A1");
355 SiteMapNode node = provider.FindSiteMapNode ("default.aspx");
356 Assert.IsNotNull (node, "#B1");
357 Assert.AreEqual ("Test", node.Title, "#B1-1");
361 [ExpectedException (typeof (ConfigurationErrorsException))]
362 public void InvalidMapFile_01 ()
364 // Top element must be siteMap.
365 new WebTest (PageInvoker.CreateOnLoad ((Page p) => {
366 InvalidMapFile_OnLoad ("~/test_map_03.sitemap", p);
371 [ExpectedException (typeof (ConfigurationErrorsException))]
372 public void InvalidMapFile_02 ()
374 // Only <siteMapNode> elements are allowed at this location.
375 var test = new WebTest (PageInvoker.CreateOnLoad ((Page p) => {
376 InvalidMapFile_OnLoad ("~/test_map_04.sitemap", p);
381 [ExpectedException (typeof (ConfigurationErrorsException))]
382 public void InvalidMapFile_03 ()
384 // Only <siteMapNode> elements are allowed at this location.
385 var test = new WebTest (PageInvoker.CreateOnLoad ((Page p) => {
386 InvalidMapFile_OnLoad ("~/test_map_05.sitemap", p);
391 [ExpectedException (typeof (ConfigurationErrorsException))]
392 public void InvalidMapFile_04 ()
394 // Only <siteMapNode> elements are allowed at this location.
395 var test = new WebTest (PageInvoker.CreateOnLoad ((Page p) => {
396 InvalidMapFile_OnLoad ("~/test_map_06.sitemap", p);
400 public static void InvalidMapFile_OnLoad (string filePath, Page p)
402 var provider = new XmlSiteMapProviderPoker ();
403 var nvc = new NameValueCollection ();
404 nvc.Add ("siteMapFile", filePath);
406 provider.Initialize ("TestMap", nvc);
407 var rn = provider.RootNode;
411 public void MapFileWithNonStandardAttributes ()
413 // Only <siteMapNode> elements are allowed at this location.
414 new WebTest (PageInvoker.CreateOnLoad (MapFileWithNonStandardAttributes_OnLoad)).Run ();
417 public static void MapFileWithNonStandardAttributes_OnLoad (Page p)
419 var provider = new XmlSiteMapProviderPoker ();
420 var nvc = new NameValueCollection ();
421 nvc.Add ("siteMapFile", "~/test_map_09.sitemap");
423 provider.Initialize ("TestMap", nvc);
424 var rn = provider.RootNode;
426 //TODO: find out what happens to non-standard attributes
427 //SiteMapNode node = rn.ChildNodes[0];
428 //Assert.IsNotNull (node, "#A1");
429 //Assert.AreEqual ("some, keyword, another, one", node["keywords"], "#A1-1");
431 //node = rn.ChildNodes[1];
432 //Assert.IsNotNull (node, "#B1");
433 //Assert.AreEqual("value", node["someattribute"], "#B1-1");
437 class XmlSiteMapProviderPoker : XmlSiteMapProvider
439 public MethodBase[] CallTrace { get; set; }
441 public void DoAddNode (SiteMapNode node, SiteMapNode parentNode)
443 AddNode (node, parentNode);
446 public override SiteMapNode BuildSiteMap ()
449 return base.BuildSiteMap ();
452 public string GetTreeString ()
454 var sb = new StringBuilder ();
455 int untitled_counter = 0;
456 BuildTreeString (RootNode, sb, 0, ref untitled_counter);
457 return sb.ToString ();
460 void BuildTreeString (SiteMapNode top, StringBuilder sb, int level, ref int untitled_counter)
462 string title = top.Title;
464 if (String.IsNullOrEmpty (title))
465 title = "UNTITLED_" + untitled_counter++;
467 SiteMapProvider provider = top.Provider;
468 if (provider != this) {
469 if (provider == null)
470 title += " [NULL_PROVIDER]";
472 string name = provider.Name;
473 if (String.IsNullOrEmpty (name))
474 title += " [" + provider.GetType () + "]";
476 title += " [" + name + "]";
482 sb.Append (title + "[" + level + "]");
483 SiteMapNodeCollection childNodes = top.ChildNodes;
484 if (childNodes != null && childNodes.Count > 0) {
485 foreach (SiteMapNode child in childNodes)
486 BuildTreeString (child, sb, level + 1, ref untitled_counter);
490 void StoreCallTrace ()
493 StackFrame[] frames = new StackTrace (1).GetFrames ();
494 var frameMethods = new List<MethodBase> ();
497 foreach (StackFrame sf in frames)
498 frameMethods.Add (sf.GetMethod ());
499 CallTrace = frameMethods.ToArray ();