Merge pull request #3796 from ntherning/windows-backend-for-MemoryMappedFile
[mono.git] / mcs / class / System.Configuration / Test / System.Configuration / ConfigurationManagerTest.cs
1 //
2 // System.Configuration.ConfigurationManagerTest.cs - Unit tests
3 // for System.Configuration.ConfigurationManager.
4 //
5 // Author:
6 //      Chris Toshok  <toshok@ximian.com>
7 //      Atsushi Enomoto  <atsushi@ximian.com>
8 //
9 // Copyright (C) 2005-2006 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 System;
32 using System.Collections;
33 using System.Collections.Specialized;
34 using System.Configuration;
35 using System.Net.Configuration;
36 using System.IO;
37 using NUnit.Framework;
38 using SysConfig = System.Configuration.Configuration;
39 using System.Runtime.InteropServices;
40 using System.Reflection;
41
42 namespace MonoTests.System.Configuration {
43         using Util;
44
45         [TestFixture]
46         public class ConfigurationManagerTest
47         {
48                 private string originalCurrentDir;
49                 private string tempFolder;
50
51                 [SetUp]
52                 public void SetUp ()
53                 {
54                         originalCurrentDir = Directory.GetCurrentDirectory ();
55                         tempFolder = Path.Combine (Path.GetTempPath (), this.GetType ().FullName);
56                         if (!Directory.Exists (tempFolder))
57                                 Directory.CreateDirectory (tempFolder);
58                 }
59
60                 [TearDown]
61                 public void TearDown ()
62                 {
63                         Directory.SetCurrentDirectory (originalCurrentDir);
64                         if (Directory.Exists (tempFolder))
65                                 Directory.Delete (tempFolder, true);
66                 }
67                 
68                 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
69                 [Category ("NotWorking")] // bug #323622
70                 public void OpenExeConfiguration1_Remote ()
71                 {
72                         AppDomain domain = null;
73                         string config_file;
74                         string config_xml = @"
75                                 <configuration>
76                                         <appSettings>
77                                                 <add key='anyKey' value='42' />
78                                         </appSettings>
79                                 </configuration>";
80
81                         config_file = Path.Combine (tempFolder, "otherConfig.noconfigext");
82                         File.WriteAllText (config_file, config_xml);
83
84                         try {
85                                 AppDomainSetup setup = new AppDomainSetup();
86                                 setup.ConfigurationFile = config_file;
87                                 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
88                                 domain = AppDomain.CreateDomain("foo", null, setup);
89
90                                 RemoteConfig config = RemoteConfig.GetInstance (domain);
91
92                                 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
93                                 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
94                                 Assert.AreEqual ("42", config.GetSettingValue (userLevel, "anyKey"));
95                                 Assert.AreEqual ("42", config.GetSettingValue ("anyKey"));
96                         } finally {
97                                 if (domain != null)
98                                         AppDomain.Unload (domain);
99                                 File.Delete (config_file);
100                         }
101
102                         config_file = Path.Combine (tempFolder, "otherConfig.exe.config");
103                         File.WriteAllText (config_file, config_xml);
104
105                         try {
106                                 AppDomainSetup setup = new AppDomainSetup();
107                                 setup.ConfigurationFile = config_file;
108                                 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
109                                 domain = AppDomain.CreateDomain("foo", null, setup);
110
111                                 RemoteConfig config = RemoteConfig.GetInstance (domain);
112
113                                 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
114                                 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
115                                 Assert.AreEqual ("42", config.GetSettingValue (userLevel, "anyKey"));
116                                 Assert.AreEqual ("42", config.GetSettingValue ("anyKey"));
117                         } finally {
118                                 if (domain != null)
119                                         AppDomain.Unload (domain);
120                                 File.Delete (config_file);
121                         }
122
123                         try {
124                                 AppDomainSetup setup = new AppDomainSetup();
125                                 setup.ConfigurationFile = config_file;
126                                 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
127                                 domain = AppDomain.CreateDomain("foo", null, setup);
128
129                                 RemoteConfig config = RemoteConfig.GetInstance (domain);
130
131                                 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
132                                 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
133                                 Assert.IsNull (config.GetSettingValue (userLevel, "anyKey"));
134                                 Assert.IsNull (config.GetSettingValue ("anyKey"));
135                         } finally {
136                                 if (domain != null)
137                                         AppDomain.Unload (domain);
138                                 File.Delete (config_file);
139                         }
140                 }
141
142                 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
143                 public void OpenExeConfiguration1_UserLevel_None ()
144                 {
145                         SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
146
147                         Console.WriteLine("application config path: {0}", config.FilePath);
148                         FileInfo fi = new FileInfo (config.FilePath);
149                         Assert.AreEqual (TestUtil.ThisConfigFileName, fi.Name);
150                 }
151
152                 [Test]
153                 public void OpenExeConfiguration1_UserLevel_PerUserRoaming ()
154                 {
155                         SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
156                         Console.WriteLine("roaming user config path: {0}", config.FilePath);
157
158                         FileInfo fi = new FileInfo (config.FilePath);
159                         Assert.AreEqual ("user.config", fi.Name);
160                 }
161
162                 [Test]
163                 public void OpenExeConfiguration1_UserLevel_PerUserRoamingAndLocal ()
164                 {
165                         SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
166                         Console.WriteLine("local user config path: {0}", config.FilePath);
167
168                         FileInfo fi = new FileInfo (config.FilePath);
169                         Assert.AreEqual ("user.config", fi.Name);
170                 }
171
172                 [Test] // OpenExeConfiguration (String)
173                 public void OpenExeConfiguration2 ()
174                 {
175                         String exePath;
176                         SysConfig config;
177
178                         exePath = Path.Combine (tempFolder, "DoesNotExist.whatever");
179                         File.Create (exePath).Close ();
180
181                         config = ConfigurationManager.OpenExeConfiguration (exePath);
182                         Assert.AreEqual (exePath + ".config", config.FilePath, "#1");
183
184                         exePath = Path.Combine (tempFolder, "SomeExecutable.exe");
185                         File.Create (exePath).Close ();
186
187                         config = ConfigurationManager.OpenExeConfiguration (exePath);
188                         Assert.AreEqual (exePath + ".config", config.FilePath, "#2");
189
190                         exePath = Path.Combine (tempFolder, "Foo.exe.config");
191                         File.Create (exePath).Close ();
192
193                         config = ConfigurationManager.OpenExeConfiguration (exePath);
194                         Assert.AreEqual (exePath + ".config", config.FilePath, "#3");
195
196                         Directory.SetCurrentDirectory (tempFolder);
197
198                         exePath = "relative.exe";
199                         File.Create (Path.Combine (tempFolder, exePath)).Close ();
200
201                         //
202                         // The temp directory as computed by the runtime is slightly different, as
203                         // it will contain the full path after following links, while the test
204                         // below is not comprehensive enough to follow links if there are any
205                         // present in tempFolder
206                         //
207                         
208                         //config = ConfigurationManager.OpenExeConfiguration (exePath);
209                         //Assert.AreEqual (Path.Combine (tempFolder, exePath + ".config"), config.FilePath, "#4");
210                 }
211
212                 [Test] // OpenExeConfiguration (String)
213                 public void OpenExeConfiguration2_ExePath_Empty ()
214                 {
215                         AppDomain domain = AppDomain.CurrentDomain;
216
217                         SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
218                         Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
219                 }
220
221                 [Test] // OpenExeConfiguration (String)
222                 public void OpenExeConfiguration2_ExePath_Null ()
223                 {
224                         AppDomain domain = AppDomain.CurrentDomain;
225
226                         SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
227                         Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
228                 }
229
230                 [Test] // OpenExeConfiguration (String)
231                 public void OpenExeConfiguration2_ExePath_DoesNotExist ()
232                 {
233                         String exePath = Path.Combine (tempFolder, "DoesNotExist.exe");
234
235                         try {
236                                 ConfigurationManager.OpenExeConfiguration (exePath);
237                                 Assert.Fail ("#1");
238                         } catch (ConfigurationErrorsException ex) {
239                                 // An error occurred loading a configuration file:
240                                 // The parameter 'exePath' is invalid
241                                 Assert.AreEqual (typeof (ConfigurationErrorsException), ex.GetType (), "#2");
242                                 Assert.IsNull (ex.Filename, "#3");
243                                 Assert.IsNotNull (ex.InnerException, "#4");
244                                 Assert.AreEqual (0, ex.Line, "#5");
245                                 Assert.IsNotNull (ex.Message, "#6");
246
247                                 // The parameter 'exePath' is invalid
248                                 ArgumentException inner = ex.InnerException as ArgumentException;
249                                 Assert.IsNotNull (inner, "#7");
250                                 Assert.AreEqual (typeof (ArgumentException), inner.GetType (), "#8");
251                                 Assert.IsNull (inner.InnerException, "#9");
252                                 Assert.IsNotNull (inner.Message, "#10");
253                                 Assert.AreEqual ("exePath", inner.ParamName, "#11");
254                         }
255                 }
256
257                 [Test]
258                 public void exePath_UserLevelNone ()
259                 {
260                         string name = TestUtil.ThisApplicationPath;
261                         SysConfig config = ConfigurationManager.OpenExeConfiguration (name);
262                         Assert.AreEqual (TestUtil.ThisApplicationPath + ".config", config.FilePath);
263                 }
264
265                 [Test]
266                 public void exePath_UserLevelPerRoaming ()
267                 {
268                         SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
269                         string filePath = config.FilePath;
270                         string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
271                         Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
272                         Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
273                 }
274
275                 [Test]
276                 public void exePath_UserLevelPerRoamingAndLocal ()
277                 {
278                         SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
279                         string filePath = config.FilePath;
280                         string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
281                         Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
282                         Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
283                 }
284
285                 [Test]
286                 public void mapped_UserLevelNone ()
287                 {
288                         ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
289                         map.ExeConfigFilename = "execonfig";
290
291                         SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
292                         Console.WriteLine("mapped application config path: {0}", config.FilePath);      
293
294                         FileInfo fi = new FileInfo (config.FilePath);
295                         Assert.AreEqual ("execonfig", fi.Name);
296
297                 }
298
299                 [Test]
300                 public void mapped_UserLevelPerRoaming ()
301                 {
302                         ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
303                         map.ExeConfigFilename = "execonfig";
304                         map.RoamingUserConfigFilename = "roaminguser";
305
306                         SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoaming);
307                         Console.WriteLine("mapped roaming user config path: {0}", config.FilePath);     
308
309                         FileInfo fi = new FileInfo (config.FilePath);
310                         Assert.AreEqual ("roaminguser", fi.Name);
311                 }
312
313                 [Test]
314                 [ExpectedException (typeof (ArgumentException))]
315                 [Category ("NotWorking")]
316                 public void mapped_UserLevelPerRoaming_no_execonfig ()
317                 {
318                         ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
319                         map.RoamingUserConfigFilename = "roaminguser";
320
321                         ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoaming);
322                 }
323
324                 [Test]
325                 public void mapped_UserLevelPerRoamingAndLocal ()
326                 {
327                         ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
328                         map.ExeConfigFilename = "execonfig";
329                         map.RoamingUserConfigFilename = "roaminguser";
330                         map.LocalUserConfigFilename = "localuser";
331
332                         SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoamingAndLocal);
333                         Console.WriteLine("mapped local user config path: {0}", config.FilePath);       
334
335                         FileInfo fi = new FileInfo (config.FilePath);
336                         Assert.AreEqual ("localuser", fi.Name);
337                 }
338
339                 [Test]
340                 [ExpectedException (typeof (ArgumentException))]
341                 [Category ("NotWorking")]
342                 public void mapped_UserLevelPerRoamingAndLocal_no_execonfig ()
343                 {
344                         ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
345                         map.RoamingUserConfigFilename = "roaminguser";
346                         map.LocalUserConfigFilename = "localuser";
347
348                         ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
349                 }
350
351                 [Test]
352                 [ExpectedException (typeof (ArgumentException))]
353                 [Category ("NotWorking")]
354                 public void mapped_UserLevelPerRoamingAndLocal_no_roaminguser ()
355                 {
356                         ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
357                         map.ExeConfigFilename = "execonfig";
358                         map.LocalUserConfigFilename = "localuser";
359
360                         ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
361                 }
362
363                 [Test]
364                 public void MachineConfig ()
365                 {
366                         SysConfig config = ConfigurationManager.OpenMachineConfiguration ();
367                         Console.WriteLine("machine config path: {0}", config.FilePath);
368
369                         FileInfo fi = new FileInfo (config.FilePath);
370                         Assert.AreEqual ("machine.config", fi.Name);
371                 }
372
373                 [Test]
374                 public void mapped_MachineConfig ()
375                 {
376                         ConfigurationFileMap map = new ConfigurationFileMap ();
377                         map.MachineConfigFilename = "machineconfig";
378
379                         SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (map);
380                         Console.WriteLine("mapped machine config path: {0}", config.FilePath);
381
382                         FileInfo fi = new FileInfo (config.FilePath);
383                         Assert.AreEqual ("machineconfig", fi.Name);
384                 }
385
386                 [Test]
387                 public void exePath_UserLevelNone_null ()
388                 {
389 #if false
390                         SysConfig config = ConfigurationManager.OpenExeConfiguration (null);
391                         Console.WriteLine("null exe application config path: {0}", config.FilePath);    
392
393                         FileInfo fi = new FileInfo (config.FilePath);
394                         Assert.AreEqual (TestUtil.ThisConfigFileName, fi.Name);
395 #endif
396                 }
397
398                 [Test]
399                 [Category ("NotWorking")]
400                 public void mapped_ExeConfiguration_null ()
401                 {
402                         SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(null, ConfigurationUserLevel.None);
403                         Console.WriteLine("null mapped application config path: {0}", config.FilePath);
404
405                         FileInfo fi = new FileInfo (config.FilePath);
406                         Assert.AreEqual (TestUtil.ThisConfigFileName, fi.Name);
407                 }
408
409                 [Test]
410                 [Category ("NotWorking")]
411                 public void mapped_MachineConfig_null ()
412                 {
413                         SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (null);
414                         Console.WriteLine("null mapped machine config path: {0}", config.FilePath);
415
416                         FileInfo fi = new FileInfo (config.FilePath);
417                         Assert.AreEqual ("machine.config", fi.Name);
418                 }
419
420                 [Test]
421                 public void GetSectionReturnsNativeObject ()
422                 {
423                         Assert.IsTrue (ConfigurationManager.GetSection ("appSettings") is NameValueCollection);
424                 }
425
426                 [Test] // test for bug #78372.
427                 public void OpenMachineConfiguration ()
428                 {
429                         SysConfig cfg = ConfigurationManager.OpenMachineConfiguration ();
430                         Assert.IsTrue (cfg.Sections.Count > 0, "#1");
431                         ConfigurationSection s = cfg.SectionGroups ["system.net"].Sections ["connectionManagement"];
432                         Assert.IsNotNull (s, "#2");
433                         Assert.IsTrue (s is ConnectionManagementSection, "#3");
434                 }
435
436                 [Test]
437                 public void SectionCollectionEnumerator ()
438                 {
439                         SysConfig c = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
440                         ConfigurationSectionCollection col =
441                                 c.GetSectionGroup ("system.web").Sections;
442                         IEnumerator e = col.GetEnumerator ();
443                         e.MoveNext ();
444                         Assert.IsTrue (e.Current is ConfigurationSection);
445                 }
446
447                 [Test]  // Test for bug #3412
448                 [Category("NotWorking")]
449                 public void TestAddRemoveSection()
450                 {
451                         const string name = "testsection";
452                         var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
453
454                         // ensure not present
455                         if (config.Sections.Get(name) != null)
456                         {
457                                 config.Sections.Remove(name);
458                         }
459
460                         // add
461                         config.Sections.Add(name, new TestSection());
462
463                         // remove
464                         var section = config.Sections.Get(name);
465                         Assert.IsNotNull(section);
466                         Assert.IsNotNull(section as TestSection);
467                         config.Sections.Remove(name);
468
469                         // add
470                         config.Sections.Add(name, new TestSection());
471
472                         // remove
473                         section = config.Sections.Get(name);
474                         Assert.IsNotNull(section);
475                         Assert.IsNotNull(section as TestSection);
476                         config.Sections.Remove(name);
477                 }
478                 
479                 [Test]
480                 public void TestFileMap ()
481                 {
482                         var name = Path.GetRandomFileName () + ".config";
483                         Assert.IsFalse (File.Exists (name));
484
485                         try {
486                                 var map = new ExeConfigurationFileMap ();
487                                 map.ExeConfigFilename = name;
488                         
489                                 var config = ConfigurationManager.OpenMappedExeConfiguration (
490                                         map, ConfigurationUserLevel.None);
491                                 
492                                 config.Sections.Add ("testsection", new TestSection ());
493                         
494                                 config.Save ();
495                         
496                                 Assert.IsTrue (File.Exists (name), "#1");
497                                 Assert.IsTrue (File.Exists (Path.GetFullPath (name)), "#2");
498                         } finally {
499                                 File.Delete (name);
500                         }
501                 }
502                 
503                 [Test]
504                 public void TestContext ()
505                 {
506                         var config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
507                         const string name = "testsection";
508
509                         // ensure not present
510                         if (config.GetSection (name) != null)
511                                 config.Sections.Remove (name);
512
513                         var section = new TestContextSection ();
514
515                         // Can't access EvaluationContext ....
516                         try {
517                                 section.TestContext (null);
518                                 Assert.Fail ("#1");
519                         } catch (ConfigurationException) {
520                                 ;
521                         }
522
523                         // ... until it's been added to a section.
524                         config.Sections.Add (name, section);
525                         section.TestContext ("#2");
526
527                         // Remove ...
528                         config.Sections.Remove (name);
529
530                         // ... and it doesn't lose its context
531                         section.TestContext (null);
532                 }
533
534                 [Test]
535                 public void TestContext2 ()
536                 {
537                         var name = Path.GetRandomFileName () + ".config";
538                         Assert.IsFalse (File.Exists (name));
539                         
540                         try {
541                                 var map = new ExeConfigurationFileMap ();
542                                 map.ExeConfigFilename = name;
543                                 
544                                 var config = ConfigurationManager.OpenMappedExeConfiguration (
545                                         map, ConfigurationUserLevel.None);
546                                 
547                                 config.Sections.Add ("testsection", new TestSection ());
548                                 config.Sections.Add ("testcontext", new TestContextSection ());
549                                 
550                                 config.Save ();
551                                 
552                                 Assert.IsTrue (File.Exists (name), "#1");
553                         } finally {
554                                 File.Delete (name);
555                         }
556                 }
557
558                         
559                 class TestSection : ConfigurationSection  {}
560
561                 class RemoteConfig : MarshalByRefObject
562                 {
563                         public static RemoteConfig GetInstance (AppDomain domain)
564                         {
565                                 RemoteConfig config = (RemoteConfig) domain.CreateInstanceAndUnwrap (
566                                         typeof (RemoteConfig).Assembly.FullName,
567                                         typeof (RemoteConfig).FullName, new object [0]);
568                                 return config;
569                         }
570
571                         public string GetFilePath (string exePath)
572                         {
573                                 global::System.Configuration.Configuration config =
574                                         ConfigurationManager.OpenExeConfiguration (exePath);
575                                 return config.FilePath;
576                         }
577
578                         public string GetFilePath (ConfigurationUserLevel userLevel)
579                         {
580                                 global::System.Configuration.Configuration config =
581                                         ConfigurationManager.OpenExeConfiguration (userLevel);
582                                 return config.FilePath;
583                         }
584
585                         public string GetSettingValue (string exePath, string key)
586                         {
587                                 global::System.Configuration.Configuration config =
588                                         ConfigurationManager.OpenExeConfiguration (exePath);
589                                 return config.AppSettings.Settings [key].Value;
590                         }
591
592                         public string GetSettingValue (ConfigurationUserLevel userLevel, string key)
593                         {
594                                 global::System.Configuration.Configuration config =
595                                         ConfigurationManager.OpenExeConfiguration (userLevel);
596                                 KeyValueConfigurationElement value = config.AppSettings.Settings [key];
597                                 return value != null ? value.Value : null;
598                         }
599
600                         public string GetSettingValue (string key)
601                         {
602                                 return ConfigurationManager.AppSettings [key];
603                         }
604                 }
605                 
606                 class TestContextSection : ConfigurationSection {
607                         public void TestContext (string label)
608                         {
609                                 Assert.That (EvaluationContext != null, label);
610                         }
611                 }
612
613
614                 [Test]
615                 public void TestConnectionStringRetrieval ()
616                 {
617                         var connStringObj = ConfigurationManager.ConnectionStrings ["test-connstring"];
618                         Assert.IsNotNull (connStringObj);
619                         var connString = connStringObj.ConnectionString;
620                         Assert.IsFalse (String.IsNullOrEmpty (connString));
621                         Assert.AreEqual ("Server=(local);Initial Catalog=someDb;User Id=someUser;Password=somePassword;Application Name=someAppName;Min Pool Size=5;Max Pool Size=500;Connect Timeout=10;Connection Lifetime=29;",
622                                          connString);
623                 }
624
625                 [Test]
626                 public void BadConfig ()
627                 {
628                         string xml = @" badXml";
629
630                         var file = Path.Combine (tempFolder, "badConfig.config");
631                         File.WriteAllText (file, xml);
632
633                         try {
634                                 var fileMap = new ConfigurationFileMap (file);
635                                 var configuration = ConfigurationManager.OpenMappedMachineConfiguration (fileMap);
636                                 Assert.Fail ("Exception ConfigurationErrorsException was expected.");
637                         } catch (ConfigurationErrorsException e) {
638                                 Assert.AreEqual (file, e.Filename);
639                         }
640
641                 }
642         }
643 }