Merge pull request #2400 from esdrubal/extrahead
[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 using System;
33 using System.IO;
34 using System.Xml;
35 using System.Xml.Serialization;
36 using System.Xml.Schema;
37 using System.Text;
38 using System.Configuration;
39 using System.ComponentModel;
40 using System.Collections;
41 using System.Collections.Specialized;
42 using NUnit.Framework;
43 using CategoryAttribute = NUnit.Framework.CategoryAttribute;
44
45 namespace MonoTests.System.Configuration {
46         class ProviderPoker : LocalFileSettingsProvider {
47                 public override void Initialize (string name,
48                                                  NameValueCollection values)
49                 {
50 #if SPEW
51                         Console.WriteLine ("Initialize '{0}'", name);
52                         Console.WriteLine (Environment.StackTrace);
53 #endif
54                         if (name == null)
55                                 name = "ProviderPoker";
56
57                         base.Initialize (name, values);
58                 }
59
60                 public override SettingsPropertyValueCollection GetPropertyValues (SettingsContext context,
61                                                                                    SettingsPropertyCollection properties)
62                 {
63 #if SPEW
64                         Console.WriteLine (Environment.StackTrace);
65 #endif
66                         return base.GetPropertyValues (context, properties);
67                 }
68
69                 public override void SetPropertyValues (SettingsContext context,
70                                                         SettingsPropertyValueCollection values)
71                 {
72 #if SPEW
73                         Console.WriteLine (Environment.StackTrace);
74 #endif
75                         base.SetPropertyValues (context, values);
76                 }
77
78                 public override string ApplicationName {
79                         get {
80 #if SPEW
81                                 Console.WriteLine (Environment.StackTrace);
82 #endif
83                                 return base.ApplicationName;
84                         }
85                         set {
86 #if SPEW
87                                 Console.WriteLine ("ApplicationName = {0}", value);
88                                 Console.WriteLine (Environment.StackTrace);
89 #endif
90                                 base.ApplicationName = value;
91                         }
92                 }
93         }
94
95         /* a basic settings class.  just two settings, one application
96          * scoped, one user scoped */
97         class TestSettings1 : ApplicationSettingsBase
98         {
99                 public TestSettings1() : base ("TestSettings1")
100                 {
101                 }
102
103                 [ApplicationScopedSetting]
104                 [DefaultSettingValue ("root")]
105                 public string Username {
106                         get { return (string)this["Username"]; }
107                         set { this["Username"] = value; }
108                 }
109
110                 [UserScopedSetting]
111                 [DefaultSettingValue ("8 Cambridge Center")]
112                 public string Address {
113                         get { return (string)this["Address"]; }
114                         set { this["Address"] = value; }
115                 }
116         }
117
118         /* an error according to msdn2 docs.  both ApplicationScoped
119          * and UserScoped attributes on the same property */
120         class TestSettings2 : ApplicationSettingsBase
121         {
122                 public TestSettings2() : base ("TestSettings2")
123                 {
124                 }
125
126                 [ApplicationScopedSetting]
127                 [UserScopedSetting]
128                 [SettingsProvider (typeof (ProviderPoker))]
129                 public string Username {
130                         get { return (string)this["Username"]; }
131                         set { this["Username"] = value; }
132                 }
133         }
134
135         /* a custom provider for our setting */
136         class TestSettings3 : ApplicationSettingsBase
137         {
138                 public TestSettings3() : base ("TestSettings3")
139                 {
140                 }
141
142                 [ApplicationScopedSetting]
143                 [SettingsProvider (typeof (ProviderPoker))]
144                 public string Username {
145                         get { return (string)this["Username"]; }
146                         set { this["Username"] = value; }
147                 }
148         }
149
150         class TestSettings4 : ApplicationSettingsBase {
151
152                 public TestSettings4 ()
153                         : base ("TestSettings4")
154                 {
155                 }
156
157                 [ApplicationScopedSetting]
158                 [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>")]
159                 public StringCollection Values {
160                         get { return (StringCollection) this ["Values"]; }
161                 }
162         }
163
164         [TestFixture]
165         public class ApplicationSettingsBaseTest
166         {
167                 [Test]
168                 public void TestSettings1_Properties ()
169                 {
170                         TestSettings1 settings = new TestSettings1 ();
171
172                         IEnumerator props = settings.Properties.GetEnumerator();
173                         Assert.IsNotNull (props, "A1");
174
175                         Assert.IsTrue (props.MoveNext(), "A4");
176                         Assert.AreEqual ("Address", ((SettingsProperty)props.Current).Name, "A5");
177                         
178                         Assert.IsTrue (props.MoveNext(), "A2");
179                         Assert.AreEqual ("Username", ((SettingsProperty)props.Current).Name, "A3");
180
181                         Assert.AreEqual ("root", settings.Username, "A6");
182                         Assert.AreEqual ("8 Cambridge Center", settings.Address, "A7");
183                 }
184
185                 [Test]
186                 public void TestSettings1_Provider ()
187                 {
188                         TestSettings1 settings = new TestSettings1 ();
189
190                         /* since we didn't specify a provider for any
191                          * of them, they should all use the
192                          * LocalFileSettingsProvider */
193                         foreach (SettingsProperty prop in settings.Properties) {
194                                 Assert.AreEqual (typeof (LocalFileSettingsProvider), prop.Provider.GetType(), "A1");
195                                 Console.WriteLine ("'{0}': '{1}'", prop.Provider.Name, prop.Provider.ApplicationName);
196                         }
197                 }
198
199                 [Test]
200                 public void TestSettings1_SetProperty ()
201                 {
202                         TestSettings1 settings = new TestSettings1 ();
203                         bool setting_changing = false;
204                         bool setting_changed = false;
205
206                         settings.SettingChanging += delegate (object sender, SettingChangingEventArgs e) {
207                                 setting_changing = true;
208                                 Assert.AreEqual ("Username", e.SettingName, "A1");
209                                 Assert.AreEqual ("toshok", e.NewValue, "A2");
210                                 Assert.AreEqual ("TestSettings1", e.SettingKey, "A3");
211                                 Assert.AreEqual (settings.GetType().FullName, e.SettingClass, "A4");
212                         };
213
214                         settings.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) {
215                                 Assert.IsTrue (setting_changing, "A5");
216                                 setting_changed = true;
217                                 Assert.AreEqual ("Username", e.PropertyName, "A6");
218                         };
219
220                         settings.Username = "toshok";
221
222                         Assert.IsTrue (setting_changing && setting_changed, "A7");
223                         Assert.AreEqual ("toshok", settings.Username, "A8");
224                 }
225
226                 [Test]
227                 public void TestSettings1_SetPropertyCancel ()
228                 {
229                         TestSettings1 settings = new TestSettings1 ();
230                         bool setting_changing = false;
231                         bool setting_changed = false;
232
233                         settings.SettingChanging += delegate (object sender, SettingChangingEventArgs e) {
234                                 setting_changing = true;
235                                 Assert.AreEqual ("Username", e.SettingName, "A1");
236                                 Assert.AreEqual ("toshok", e.NewValue, "A2");
237                                 Assert.AreEqual ("TestSettings1", e.SettingKey, "A3");
238                                 Assert.AreEqual (settings.GetType().FullName, e.SettingClass, "A4");
239                                 e.Cancel = true;
240                         };
241
242                         settings.PropertyChanged += delegate (object sender, PropertyChangedEventArgs e) {
243                                 setting_changed = true;
244                                 Assert.Fail ("shouldn't reach here.", "A5");
245                         };
246
247                         settings.Username = "toshok";
248
249                         Assert.IsTrue (setting_changing, "A6");
250                         Assert.IsFalse (setting_changed, "A7");
251
252                         Assert.AreEqual ("root", settings.Username, "A8");
253                 }
254
255                 [Test]
256                 public void TestSettings1_SettingsLoaded ()
257                 {
258                         TestSettings1 settings = new TestSettings1 ();
259                         bool settings_loaded = false;
260                         SettingsProvider loaded_provider = null;
261
262                         settings.SettingsLoaded += delegate (object sender, SettingsLoadedEventArgs e) {
263                                 settings_loaded = true;
264                                 loaded_provider = e.Provider;
265                         };
266
267                         Assert.AreEqual ("root", settings.Username, "A1");
268                         Assert.IsTrue (settings_loaded, "A2");
269                         Assert.AreEqual (loaded_provider, settings.Properties ["Username"].Provider, "A3");
270                 }
271
272                 [Test]
273                 [Category ("NotWorking")]
274                 public void TestSettings1_SetPropertyReset ()
275                 {
276                         TestSettings1 settings = new TestSettings1 ();
277
278                         settings.Username = "toshok";
279
280                         Assert.AreEqual ("toshok", settings.Username, "A1");
281
282                         settings.Reset ();
283
284                         Assert.AreEqual ("root", settings.Username, "A2");
285                 }
286
287                 [Test]
288                 public void TestSettings2_Properties ()
289                 {
290                         string expected = "MonoTests.System.Configuration.ProviderPoker, net_4_x_System_test, Version=0.0.0.0";
291                         Assert.AreEqual (expected, new SettingsProviderAttribute (typeof (ProviderPoker)).ProviderTypeName.Substring (0, expected.Length), "#1");
292                         TestSettings2 settings = new TestSettings2 ();
293
294                         /* should throw ConfigurationException */
295                         IEnumerator props = settings.Properties.GetEnumerator();
296                 }
297
298                 [Test]
299                 [Ignore ("On MS.NET it returns null ...")]
300                 public void TestSettings3_Properties ()
301                 {
302                         TestSettings3 settings = new TestSettings3 ();
303
304                         Assert.AreEqual ("root", settings.Username, "A1");
305                 }
306
307                 public static void Main (string[] args)
308                 {
309                         ApplicationSettingsBaseTest test = new ApplicationSettingsBaseTest();
310                         test.TestSettings1_Properties();
311                 }
312
313                 [Test]
314                 public void Synchronized ()
315                 {
316                         Bug78430 s = new Bug78430 ();
317                         s.Initialize (null, new SettingsPropertyCollection (),
318                                 new SettingsProviderCollection ());
319                         SettingsBase sb = SettingsBase.Synchronized (s);
320                         Assert.IsTrue (sb.IsSynchronized, "#1");
321                         Assert.IsTrue (sb is Bug78430, "#2");
322                         // these checks are so cosmetic, actually not
323                         // worthy of testing.
324                         Assert.IsTrue (Object.ReferenceEquals (s, sb), "#3");
325                         Assert.IsFalse (sb.Properties.IsSynchronized, "#4");
326                 }
327
328                 class Bug78430 : SettingsBase
329                 {
330                 }
331
332                 [Test] // bug #78654
333                 public void DefaultSettingValueAs ()
334                 {
335                         Assert.AreEqual (1, new Bug78654 ().IntSetting);
336                 }
337
338                 class Bug78654 : ApplicationSettingsBase
339                 {
340                         [UserScopedSettingAttribute ()]
341                         [DefaultSettingValueAttribute ("1")]
342                         public int IntSetting {
343                                 get { return ((int)(this ["IntSetting"])); }
344                         }
345                 }
346
347                 [Test]
348                 public void TestSettings4_StringCollection_DefaultSettingValue ()
349                 {
350                         TestSettings4 settings = new TestSettings4 ();
351                         Assert.AreEqual (2, settings.Values.Count, "Count");
352                         Assert.AreEqual ("go", settings.Values[0], "0");
353                         Assert.AreEqual ("mono", settings.Values[1], "1");
354                 }
355
356                 [Test]
357                 [Category ("NotWorking")]
358                 public void Providers ()
359                 {
360                         Assert.AreEqual (0, new TestSettings1 ().Providers.Count);
361                 }
362
363                 class Bug532180 : ApplicationSettingsBase {
364                         [UserScopedSetting]
365                         [DefaultSettingValue("10")]
366                         public int IntSetting {
367                                 get { return (int)this["IntSetting"]; }
368                                 set { this["IntSetting"] = value; }                               
369                         }
370                 }
371
372                 [Test] // bug #532180
373                 public void DefaultSettingValueAsWithReload() 
374                 {
375                         Bug532180 settings = new Bug532180();
376                         Assert.AreEqual (10, settings.IntSetting, "A1");
377                         settings.IntSetting = 1;
378                         Assert.AreEqual (1, settings.IntSetting, "A2");
379                         settings.Reload ();
380                         Assert.AreEqual (10, settings.IntSetting, "A3");
381                 }                        
382                 
383                 class Bug8592ConfHolder : ApplicationSettingsBase {
384                         [UserScopedSetting]
385                         public string TestKey1OnHolder { 
386                                 get { return (string) this ["TestKey1OnHolder"] ?? ""; }
387                                 set { this ["TestKey1OnHolder"] = value; }
388                         }
389                 }
390
391                 [Test]
392                 public void TestBug8592BasicOperations ()
393                 {
394                         var holder = new Bug8592ConfHolder ();
395                         holder.Reset ();
396                         holder.Save ();
397                         Assert.AreEqual ("", holder.TestKey1OnHolder, "#1");
398                         holder.TestKey1OnHolder = "candy";
399                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#2");
400                         holder.Reload ();
401                         Assert.AreEqual ("", holder.TestKey1OnHolder, "#3");
402                         holder.TestKey1OnHolder = "candy";
403                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#4");
404                         holder.Save ();
405                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#5");
406                         holder.Reload ();
407                         Assert.AreEqual ("candy", holder.TestKey1OnHolder, "#6");
408                         holder.Reset ();
409                         Assert.AreEqual ("", holder.TestKey1OnHolder, "#7");
410                 }
411
412                 class Bug8533ConfHolder1 : ApplicationSettingsBase {
413                         [UserScopedSetting]
414                         public string TestKey1OnHolder1 {
415                                 get { return (string) this ["TestKey1OnHolder1"] ?? ""; }
416                                 set { this ["TestKey1OnHolder1"] = value; }
417                         }
418
419                         [UserScopedSetting]
420                         public string TestKey1OnHolder2 {
421                                 get { return (string) this ["TestKey1OnHolder2"] ?? ""; }
422                                 set { this ["TestKey1OnHolder2"] = value; }
423                         }
424                         
425                         [UserScopedSetting]
426                         public string TestKey {
427                                 get { return (string) this ["TestKey"] ?? ""; }
428                                 set { this ["TestKey"] = value; }
429                         }
430                 }
431
432                 class Bug8533ConfHolder2 : ApplicationSettingsBase {
433                         [UserScopedSetting]
434                         public string TestKey1OnHolder2 {
435                                 get { return (string) this ["TestKey1OnHolder2"] ?? ""; }
436                                 set { this ["TestKey1OnHolder2"] = value; }
437                         }
438
439                         [UserScopedSetting]
440                         public string TestKey {
441                                 get { return (string) this ["TestKey"] ?? ""; }
442                                 set { this ["TestKey"] = value; }
443                         }
444                 }
445
446                 [Test]
447                 public void TestBug8533ConfHandlerWronglyMixedUp ()
448                 {
449                         var holder1 = new Bug8533ConfHolder1 ();
450                         holder1.TestKey1OnHolder1 = "candy";
451                         holder1.TestKey = "eclair";
452                         Assert.AreEqual ("", holder1.TestKey1OnHolder2, "#-1");
453                         holder1.Save ();
454                         Assert.AreEqual ("", holder1.TestKey1OnHolder2, "#0");
455                         holder1.Reload ();
456                         
457                         var holder2 = new Bug8533ConfHolder2 ();
458                         holder2.TestKey1OnHolder2 = "donut";
459                         Assert.AreEqual ("", holder1.TestKey1OnHolder2, "#1");
460                         holder2.Save ();
461                         holder2.Reload();
462                         Assert.AreEqual ("candy", holder1.TestKey1OnHolder1, "#2");
463                         Assert.AreEqual ("donut", holder2.TestKey1OnHolder2, "#3");
464                         Assert.AreEqual ("eclair", holder1.TestKey, "#4");
465                         Assert.AreEqual ("", holder2.TestKey, "#5");
466                 }
467
468                 class Settings : ApplicationSettingsBase
469                 {
470                         [UserScopedSetting]
471                         public WindowPositionList WindowPositions {
472                                 get {
473                                         return ((WindowPositionList)(this ["WindowPositions"]));
474                                 }
475                                 set {
476                                         this ["WindowPositions"] = value;
477                                 }
478                         }
479                 }
480
481                 [Serializable]
482                 public class WindowPositionList : IXmlSerializable
483                 {
484                         public XmlSchema GetSchema ()
485                         {
486                                 return null;
487                         }
488
489                         public void ReadXml (XmlReader reader)
490                         {
491                                 reader.ReadStartElement ("sampleNode");
492                                 reader.ReadEndElement ();
493                         }
494
495                         public void WriteXml (XmlWriter writer)
496                         {
497                                 writer.WriteStartElement ("sampleNode");
498                                 writer.WriteEndElement ();
499                         }
500                 }
501
502                 [Test] //Covers 36388
503                 public void XmlHeader ()
504                 {
505                         try {
506                                 var settings = new Settings ();
507                                 settings.Reset ();
508                                 settings.Save ();
509
510                                 settings.WindowPositions = new WindowPositionList ();
511
512                                 settings.Save ();
513                                 // If Reloads fails then saved data is corrupted
514                                 settings.Reload ();
515                         } catch (ConfigurationErrorsException e) {
516                                 // Delete corrupted config file so other test won't fail.
517                                 File.Delete (e.Filename);
518                                 Assert.Fail ("Invalid data was saved to config file.");
519                         }
520                 }
521         }
522 }
523