|  | <?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("GPBMetadata/Conformance.php"); | 
|  | require_once("GPBMetadata/TestMessagesProto3.php"); | 
|  |  | 
|  | use  \Conformance\TestCategory; | 
|  | use  \Conformance\WireFormat; | 
|  |  | 
|  | if (!ini_get("date.timezone")) { | 
|  | ini_set("date.timezone", "UTC"); | 
|  | } | 
|  |  | 
|  | $test_count = 0; | 
|  |  | 
|  | function doTest($request) | 
|  | { | 
|  | $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3(); | 
|  | $response = new \Conformance\ConformanceResponse(); | 
|  | if ($request->getPayload() == "protobuf_payload") { | 
|  | if ($request->getMessageType() == "conformance.FailureSet") { | 
|  | $response->setProtobufPayload(""); | 
|  | return $response; | 
|  | } elseif ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") { | 
|  | try { | 
|  | $test_message->mergeFromString($request->getProtobufPayload()); | 
|  | } catch (Exception $e) { | 
|  | $response->setParseError($e->getMessage()); | 
|  | return $response; | 
|  | } | 
|  | } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") { | 
|  | $response->setSkipped("PHP doesn't support proto2"); | 
|  | return $response; | 
|  | } else { | 
|  | trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR); | 
|  | } | 
|  | } elseif ($request->getPayload() == "json_payload") { | 
|  | $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; | 
|  | } | 
|  | } elseif ($request->getPayload() == "text_payload") { | 
|  | $response->setSkipped("PHP doesn't support text format yet"); | 
|  | return $response; | 
|  | } else { | 
|  | trigger_error("Request didn't have payload.", E_USER_ERROR); | 
|  | } | 
|  |  | 
|  | if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) { | 
|  | trigger_error("Unspecified output format.", E_USER_ERROR); | 
|  | } elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) { | 
|  | $response->setProtobufPayload($test_message->serializeToString()); | 
|  | } elseif ($request->getRequestedOutputFormat() == 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 \Conformance\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; | 
|  | } | 
|  | } |