<?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.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; } }