1ffe3c632Sopenharmony_ci<?php 2ffe3c632Sopenharmony_ci 3ffe3c632Sopenharmony_cirequire_once("Conformance/WireFormat.php"); 4ffe3c632Sopenharmony_cirequire_once("Conformance/ConformanceResponse.php"); 5ffe3c632Sopenharmony_cirequire_once("Conformance/ConformanceRequest.php"); 6ffe3c632Sopenharmony_cirequire_once("Conformance/FailureSet.php"); 7ffe3c632Sopenharmony_cirequire_once("Conformance/JspbEncodingConfig.php"); 8ffe3c632Sopenharmony_cirequire_once("Conformance/TestCategory.php"); 9ffe3c632Sopenharmony_cirequire_once("Protobuf_test_messages/Proto3/ForeignMessage.php"); 10ffe3c632Sopenharmony_cirequire_once("Protobuf_test_messages/Proto3/ForeignEnum.php"); 11ffe3c632Sopenharmony_cirequire_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php"); 12ffe3c632Sopenharmony_cirequire_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php"); 13ffe3c632Sopenharmony_cirequire_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php"); 14ffe3c632Sopenharmony_cirequire_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php"); 15ffe3c632Sopenharmony_ci 16ffe3c632Sopenharmony_cirequire_once("GPBMetadata/Conformance.php"); 17ffe3c632Sopenharmony_cirequire_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php"); 18ffe3c632Sopenharmony_ci 19ffe3c632Sopenharmony_ciuse \Conformance\TestCategory; 20ffe3c632Sopenharmony_ciuse \Conformance\WireFormat; 21ffe3c632Sopenharmony_ci 22ffe3c632Sopenharmony_ciif (!ini_get("date.timezone")) { 23ffe3c632Sopenharmony_ci ini_set("date.timezone", "UTC"); 24ffe3c632Sopenharmony_ci} 25ffe3c632Sopenharmony_ci 26ffe3c632Sopenharmony_ci$test_count = 0; 27ffe3c632Sopenharmony_ci 28ffe3c632Sopenharmony_cifunction doTest($request) 29ffe3c632Sopenharmony_ci{ 30ffe3c632Sopenharmony_ci $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3(); 31ffe3c632Sopenharmony_ci $response = new \Conformance\ConformanceResponse(); 32ffe3c632Sopenharmony_ci if ($request->getPayload() == "protobuf_payload") { 33ffe3c632Sopenharmony_ci if ($request->getMessageType() == "conformance.FailureSet") { 34ffe3c632Sopenharmony_ci $response->setProtobufPayload(""); 35ffe3c632Sopenharmony_ci return $response; 36ffe3c632Sopenharmony_ci } elseif ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") { 37ffe3c632Sopenharmony_ci try { 38ffe3c632Sopenharmony_ci $test_message->mergeFromString($request->getProtobufPayload()); 39ffe3c632Sopenharmony_ci } catch (Exception $e) { 40ffe3c632Sopenharmony_ci $response->setParseError($e->getMessage()); 41ffe3c632Sopenharmony_ci return $response; 42ffe3c632Sopenharmony_ci } 43ffe3c632Sopenharmony_ci } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") { 44ffe3c632Sopenharmony_ci $response->setSkipped("PHP doesn't support proto2"); 45ffe3c632Sopenharmony_ci return $response; 46ffe3c632Sopenharmony_ci } else { 47ffe3c632Sopenharmony_ci trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR); 48ffe3c632Sopenharmony_ci } 49ffe3c632Sopenharmony_ci } elseif ($request->getPayload() == "json_payload") { 50ffe3c632Sopenharmony_ci $ignore_json_unknown = 51ffe3c632Sopenharmony_ci ($request->getTestCategory() == 52ffe3c632Sopenharmony_ci TestCategory::JSON_IGNORE_UNKNOWN_PARSING_TEST); 53ffe3c632Sopenharmony_ci try { 54ffe3c632Sopenharmony_ci $test_message->mergeFromJsonString($request->getJsonPayload(), 55ffe3c632Sopenharmony_ci $ignore_json_unknown); 56ffe3c632Sopenharmony_ci } catch (Exception $e) { 57ffe3c632Sopenharmony_ci $response->setParseError($e->getMessage()); 58ffe3c632Sopenharmony_ci return $response; 59ffe3c632Sopenharmony_ci } 60ffe3c632Sopenharmony_ci } elseif ($request->getPayload() == "text_payload") { 61ffe3c632Sopenharmony_ci $response->setSkipped("PHP doesn't support text format yet"); 62ffe3c632Sopenharmony_ci return $response; 63ffe3c632Sopenharmony_ci } else { 64ffe3c632Sopenharmony_ci trigger_error("Request didn't have payload.", E_USER_ERROR); 65ffe3c632Sopenharmony_ci } 66ffe3c632Sopenharmony_ci 67ffe3c632Sopenharmony_ci if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) { 68ffe3c632Sopenharmony_ci trigger_error("Unspecified output format.", E_USER_ERROR); 69ffe3c632Sopenharmony_ci } elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) { 70ffe3c632Sopenharmony_ci $response->setProtobufPayload($test_message->serializeToString()); 71ffe3c632Sopenharmony_ci } elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) { 72ffe3c632Sopenharmony_ci try { 73ffe3c632Sopenharmony_ci $response->setJsonPayload($test_message->serializeToJsonString()); 74ffe3c632Sopenharmony_ci } catch (Exception $e) { 75ffe3c632Sopenharmony_ci $response->setSerializeError($e->getMessage()); 76ffe3c632Sopenharmony_ci return $response; 77ffe3c632Sopenharmony_ci } 78ffe3c632Sopenharmony_ci } 79ffe3c632Sopenharmony_ci 80ffe3c632Sopenharmony_ci return $response; 81ffe3c632Sopenharmony_ci} 82ffe3c632Sopenharmony_ci 83ffe3c632Sopenharmony_cifunction doTestIO() 84ffe3c632Sopenharmony_ci{ 85ffe3c632Sopenharmony_ci $length_bytes = fread(STDIN, 4); 86ffe3c632Sopenharmony_ci if (strlen($length_bytes) == 0) { 87ffe3c632Sopenharmony_ci return false; # EOF 88ffe3c632Sopenharmony_ci } elseif (strlen($length_bytes) != 4) { 89ffe3c632Sopenharmony_ci fwrite(STDERR, "I/O error\n"); 90ffe3c632Sopenharmony_ci return false; 91ffe3c632Sopenharmony_ci } 92ffe3c632Sopenharmony_ci 93ffe3c632Sopenharmony_ci $length = unpack("V", $length_bytes)[1]; 94ffe3c632Sopenharmony_ci $serialized_request = fread(STDIN, $length); 95ffe3c632Sopenharmony_ci if (strlen($serialized_request) != $length) { 96ffe3c632Sopenharmony_ci trigger_error("I/O error", E_USER_ERROR); 97ffe3c632Sopenharmony_ci } 98ffe3c632Sopenharmony_ci 99ffe3c632Sopenharmony_ci $request = new \Conformance\ConformanceRequest(); 100ffe3c632Sopenharmony_ci $request->mergeFromString($serialized_request); 101ffe3c632Sopenharmony_ci 102ffe3c632Sopenharmony_ci $response = doTest($request); 103ffe3c632Sopenharmony_ci 104ffe3c632Sopenharmony_ci $serialized_response = $response->serializeToString(); 105ffe3c632Sopenharmony_ci fwrite(STDOUT, pack("V", strlen($serialized_response))); 106ffe3c632Sopenharmony_ci fwrite(STDOUT, $serialized_response); 107ffe3c632Sopenharmony_ci 108ffe3c632Sopenharmony_ci $GLOBALS['test_count'] += 1; 109ffe3c632Sopenharmony_ci 110ffe3c632Sopenharmony_ci return true; 111ffe3c632Sopenharmony_ci} 112ffe3c632Sopenharmony_ci 113ffe3c632Sopenharmony_ciwhile(true){ 114ffe3c632Sopenharmony_ci if (!doTestIO()) { 115ffe3c632Sopenharmony_ci fprintf(STDERR, 116ffe3c632Sopenharmony_ci "conformance_php: received EOF from test runner " + 117ffe3c632Sopenharmony_ci "after %d tests, exiting\n", $test_count); 118ffe3c632Sopenharmony_ci exit; 119ffe3c632Sopenharmony_ci } 120ffe3c632Sopenharmony_ci} 121