[System] UriKind.RelativeOrAbsolute workaround.
[mono.git] / mcs / class / System / Test / System.Configuration / ApplicationSettingsBaseTest.cs
1 //
2 // System.Configuration.ApplicationsSettingsBaseTest.cs - Unit tests
3 // for System.Configuration.ApplicationSettingsBase.
4 //
5 // Author:
6 //      Chris Toshok  <toshok@ximian.com>
7 //
8 // Copyright (C) 2005, 2006 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 //#define SPEW
31
32
33 using System;
34 using System.Text;
35 using System.Configuration;
36 using System.ComponentModel;
37 using System.Collections;
38 using System.Collections.Specialized;
39 using NUnit.Framework;
40 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
41
42 namespace MonoTests.System.Configuration {
43         class ProviderPoker : LocalFileSettingsProvider {
44                 public override void Initialize (string name,
45                                                  NameValueCollection values)
46                 {
47 #if SPEW
48                         Console.WriteLine ("Initialize '{0}'", name);
49                         Console.WriteLine (Environment.StackTrace);
50 #endif
51                         if (name == null)
52                                 name = "ProviderPoker";
53
54                         base.Initialize (name, values);
55                 }
56
57                 public override SettingsPropertyValueCollection GetPropertyValues (SettingsContext context,
58                                                                                    SettingsPropertyCollection properties)
59                 {
60 #if SPEW
61                         Console.WriteLine (Environment.StackTrace);
62 #endif
63                         return base.GetPropertyValues (context, properties);
64                 }
65
66                 public override void SetPropertyValues (SettingsContext context,
67                                                         SettingsPropertyValueCollection values)
68                 {
69 #if SPEW
70                         Console.WriteLine (Environment.StackTrace);
71 #endif
72                         base.SetPropertyValues (context, values);
73                 }
74
75                 public override string ApplicationName {
76                         get {
77 #if SPEW
78                                 Console.WriteLine (Environment.StackTrace);
79 #endif
80                                 return base.ApplicationName;
81                         }
82                         set {
83 #if SPEW
84                                 Console.WriteLine ("ApplicationName = {0}", value);
85                                 Console.WriteLine (Environment.StackTrace);
86 #endif
87                                 base.ApplicationName = value;
88                         }
89                 }
90         }
91
92         /* a basic settings class.  just two settings, one application
93          * scoped, one user scoped */
94         class TestSettings1 : ApplicationSettingsBase
95         {
96                 public TestSettings1() : base ("TestSettings1")
97                 {
98                 }
99
100                 [ApplicationScopedSetting]
101                 [DefaultSettingValue ("root")]
102                 public string Username {
103                         get { return (string)this["Username"]; }
104                         set { this["Username"] = value; }
105                 }
106
107                 [UserScopedSetting]
108                 [DefaultSettingValue ("8 Cambridge Center")]
109                 public string Address {
110                         get { return (string)this["Address"]; }
111                         set { this["Address"] = value; }
112                 }
113         }
114
115         /* an error according to msdn2 docs.  both ApplicationScoped
116          * and UserScoped attributes on the same property */
117         class TestSettings2 : ApplicationSettingsBase
118         {
119                 public TestSettings2() : base ("TestSettings2")
120                 {
121                 }
122
123                 [ApplicationScopedSetting]
124                 [UserScopedSetting]
125                 [SettingsProvider (typeof (ProviderPoker))]
126                 public string Username {
127                         get { return (string)this["Username"]; }
128                         set { this["Username"] = value; }
129                 }
130         }
131
132         /* a custom provider for our setting */
133         class TestSettings3 : ApplicationSettingsBase
134         {
135                 public TestSettings3() : base ("TestSettings3")
136                 {
137                 }
138
139                 [ApplicationScopedSetting]
140                 [SettingsProvider (typeof (ProviderPoker))]
141                 public string Username {
142                         get { return (string)this["Username"]; }
143                         set { this["Username"] = value; }
144                 }
145         }
146
147         class TestSettings4 : ApplicationSettingsBase {
148
149                 public TestSettings4 ()
150                         : base ("TestSettings4")
151                 {
152                 }
153
154                 [ApplicationScopedSetting]
155                 [DefaultSettingValue ("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <string>go</string>\r\n  <string>mono</string>\r\n  </ArrayOfString>")]
156                 public StringCollection Values {
157                         get { return (StringCollection) this ["Values"]; }
158                 }
159         }
160
161         [TestFixture]
162         public class ApplicationSettingsBaseTest
163         {
164                 [Test]
165                 public void TestSettings1_Properties ()
166                 {
167                         TestSettings1 settings = new TestSettings1 ();
168
169                         IEnumerator props = settings.Properties.GetEnumerator();
170                         Assert.IsNotNull (props, "A1");
171
172                         Assert.IsTrue (props.MoveNext(), "A4");
173                         Assert.AreEqual ("Address", ((SettingsProperty)props.Current).Name, "A5");
174                         
175                         Assert.IsTrue (props.MoveNext(), "A2");
176                         Assert.AreEqual ("Username", ((SettingsProperty)props.Current).Name, "A3");
177
178                         Assert.AreEqual ("root", settings.Username, "A6");
179                         Assert.AreEqual ("8 Cambridge Center", settings.Address, "A7");
180                 }
181
182                 [Test]
183                 public void TestSettings1_Provider ()
184                 {
185                         TestSettings1 settings = new TestSettings1 ();
186
187                         /* since we didn't specify a provider for any
188                          * of them, they should all use the
189                          * LocalFileSettingsProvider */
190                         foreach (SettingsProperty prop in settings.Properties) {
191                                 Assert.AreEqual (typeof (LocalFileSettingsProvider), prop.Provider.GetType(), "A1");
192                                 Console.WriteLine ("'{0}': '{1}'", prop.Provider.Name, prop.Provider.ApplicationName);
193                         }
194                 }
195
196                 [Test]
197                 public void TestSettings1_SetProperty ()
198                 {
199                         TestSettings1 settings = new TestSettings1 ();
200                         bool setting_changing = false;
201                         bool setting_changed = false;
202
203                         settings.SettingChanging += delegate (object sender, SettingChangingEventArgs e) {
204                                 setting_changing = true;
205                                 Assert.AreEqual ("Username", e.SettingName, "A1");
206                                 Assert.AreEqual ("toshok", e.NewValue, "A2");
207                                 Assert.AreEqual ("TestSettings1", e.SettingKey, "A3");
208                                 Assert.AreEqual (settings.GetType().FullName, e.SettingClass, "A4");
209                         };
210
211                         settings.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) {
212                                 Assert.IsTrue (setting_changing, "A5");
213                                 setting_changed = true;
214                                 Assert.AreEqual ("Username", e.PropertyName, "A6");
215                         };
216
217                         settings.Username = "toshok";
218
219                         Assert.IsTrue (setting_changing && setting_changed, "A7");
220                         Assert.AreEqual ("toshok", settings.Username, "A8");
221                 }
222
223                 [Test]
224                 public void TestSettings1_SetPropertyCancel ()
225                 {
226                         TestSettings1 settings = new TestSettings1 ();
227                         bool setting_changing = false;
228                         bool setting_changed = false;
229
230                         settings.SettingChanging += delegate (object sender, SettingChangingEventArgs e) {
231                                 setting_changing = true;
232                                 Assert.AreEqual ("Username", e.SettingName, "A1");
233                                 Assert.AreEqual ("toshok", e.NewValue, "A2");
234                                 Assert.AreEqual ("TestSettings1", e.SettingKey, "A3");
235                                 Assert.AreEqual (settings.GetType().FullName, e.SettingClass, "A4");
236                                 e.Cancel = true;
237                         };
238
239                         settings.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) {
240                                 setting_changed = true;
241                                 Assert.Fail ("shouldn't reach here.", "A5");
242                         };
243
244                         settings.Username = "toshok";
245
246                         Assert.IsTrue (setting_changing, "A6");
247                         Assert.IsFalse (setting_changed, "A7");
248
249                         Assert.AreEqual ("root", settings.Username, "A8");
250                 }
251
252                 [Test]
253                 public void TestSettings1_SettingsLoaded ()
254                 {
255                         TestSettings1 settings = new TestSettings1 ();
256                         bool settings_loaded = false;
257                         SettingsProvider loaded_provider = null;
258
259                         settings.SettingsLoaded += delegate (object sender, SettingsLoadedEventArgs e) {
260                                 settings_loaded = true;
261                                 loaded_provider = e.Provider;
262                         };
263
264                         Assert.AreEqual ("root", settings.Username, "A1");
265                         Assert.IsTrue (settings_loaded, "A2");
266                         Assert.AreEqual (loaded_provider, settings.Properties ["Username"].Provider, "A3");
267                 }
268
269                 [Test]
270                 [Category ("NotWorking")]
271                 public void TestSettings1_SetPropertyReset ()
272                 {
273                         TestSettings1 settings = new TestSettings1 ();
274
275                         settings.Username = "toshok";
276
277                         Assert.AreEqual ("toshok", settings.Username, "A1");
278
279                         settings.Reset ();
280
281                         Assert.AreEqual ("root", settings.Username, "A2");
282                 }
283
284                 [Test]
285                 public void TestSettings2_Properties ()
286                 {
287                         // This test will fail when there are newer versions
288                         // of the test assemblies - so conditionalize it in
289                         // such cases.
290 #if   NET_4_5
291                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_4_5, Version=0.0.0.0";
292 #elif NET_4_0
293                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_4_0, Version=0.0.0.0";
294 #else
295                         string expected = "MonoTests.System.Configuration.ProviderPoker, System_test_net_2_0, Version=0.0.0.0";
296 #endif
297                         Assert.AreEqual (expected, new SettingsProviderAttribute (typeof (ProviderPoker)).ProviderTypeName.Substring (0, expected.Length), "#1");
298                         TestSettings2 settings = new TestSettings2 ();
299
300                         /* should throw ConfigurationException */
301                         IEnumerator props = settings.Properties.GetEnumerator();
302                 }
303
304                 [Test]
305                 [Ignore ("On MS.NET it returns null ...")]
306                 public void TestSettings3_Properties ()
307                 {
308                         TestSettings3 settings = new TestSettings3 ();
309
310                         Assert.AreEqual ("root", settings.Username, "A1");
311                 }
312
313                 public static void Main (string[] args)
314                 {
315                         ApplicationSettingsBaseTest test = new ApplicationSettingsBaseTest();
316                         test.TestSettings1_Properties();
317                 }
318
319                 [Test]
320                 public void Synchronized ()
321                 {
322                         Bug78430 s = new Bug78430 ();
323                         s.Initialize (null, new SettingsPropertyCollection (),
324                                 new SettingsProviderCollection ());
325                         SettingsBase sb = SettingsBase.Synchronized (s);
326                         Assert.IsTrue (sb.IsSynchronized, "#1");
327                         Assert.IsTrue (sb is Bug78430, "#2");
328                         // these checks are so cosmetic, actually not
329                         // worthy of testing.
330                         Assert.IsTrue (Object.ReferenceEquals (s, sb), "#3");
331                         Assert.IsFalse (sb.Properties.IsSynchronized, "#4");
332                 }
333
334                 class Bug78430 : SettingsBase
335                 {
336                 }
337
338                 [Test] // bug #78654
339                 public void DefaultSettingValueAs ()
340                 {
341                         Assert.AreEqual (1, new Bug78654 ().IntSetting);
342                 }
343
344                 class Bug78654 : ApplicationSettingsBase
345                 {
346                         [UserScopedSettingAttribute ()]
347                         [DefaultSettingValueAttribute ("1")]
348                         public int IntSetting {
349                                 get { return ((int)(this ["IntSetting"])); }
350                         }
351                 }
352
353                 [Test]
354                 public void TestSettings4_StringCollection_DefaultSettingValue ()
355                 {
356                         TestSettings4 settings = new TestSettings4 ();
357                         Assert.AreEqual (2, settings.Values.Count, "Count");
358                         Assert.AreEqual ("go", settings.Values[0], "0");
359                         Assert.AreEqual ("mono", settings.Values[1], "1");
360                 }
361
362                 [Test]
363                 [Category ("NotWorking")]
364                 public void Providers ()
365                 {
366                         Assert.AreEqual (0, new TestSettings1 ().Providers.Count);
367                 }
368
369                 class Bug532180 : ApplicationSettingsBase {
370                         [UserScopedSetting]
371                         [DefaultSettingValue("10")]
372                         public int IntSetting {
373                                 get { return (int)this["IntSetting"]; }
374                                 set { this["IntSetting"] = value; }                               
375                         }
376                 }
377
378                 [Test] // bug #532180
379                 public void DefaultSettingValueAsWithReload() 
380                 {
381                         Bug532180 settings = new Bug532180();
382                         Assert.AreEqual (10, settings.IntSetting, "A1");
383                         settings.IntSetting = 1;
384                         Assert.AreEqual (1, settings.IntSetting, "A2");
385                         settings.Reload ();
386                         Assert.AreEqual (10, settings.IntSetting, "A3");
387                 }                        
388                 
389                 class Bug8592ConfHolder : ApplicationSettingsBase {
390                         [UserScopedSetting]
391                         public string TestKey1OnHolder { 
392                                 get { return (string) this ["TestKey1OnHolder"] ?? ""; }
393                                 set { this ["TestKey1OnHolder"] = value; }
394                         }
395                 }
396
397                 [Test]
398                 public void TestBug8592BasicOperations ()
399                 {
400                         var holder = new Bug8592ConfHolder ();
401                         holder.Reset ();
402                         holder.Save ();
403                         Assert.AreEqual ("", holder.TestKey1OnHolder, "#1");
404                         holder.TestKey1OnHolder = "candy";
405                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#2");
406                         holder.Reload ();
407                         Assert.AreEqual ("", holder.TestKey1OnHolder, "#3");
408                         holder.TestKey1OnHolder = "candy";
409                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#4");
410                         holder.Save ();
411                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#5");
412                         holder.Reload ();
413                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#6");
414                         holder.Reset ();
415                         Assert.AreEqual ("", holder.TestKey1OnHolder, "#7");
416                 }
417
418                 class Bug8533ConfHolder1 : ApplicationSettingsBase {
419                         [UserScopedSetting]
420                         public string TestKey1OnHolder1 {
421                                 get { return (string) this ["TestKey1OnHolder1"] ?? ""; }
422                                 set { this ["TestKey1OnHolder1"] = value; }
423                         }
424
425                         [UserScopedSetting]
426                         public string TestKey1OnHolder2 {
427                                 get { return (string) this ["TestKey1OnHolder2"] ?? ""; }
428                                 set { this ["TestKey1OnHolder2"] = value; }
429                         }
430                         
431                         [UserScopedSetting]
432                         public string TestKey {
433                                 get { return (string) this ["TestKey"] ?? ""; }
434                                 set { this ["TestKey"] = value; }
435                         }
436                 }
437
438                 class Bug8533ConfHolder2 : ApplicationSettingsBase {
439                         [UserScopedSetting]
440                         public string TestKey1OnHolder2 {
441                                 get { return (string) this ["TestKey1OnHolder2"] ?? ""; }
442                                 set { this ["TestKey1OnHolder2"] = value; }
443                         }
444
445                         [UserScopedSetting]
446                         public string TestKey {
447                                 get { return (string) this ["TestKey"] ?? ""; }
448                                 set { this ["TestKey"] = value; }
449                         }
450                 }
451
452                 [Test]
453                 public void TestBug8533ConfHandlerWronglyMixedUp ()
454                 {
455                         var holder1 = new Bug8533ConfHolder1 ();
456                         holder1.TestKey1OnHolder1 = "candy";
457                         holder1.TestKey = "eclair";
458                         Assert.AreEqual ("", holder1.TestKey1OnHolder2, "#-1");
459                         holder1.Save ();
460                         Assert.AreEqual ("", holder1.TestKey1OnHolder2, "#0");
461                         holder1.Reload ();
462                         
463                         var holder2 = new Bug8533ConfHolder2 ();
464                         holder2.TestKey1OnHolder2 = "donut";
465                         Assert.AreEqual ("", holder1.TestKey1OnHolder2, "#1");
466                         holder2.Save ();
467                         holder2.Reload();
468                         Assert.AreEqual ("candy", holder1.TestKey1OnHolder1, "#2");
469                         Assert.AreEqual ("donut", holder2.TestKey1OnHolder2, "#3");
470                         Assert.AreEqual ("eclair", holder1.TestKey, "#4");
471                         Assert.AreEqual ("", holder2.TestKey, "#5");
472                 }
473         }
474 }
475