getPayload()) { case 'protobuf_payload': switch ($request->getMessageType()) { case 'protobuf_test_messages.proto3.TestAllTypesProto3': $test_message = new TestAllTypesProto3(); break; case 'protobuf_test_messages.editions.proto3.TestAllTypesProto3': $test_message = new TestAllTypesProto3Editions(); break; case 'conformance.FailureSet': $response->setProtobufPayload(''); return $response; case 'protobuf_test_messages.proto2.TestAllTypesProto2': case 'protobuf_test_messages.editions.proto2.TestAllTypesProto2': $response->setSkipped('PHP doesn\'t support proto2'); return $response; case 'protobuf_test_messages.editions.TestAllTypesEdition2023': $response->setSkipped('PHP doesn\'t support editions-specific features yet'); return $response; case '': trigger_error( 'Protobuf request doesn\'t have specific payload type', E_USER_ERROR ); default: trigger_error(sprintf( 'Protobuf request doesn\'t support %s message type', $request->getMessageType(), ), E_USER_ERROR); } try { $test_message->mergeFromString($request->getProtobufPayload()); } catch (Exception $e) { $response->setParseError($e->getMessage()); return $response; } break; case 'json_payload': switch ($request->getMessageType()) { case 'protobuf_test_messages.editions.proto3.TestAllTypesProto3': $test_message = new TestAllTypesProto3Editions(); break; case 'protobuf_test_messages.editions.proto2.TestAllTypesProto2': $response->setSkipped('PHP doesn\'t support proto2'); return $response; default: $test_message = new TestAllTypesProto3(); } $ignore_json_unknown = ($request->getTestCategory() == TestCategory::JSON_IGNORE_UNKNOWN_PARSING_TEST); try { $test_message->mergeFromJsonString( $request->getJsonPayload(), $ignore_json_unknown ); } catch (Exception $e) { $response->setParseError($e->getMessage()); return $response; } break; case 'text_payload': $response->setSkipped('PHP doesn\'t support text format yet'); return $response; default: trigger_error('Request didn\'t have payload.', E_USER_ERROR); } switch ($request->getRequestedOutputFormat()) { case WireFormat::TEXT_FORMAT: $response->setSkipped('PHP doesn\'t support text format yet'); return $response; case WireFormat::UNSPECIFIED: trigger_error('Unspecified output format.', E_USER_ERROR); case WireFormat::PROTOBUF: $response->setProtobufPayload($test_message->serializeToString()); break; case WireFormat::JSON: try { $response->setJsonPayload($test_message->serializeToJsonString()); } catch (Exception $e) { $response->setSerializeError($e->getMessage()); return $response; } } return $response; } function doTestIO() { $length_bytes = fread(STDIN, 4); if (strlen($length_bytes) == 0) { return false; # EOF } elseif (strlen($length_bytes) != 4) { fwrite(STDERR, "I/O error\n"); return false; } $length = unpack('V', $length_bytes)[1]; $serialized_request = fread(STDIN, $length); if (strlen($serialized_request) != $length) { trigger_error('I/O error', E_USER_ERROR); } $request = new ConformanceRequest(); $request->mergeFromString($serialized_request); $response = doTest($request); $serialized_response = $response->serializeToString(); fwrite(STDOUT, pack('V', strlen($serialized_response))); fwrite(STDOUT, $serialized_response); $GLOBALS['test_count'] += 1; return true; } while(true){ if (!doTestIO()) { fprintf(STDERR, 'conformance_php: received EOF from test runner ' . "after %d tests, exiting\n", $test_count); exit; } }