From 56af2d2efce319e26adfddc620fc6def86cfd6ba Mon Sep 17 00:00:00 2001 From: Oskar Dudycz Date: Sun, 12 May 2019 15:14:24 +0200 Subject: [PATCH 1/5] Added failing test for #37610 - [System.Text.Json] Serializing class that has array of children of the same class throws StackOverflowException --- src/System.Text.Json/tests/Serialization/CyclicTests.cs | 9 +++++++++ src/System.Text.Json/tests/Serialization/TestClasses.cs | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/System.Text.Json/tests/Serialization/CyclicTests.cs b/src/System.Text.Json/tests/Serialization/CyclicTests.cs index 58eb152e41ac..07529a9ae77d 100644 --- a/src/System.Text.Json/tests/Serialization/CyclicTests.cs +++ b/src/System.Text.Json/tests/Serialization/CyclicTests.cs @@ -17,5 +17,14 @@ public static void WriteCyclicFail() // We don't allow cycles; we throw InvalidOperation instead of an unrecoverable StackOverflow. Assert.Throws(() => JsonSerializer.ToString(obj)); } + + [Fact] + public static void WriteCyclicFail() + { + TestClassWithArrayWithElementsOfSameClass obj = new TestClassWithArrayWithElementsOfSameClass(); + + //It shouldn't throw when there is no real cycle reference, and just empty object is created + Assert.Null(Record.Exception(() => JsonSerializer.ToString(obj))); + } } } diff --git a/src/System.Text.Json/tests/Serialization/TestClasses.cs b/src/System.Text.Json/tests/Serialization/TestClasses.cs index 380fbab122ba..2f1df6442466 100644 --- a/src/System.Text.Json/tests/Serialization/TestClasses.cs +++ b/src/System.Text.Json/tests/Serialization/TestClasses.cs @@ -396,6 +396,11 @@ public void Initialize() } } + public class TestClassWithArrayWithElementsOfSameClass + { + public TestClassWithArrayWithElementsOfSameClass[] Array { get; set; } + } + public class TestClassWithGenericList : ITestClass { public List MyData { get; set; } From 7df1c9276cf127ac13a7d5fc5592aae3b2c63c11 Mon Sep 17 00:00:00 2001 From: Oskar Dudycz Date: Sun, 12 May 2019 15:27:26 +0200 Subject: [PATCH 2/5] Updated naming --- src/System.Text.Json/tests/Serialization/CyclicTests.cs | 4 ++-- src/System.Text.Json/tests/Serialization/TestClasses.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/System.Text.Json/tests/Serialization/CyclicTests.cs b/src/System.Text.Json/tests/Serialization/CyclicTests.cs index 07529a9ae77d..373f7d61f800 100644 --- a/src/System.Text.Json/tests/Serialization/CyclicTests.cs +++ b/src/System.Text.Json/tests/Serialization/CyclicTests.cs @@ -19,9 +19,9 @@ public static void WriteCyclicFail() } [Fact] - public static void WriteCyclicFail() + public static void WriteTestClassWithArrayOfElementsOfTheSameClassWithoutCyclesDoesNotFail() { - TestClassWithArrayWithElementsOfSameClass obj = new TestClassWithArrayWithElementsOfSameClass(); + TestClassWithArrayOfElementsOfTheSameClass obj = new TestClassWithArrayOfElementsOfTheSameClass(); //It shouldn't throw when there is no real cycle reference, and just empty object is created Assert.Null(Record.Exception(() => JsonSerializer.ToString(obj))); diff --git a/src/System.Text.Json/tests/Serialization/TestClasses.cs b/src/System.Text.Json/tests/Serialization/TestClasses.cs index 2f1df6442466..7fac2f2638b1 100644 --- a/src/System.Text.Json/tests/Serialization/TestClasses.cs +++ b/src/System.Text.Json/tests/Serialization/TestClasses.cs @@ -396,9 +396,9 @@ public void Initialize() } } - public class TestClassWithArrayWithElementsOfSameClass + public class TestClassWithArrayOfElementsOfTheSameClass { - public TestClassWithArrayWithElementsOfSameClass[] Array { get; set; } + public TestClassWithArrayOfElementsOfTheSameClass[] Array { get; set; } } public class TestClassWithGenericList : ITestClass From c1e7d5d7133059c3b4b377838cea8e2b242d67a2 Mon Sep 17 00:00:00 2001 From: Oskar Dudycz Date: Tue, 14 May 2019 17:22:06 +0200 Subject: [PATCH 3/5] Added ActiveIssue attribute to CyclicTests.WriteTestClassWithArrayOfElementsOfTheSameClassWithoutCyclesDoesNotFail --- src/System.Text.Json/tests/Serialization/CyclicTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/System.Text.Json/tests/Serialization/CyclicTests.cs b/src/System.Text.Json/tests/Serialization/CyclicTests.cs index 373f7d61f800..0e1bf606cc28 100644 --- a/src/System.Text.Json/tests/Serialization/CyclicTests.cs +++ b/src/System.Text.Json/tests/Serialization/CyclicTests.cs @@ -19,12 +19,13 @@ public static void WriteCyclicFail() } [Fact] + [ActiveIssue(37313)] public static void WriteTestClassWithArrayOfElementsOfTheSameClassWithoutCyclesDoesNotFail() { TestClassWithArrayOfElementsOfTheSameClass obj = new TestClassWithArrayOfElementsOfTheSameClass(); //It shouldn't throw when there is no real cycle reference, and just empty object is created - Assert.Null(Record.Exception(() => JsonSerializer.ToString(obj))); + Assert.Throws(() => JsonSerializer.ToString(obj)); } } } From 64e1b2771fc3d66a985dc27018008711ad33e6cd Mon Sep 17 00:00:00 2001 From: Oskar Dudycz Date: Tue, 14 May 2019 17:24:24 +0200 Subject: [PATCH 4/5] Fixed formatting of CyclicTests --- src/System.Text.Json/tests/Serialization/CyclicTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System.Text.Json/tests/Serialization/CyclicTests.cs b/src/System.Text.Json/tests/Serialization/CyclicTests.cs index 0e1bf606cc28..40347d53278a 100644 --- a/src/System.Text.Json/tests/Serialization/CyclicTests.cs +++ b/src/System.Text.Json/tests/Serialization/CyclicTests.cs @@ -19,7 +19,7 @@ public static void WriteCyclicFail() } [Fact] - [ActiveIssue(37313)] + [ActiveIssue(37313)] public static void WriteTestClassWithArrayOfElementsOfTheSameClassWithoutCyclesDoesNotFail() { TestClassWithArrayOfElementsOfTheSameClass obj = new TestClassWithArrayOfElementsOfTheSameClass(); From 10353ab19786bf6a14129e399c3de3093d83ac34 Mon Sep 17 00:00:00 2001 From: Oskar Dudycz Date: Wed, 15 May 2019 20:32:49 +0200 Subject: [PATCH 5/5] Updated assert in CyclicTests.WriteTestClassWithArrayOfElementsOfTheSameClassWithoutCyclesDoesNotFail --- src/System.Text.Json/tests/Serialization/CyclicTests.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/System.Text.Json/tests/Serialization/CyclicTests.cs b/src/System.Text.Json/tests/Serialization/CyclicTests.cs index 0e1bf606cc28..19f38562db3b 100644 --- a/src/System.Text.Json/tests/Serialization/CyclicTests.cs +++ b/src/System.Text.Json/tests/Serialization/CyclicTests.cs @@ -19,13 +19,14 @@ public static void WriteCyclicFail() } [Fact] - [ActiveIssue(37313)] + [ActiveIssue(37313)] public static void WriteTestClassWithArrayOfElementsOfTheSameClassWithoutCyclesDoesNotFail() { TestClassWithArrayOfElementsOfTheSameClass obj = new TestClassWithArrayOfElementsOfTheSameClass(); //It shouldn't throw when there is no real cycle reference, and just empty object is created - Assert.Throws(() => JsonSerializer.ToString(obj)); + string json = JsonSerializer.ToString(obj); + Assert.Equal(@"{}", json); } } }