blob: 9eef0c5a4abc6cc970475385974f54094417ceb2 [file] [log] [blame]
Paul Yang39756642017-02-01 12:47:58 -08001<?php
2
3require_once("Conformance/WireFormat.php");
4require_once("Conformance/ConformanceResponse.php");
5require_once("Conformance/ConformanceRequest.php");
Yilun Chong0adb74c2019-01-08 15:06:30 -08006require_once("Conformance/FailureSet.php");
Paul Yangcecba292018-12-14 16:05:03 -08007require_once("Conformance/JspbEncodingConfig.php");
Feng Xiao6bbe1972018-08-08 17:00:41 -07008require_once("Conformance/TestCategory.php");
Paul Yang39756642017-02-01 12:47:58 -08009require_once("Protobuf_test_messages/Proto3/ForeignMessage.php");
10require_once("Protobuf_test_messages/Proto3/ForeignEnum.php");
Yilun Chong3adb0542017-06-30 17:22:32 -070011require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php");
Hao Nguyene24d9a82018-12-19 15:48:57 -080012require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php");
Paul Yang26eeec92018-07-09 14:29:23 -070013require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php");
14require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php");
Paul Yang39756642017-02-01 12:47:58 -080015
16require_once("GPBMetadata/Conformance.php");
Paul Yang39756642017-02-01 12:47:58 -080017require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
18
Feng Xiao6bbe1972018-08-08 17:00:41 -070019use \Conformance\TestCategory;
Paul Yang39756642017-02-01 12:47:58 -080020use \Conformance\WireFormat;
21
Jack Wakefield174c82d2017-09-10 23:17:50 +010022if (!ini_get("date.timezone")) {
23 ini_set("date.timezone", "UTC");
24}
25
Paul Yang39756642017-02-01 12:47:58 -080026$test_count = 0;
27
28function doTest($request)
29{
Yilun Chong3adb0542017-06-30 17:22:32 -070030 $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3();
Paul Yang39756642017-02-01 12:47:58 -080031 $response = new \Conformance\ConformanceResponse();
32 if ($request->getPayload() == "protobuf_payload") {
Yilun Chong0adb74c2019-01-08 15:06:30 -080033 if ($request->getMessageType() == "conformance.FailureSet") {
34 $response->setProtobufPayload("");
35 return $response;
36 } elseif ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
Yilun Chong18a0c2c2017-06-27 18:24:15 -070037 try {
Paul Yangdd8d5f52017-03-08 14:31:34 -080038 $test_message->mergeFromString($request->getProtobufPayload());
Yilun Chong18a0c2c2017-06-27 18:24:15 -070039 } catch (Exception $e) {
Paul Yangcba04b12017-02-08 10:27:54 -080040 $response->setParseError($e->getMessage());
41 return $response;
Yilun Chong18a0c2c2017-06-27 18:24:15 -070042 }
Yilun Chonga7d5be62017-06-29 15:04:50 -070043 } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") {
Paul Yang23adfeb2017-10-26 14:41:43 -070044 $response->setSkipped("PHP doesn't support proto2");
45 return $response;
Yilun Chong18a0c2c2017-06-27 18:24:15 -070046 } else {
Paul Yang23adfeb2017-10-26 14:41:43 -070047 trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR);
Paul Yangcba04b12017-02-08 10:27:54 -080048 }
Paul Yang39756642017-02-01 12:47:58 -080049 } elseif ($request->getPayload() == "json_payload") {
Feng Xiao6bbe1972018-08-08 17:00:41 -070050 $ignore_json_unknown =
51 ($request->getTestCategory() ==
52 TestCategory::JSON_IGNORE_UNKNOWN_PARSING_TEST);
Paul Yangcba04b12017-02-08 10:27:54 -080053 try {
Paul Yang26eeec92018-07-09 14:29:23 -070054 $test_message->mergeFromJsonString($request->getJsonPayload(),
55 $ignore_json_unknown);
Paul Yangcba04b12017-02-08 10:27:54 -080056 } catch (Exception $e) {
57 $response->setParseError($e->getMessage());
58 return $response;
59 }
Yilun Chong6d29c222019-02-26 13:46:30 -080060 } elseif ($request->getPayload() == "text_payload") {
61 $response->setSkipped("PHP doesn't support text format yet");
62 return $response;
63 } else {
Paul Yang39756642017-02-01 12:47:58 -080064 trigger_error("Request didn't have payload.", E_USER_ERROR);
65 }
66
67 if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) {
68 trigger_error("Unspecified output format.", E_USER_ERROR);
69 } elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) {
Paul Yangdd8d5f52017-03-08 14:31:34 -080070 $response->setProtobufPayload($test_message->serializeToString());
Paul Yang39756642017-02-01 12:47:58 -080071 } elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) {
Paul Yangbcda9192017-11-03 12:30:09 -070072 try {
73 $response->setJsonPayload($test_message->serializeToJsonString());
74 } catch (Exception $e) {
75 $response->setSerializeError($e->getMessage());
76 return $response;
77 }
Paul Yang39756642017-02-01 12:47:58 -080078 }
79
80 return $response;
81}
82
83function doTestIO()
84{
85 $length_bytes = fread(STDIN, 4);
86 if (strlen($length_bytes) == 0) {
87 return false; # EOF
88 } elseif (strlen($length_bytes) != 4) {
Paul Yangecca6ea2017-06-30 12:14:09 -070089 fwrite(STDERR, "I/O error\n");
90 return false;
Paul Yang39756642017-02-01 12:47:58 -080091 }
92
93 $length = unpack("V", $length_bytes)[1];
94 $serialized_request = fread(STDIN, $length);
95 if (strlen($serialized_request) != $length) {
96 trigger_error("I/O error", E_USER_ERROR);
97 }
98
99 $request = new \Conformance\ConformanceRequest();
Paul Yangdd8d5f52017-03-08 14:31:34 -0800100 $request->mergeFromString($serialized_request);
Paul Yang39756642017-02-01 12:47:58 -0800101
102 $response = doTest($request);
103
Paul Yangdd8d5f52017-03-08 14:31:34 -0800104 $serialized_response = $response->serializeToString();
Paul Yang39756642017-02-01 12:47:58 -0800105 fwrite(STDOUT, pack("V", strlen($serialized_response)));
106 fwrite(STDOUT, $serialized_response);
107
108 $GLOBALS['test_count'] += 1;
109
110 return true;
111}
112
113while(true){
114 if (!doTestIO()) {
115 fprintf(STDERR,
116 "conformance_php: received EOF from test runner " +
117 "after %d tests, exiting\n", $test_count);
118 exit;
119 }
120}