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;
41 namespace MonoTests.System.Configuration {
43 public class ConfigurationManagerTest
45 private string originalCurrentDir;
46 private string tempFolder;
51 originalCurrentDir = Directory.GetCurrentDirectory ();
52 tempFolder = Path.Combine (Path.GetTempPath (), this.GetType ().FullName);
53 if (!Directory.Exists (tempFolder))
54 Directory.CreateDirectory (tempFolder);
58 public void TearDown ()
60 Directory.SetCurrentDirectory (originalCurrentDir);
61 if (Directory.Exists (tempFolder))
62 Directory.Delete (tempFolder, true);
65 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
66 [Category ("NotWorking")] // bug #323622
67 public void OpenExeConfiguration1_Remote ()
69 AppDomain domain = null;
71 string config_xml = @"
74 <add key='anyKey' value='42' />
78 config_file = Path.Combine (tempFolder, "otherConfig.noconfigext");
79 File.WriteAllText (config_file, config_xml);
82 AppDomainSetup setup = new AppDomainSetup();
83 setup.ConfigurationFile = config_file;
84 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
85 domain = AppDomain.CreateDomain("foo", null, setup);
87 RemoteConfig config = RemoteConfig.GetInstance (domain);
89 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
90 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
91 Assert.AreEqual ("42", config.GetSettingValue (userLevel, "anyKey"));
92 Assert.AreEqual ("42", config.GetSettingValue ("anyKey"));
95 AppDomain.Unload (domain);
96 File.Delete (config_file);
99 config_file = Path.Combine (tempFolder, "otherConfig.exe.config");
100 File.WriteAllText (config_file, config_xml);
103 AppDomainSetup setup = new AppDomainSetup();
104 setup.ConfigurationFile = config_file;
105 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
106 domain = AppDomain.CreateDomain("foo", null, setup);
108 RemoteConfig config = RemoteConfig.GetInstance (domain);
110 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
111 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
112 Assert.AreEqual ("42", config.GetSettingValue (userLevel, "anyKey"));
113 Assert.AreEqual ("42", config.GetSettingValue ("anyKey"));
116 AppDomain.Unload (domain);
117 File.Delete (config_file);
121 AppDomainSetup setup = new AppDomainSetup();
122 setup.ConfigurationFile = config_file;
123 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
124 domain = AppDomain.CreateDomain("foo", null, setup);
126 RemoteConfig config = RemoteConfig.GetInstance (domain);
128 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
129 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
130 Assert.IsNull (config.GetSettingValue (userLevel, "anyKey"));
131 Assert.IsNull (config.GetSettingValue ("anyKey"));
134 AppDomain.Unload (domain);
135 File.Delete (config_file);
139 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
140 public void OpenExeConfiguration1_UserLevel_None ()
142 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
144 Console.WriteLine("application config path: {0}", config.FilePath);
145 FileInfo fi = new FileInfo (config.FilePath);
147 Assert.AreEqual ("nunit-console.jar.config", fi.Name);
149 Assert.AreEqual ("System.Configuration_test_net_4_5.dll.config", fi.Name);
151 Assert.AreEqual ("System.Configuration_test_net_4_0.dll.config", fi.Name);
153 Assert.AreEqual ("System.Configuration_test_net_2_0.dll.config", fi.Name);
158 public void OpenExeConfiguration1_UserLevel_PerUserRoaming ()
160 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
161 Console.WriteLine("roaming user config path: {0}", config.FilePath);
163 FileInfo fi = new FileInfo (config.FilePath);
164 Assert.AreEqual ("user.config", fi.Name);
168 public void OpenExeConfiguration1_UserLevel_PerUserRoamingAndLocal ()
170 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
171 Console.WriteLine("local user config path: {0}", config.FilePath);
173 FileInfo fi = new FileInfo (config.FilePath);
174 Assert.AreEqual ("user.config", fi.Name);
177 [Test] // OpenExeConfiguration (String)
178 public void OpenExeConfiguration2 ()
183 exePath = Path.Combine (tempFolder, "DoesNotExist.whatever");
184 File.Create (exePath).Close ();
186 config = ConfigurationManager.OpenExeConfiguration (exePath);
187 Assert.AreEqual (exePath + ".config", config.FilePath, "#1");
189 exePath = Path.Combine (tempFolder, "SomeExecutable.exe");
190 File.Create (exePath).Close ();
192 config = ConfigurationManager.OpenExeConfiguration (exePath);
193 Assert.AreEqual (exePath + ".config", config.FilePath, "#2");
195 exePath = Path.Combine (tempFolder, "Foo.exe.config");
196 File.Create (exePath).Close ();
198 config = ConfigurationManager.OpenExeConfiguration (exePath);
199 Assert.AreEqual (exePath + ".config", config.FilePath, "#3");
201 Directory.SetCurrentDirectory (tempFolder);
203 exePath = "relative.exe";
204 File.Create (Path.Combine (tempFolder, exePath)).Close ();
207 // The temp directory as computed by the runtime is slightly different, as
208 // it will contain the full path after following links, while the test
209 // below is not comprehensive enough to follow links if there are any
210 // present in tempFolder
213 //config = ConfigurationManager.OpenExeConfiguration (exePath);
214 //Assert.AreEqual (Path.Combine (tempFolder, exePath + ".config"), config.FilePath, "#4");
217 [Test] // OpenExeConfiguration (String)
218 public void OpenExeConfiguration2_ExePath_Empty ()
220 AppDomain domain = AppDomain.CurrentDomain;
222 SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
223 Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
226 [Test] // OpenExeConfiguration (String)
227 public void OpenExeConfiguration2_ExePath_Null ()
229 AppDomain domain = AppDomain.CurrentDomain;
231 SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
232 Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
235 [Test] // OpenExeConfiguration (String)
236 public void OpenExeConfiguration2_ExePath_DoesNotExist ()
238 String exePath = Path.Combine (tempFolder, "DoesNotExist.exe");
241 ConfigurationManager.OpenExeConfiguration (exePath);
243 } catch (ConfigurationErrorsException ex) {
244 // An error occurred loading a configuration file:
245 // The parameter 'exePath' is invalid
246 Assert.AreEqual (typeof (ConfigurationErrorsException), ex.GetType (), "#2");
247 Assert.IsNull (ex.Filename, "#3");
248 Assert.IsNotNull (ex.InnerException, "#4");
249 Assert.AreEqual (0, ex.Line, "#5");
250 Assert.IsNotNull (ex.Message, "#6");
252 // The parameter 'exePath' is invalid
253 ArgumentException inner = ex.InnerException as ArgumentException;
254 Assert.IsNotNull (inner, "#7");
255 Assert.AreEqual (typeof (ArgumentException), inner.GetType (), "#8");
256 Assert.IsNull (inner.InnerException, "#9");
257 Assert.IsNotNull (inner.Message, "#10");
258 Assert.AreEqual ("exePath", inner.ParamName, "#11");
263 public void exePath_UserLevelNone ()
265 string basedir = AppDomain.CurrentDomain.BaseDirectory;
266 SysConfig config = ConfigurationManager.OpenExeConfiguration("System.Configuration_test_net_2_0.dll.mdb");
267 Assert.AreEqual (Path.Combine (basedir, "System.Configuration_test_net_2_0.dll.mdb.config"), config.FilePath);
271 public void exePath_UserLevelPerRoaming ()
273 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
274 string filePath = config.FilePath;
275 string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
276 Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
277 Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
281 public void exePath_UserLevelPerRoamingAndLocal ()
283 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
284 string filePath = config.FilePath;
285 string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
286 Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
287 Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
291 public void mapped_UserLevelNone ()
293 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
294 map.ExeConfigFilename = "execonfig";
296 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
297 Console.WriteLine("mapped application config path: {0}", config.FilePath);
299 FileInfo fi = new FileInfo (config.FilePath);
300 Assert.AreEqual ("execonfig", fi.Name);
305 public void mapped_UserLevelPerRoaming ()
307 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
308 map.ExeConfigFilename = "execonfig";
309 map.RoamingUserConfigFilename = "roaminguser";
311 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoaming);
312 Console.WriteLine("mapped roaming user config path: {0}", config.FilePath);
314 FileInfo fi = new FileInfo (config.FilePath);
315 Assert.AreEqual ("roaminguser", fi.Name);
319 [ExpectedException (typeof (ArgumentException))]
320 [Category ("NotWorking")]
321 public void mapped_UserLevelPerRoaming_no_execonfig ()
323 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
324 map.RoamingUserConfigFilename = "roaminguser";
326 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoaming);
330 public void mapped_UserLevelPerRoamingAndLocal ()
332 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
333 map.ExeConfigFilename = "execonfig";
334 map.RoamingUserConfigFilename = "roaminguser";
335 map.LocalUserConfigFilename = "localuser";
337 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoamingAndLocal);
338 Console.WriteLine("mapped local user config path: {0}", config.FilePath);
340 FileInfo fi = new FileInfo (config.FilePath);
341 Assert.AreEqual ("localuser", fi.Name);
345 [ExpectedException (typeof (ArgumentException))]
346 [Category ("NotWorking")]
347 public void mapped_UserLevelPerRoamingAndLocal_no_execonfig ()
349 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
350 map.RoamingUserConfigFilename = "roaminguser";
351 map.LocalUserConfigFilename = "localuser";
353 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
357 [ExpectedException (typeof (ArgumentException))]
358 [Category ("NotWorking")]
359 public void mapped_UserLevelPerRoamingAndLocal_no_roaminguser ()
361 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
362 map.ExeConfigFilename = "execonfig";
363 map.LocalUserConfigFilename = "localuser";
365 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
369 public void MachineConfig ()
371 SysConfig config = ConfigurationManager.OpenMachineConfiguration ();
372 Console.WriteLine("machine config path: {0}", config.FilePath);
374 FileInfo fi = new FileInfo (config.FilePath);
375 Assert.AreEqual ("machine.config", fi.Name);
379 public void mapped_MachineConfig ()
381 ConfigurationFileMap map = new ConfigurationFileMap ();
382 map.MachineConfigFilename = "machineconfig";
384 SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (map);
385 Console.WriteLine("mapped machine config path: {0}", config.FilePath);
387 FileInfo fi = new FileInfo (config.FilePath);
388 Assert.AreEqual ("machineconfig", fi.Name);
392 public void exePath_UserLevelNone_null ()
394 SysConfig config = ConfigurationManager.OpenExeConfiguration (null);
396 Console.WriteLine("null exe application config path: {0}", config.FilePath);
398 FileInfo fi = new FileInfo (config.FilePath);
399 Assert.AreEqual ("System.Configuration_test_net_2_0.dll.config", fi.Name);
404 [Category ("NotWorking")]
405 public void mapped_ExeConfiguration_null ()
407 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(null, ConfigurationUserLevel.None);
408 Console.WriteLine("null mapped application config path: {0}", config.FilePath);
410 FileInfo fi = new FileInfo (config.FilePath);
412 Assert.AreEqual("System.Configuration.Test20.jar.config", fi.Name);
414 Assert.AreEqual ("System.Configuration_test_net_2_0.dll.config", fi.Name);
419 [Category ("NotWorking")]
420 public void mapped_MachineConfig_null ()
422 SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (null);
423 Console.WriteLine("null mapped machine config path: {0}", config.FilePath);
425 FileInfo fi = new FileInfo (config.FilePath);
426 Assert.AreEqual ("machine.config", fi.Name);
430 public void GetSectionReturnsNativeObject ()
432 Assert.IsTrue (ConfigurationManager.GetSection ("appSettings") is NameValueCollection);
435 [Test] // test for bug #78372.
436 public void OpenMachineConfiguration ()
438 SysConfig cfg = ConfigurationManager.OpenMachineConfiguration ();
439 Assert.IsTrue (cfg.Sections.Count > 0, "#1");
441 ConfigurationSection s = cfg.SectionGroups ["system.net"].Sections ["connectionManagement"];
442 Assert.IsNotNull (s, "#2");
443 Assert.IsTrue (s is ConnectionManagementSection, "#3");
448 public void SectionCollectionEnumerator ()
450 SysConfig c = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
451 ConfigurationSectionCollection col =
452 c.GetSectionGroup ("system.web").Sections;
453 IEnumerator e = col.GetEnumerator ();
455 Assert.IsTrue (e.Current is ConfigurationSection);
458 [Test] // Test for bug #3412
459 [Category("NotWorking")]
460 public void TestAddRemoveSection()
462 const string name = "testsection";
463 var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
465 // ensure not present
466 if (config.Sections.Get(name) != null)
468 config.Sections.Remove(name);
472 config.Sections.Add(name, new TestSection());
475 var section = config.Sections.Get(name);
476 Assert.IsNotNull(section);
477 Assert.IsNotNull(section as TestSection);
478 config.Sections.Remove(name);
481 config.Sections.Add(name, new TestSection());
484 section = config.Sections.Get(name);
485 Assert.IsNotNull(section);
486 Assert.IsNotNull(section as TestSection);
487 config.Sections.Remove(name);
490 class TestSection : ConfigurationSection {}
492 class RemoteConfig : MarshalByRefObject
494 public static RemoteConfig GetInstance (AppDomain domain)
496 RemoteConfig config = (RemoteConfig) domain.CreateInstanceAndUnwrap (
497 typeof (RemoteConfig).Assembly.FullName,
498 typeof (RemoteConfig).FullName, new object [0]);
502 public string GetFilePath (string exePath)
504 global::System.Configuration.Configuration config =
505 ConfigurationManager.OpenExeConfiguration (exePath);
506 return config.FilePath;
509 public string GetFilePath (ConfigurationUserLevel userLevel)
511 global::System.Configuration.Configuration config =
512 ConfigurationManager.OpenExeConfiguration (userLevel);
513 return config.FilePath;
516 public string GetSettingValue (string exePath, string key)
518 global::System.Configuration.Configuration config =
519 ConfigurationManager.OpenExeConfiguration (exePath);
520 return config.AppSettings.Settings [key].Value;
523 public string GetSettingValue (ConfigurationUserLevel userLevel, string key)
525 global::System.Configuration.Configuration config =
526 ConfigurationManager.OpenExeConfiguration (userLevel);
527 KeyValueConfigurationElement value = config.AppSettings.Settings [key];
528 return value != null ? value.Value : null;
531 public string GetSettingValue (string key)
533 return ConfigurationManager.AppSettings [key];