| <?php |
| |
| require_once('Conformance/WireFormat.php'); |
| require_once('Conformance/ConformanceResponse.php'); |
| require_once('Conformance/ConformanceRequest.php'); |
| require_once('Conformance/FailureSet.php'); |
| require_once('Conformance/JspbEncodingConfig.php'); |
| require_once('Conformance/TestCategory.php'); |
| require_once('Protobuf_test_messages/Proto3/ForeignMessage.php'); |
| require_once('Protobuf_test_messages/Proto3/ForeignEnum.php'); |
| require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3.php'); |
| require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php'); |
| require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php'); |
| require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/EnumOnlyProto3/PBBool.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/EnumOnlyProto3.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3/NestedMessage.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3/NestedEnum.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3/AliasedEnum.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/NullHypothesisProto3.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/ForeignEnum.php'); |
| require_once('Protobuf_test_messages/Editions/Proto3/ForeignMessage.php'); |
| require_once('GPBMetadata/Conformance.php'); |
| require_once('GPBMetadata/TestMessagesProto3.php'); |
| require_once('GPBMetadata/TestMessagesProto3Editions.php'); |
| |
| use Conformance\ConformanceRequest; |
| use Conformance\ConformanceResponse; |
| use Conformance\TestCategory; |
| use Conformance\WireFormat; |
| use Protobuf_test_messages\Proto3\TestAllTypesProto3; |
| use Protobuf_test_messages\Editions\Proto3\TestAllTypesProto3 as TestAllTypesProto3Editions; |
| |
| if (!ini_get('date.timezone')) { |
| ini_set('date.timezone', 'UTC'); |
| } |
| |
| $test_count = 0; |
| |
| function doTest($request) |
| { |
| $response = new ConformanceResponse(); |
| |
| switch ($request->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.proto2.TestAllTypesProto2': |
| 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; |
| } |
| } |