1515import com .google .protobuf .conformance .Conformance ;
1616import com .google .protobuf .util .JsonFormat ;
1717import com .google .protobuf .util .JsonFormat .TypeRegistry ;
18+ import com .google .protobuf_test_messages .editions .proto2 .TestMessagesProto2Editions ;
19+ import com .google .protobuf_test_messages .editions .proto3 .TestMessagesProto3Editions ;
1820import com .google .protobuf_test_messages .proto2 .TestMessagesProto2 ;
1921import com .google .protobuf_test_messages .proto2 .TestMessagesProto2 .TestAllTypesProto2 ;
2022import com .google .protobuf_test_messages .proto3 .TestMessagesProto3 ;
@@ -205,42 +207,63 @@ private <T extends AbstractMessage> T parseBinary(
205207 return messages .get (0 );
206208 }
207209
210+ private Class <? extends AbstractMessage > createTestMessage (String messageType ) {
211+ switch (messageType ) {
212+ case "protobuf_test_messages.proto3.TestAllTypesProto3" :
213+ return TestAllTypesProto3 .class ;
214+ case "protobuf_test_messages.proto2.TestAllTypesProto2" :
215+ return TestAllTypesProto2 .class ;
216+ case "protobuf_test_messages.editions.proto3.TestAllTypesProto3" :
217+ return TestMessagesProto3Editions .TestAllTypesProto3 .class ;
218+ case "protobuf_test_messages.editions.proto2.TestAllTypesProto2" :
219+ return TestMessagesProto2Editions .TestAllTypesProto2 .class ;
220+ default :
221+ throw new IllegalArgumentException (
222+ "Protobuf request has unexpected payload type: " + messageType );
223+ }
224+ }
225+
226+ private Class <?> createTestFile (String messageType ) {
227+ switch (messageType ) {
228+ case "protobuf_test_messages.proto3.TestAllTypesProto3" :
229+ return TestMessagesProto3 .class ;
230+ case "protobuf_test_messages.proto2.TestAllTypesProto2" :
231+ return TestMessagesProto2 .class ;
232+ case "protobuf_test_messages.editions.proto3.TestAllTypesProto3" :
233+ return TestMessagesProto3Editions .class ;
234+ case "protobuf_test_messages.editions.proto2.TestAllTypesProto2" :
235+ return TestMessagesProto2Editions .class ;
236+ default :
237+ throw new IllegalArgumentException (
238+ "Protobuf request has unexpected payload type: " + messageType );
239+ }
240+ }
241+
242+ @ SuppressWarnings ("unchecked" )
208243 private Conformance .ConformanceResponse doTest (Conformance .ConformanceRequest request ) {
209244 AbstractMessage testMessage ;
210245 String messageType = request .getMessageType ();
211- boolean isProto3 = messageType .equals ("protobuf_test_messages.proto3.TestAllTypesProto3" );
212- boolean isProto2 = messageType .equals ("protobuf_test_messages.proto2.TestAllTypesProto2" );
213246
214247 switch (request .getPayloadCase ()) {
215248 case PROTOBUF_PAYLOAD :
216249 {
217- if (isProto3 ) {
218- try {
219- ExtensionRegistry extensions = ExtensionRegistry .newInstance ();
220- TestMessagesProto3 .registerAllExtensions (extensions );
221- testMessage =
222- parseBinary (
223- request .getProtobufPayload (), TestAllTypesProto3 .parser (), extensions );
224- } catch (InvalidProtocolBufferException e ) {
225- return Conformance .ConformanceResponse .newBuilder ()
226- .setParseError (e .getMessage ())
227- .build ();
228- }
229- } else if (isProto2 ) {
230- try {
231- ExtensionRegistry extensions = ExtensionRegistry .newInstance ();
232- TestMessagesProto2 .registerAllExtensions (extensions );
233- testMessage =
234- parseBinary (
235- request .getProtobufPayload (), TestAllTypesProto2 .parser (), extensions );
236- } catch (InvalidProtocolBufferException e ) {
237- return Conformance .ConformanceResponse .newBuilder ()
238- .setParseError (e .getMessage ())
239- .build ();
240- }
241- } else {
242- throw new IllegalArgumentException (
243- "Protobuf request has unexpected payload type: " + messageType );
250+ try {
251+ ExtensionRegistry extensions = ExtensionRegistry .newInstance ();
252+ createTestFile (messageType )
253+ .getMethod ("registerAllExtensions" , ExtensionRegistry .class )
254+ .invoke (null , extensions );
255+ testMessage =
256+ parseBinary (
257+ request .getProtobufPayload (),
258+ (Parser <AbstractMessage >)
259+ createTestMessage (messageType ).getMethod ("parser" ).invoke (null ),
260+ extensions );
261+ } catch (InvalidProtocolBufferException e ) {
262+ return Conformance .ConformanceResponse .newBuilder ()
263+ .setParseError (e .getMessage ())
264+ .build ();
265+ } catch (Exception e ) {
266+ throw new RuntimeException (e );
244267 }
245268 break ;
246269 }
@@ -252,54 +275,34 @@ private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest re
252275 == Conformance .TestCategory .JSON_IGNORE_UNKNOWN_PARSING_TEST ) {
253276 parser = parser .ignoringUnknownFields ();
254277 }
255- if (isProto3 ) {
256- TestMessagesProto3 .TestAllTypesProto3 .Builder builder =
257- TestMessagesProto3 .TestAllTypesProto3 .newBuilder ();
258- parser .merge (request .getJsonPayload (), builder );
259- testMessage = builder .build ();
260- } else if (isProto2 ) {
261- TestMessagesProto2 .TestAllTypesProto2 .Builder builder =
262- TestMessagesProto2 .TestAllTypesProto2 .newBuilder ();
263- parser .merge (request .getJsonPayload (), builder );
264- testMessage = builder .build ();
265- } else {
266- throw new IllegalArgumentException (
267- "Protobuf request has unexpected payload type: " + messageType );
268- }
278+ AbstractMessage .Builder <?> builder =
279+ (AbstractMessage .Builder <?>)
280+ createTestMessage (messageType ).getMethod ("newBuilder" ).invoke (null );
281+ parser .merge (request .getJsonPayload (), builder );
282+ testMessage = (AbstractMessage ) builder .build ();
269283 } catch (InvalidProtocolBufferException e ) {
270284 return Conformance .ConformanceResponse .newBuilder ()
271285 .setParseError (e .getMessage ())
272286 .build ();
287+ } catch (Exception e ) {
288+ throw new RuntimeException (e );
273289 }
274290 break ;
275291 }
276292 case TEXT_PAYLOAD :
277293 {
278- if (isProto3 ) {
279- try {
280- TestMessagesProto3 .TestAllTypesProto3 .Builder builder =
281- TestMessagesProto3 .TestAllTypesProto3 .newBuilder ();
282- TextFormat .merge (request .getTextPayload (), builder );
283- testMessage = builder .build ();
284- } catch (TextFormat .ParseException e ) {
285- return Conformance .ConformanceResponse .newBuilder ()
286- .setParseError (e .getMessage ())
287- .build ();
288- }
289- } else if (isProto2 ) {
290- try {
291- TestMessagesProto2 .TestAllTypesProto2 .Builder builder =
292- TestMessagesProto2 .TestAllTypesProto2 .newBuilder ();
293- TextFormat .merge (request .getTextPayload (), builder );
294- testMessage = builder .build ();
294+ try {
295+ AbstractMessage .Builder <?> builder =
296+ (AbstractMessage .Builder <?>)
297+ createTestMessage (messageType ).getMethod ("newBuilder" ).invoke (null );
298+ TextFormat .merge (request .getTextPayload (), builder );
299+ testMessage = (AbstractMessage ) builder .build ();
295300 } catch (TextFormat .ParseException e ) {
296301 return Conformance .ConformanceResponse .newBuilder ()
297302 .setParseError (e .getMessage ())
298303 .build ();
299- }
300- } else {
301- throw new IllegalArgumentException (
302- "Protobuf request has unexpected payload type: " + messageType );
304+ } catch (Exception e ) {
305+ throw new RuntimeException (e );
303306 }
304307 break ;
305308 }
@@ -378,6 +381,9 @@ public void run() throws Exception {
378381 typeRegistry =
379382 TypeRegistry .newBuilder ()
380383 .add (TestMessagesProto3 .TestAllTypesProto3 .getDescriptor ())
384+ .add (
385+ com .google .protobuf_test_messages .editions .proto3 .TestMessagesProto3Editions
386+ .TestAllTypesProto3 .getDescriptor ())
381387 .build ();
382388 while (doTestIo ()) {
383389 this .testCount ++;
0 commit comments