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