[corlib] Fix 44255: Inconsistent results in the serialization of TimeZoneInfo. ...
authorEgor Bogatov <egorbo@gmail.com>
Thu, 21 Sep 2017 05:57:35 +0000 (08:57 +0300)
committerMarek Safar <marek.safar@gmail.com>
Thu, 21 Sep 2017 05:57:35 +0000 (07:57 +0200)
mcs/class/corlib/System/TimeZoneInfo.Serialization.cs
mcs/class/corlib/System/TimeZoneInfo.cs
mcs/class/corlib/Test/System/TimeZoneInfo.SerializationTest.cs

index b272a20f00cf4bf1ed0c970d89779cac3f9ae511..b78b5536b8e4522a1992eacf85c1affea0975326 100644 (file)
@@ -42,12 +42,14 @@ namespace System
                        var displayName = DeserializeString (ref input);
                        var standardName = DeserializeString (ref input);
                        var daylightName = DeserializeString (ref input);
-                       var rules = new List<TimeZoneInfo.AdjustmentRule> ();
+                       List<TimeZoneInfo.AdjustmentRule> rules = null;
                        while (input [0] != ';') {
+                               if (rules == null)
+                                       rules = new List<TimeZoneInfo.AdjustmentRule> ();
                                rules.Add (DeserializeAdjustmentRule (ref input));
                        }
                        var offsetSpan = TimeSpan.FromMinutes (offset);
-                       return TimeZoneInfo.CreateCustomTimeZone (tzId, offsetSpan, displayName, standardName, daylightName, rules.ToArray ());
+                       return TimeZoneInfo.CreateCustomTimeZone (tzId, offsetSpan, displayName, standardName, daylightName, rules?.ToArray ());
                }
 
                public string ToSerializedString ()
index 1c5cdd3ae820dc363687a19efbfe553ca31b6b20..25d9e9a39becbcd5e395d7c057ecaf11afc3d312 100644 (file)
@@ -624,7 +624,7 @@ namespace System
                        else
                                ParseRegTzi(adjustmentRules, 1, 9999, reg_tzi);
 
-                       return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules).ToArray ());
+                       return CreateCustomTimeZone (id, baseUtcOffset, display_name, standard_name, daylight_name, ValidateRules (adjustmentRules));
                }
 
                private static void ParseRegTzi (List<AdjustmentRule> adjustmentRules, int start_year, int end_year, byte [] buffer)
@@ -1231,8 +1231,11 @@ namespace System
                        return new DateTime (year, transition.Month, day) + transition.TimeOfDay.TimeOfDay;
                }
 
-               static List<AdjustmentRule> ValidateRules (List<AdjustmentRule> adjustmentRules)
+               static AdjustmentRule[] ValidateRules (List<AdjustmentRule> adjustmentRules)
                {
+                       if (adjustmentRules == null || adjustmentRules.Count == 0)
+                               return null;
+
                        AdjustmentRule prev = null;
                        foreach (AdjustmentRule current in adjustmentRules.ToArray ()) {
                                if (prev != null && prev.DateEnd > current.DateStart) {
@@ -1240,7 +1243,7 @@ namespace System
                                }
                                prev = current;
                        }
-                       return adjustmentRules;
+                       return adjustmentRules.ToArray ();
                }
 
 #if LIBC || MONOTOUCH
@@ -1404,13 +1407,13 @@ namespace System
                                }
                                tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName);
                        } else {
-                               tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName, daylightDisplayName, ValidateRules (adjustmentRules).ToArray ());
+                               tz = CreateCustomTimeZone (id, baseUtcOffset, id, standardDisplayName, daylightDisplayName, ValidateRules (adjustmentRules));
                        }
 
                        if (storeTransition && transitions.Count > 0) {
                                tz.transitions = transitions;
-                               tz.supportsDaylightSavingTime = true;
                        }
+                       tz.supportsDaylightSavingTime = adjustmentRules.Count > 0;
 
                        return tz;
                }
index f4d0cfa1e8c915d7de6b518eed18934222c91a58..b53a8d4496aaf50d01f99c4b9e29363b5f2b80d0 100644 (file)
@@ -1,5 +1,6 @@
 using System;
 using System.IO;
+using System.Linq;
 using NUnit.Framework;
 
 namespace MonoTests.System
@@ -24,6 +25,20 @@ namespace MonoTests.System
                        Assert.AreEqual (0, utc.GetAdjustmentRules ().Length);
                }
 
+               [Test] // Bug-44255
+               public void SystemTimeZoneSerializationTests ()
+               {
+                       foreach (var tmz in TimeZoneInfo.GetSystemTimeZones ())
+                       {
+                               var tmzClone = TimeZoneInfo.FromSerializedString (tmz.ToSerializedString ());
+                               Assert.AreEqual (tmz, tmzClone);
+                               Assert.AreEqual (tmz.DisplayName, tmzClone.DisplayName);
+                               Assert.AreEqual (tmz.StandardName, tmzClone.StandardName);
+                               Assert.AreEqual (tmz.SupportsDaylightSavingTime, tmzClone.SupportsDaylightSavingTime);
+                               Assert.AreEqual (tmz.DaylightName, tmzClone.DaylightName);
+                       }
+               }
+
                [Test]
                public void SerializeCustomUtcZoneWithOddNaming ()
                {