2 // System.Configuration.ConfigurationManagerTest.cs - Unit tests
3 // for System.Configuration.ConfigurationManager.
6 // Chris Toshok <toshok@ximian.com>
7 // Atsushi Enomoto <atsushi@ximian.com>
9 // Copyright (C) 2005-2006 Novell, Inc (http://www.novell.com)
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:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
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.
32 using System.Collections;
33 using System.Collections.Specialized;
34 using System.Configuration;
35 using System.Net.Configuration;
37 using NUnit.Framework;
38 using SysConfig = System.Configuration.Configuration;
39 using System.Runtime.InteropServices;
40 using System.Reflection;
42 namespace MonoTests.System.Configuration {
46 public class ConfigurationManagerTest
48 private string originalCurrentDir;
49 private string tempFolder;
54 originalCurrentDir = Directory.GetCurrentDirectory ();
55 tempFolder = Path.Combine (Path.GetTempPath (), this.GetType ().FullName);
56 if (!Directory.Exists (tempFolder))
57 Directory.CreateDirectory (tempFolder);
61 public void TearDown ()
63 Directory.SetCurrentDirectory (originalCurrentDir);
64 if (Directory.Exists (tempFolder))
65 Directory.Delete (tempFolder, true);
68 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
69 [Category ("NotWorking")] // bug #323622
70 public void OpenExeConfiguration1_Remote ()
72 AppDomain domain = null;
74 string config_xml = @"
77 <add key='anyKey' value='42' />
81 config_file = Path.Combine (tempFolder, "otherConfig.noconfigext");
82 File.WriteAllText (config_file, config_xml);
85 AppDomainSetup setup = new AppDomainSetup();
86 setup.ConfigurationFile = config_file;
87 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
88 domain = AppDomain.CreateDomain("foo", null, setup);
90 RemoteConfig config = RemoteConfig.GetInstance (domain);
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"));
98 AppDomain.Unload (domain);
99 File.Delete (config_file);
102 config_file = Path.Combine (tempFolder, "otherConfig.exe.config");
103 File.WriteAllText (config_file, config_xml);
106 AppDomainSetup setup = new AppDomainSetup();
107 setup.ConfigurationFile = config_file;
108 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
109 domain = AppDomain.CreateDomain("foo", null, setup);
111 RemoteConfig config = RemoteConfig.GetInstance (domain);
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"));
119 AppDomain.Unload (domain);
120 File.Delete (config_file);
124 AppDomainSetup setup = new AppDomainSetup();
125 setup.ConfigurationFile = config_file;
126 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
127 domain = AppDomain.CreateDomain("foo", null, setup);
129 RemoteConfig config = RemoteConfig.GetInstance (domain);
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"));
137 AppDomain.Unload (domain);
138 File.Delete (config_file);
142 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
143 public void OpenExeConfiguration1_UserLevel_None ()
145 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
147 Console.WriteLine("application config path: {0}", config.FilePath);
148 FileInfo fi = new FileInfo (config.FilePath);
149 Assert.AreEqual (TestUtil.ThisConfigFileName, fi.Name);
153 public void OpenExeConfiguration1_UserLevel_PerUserRoaming ()
155 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
156 Console.WriteLine("roaming user config path: {0}", config.FilePath);
158 FileInfo fi = new FileInfo (config.FilePath);
159 Assert.AreEqual ("user.config", fi.Name);
163 public void OpenExeConfiguration1_UserLevel_PerUserRoamingAndLocal ()
165 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
166 Console.WriteLine("local user config path: {0}", config.FilePath);
168 FileInfo fi = new FileInfo (config.FilePath);
169 Assert.AreEqual ("user.config", fi.Name);
172 [Test] // OpenExeConfiguration (String)
173 public void OpenExeConfiguration2 ()
178 exePath = Path.Combine (tempFolder, "DoesNotExist.whatever");
179 File.Create (exePath).Close ();
181 config = ConfigurationManager.OpenExeConfiguration (exePath);
182 Assert.AreEqual (exePath + ".config", config.FilePath, "#1");
184 exePath = Path.Combine (tempFolder, "SomeExecutable.exe");
185 File.Create (exePath).Close ();
187 config = ConfigurationManager.OpenExeConfiguration (exePath);
188 Assert.AreEqual (exePath + ".config", config.FilePath, "#2");
190 exePath = Path.Combine (tempFolder, "Foo.exe.config");
191 File.Create (exePath).Close ();
193 config = ConfigurationManager.OpenExeConfiguration (exePath);
194 Assert.AreEqual (exePath + ".config", config.FilePath, "#3");
196 Directory.SetCurrentDirectory (tempFolder);
198 exePath = "relative.exe";
199 File.Create (Path.Combine (tempFolder, exePath)).Close ();
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
208 //config = ConfigurationManager.OpenExeConfiguration (exePath);
209 //Assert.AreEqual (Path.Combine (tempFolder, exePath + ".config"), config.FilePath, "#4");
212 [Test] // OpenExeConfiguration (String)
213 public void OpenExeConfiguration2_ExePath_Empty ()
215 AppDomain domain = AppDomain.CurrentDomain;
217 SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
218 Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
221 [Test] // OpenExeConfiguration (String)
222 public void OpenExeConfiguration2_ExePath_Null ()
224 AppDomain domain = AppDomain.CurrentDomain;
226 SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
227 Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
230 [Test] // OpenExeConfiguration (String)
231 public void OpenExeConfiguration2_ExePath_DoesNotExist ()
233 String exePath = Path.Combine (tempFolder, "DoesNotExist.exe");
236 ConfigurationManager.OpenExeConfiguration (exePath);
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");
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");
258 public void exePath_UserLevelNone ()
260 string basedir = AppDomain.CurrentDomain.BaseDirectory;
261 string name = TestUtil.ThisDllName;
262 SysConfig config = ConfigurationManager.OpenExeConfiguration (name);
263 Assert.AreEqual (Path.Combine (basedir, name + ".config"), config.FilePath);
267 public void exePath_UserLevelPerRoaming ()
269 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
270 string filePath = config.FilePath;
271 string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
272 Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
273 Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
277 public void exePath_UserLevelPerRoamingAndLocal ()
279 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
280 string filePath = config.FilePath;
281 string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
282 Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
283 Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
287 public void mapped_UserLevelNone ()
289 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
290 map.ExeConfigFilename = "execonfig";
292 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
293 Console.WriteLine("mapped application config path: {0}", config.FilePath);
295 FileInfo fi = new FileInfo (config.FilePath);
296 Assert.AreEqual ("execonfig", fi.Name);
301 public void mapped_UserLevelPerRoaming ()
303 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
304 map.ExeConfigFilename = "execonfig";
305 map.RoamingUserConfigFilename = "roaminguser";
307 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoaming);
308 Console.WriteLine("mapped roaming user config path: {0}", config.FilePath);
310 FileInfo fi = new FileInfo (config.FilePath);
311 Assert.AreEqual ("roaminguser", fi.Name);
315 [ExpectedException (typeof (ArgumentException))]
316 [Category ("NotWorking")]
317 public void mapped_UserLevelPerRoaming_no_execonfig ()
319 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
320 map.RoamingUserConfigFilename = "roaminguser";
322 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoaming);
326 public void mapped_UserLevelPerRoamingAndLocal ()
328 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
329 map.ExeConfigFilename = "execonfig";
330 map.RoamingUserConfigFilename = "roaminguser";
331 map.LocalUserConfigFilename = "localuser";
333 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoamingAndLocal);
334 Console.WriteLine("mapped local user config path: {0}", config.FilePath);
336 FileInfo fi = new FileInfo (config.FilePath);
337 Assert.AreEqual ("localuser", fi.Name);
341 [ExpectedException (typeof (ArgumentException))]
342 [Category ("NotWorking")]
343 public void mapped_UserLevelPerRoamingAndLocal_no_execonfig ()
345 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
346 map.RoamingUserConfigFilename = "roaminguser";
347 map.LocalUserConfigFilename = "localuser";
349 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
353 [ExpectedException (typeof (ArgumentException))]
354 [Category ("NotWorking")]
355 public void mapped_UserLevelPerRoamingAndLocal_no_roaminguser ()
357 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
358 map.ExeConfigFilename = "execonfig";
359 map.LocalUserConfigFilename = "localuser";
361 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
365 public void MachineConfig ()
367 SysConfig config = ConfigurationManager.OpenMachineConfiguration ();
368 Console.WriteLine("machine config path: {0}", config.FilePath);
370 FileInfo fi = new FileInfo (config.FilePath);
371 Assert.AreEqual ("machine.config", fi.Name);
375 public void mapped_MachineConfig ()
377 ConfigurationFileMap map = new ConfigurationFileMap ();
378 map.MachineConfigFilename = "machineconfig";
380 SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (map);
381 Console.WriteLine("mapped machine config path: {0}", config.FilePath);
383 FileInfo fi = new FileInfo (config.FilePath);
384 Assert.AreEqual ("machineconfig", fi.Name);
388 public void exePath_UserLevelNone_null ()
391 SysConfig config = ConfigurationManager.OpenExeConfiguration (null);
392 Console.WriteLine("null exe application config path: {0}", config.FilePath);
394 FileInfo fi = new FileInfo (config.FilePath);
395 Assert.AreEqual (TestUtil.ThisConfigFileName, fi.Name);
400 [Category ("NotWorking")]
401 public void mapped_ExeConfiguration_null ()
403 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(null, ConfigurationUserLevel.None);
404 Console.WriteLine("null mapped application config path: {0}", config.FilePath);
406 FileInfo fi = new FileInfo (config.FilePath);
407 Assert.AreEqual (TestUtil.ThisConfigFileName, fi.Name);
411 [Category ("NotWorking")]
412 public void mapped_MachineConfig_null ()
414 SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (null);
415 Console.WriteLine("null mapped machine config path: {0}", config.FilePath);
417 FileInfo fi = new FileInfo (config.FilePath);
418 Assert.AreEqual ("machine.config", fi.Name);
422 public void GetSectionReturnsNativeObject ()
424 Assert.IsTrue (ConfigurationManager.GetSection ("appSettings") is NameValueCollection);
427 [Test] // test for bug #78372.
428 public void OpenMachineConfiguration ()
430 SysConfig cfg = ConfigurationManager.OpenMachineConfiguration ();
431 Assert.IsTrue (cfg.Sections.Count > 0, "#1");
433 ConfigurationSection s = cfg.SectionGroups ["system.net"].Sections ["connectionManagement"];
434 Assert.IsNotNull (s, "#2");
435 Assert.IsTrue (s is ConnectionManagementSection, "#3");
440 public void SectionCollectionEnumerator ()
442 SysConfig c = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
443 ConfigurationSectionCollection col =
444 c.GetSectionGroup ("system.web").Sections;
445 IEnumerator e = col.GetEnumerator ();
447 Assert.IsTrue (e.Current is ConfigurationSection);
450 [Test] // Test for bug #3412
451 [Category("NotWorking")]
452 public void TestAddRemoveSection()
454 const string name = "testsection";
455 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
457 // ensure not present
458 if (config.Sections.Get(name) != null)
460 config.Sections.Remove(name);
464 config.Sections.Add(name, new TestSection());
467 var section = config.Sections.Get(name);
468 Assert.IsNotNull(section);
469 Assert.IsNotNull(section as TestSection);
470 config.Sections.Remove(name);
473 config.Sections.Add(name, new TestSection());
476 section = config.Sections.Get(name);
477 Assert.IsNotNull(section);
478 Assert.IsNotNull(section as TestSection);
479 config.Sections.Remove(name);
483 public void TestFileMap ()
485 var name = Path.GetRandomFileName () + ".config";
486 Assert.IsFalse (File.Exists (name));
489 var map = new ExeConfigurationFileMap ();
490 map.ExeConfigFilename = name;
492 var config = ConfigurationManager.OpenMappedExeConfiguration (
493 map, ConfigurationUserLevel.None);
495 config.Sections.Add ("testsection", new TestSection ());
499 Assert.IsTrue (File.Exists (name), "#1");
500 Assert.IsTrue (File.Exists (Path.GetFullPath (name)), "#2");
507 public void TestContext ()
509 var config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
510 const string name = "testsection";
512 // ensure not present
513 if (config.GetSection (name) != null)
514 config.Sections.Remove (name);
516 var section = new TestContextSection ();
518 // Can't access EvaluationContext ....
520 section.TestContext (null);
522 } catch (ConfigurationException) {
526 // ... until it's been added to a section.
527 config.Sections.Add (name, section);
528 section.TestContext ("#2");
531 config.Sections.Remove (name);
533 // ... and it doesn't lose its context
534 section.TestContext (null);
538 public void TestContext2 ()
540 var name = Path.GetRandomFileName () + ".config";
541 Assert.IsFalse (File.Exists (name));
544 var map = new ExeConfigurationFileMap ();
545 map.ExeConfigFilename = name;
547 var config = ConfigurationManager.OpenMappedExeConfiguration (
548 map, ConfigurationUserLevel.None);
550 config.Sections.Add ("testsection", new TestSection ());
551 config.Sections.Add ("testcontext", new TestContextSection ());
555 Assert.IsTrue (File.Exists (name), "#1");
562 class TestSection : ConfigurationSection {}
564 class RemoteConfig : MarshalByRefObject
566 public static RemoteConfig GetInstance (AppDomain domain)
568 RemoteConfig config = (RemoteConfig) domain.CreateInstanceAndUnwrap (
569 typeof (RemoteConfig).Assembly.FullName,
570 typeof (RemoteConfig).FullName, new object [0]);
574 public string GetFilePath (string exePath)
576 global::System.Configuration.Configuration config =
577 ConfigurationManager.OpenExeConfiguration (exePath);
578 return config.FilePath;
581 public string GetFilePath (ConfigurationUserLevel userLevel)
583 global::System.Configuration.Configuration config =
584 ConfigurationManager.OpenExeConfiguration (userLevel);
585 return config.FilePath;
588 public string GetSettingValue (string exePath, string key)
590 global::System.Configuration.Configuration config =
591 ConfigurationManager.OpenExeConfiguration (exePath);
592 return config.AppSettings.Settings [key].Value;
595 public string GetSettingValue (ConfigurationUserLevel userLevel, string key)
597 global::System.Configuration.Configuration config =
598 ConfigurationManager.OpenExeConfiguration (userLevel);
599 KeyValueConfigurationElement value = config.AppSettings.Settings [key];
600 return value != null ? value.Value : null;
603 public string GetSettingValue (string key)
605 return ConfigurationManager.AppSettings [key];
609 class TestContextSection : ConfigurationSection {
610 public void TestContext (string label)
612 Assert.That (EvaluationContext != null, label);
618 public void TestConnectionStringRetrieval ()
620 var currentAssembly = Assembly.GetExecutingAssembly().Location;
621 Assert.IsTrue (File.Exists (currentAssembly + ".config"),
622 String.Format ("This test cannot succeed without the .config file being in the same place as the assembly ({0})",
625 var connStringObj = ConfigurationManager.ConnectionStrings ["test-connstring"];
626 Assert.IsNotNull (connStringObj);
627 var connString = connStringObj.ConnectionString;
628 Assert.IsFalse (String.IsNullOrEmpty (connString));
629 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;",