Skip to content

Commit a4dc75f

Browse files
authored
fix(php): do not throw deprecated warning on field getters for default values (#21033)
* fix(php): do not throw deprecated warning on field getters for default values (#17788) backports fix for #13428 to 25.x branch * fix deprecation_trigger generation
1 parent 2dac90d commit a4dc75f

File tree

3 files changed

+221
-89
lines changed

3 files changed

+221
-89
lines changed

php/tests/GeneratedClassTest.php

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,92 @@ public function testDeprecatedInt32Field()
104104
$this->assertSame(4, $deprecationCount);
105105
}
106106

107+
public function testDeprecatedFieldGetterDoesNotThrowWarning()
108+
{
109+
// temporarily change error handler to capture the deprecated errors
110+
$deprecationCount = 0;
111+
set_error_handler(function ($errno, $errstr) use (&$deprecationCount) {
112+
if (false !== strpos($errstr, ' is deprecated.')) {
113+
$deprecationCount++;
114+
}
115+
}, E_USER_DEPRECATED);
116+
117+
// does not throw warning
118+
$message = new TestMessage();
119+
$message->getDeprecatedInt32();
120+
$message->getDeprecatedOptionalInt32();
121+
$message->getDeprecatedInt32ValueUnwrapped(); // wrapped field
122+
$message->getDeprecatedInt32Value(); // wrapped field
123+
$message->getDeprecatedOneofInt32(); // oneof field
124+
$message->getDeprecatedOneof(); // oneof field
125+
$message->getDeprecatedRepeatedInt32(); // repeated field
126+
$message->getDeprecatedMapInt32Int32(); // map field
127+
$message->getDeprecatedAny(); // any field
128+
$message->getDeprecatedMessage(); // message field
129+
$message->getDeprecatedEnum(); // enum field
130+
131+
restore_error_handler();
132+
133+
$this->assertEquals(0, $deprecationCount);
134+
}
135+
136+
public function testDeprecatedFieldGetterThrowsWarningWithValue()
137+
{
138+
$message = new TestMessage([
139+
'deprecated_int32' => 1,
140+
'deprecated_optional_int32' => 1,
141+
'deprecated_int32_value' => new \Google\Protobuf\Int32Value(['value' => 1]),
142+
'deprecated_oneof_int32' => 1,
143+
'deprecated_repeated_int32' => [1],
144+
'deprecated_map_int32_int32' => [1 => 1],
145+
'deprecated_any' => new \Google\Protobuf\Any(['type_url' => 'foo', 'value' => 'bar']),
146+
'deprecated_message' => new TestMessage(),
147+
'deprecated_enum' => 1,
148+
]);
149+
150+
// temporarily change error handler to capture the deprecated errors
151+
$deprecationCount = 0;
152+
set_error_handler(function ($errno, $errstr) use (&$deprecationCount) {
153+
if (false !== strpos($errstr, ' is deprecated.')) {
154+
$deprecationCount++;
155+
}
156+
}, E_USER_DEPRECATED);
157+
158+
$message->getDeprecatedInt32();
159+
$message->getDeprecatedOptionalInt32();
160+
$message->getDeprecatedInt32ValueUnwrapped(); // wrapped field unwrapped
161+
$message->getDeprecatedInt32Value(); // wrapped field
162+
$message->getDeprecatedOneofInt32(); // oneof field
163+
$message->getDeprecatedRepeatedInt32(); // repeated field
164+
$message->getDeprecatedMapInt32Int32(); // map field
165+
$message->getDeprecatedAny(); // any field
166+
$message->getDeprecatedMessage(); // message field
167+
$message->getDeprecatedEnum(); // enum field
168+
169+
// oneof field (should never warn)
170+
$message->getDeprecatedOneof();
171+
172+
restore_error_handler();
173+
174+
$this->assertEquals(10, $deprecationCount);
175+
}
176+
177+
public function testDeprecatedFieldWarningsOnSerialize()
178+
{
179+
set_error_handler(function ($errno, $errstr) {
180+
if (false !== strpos($errstr, ' is deprecated.')) {
181+
throw new \Exception($errstr);
182+
}
183+
}, E_USER_DEPRECATED);
184+
185+
$message = new TestMessage();
186+
$message->serializeToJsonString();
187+
188+
restore_error_handler();
189+
190+
$this->assertTrue(true, 'No deprecation warning on serialize');
191+
}
192+
107193
#########################################################
108194
# Test optional int32 field.
109195
#########################################################

php/tests/proto/test.proto

Lines changed: 97 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
syntax = "proto3";
22

3+
package foo;
4+
35
import 'google/protobuf/any.proto';
4-
import 'google/protobuf/wrappers.proto';
56
import 'google/protobuf/struct.proto';
7+
import 'google/protobuf/wrappers.proto';
8+
import 'proto/test_empty_php_namespace.proto';
69
import 'proto/test_include.proto';
710
import 'proto/test_no_namespace.proto';
811
import 'proto/test_php_namespace.proto';
9-
import 'proto/test_empty_php_namespace.proto';
1012
import 'proto/test_prefix.proto';
1113

12-
package foo;
13-
1414
message TestMessage {
1515
// Singular
1616
int32 optional_int32 = 1;
@@ -56,63 +56,63 @@ message TestMessage {
5656
optional bar.TestInclude true_optional_included_message = 218;
5757

5858
// Repeated
59-
repeated int32 repeated_int32 = 31;
60-
repeated int64 repeated_int64 = 32;
61-
repeated uint32 repeated_uint32 = 33;
62-
repeated uint64 repeated_uint64 = 34;
63-
repeated sint32 repeated_sint32 = 35;
64-
repeated sint64 repeated_sint64 = 36;
65-
repeated fixed32 repeated_fixed32 = 37;
66-
repeated fixed64 repeated_fixed64 = 38;
59+
repeated int32 repeated_int32 = 31;
60+
repeated int64 repeated_int64 = 32;
61+
repeated uint32 repeated_uint32 = 33;
62+
repeated uint64 repeated_uint64 = 34;
63+
repeated sint32 repeated_sint32 = 35;
64+
repeated sint64 repeated_sint64 = 36;
65+
repeated fixed32 repeated_fixed32 = 37;
66+
repeated fixed64 repeated_fixed64 = 38;
6767
repeated sfixed32 repeated_sfixed32 = 39;
6868
repeated sfixed64 repeated_sfixed64 = 40;
69-
repeated float repeated_float = 41;
70-
repeated double repeated_double = 42;
71-
repeated bool repeated_bool = 43;
72-
repeated string repeated_string = 44;
73-
repeated bytes repeated_bytes = 45;
69+
repeated float repeated_float = 41;
70+
repeated double repeated_double = 42;
71+
repeated bool repeated_bool = 43;
72+
repeated string repeated_string = 44;
73+
repeated bytes repeated_bytes = 45;
7474

7575
repeated TestEnum repeated_enum = 46;
7676
repeated Sub repeated_message = 47;
7777
repeated TestMessage repeated_recursive = 48;
7878

7979
oneof my_oneof {
80-
int32 oneof_int32 = 51;
81-
int64 oneof_int64 = 52;
82-
uint32 oneof_uint32 = 53;
83-
uint64 oneof_uint64 = 54;
84-
uint32 oneof_sint32 = 55;
85-
uint64 oneof_sint64 = 56;
86-
uint32 oneof_fixed32 = 57;
87-
uint64 oneof_fixed64 = 58;
80+
int32 oneof_int32 = 51;
81+
int64 oneof_int64 = 52;
82+
uint32 oneof_uint32 = 53;
83+
uint64 oneof_uint64 = 54;
84+
uint32 oneof_sint32 = 55;
85+
uint64 oneof_sint64 = 56;
86+
uint32 oneof_fixed32 = 57;
87+
uint64 oneof_fixed64 = 58;
8888
uint32 oneof_sfixed32 = 59;
8989
uint64 oneof_sfixed64 = 60;
90-
double oneof_double = 61;
91-
float oneof_float = 62;
92-
bool oneof_bool = 63;
93-
string oneof_string = 64;
94-
bytes oneof_bytes = 65;
95-
TestEnum oneof_enum = 66;
96-
Sub oneof_message = 67;
90+
double oneof_double = 61;
91+
float oneof_float = 62;
92+
bool oneof_bool = 63;
93+
string oneof_string = 64;
94+
bytes oneof_bytes = 65;
95+
TestEnum oneof_enum = 66;
96+
Sub oneof_message = 67;
9797
}
9898

99-
map<int32, int32> map_int32_int32 = 71;
100-
map<int64, int64> map_int64_int64 = 72;
101-
map<uint32, uint32> map_uint32_uint32 = 73;
102-
map<uint64, uint64> map_uint64_uint64 = 74;
103-
map<sint32, sint32> map_sint32_sint32 = 75;
104-
map<sint64, sint64> map_sint64_sint64 = 76;
105-
map<fixed32, fixed32> map_fixed32_fixed32 = 77;
106-
map<fixed64, fixed64> map_fixed64_fixed64 = 78;
99+
map<int32, int32> map_int32_int32 = 71;
100+
map<int64, int64> map_int64_int64 = 72;
101+
map<uint32, uint32> map_uint32_uint32 = 73;
102+
map<uint64, uint64> map_uint64_uint64 = 74;
103+
map<sint32, sint32> map_sint32_sint32 = 75;
104+
map<sint64, sint64> map_sint64_sint64 = 76;
105+
map<fixed32, fixed32> map_fixed32_fixed32 = 77;
106+
map<fixed64, fixed64> map_fixed64_fixed64 = 78;
107107
map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79;
108108
map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80;
109-
map<int32, float> map_int32_float = 81;
110-
map<int32, double> map_int32_double = 82;
111-
map<bool, bool> map_bool_bool = 83;
112-
map<string, string> map_string_string = 84;
113-
map<int32, bytes> map_int32_bytes = 85;
114-
map<int32, TestEnum> map_int32_enum = 86;
115-
map<int32, Sub> map_int32_message = 87;
109+
map<int32, float> map_int32_float = 81;
110+
map<int32, double> map_int32_double = 82;
111+
map<bool, bool> map_bool_bool = 83;
112+
map<string, string> map_string_string = 84;
113+
map<int32, bytes> map_int32_bytes = 85;
114+
map<int32, TestEnum> map_int32_enum = 86;
115+
map<int32, Sub> map_int32_message = 87;
116116

117117
map<int32, TestMessage> map_recursive = 88;
118118

@@ -149,13 +149,31 @@ message TestMessage {
149149
map<string, google.protobuf.Struct> map_string_struct = 124;
150150

151151
// deprecated field
152-
int32 deprecated_optional_int32 = 125 [deprecated=true];
152+
int32 deprecated_int32 = 125 [deprecated = true];
153+
// deprecated optional field
154+
optional int32 deprecated_optional_int32 = 126 [deprecated = true];
155+
// deprecated wrapped field
156+
google.protobuf.Int32Value deprecated_int32_value = 127 [deprecated = true];
157+
// deprecated oneof
158+
oneof deprecated_oneof {
159+
int32 deprecated_oneof_int32 = 128 [deprecated = true];
160+
}
161+
// deprecated repeated field
162+
repeated int32 deprecated_repeated_int32 = 129 [deprecated = true];
163+
// deprecated map
164+
map<int32, int32> deprecated_map_int32_int32 = 130 [deprecated = true];
165+
// deprecated any
166+
google.protobuf.Any deprecated_any = 131 [deprecated = true];
167+
// deprecated message
168+
TestMessage deprecated_message = 132 [deprecated = true];
169+
// deprecated enum
170+
NestedEnum deprecated_enum = 133 [deprecated = true];
153171
}
154172

155173
enum TestEnum {
156174
ZERO = 0;
157-
ONE = 1;
158-
TWO = 2;
175+
ONE = 1;
176+
TWO = 2;
159177
ECHO = 3; // Test reserved name.
160178
}
161179

@@ -173,38 +191,38 @@ message EmptyAnySerialization {
173191
}
174192

175193
message TestPackedMessage {
176-
repeated int32 repeated_int32 = 90 [packed = true];
177-
repeated int64 repeated_int64 = 91 [packed = true];
178-
repeated uint32 repeated_uint32 = 92 [packed = true];
179-
repeated uint64 repeated_uint64 = 93 [packed = true];
180-
repeated sint32 repeated_sint32 = 94 [packed = true];
181-
repeated sint64 repeated_sint64 = 95 [packed = true];
182-
repeated fixed32 repeated_fixed32 = 96 [packed = true];
183-
repeated fixed64 repeated_fixed64 = 97 [packed = true];
184-
repeated sfixed32 repeated_sfixed32 = 98 [packed = true];
185-
repeated sfixed64 repeated_sfixed64 = 99 [packed = true];
186-
repeated float repeated_float = 100 [packed = true];
187-
repeated double repeated_double = 101 [packed = true];
188-
repeated bool repeated_bool = 102 [packed = true];
189-
repeated TestEnum repeated_enum = 103 [packed = true];
194+
repeated int32 repeated_int32 = 90 [packed = true];
195+
repeated int64 repeated_int64 = 91 [packed = true];
196+
repeated uint32 repeated_uint32 = 92 [packed = true];
197+
repeated uint64 repeated_uint64 = 93 [packed = true];
198+
repeated sint32 repeated_sint32 = 94 [packed = true];
199+
repeated sint64 repeated_sint64 = 95 [packed = true];
200+
repeated fixed32 repeated_fixed32 = 96 [packed = true];
201+
repeated fixed64 repeated_fixed64 = 97 [packed = true];
202+
repeated sfixed32 repeated_sfixed32 = 98 [packed = true];
203+
repeated sfixed64 repeated_sfixed64 = 99 [packed = true];
204+
repeated float repeated_float = 100 [packed = true];
205+
repeated double repeated_double = 101 [packed = true];
206+
repeated bool repeated_bool = 102 [packed = true];
207+
repeated TestEnum repeated_enum = 103 [packed = true];
190208
}
191209

192210
// Need to be in sync with TestPackedMessage.
193211
message TestUnpackedMessage {
194-
repeated int32 repeated_int32 = 90 [packed = false];
195-
repeated int64 repeated_int64 = 91 [packed = false];
196-
repeated uint32 repeated_uint32 = 92 [packed = false];
197-
repeated uint64 repeated_uint64 = 93 [packed = false];
198-
repeated sint32 repeated_sint32 = 94 [packed = false];
199-
repeated sint64 repeated_sint64 = 95 [packed = false];
200-
repeated fixed32 repeated_fixed32 = 96 [packed = false];
201-
repeated fixed64 repeated_fixed64 = 97 [packed = false];
202-
repeated sfixed32 repeated_sfixed32 = 98 [packed = false];
203-
repeated sfixed64 repeated_sfixed64 = 99 [packed = false];
204-
repeated float repeated_float = 100 [packed = false];
205-
repeated double repeated_double = 101 [packed = false];
206-
repeated bool repeated_bool = 102 [packed = false];
207-
repeated TestEnum repeated_enum = 103 [packed = false];
212+
repeated int32 repeated_int32 = 90 [packed = false];
213+
repeated int64 repeated_int64 = 91 [packed = false];
214+
repeated uint32 repeated_uint32 = 92 [packed = false];
215+
repeated uint64 repeated_uint64 = 93 [packed = false];
216+
repeated sint32 repeated_sint32 = 94 [packed = false];
217+
repeated sint64 repeated_sint64 = 95 [packed = false];
218+
repeated fixed32 repeated_fixed32 = 96 [packed = false];
219+
repeated fixed64 repeated_fixed64 = 97 [packed = false];
220+
repeated sfixed32 repeated_sfixed32 = 98 [packed = false];
221+
repeated sfixed64 repeated_sfixed64 = 99 [packed = false];
222+
repeated float repeated_float = 100 [packed = false];
223+
repeated double repeated_double = 101 [packed = false];
224+
repeated bool repeated_bool = 102 [packed = false];
225+
repeated TestEnum repeated_enum = 103 [packed = false];
208226
}
209227

210228
// /**/@<>&\{
@@ -236,8 +254,7 @@ message TestReverseFieldOrder {
236254
string b = 1;
237255
}
238256

239-
message testLowerCaseMessage {
240-
}
257+
message testLowerCaseMessage {}
241258

242259
enum testLowerCaseEnum {
243260
VALUE = 0;

0 commit comments

Comments
 (0)