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.
34 using System.Collections;
35 using System.Collections.Specialized;
36 using System.Configuration;
37 using System.Net.Configuration;
39 using NUnit.Framework;
40 using SysConfig = System.Configuration.Configuration;
41 using System.Runtime.InteropServices;
43 namespace MonoTests.System.Configuration {
45 public class ConfigurationManagerTest
47 private string originalCurrentDir;
48 private string tempFolder;
53 originalCurrentDir = Directory.GetCurrentDirectory ();
54 tempFolder = Path.Combine (Path.GetTempPath (), this.GetType ().FullName);
55 if (!Directory.Exists (tempFolder))
56 Directory.CreateDirectory (tempFolder);
60 public void TearDown ()
62 Directory.SetCurrentDirectory (originalCurrentDir);
63 if (Directory.Exists (tempFolder))
64 Directory.Delete (tempFolder, true);
67 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
68 [Category ("NotWorking")] // bug #323622
69 public void OpenExeConfiguration1_Remote ()
71 AppDomain domain = null;
73 string config_xml = @"
76 <add key='anyKey' value='42' />
80 config_file = Path.Combine (tempFolder, "otherConfig.noconfigext");
81 File.WriteAllText (config_file, config_xml);
84 AppDomainSetup setup = new AppDomainSetup();
85 setup.ConfigurationFile = config_file;
86 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
87 domain = AppDomain.CreateDomain("foo", null, setup);
89 RemoteConfig config = RemoteConfig.GetInstance (domain);
91 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
92 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
93 Assert.AreEqual ("42", config.GetSettingValue (userLevel, "anyKey"));
94 Assert.AreEqual ("42", config.GetSettingValue ("anyKey"));
97 AppDomain.Unload (domain);
98 File.Delete (config_file);
101 config_file = Path.Combine (tempFolder, "otherConfig.exe.config");
102 File.WriteAllText (config_file, config_xml);
105 AppDomainSetup setup = new AppDomainSetup();
106 setup.ConfigurationFile = config_file;
107 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
108 domain = AppDomain.CreateDomain("foo", null, setup);
110 RemoteConfig config = RemoteConfig.GetInstance (domain);
112 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
113 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
114 Assert.AreEqual ("42", config.GetSettingValue (userLevel, "anyKey"));
115 Assert.AreEqual ("42", config.GetSettingValue ("anyKey"));
118 AppDomain.Unload (domain);
119 File.Delete (config_file);
123 AppDomainSetup setup = new AppDomainSetup();
124 setup.ConfigurationFile = config_file;
125 setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
126 domain = AppDomain.CreateDomain("foo", null, setup);
128 RemoteConfig config = RemoteConfig.GetInstance (domain);
130 ConfigurationUserLevel userLevel = ConfigurationUserLevel.None;
131 Assert.AreEqual (config_file, config.GetFilePath (userLevel));
132 Assert.IsNull (config.GetSettingValue (userLevel, "anyKey"));
133 Assert.IsNull (config.GetSettingValue ("anyKey"));
136 AppDomain.Unload (domain);
137 File.Delete (config_file);
141 [Test] // OpenExeConfiguration (ConfigurationUserLevel)
142 public void OpenExeConfiguration1_UserLevel_None ()
144 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
146 Console.WriteLine("application config path: {0}", config.FilePath);
147 FileInfo fi = new FileInfo (config.FilePath);
149 Assert.AreEqual ("nunit-console.jar.config", fi.Name);
151 Assert.AreEqual ("System.Configuration_test_net_2_0.dll.config", fi.Name);
156 public void OpenExeConfiguration1_UserLevel_PerUserRoaming ()
158 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
159 Console.WriteLine("roaming user config path: {0}", config.FilePath);
161 FileInfo fi = new FileInfo (config.FilePath);
162 Assert.AreEqual ("user.config", fi.Name);
166 public void OpenExeConfiguration1_UserLevel_PerUserRoamingAndLocal ()
168 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
169 Console.WriteLine("local user config path: {0}", config.FilePath);
171 FileInfo fi = new FileInfo (config.FilePath);
172 Assert.AreEqual ("user.config", fi.Name);
175 [Test] // OpenExeConfiguration (String)
176 public void OpenExeConfiguration2 ()
181 exePath = Path.Combine (tempFolder, "DoesNotExist.whatever");
182 File.Create (exePath).Close ();
184 config = ConfigurationManager.OpenExeConfiguration (exePath);
185 Assert.AreEqual (exePath + ".config", config.FilePath, "#1");
187 exePath = Path.Combine (tempFolder, "SomeExecutable.exe");
188 File.Create (exePath).Close ();
190 config = ConfigurationManager.OpenExeConfiguration (exePath);
191 Assert.AreEqual (exePath + ".config", config.FilePath, "#2");
193 exePath = Path.Combine (tempFolder, "Foo.exe.config");
194 File.Create (exePath).Close ();
196 config = ConfigurationManager.OpenExeConfiguration (exePath);
197 Assert.AreEqual (exePath + ".config", config.FilePath, "#3");
199 Directory.SetCurrentDirectory (tempFolder);
201 exePath = "relative.exe";
202 File.Create (Path.Combine (tempFolder, exePath)).Close ();
204 config = ConfigurationManager.OpenExeConfiguration (exePath);
205 Assert.AreEqual (Path.Combine (tempFolder, exePath + ".config"), config.FilePath, "#4");
208 [Test] // OpenExeConfiguration (String)
209 public void OpenExeConfiguration2_ExePath_Empty ()
211 AppDomain domain = AppDomain.CurrentDomain;
213 SysConfig config = ConfigurationManager.OpenExeConfiguration (string.Empty);
214 Assert.AreEqual (domain.SetupInformation.ConfigurationFile, config.FilePath);
217 [Test] // OpenExeConfiguration (String)
218 public void OpenExeConfiguration2_ExePath_Null ()
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_DoesNotExist ()
229 String exePath = Path.Combine (tempFolder, "DoesNotExist.exe");
232 ConfigurationManager.OpenExeConfiguration (exePath);
234 } catch (ConfigurationErrorsException ex) {
235 // An error occurred loading a configuration file:
236 // The parameter 'exePath' is invalid
237 Assert.AreEqual (typeof (ConfigurationErrorsException), ex.GetType (), "#2");
238 Assert.IsNull (ex.Filename, "#3");
239 Assert.IsNotNull (ex.InnerException, "#4");
240 Assert.AreEqual (0, ex.Line, "#5");
241 Assert.IsNotNull (ex.Message, "#6");
243 // The parameter 'exePath' is invalid
244 ArgumentException inner = ex.InnerException as ArgumentException;
245 Assert.IsNotNull (inner, "#7");
246 Assert.AreEqual (typeof (ArgumentException), inner.GetType (), "#8");
247 Assert.IsNull (inner.InnerException, "#9");
248 Assert.IsNotNull (inner.Message, "#10");
249 Assert.AreEqual ("exePath", inner.ParamName, "#11");
254 public void exePath_UserLevelNone ()
256 string basedir = AppDomain.CurrentDomain.BaseDirectory;
257 SysConfig config = ConfigurationManager.OpenExeConfiguration("System.Configuration_test_net_2_0.dll.mdb");
258 Assert.AreEqual (Path.Combine (basedir, "System.Configuration_test_net_2_0.dll.mdb.config"), config.FilePath);
262 public void exePath_UserLevelPerRoaming ()
264 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
265 string filePath = config.FilePath;
266 string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
267 Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
268 Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
272 public void exePath_UserLevelPerRoamingAndLocal ()
274 SysConfig config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
275 string filePath = config.FilePath;
276 string applicationData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
277 Assert.IsTrue (filePath.StartsWith (applicationData), "#1:" + filePath);
278 Assert.AreEqual ("user.config", Path.GetFileName (filePath), "#2:" + filePath);
282 public void mapped_UserLevelNone ()
284 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
285 map.ExeConfigFilename = "execonfig";
287 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
288 Console.WriteLine("mapped application config path: {0}", config.FilePath);
290 FileInfo fi = new FileInfo (config.FilePath);
291 Assert.AreEqual ("execonfig", fi.Name);
296 public void mapped_UserLevelPerRoaming ()
298 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
299 map.ExeConfigFilename = "execonfig";
300 map.RoamingUserConfigFilename = "roaminguser";
302 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoaming);
303 Console.WriteLine("mapped roaming user config path: {0}", config.FilePath);
305 FileInfo fi = new FileInfo (config.FilePath);
306 Assert.AreEqual ("roaminguser", fi.Name);
310 [ExpectedException (typeof (ArgumentException))]
311 [Category ("NotWorking")]
312 public void mapped_UserLevelPerRoaming_no_execonfig ()
314 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
315 map.RoamingUserConfigFilename = "roaminguser";
317 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoaming);
321 public void mapped_UserLevelPerRoamingAndLocal ()
323 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
324 map.ExeConfigFilename = "execonfig";
325 map.RoamingUserConfigFilename = "roaminguser";
326 map.LocalUserConfigFilename = "localuser";
328 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.PerUserRoamingAndLocal);
329 Console.WriteLine("mapped local user config path: {0}", config.FilePath);
331 FileInfo fi = new FileInfo (config.FilePath);
332 Assert.AreEqual ("localuser", fi.Name);
336 [ExpectedException (typeof (ArgumentException))]
337 [Category ("NotWorking")]
338 public void mapped_UserLevelPerRoamingAndLocal_no_execonfig ()
340 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
341 map.RoamingUserConfigFilename = "roaminguser";
342 map.LocalUserConfigFilename = "localuser";
344 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
348 [ExpectedException (typeof (ArgumentException))]
349 [Category ("NotWorking")]
350 public void mapped_UserLevelPerRoamingAndLocal_no_roaminguser ()
352 ExeConfigurationFileMap map = new ExeConfigurationFileMap ();
353 map.ExeConfigFilename = "execonfig";
354 map.LocalUserConfigFilename = "localuser";
356 ConfigurationManager.OpenMappedExeConfiguration (map, ConfigurationUserLevel.PerUserRoamingAndLocal);
360 public void MachineConfig ()
362 SysConfig config = ConfigurationManager.OpenMachineConfiguration ();
363 Console.WriteLine("machine config path: {0}", config.FilePath);
365 FileInfo fi = new FileInfo (config.FilePath);
366 Assert.AreEqual ("machine.config", fi.Name);
370 public void mapped_MachineConfig ()
372 ConfigurationFileMap map = new ConfigurationFileMap ();
373 map.MachineConfigFilename = "machineconfig";
375 SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (map);
376 Console.WriteLine("mapped machine config path: {0}", config.FilePath);
378 FileInfo fi = new FileInfo (config.FilePath);
379 Assert.AreEqual ("machineconfig", fi.Name);
383 public void exePath_UserLevelNone_null ()
385 SysConfig config = ConfigurationManager.OpenExeConfiguration (null);
387 Console.WriteLine("null exe application config path: {0}", config.FilePath);
389 FileInfo fi = new FileInfo (config.FilePath);
390 Assert.AreEqual ("System.Configuration_test_net_2_0.dll.config", fi.Name);
395 [Category ("NotWorking")]
396 public void mapped_ExeConfiguration_null ()
398 SysConfig config = ConfigurationManager.OpenMappedExeConfiguration(null, ConfigurationUserLevel.None);
399 Console.WriteLine("null mapped application config path: {0}", config.FilePath);
401 FileInfo fi = new FileInfo (config.FilePath);
403 Assert.AreEqual("System.Configuration.Test20.jar.config", fi.Name);
405 Assert.AreEqual ("System.Configuration_test_net_2_0.dll.config", fi.Name);
410 [Category ("NotWorking")]
411 public void mapped_MachineConfig_null ()
413 SysConfig config = ConfigurationManager.OpenMappedMachineConfiguration (null);
414 Console.WriteLine("null mapped machine config path: {0}", config.FilePath);
416 FileInfo fi = new FileInfo (config.FilePath);
417 Assert.AreEqual ("machine.config", fi.Name);
421 public void GetSectionReturnsNativeObject ()
423 Assert.IsTrue (ConfigurationManager.GetSection ("appSettings") is NameValueCollection);
426 [Test] // test for bug #78372.
427 public void OpenMachineConfiguration ()
429 SysConfig cfg = ConfigurationManager.OpenMachineConfiguration ();
430 Assert.IsTrue (cfg.Sections.Count > 0, "#1");
432 ConfigurationSection s = cfg.SectionGroups ["system.net"].Sections ["connectionManagement"];
433 Assert.IsNotNull (s, "#2");
434 Assert.IsTrue (s is ConnectionManagementSection, "#3");
439 public void SectionCollectionEnumerator ()
441 SysConfig c = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None);
442 ConfigurationSectionCollection col =
443 c.GetSectionGroup ("system.web").Sections;
444 IEnumerator e = col.GetEnumerator ();
446 Assert.IsTrue (e.Current is ConfigurationSection);
449 class RemoteConfig : MarshalByRefObject
451 public static RemoteConfig GetInstance (AppDomain domain)
453 RemoteConfig config = (RemoteConfig) domain.CreateInstanceAndUnwrap (
454 typeof (RemoteConfig).Assembly.FullName,
455 typeof (RemoteConfig).FullName, new object [0]);
459 public string GetFilePath (string exePath)
461 global::System.Configuration.Configuration config =
462 ConfigurationManager.OpenExeConfiguration (exePath);
463 return config.FilePath;
466 public string GetFilePath (ConfigurationUserLevel userLevel)
468 global::System.Configuration.Configuration config =
469 ConfigurationManager.OpenExeConfiguration (userLevel);
470 return config.FilePath;
473 public string GetSettingValue (string exePath, string key)
475 global::System.Configuration.Configuration config =
476 ConfigurationManager.OpenExeConfiguration (exePath);
477 return config.AppSettings.Settings [key].Value;
480 public string GetSettingValue (ConfigurationUserLevel userLevel, string key)
482 global::System.Configuration.Configuration config =
483 ConfigurationManager.OpenExeConfiguration (userLevel);
484 KeyValueConfigurationElement value = config.AppSettings.Settings [key];
485 return value != null ? value.Value : null;
488 public string GetSettingValue (string key)
490 return ConfigurationManager.AppSettings [key];