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