Эх сурвалжийг харах

When we write a single character to a JSON output, make sure we actually have
an output before flushing.

Fixes issue 64.

Jon Skeet 12 жил өмнө
parent
commit
f86edcbb46

+ 4 - 0
src/ProtocolBuffers.Serialization/JsonFormatWriter.cs

@@ -82,6 +82,10 @@ namespace Google.ProtocolBuffers.Serialization
             {
                 if (_bufferPos >= _buffer.Length)
                 {
+                    if (_output == null)
+                    {
+                        _output = new StringWriter(new StringBuilder(_buffer.Length * 2));
+                    }
                     Flush();
                 }
                 _buffer[_bufferPos++] = ch;

+ 37 - 0
src/ProtocolBuffers.Test/TestWriterFormatJson.cs

@@ -1,9 +1,11 @@
 using System;
 using System.IO;
 using System.Text;
+using Google.ProtocolBuffers.DescriptorProtos;
 using Google.ProtocolBuffers.Serialization;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using Google.ProtocolBuffers.TestProtos;
+using EnumOptions = Google.ProtocolBuffers.TestProtos.EnumOptions;
 
 namespace Google.ProtocolBuffers
 {
@@ -152,6 +154,7 @@ namespace Google.ProtocolBuffers
                 @"{}"
                 );
         }
+        
         [TestMethod]
         public void TestRepeatedField()
         {
@@ -163,6 +166,7 @@ namespace Google.ProtocolBuffers
                 @"{""options"":[""ONE"",""TWO""]}"
                 );
         }
+        
         [TestMethod]
         public void TestNestedEmptyMessage()
         {
@@ -173,6 +177,7 @@ namespace Google.ProtocolBuffers
                 @"{""child"":{}}"
                 );
         }
+        
         [TestMethod]
         public void TestNestedMessage()
         {
@@ -183,6 +188,7 @@ namespace Google.ProtocolBuffers
                 @"{""child"":{""options"":[""TWO""]}}"
                 );
         }
+        
         [TestMethod]
         public void TestBooleanTypes()
         {
@@ -193,6 +199,7 @@ namespace Google.ProtocolBuffers
                 @"{""valid"":true}"
                 );
         }
+        
         [TestMethod]
         public void TestFullMessage()
         {
@@ -222,6 +229,7 @@ namespace Google.ProtocolBuffers
                 0x1010101010L.ToString()
                 );
         }
+        
         [TestMethod]
         public void TestMessageWithXmlText()
         {
@@ -232,6 +240,7 @@ namespace Google.ProtocolBuffers
                 @"{""text"":""<text><\/text>""}"
                 );
         }
+        
         [TestMethod]
         public void TestWithEscapeChars()
         {
@@ -242,6 +251,7 @@ namespace Google.ProtocolBuffers
                 "{\"text\":\" \\t <- \\\"leading space and trailing\\\" -> \\\\ \\uef54 \\u0000 \\u00ff \\uffff \\b \\f \\r \\n \\t \"}"
                 );
         }
+        
         [TestMethod]
         public void TestWithExtensionText()
         {
@@ -253,6 +263,7 @@ namespace Google.ProtocolBuffers
                 @"{""valid"":false,""extension_text"":"" extension text value ! ""}"
                 );
         }
+        
         [TestMethod]
         public void TestWithExtensionNumber()
         {
@@ -264,6 +275,7 @@ namespace Google.ProtocolBuffers
                 @"{""number"":42}"
                 );
         }
+        
         [TestMethod]
         public void TestWithExtensionArray()
         {
@@ -276,6 +288,7 @@ namespace Google.ProtocolBuffers
                 @"{""extension_number"":[100,101,102]}"
                 );
         }
+        
         [TestMethod]
         public void TestWithExtensionEnum()
         {
@@ -286,6 +299,7 @@ namespace Google.ProtocolBuffers
                 @"{""extension_enum"":""ONE""}"
                 );
         }
+        
         [TestMethod]
         public void TestMessageWithExtensions()
         {
@@ -308,6 +322,7 @@ namespace Google.ProtocolBuffers
                 @"""extension_message"":{""number"":42}"
                 );
         }
+        
         [TestMethod]
         public void TestMessageMissingExtensions()
         {
@@ -340,6 +355,7 @@ namespace Google.ProtocolBuffers
             Assert.AreNotEqual(original, copy);
             Assert.AreEqual(message, copy);
         }
+        
         [TestMethod]
         public void TestMergeFields()
         {
@@ -350,6 +366,7 @@ namespace Google.ProtocolBuffers
             Assert.AreEqual("text", builder.Text);
             Assert.AreEqual(411, builder.Number);
         }
+        
         [TestMethod]
         public void TestMessageArray()
         {
@@ -374,6 +391,7 @@ namespace Google.ProtocolBuffers
             Assert.AreEqual(3, ordinal);
             Assert.AreEqual(3, builder.TextlinesCount);
         }
+        
         [TestMethod]
         public void TestNestedMessageArray()
         {
@@ -403,6 +421,7 @@ namespace Google.ProtocolBuffers
             Assert.AreEqual(3, ordinal);
             Assert.AreEqual(3, builder.TextlinesCount);
         }
+        
         [TestMethod]
         public void TestReadWriteJsonWithoutRoot()
         {
@@ -425,6 +444,7 @@ namespace Google.ProtocolBuffers
 
             Assert.AreEqual(message, copy);
         }
+        
         [TestMethod,ExpectedException(typeof(RecursionLimitExceededException))]
         public void TestRecursiveLimit()
         {
@@ -433,29 +453,46 @@ namespace Google.ProtocolBuffers
                 sb.Append("{\"child\":");
             TestXmlRescursive msg = Extensions.MergeFromJson(new TestXmlRescursive.Builder(), sb.ToString()).Build();
         }
+
         [TestMethod, ExpectedException(typeof(FormatException))]
         public void FailWithEmptyText()
         {
             JsonFormatReader.CreateInstance("")
                 .Merge(TestXmlMessage.CreateBuilder());
         }
+        
         [TestMethod, ExpectedException(typeof(FormatException))]
         public void FailWithUnexpectedValue()
         {
             JsonFormatReader.CreateInstance("{{}}")
                 .Merge(TestXmlMessage.CreateBuilder());
         }
+        
         [TestMethod, ExpectedException(typeof(FormatException))]
         public void FailWithUnQuotedName()
         {
             JsonFormatReader.CreateInstance("{name:{}}")
                 .Merge(TestXmlMessage.CreateBuilder());
         }
+        
         [TestMethod, ExpectedException(typeof(FormatException))]
         public void FailWithUnexpectedType()
         {
             JsonFormatReader.CreateInstance("{\"valid\":{}}")
                 .Merge(TestXmlMessage.CreateBuilder());
         }
+
+        // See issue 64 for background.
+        [TestMethod]
+        public void ToJsonRequiringBufferExpansion()
+        {
+            string s = new string('.', 4086);
+            var opts = FileDescriptorProto.CreateBuilder()
+               .SetName(s)
+               .SetPackage("package")
+               .BuildPartial();
+
+            Assert.NotNull(opts.ToJson());
+        }
     }
 }