Fix field mask for php in json (#5591)

* Fix field mask for php in json

* Update byte size
diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php
index 6aaca84..61527e8 100644
--- a/php/tests/encode_decode_test.php
+++ b/php/tests/encode_decode_test.php
@@ -14,6 +14,7 @@
 use Foo\TestUnpackedMessage;
 use Google\Protobuf\Any;
 use Google\Protobuf\DoubleValue;
+use Google\Protobuf\FieldMask;
 use Google\Protobuf\FloatValue;
 use Google\Protobuf\Int32Value;
 use Google\Protobuf\UInt32Value;
@@ -266,6 +267,40 @@
 
     }
 
+    public function testJsonEncodeDecodeOneof()
+    {
+        $m = new TestMessage();
+
+        $m->setOneofEnum(TestEnum::ONE);
+        $data = $m->serializeToJsonString();
+        $n = new TestMessage();
+        $n->mergeFromJsonString($data);
+        $this->assertSame("oneof_enum", $n->getMyOneof());
+        $this->assertSame(TestEnum::ONE, $n->getOneofEnum());
+
+        $m->setOneofString("a");
+        $data = $m->serializeToJsonString();
+        $n = new TestMessage();
+        $n->mergeFromJsonString($data);
+        $this->assertSame("oneof_string", $n->getMyOneof());
+        $this->assertSame("a", $n->getOneofString());
+
+        $m->setOneofBytes("bbbb");
+        $data = $m->serializeToJsonString();
+        $n = new TestMessage();
+        $n->mergeFromJsonString($data);
+        $this->assertSame("oneof_bytes", $n->getMyOneof());
+        $this->assertSame("bbbb", $n->getOneofBytes());
+
+        $sub_m = new Sub();
+        $m->setOneofMessage($sub_m);
+        $data = $m->serializeToJsonString();
+        $n = new TestMessage();
+        $n->mergeFromJsonString($data);
+        $this->assertSame("oneof_message", $n->getMyOneof());
+        $this->assertFalse(is_null($n->getOneofMessage()));
+    }
+
     public function testPackedEncode()
     {
         $from = new TestPackedMessage();
@@ -1070,4 +1105,27 @@
             $m->serializeToJsonString());
     }
 
+    public function testDecodeTopLevelFieldMask()
+    {
+        $m = new TestMessage();
+        $m->setMapStringString(['a'=>'abcdefg']);
+        $data1 = $m->serializeToJsonString();
+        $n = new TestMessage();
+        $n->mergeFromJsonString($data1);
+        $data2 = $n->serializeToJsonString();
+        $this->assertSame($data1, $data2);
+
+        $m = new FieldMask();
+        $m->mergeFromJsonString("\"foo.barBaz,qux\"");
+        $this->assertSame("foo.bar_baz", $m->getPaths()[0]);
+        $this->assertSame("qux", $m->getPaths()[1]);
+    }
+
+    public function testEncodeTopLevelFieldMask()
+    {
+        $m = new FieldMask();
+        $m->setPaths(["foo.bar_baz", "qux"]);
+        $this->assertSame("\"foo.barBaz,qux\"", $m->serializeToJsonString());
+    }
+
 }
diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php
index 38c3809..83deaba 100644
--- a/php/tests/generated_class_test.php
+++ b/php/tests/generated_class_test.php
@@ -1329,7 +1329,7 @@
             'optional_double' => 1.6,
             'optional_bool' => true,
             'optional_string' => 'a',
-            'optional_bytes' => 'b',
+            'optional_bytes' => 'bbbb',
             'optional_enum' => TestEnum::ONE,
             'optional_message' => new Sub([
                 'a' => 33
@@ -1348,7 +1348,7 @@
             'repeated_double' => [1.6, 2.6],
             'repeated_bool' => [true, false],
             'repeated_string' => ['a', 'c'],
-            'repeated_bytes' => ['b', 'd'],
+            'repeated_bytes' => ['bbbb', 'dddd'],
             'repeated_enum' => [TestEnum::ZERO, TestEnum::ONE],
             'repeated_message' => [new Sub(['a' => 34]),
                                    new Sub(['a' => 35])],
@@ -1366,7 +1366,7 @@
             'map_int32_double' => [1 => 3.6],
             'map_bool_bool' => [true => true],
             'map_string_string' => ['e' => 'e'],
-            'map_int32_bytes' => [1 => 'f'],
+            'map_int32_bytes' => [1 => 'ffff'],
             'map_int32_enum' => [1 => TestEnum::ONE],
             'map_int32_message' => [1 => new Sub(['a' => 36])],
         ]);
diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php
index 323a36f..8d27d19 100644
--- a/php/tests/php_implementation_test.php
+++ b/php/tests/php_implementation_test.php
@@ -504,7 +504,7 @@
     {
         $m = new TestMessage();
         TestUtil::setTestMessage($m);
-        $this->assertSame(506, $m->byteSize());
+        $this->assertSame(518, $m->byteSize());
     }
 
     public function testPackedByteSize()
diff --git a/php/tests/test_base.php b/php/tests/test_base.php
index 27efc87..a4d951b 100644
--- a/php/tests/test_base.php
+++ b/php/tests/test_base.php
@@ -28,7 +28,7 @@
         $this->assertSame(1.6,  $m->getOptionalDouble());
         $this->assertSame(true, $m->getOptionalBool());
         $this->assertSame('a',  $m->getOptionalString());
-        $this->assertSame('b',  $m->getOptionalBytes());
+        $this->assertSame('bbbb',  $m->getOptionalBytes());
         $this->assertSame(TestEnum::ONE, $m->getOptionalEnum());
         $this->assertSame(33,   $m->getOptionalMessage()->getA());
         if (PHP_INT_SIZE == 4) {
@@ -59,7 +59,7 @@
         $this->assertEquals(1.6,  $m->getRepeatedDouble()[0]);
         $this->assertEquals(true, $m->getRepeatedBool()[0]);
         $this->assertEquals('a',  $m->getRepeatedString()[0]);
-        $this->assertEquals('b',  $m->getRepeatedBytes()[0]);
+        $this->assertEquals('bbbb',  $m->getRepeatedBytes()[0]);
         $this->assertEquals(34,   $m->getRepeatedMessage()[0]->GetA());
 
         $this->assertEquals(-52,   $m->getRepeatedInt32()[1]);
@@ -76,7 +76,7 @@
         $this->assertEquals(2.6,   $m->getRepeatedDouble()[1]);
         $this->assertEquals(false, $m->getRepeatedBool()[1]);
         $this->assertEquals('c',   $m->getRepeatedString()[1]);
-        $this->assertEquals('d',   $m->getRepeatedBytes()[1]);
+        $this->assertEquals('dddd',   $m->getRepeatedBytes()[1]);
         $this->assertEquals(35,    $m->getRepeatedMessage()[1]->GetA());
 
         if (PHP_INT_SIZE == 4) {
@@ -101,7 +101,7 @@
         $this->assertEquals(3.6, $m->getMapInt32Double()[1]);
         $this->assertEquals(true , $m->getMapBoolBool()[true]);
         $this->assertEquals('e', $m->getMapStringString()['e']);
-        $this->assertEquals('f', $m->getMapInt32Bytes()[1]);
+        $this->assertEquals('ffff', $m->getMapInt32Bytes()[1]);
         $this->assertEquals(TestEnum::ONE, $m->getMapInt32Enum()[1]);
         $this->assertEquals(36, $m->getMapInt32Message()[1]->GetA());
     }
@@ -146,7 +146,7 @@
         $this->assertEquals(1.6,  $m->getRepeatedDouble()[0]);
         $this->assertEquals(true, $m->getRepeatedBool()[0]);
         $this->assertEquals('a',  $m->getRepeatedString()[0]);
-        $this->assertEquals('b',  $m->getRepeatedBytes()[0]);
+        $this->assertEquals('bbbb',  $m->getRepeatedBytes()[0]);
         $this->assertEquals(TestEnum::ZERO,  $m->getRepeatedEnum()[0]);
         $this->assertEquals(34,   $m->getRepeatedMessage()[0]->GetA());
 
@@ -164,7 +164,7 @@
         $this->assertEquals(2.6,   $m->getRepeatedDouble()[1]);
         $this->assertEquals(false, $m->getRepeatedBool()[1]);
         $this->assertEquals('c',   $m->getRepeatedString()[1]);
-        $this->assertEquals('d',   $m->getRepeatedBytes()[1]);
+        $this->assertEquals('dddd',   $m->getRepeatedBytes()[1]);
         $this->assertEquals(TestEnum::ONE,  $m->getRepeatedEnum()[1]);
         $this->assertEquals(35,    $m->getRepeatedMessage()[1]->GetA());
 
diff --git a/php/tests/test_util.php b/php/tests/test_util.php
index a676d09..2c5b595 100644
--- a/php/tests/test_util.php
+++ b/php/tests/test_util.php
@@ -65,7 +65,7 @@
         $m->setOptionalDouble(1.6);
         $m->setOptionalBool(true);
         $m->setOptionalString('a');
-        $m->setOptionalBytes('b');
+        $m->setOptionalBytes('bbbb');
         $m->setOptionalEnum(TestEnum::ONE);
         $sub = new Sub();
         $m->setOptionalMessage($sub);
@@ -85,7 +85,7 @@
         self::appendHelper($m, 'RepeatedDouble',   1.6);
         self::appendHelper($m, 'RepeatedBool',     true);
         self::appendHelper($m, 'RepeatedString',   'a');
-        self::appendHelper($m, 'RepeatedBytes',    'b');
+        self::appendHelper($m, 'RepeatedBytes',    'bbbb');
         self::appendHelper($m, 'RepeatedEnum',     TestEnum::ZERO);
         self::appendHelper($m, 'RepeatedMessage',  new Sub());
         $m->getRepeatedMessage()[0]->setA(34);
@@ -104,7 +104,7 @@
         self::appendHelper($m, 'RepeatedDouble',   2.6);
         self::appendHelper($m, 'RepeatedBool',     false);
         self::appendHelper($m, 'RepeatedString',   'c');
-        self::appendHelper($m, 'RepeatedBytes',    'd');
+        self::appendHelper($m, 'RepeatedBytes',    'dddd');
         self::appendHelper($m, 'RepeatedEnum',     TestEnum::ONE);
         self::appendHelper($m, 'RepeatedMessage',  new Sub());
         $m->getRepeatedMessage()[1]->SetA(35);
@@ -123,7 +123,7 @@
         self::kvUpdateHelper($m, 'MapInt32Double', 1, 3.6);
         self::kvUpdateHelper($m, 'MapBoolBool', true, true);
         self::kvUpdateHelper($m, 'MapStringString', 'e', 'e');
-        self::kvUpdateHelper($m, 'MapInt32Bytes', 1, 'f');
+        self::kvUpdateHelper($m, 'MapInt32Bytes', 1, 'ffff');
         self::kvUpdateHelper($m, 'MapInt32Enum', 1, TestEnum::ONE);
         self::kvUpdateHelper($m, 'MapInt32Message', 1, new Sub());
         $m->getMapInt32Message()[1]->SetA(36);
@@ -234,7 +234,7 @@
         assert(1.6 === $m->getOptionalDouble());
         assert(true=== $m->getOptionalBool());
         assert('a' === $m->getOptionalString());
-        assert('b' === $m->getOptionalBytes());
+        assert('bbbb' === $m->getOptionalBytes());
         assert(TestEnum::ONE === $m->getOptionalEnum());
         assert(33  === $m->getOptionalMessage()->getA());
 
@@ -260,7 +260,7 @@
         assert(1.6 === $m->getRepeatedDouble()[0]);
         assert(true=== $m->getRepeatedBool()[0]);
         assert('a' === $m->getRepeatedString()[0]);
-        assert('b' === $m->getRepeatedBytes()[0]);
+        assert('bbbb' === $m->getRepeatedBytes()[0]);
         assert(TestEnum::ZERO === $m->getRepeatedEnum()[0]);
         assert(34  === $m->getRepeatedMessage()[0]->getA());
 
@@ -286,7 +286,7 @@
         assert(2.6 === $m->getRepeatedDouble()[1]);
         assert(false === $m->getRepeatedBool()[1]);
         assert('c' === $m->getRepeatedString()[1]);
-        assert('d' === $m->getRepeatedBytes()[1]);
+        assert('dddd' === $m->getRepeatedBytes()[1]);
         assert(TestEnum::ONE === $m->getRepeatedEnum()[1]);
         assert(35  === $m->getRepeatedMessage()[1]->getA());
 
@@ -312,7 +312,7 @@
         assert(3.6 === $m->getMapInt32Double()[1]);
         assert(true === $m->getMapBoolBool()[true]);
         assert('e' === $m->getMapStringString()['e']);
-        assert('f' === $m->getMapInt32Bytes()[1]);
+        assert('ffff' === $m->getMapInt32Bytes()[1]);
         assert(TestEnum::ONE === $m->getMapInt32Enum()[1]);
         assert(36  === $m->getMapInt32Message()[1]->GetA());
     }
@@ -334,7 +334,7 @@
             "619A9999999999F93F" .
             "6801" .
             "720161" .
-            "7A0162" .
+            "7A0462626262" .
             "800101" .
             "8A01020821" .
 
@@ -366,8 +366,8 @@
             "D80200" .
             "E2020161" .
             "E2020163" .
-            "EA020162" .
-            "EA020164" .
+            "EA020462626262" .
+            "EA020464646464" .
             "F00200" .
             "F00201" .
             "FA02020822" .
@@ -387,7 +387,7 @@
             "92050B080111CDCCCCCCCCCC0C40" .
             "9A050408011001" .
             "A205060a0165120165" .
-            "AA05050801120166" .
+            "AA05080801120466666666" .
             "B2050408011001" .
             "Ba0506080112020824"
         );