blob: 799cc3e3614277fff2a4695da158c4db95aa158a [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");
Feng Xiao6bbe1972018-08-08 17:00:41 -07006require_once("Conformance/TestCategory.php");
Paul Yang39756642017-02-01 12:47:58 -08007require_once("Protobuf_test_messages/Proto3/ForeignMessage.php");
8require_once("Protobuf_test_messages/Proto3/ForeignEnum.php");
Yilun Chong3adb0542017-06-30 17:22:32 -07009require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php");
Paul Yang26eeec92018-07-09 14:29:23 -070010require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php");
11require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php");
Paul Yang39756642017-02-01 12:47:58 -080012
13require_once("GPBMetadata/Conformance.php");
Paul Yang39756642017-02-01 12:47:58 -080014require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
15
Feng Xiao6bbe1972018-08-08 17:00:41 -070016use \Conformance\TestCategory;
Paul Yang39756642017-02-01 12:47:58 -080017use \Conformance\WireFormat;
18
Jack Wakefield174c82d2017-09-10 23:17:50 +010019if (!ini_get("date.timezone")) {
20 ini_set("date.timezone", "UTC");
21}
22
Paul Yang39756642017-02-01 12:47:58 -080023$test_count = 0;
24
25function doTest($request)
26{
Yilun Chong3adb0542017-06-30 17:22:32 -070027 $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3();
Paul Yang39756642017-02-01 12:47:58 -080028 $response = new \Conformance\ConformanceResponse();
29 if ($request->getPayload() == "protobuf_payload") {
Yilun Chong3adb0542017-06-30 17:22:32 -070030 if ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
Yilun Chong18a0c2c2017-06-27 18:24:15 -070031 try {
Paul Yangdd8d5f52017-03-08 14:31:34 -080032 $test_message->mergeFromString($request->getProtobufPayload());
Yilun Chong18a0c2c2017-06-27 18:24:15 -070033 } catch (Exception $e) {
Paul Yangcba04b12017-02-08 10:27:54 -080034 $response->setParseError($e->getMessage());
35 return $response;
Yilun Chong18a0c2c2017-06-27 18:24:15 -070036 }
Yilun Chonga7d5be62017-06-29 15:04:50 -070037 } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") {
Paul Yang23adfeb2017-10-26 14:41:43 -070038 $response->setSkipped("PHP doesn't support proto2");
39 return $response;
Yilun Chong18a0c2c2017-06-27 18:24:15 -070040 } else {
Paul Yang23adfeb2017-10-26 14:41:43 -070041 trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR);
Paul Yangcba04b12017-02-08 10:27:54 -080042 }
Paul Yang39756642017-02-01 12:47:58 -080043 } elseif ($request->getPayload() == "json_payload") {
Feng Xiao6bbe1972018-08-08 17:00:41 -070044 $ignore_json_unknown =
45 ($request->getTestCategory() ==
46 TestCategory::JSON_IGNORE_UNKNOWN_PARSING_TEST);
Paul Yangcba04b12017-02-08 10:27:54 -080047 try {
Paul Yang26eeec92018-07-09 14:29:23 -070048 $test_message->mergeFromJsonString($request->getJsonPayload(),
49 $ignore_json_unknown);
Paul Yangcba04b12017-02-08 10:27:54 -080050 } catch (Exception $e) {
51 $response->setParseError($e->getMessage());
52 return $response;
53 }
Paul Yang39756642017-02-01 12:47:58 -080054 } else {
55 trigger_error("Request didn't have payload.", E_USER_ERROR);
56 }
57
58 if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) {
59 trigger_error("Unspecified output format.", E_USER_ERROR);
60 } elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) {
Paul Yangdd8d5f52017-03-08 14:31:34 -080061 $response->setProtobufPayload($test_message->serializeToString());
Paul Yang39756642017-02-01 12:47:58 -080062 } elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) {
Paul Yangbcda9192017-11-03 12:30:09 -070063 try {
64 $response->setJsonPayload($test_message->serializeToJsonString());
65 } catch (Exception $e) {
66 $response->setSerializeError($e->getMessage());
67 return $response;
68 }
Paul Yang39756642017-02-01 12:47:58 -080069 }
70
71 return $response;
72}
73
74function doTestIO()
75{
76 $length_bytes = fread(STDIN, 4);
77 if (strlen($length_bytes) == 0) {
78 return false; # EOF
79 } elseif (strlen($length_bytes) != 4) {
Paul Yangecca6ea2017-06-30 12:14:09 -070080 fwrite(STDERR, "I/O error\n");
81 return false;
Paul Yang39756642017-02-01 12:47:58 -080082 }
83
84 $length = unpack("V", $length_bytes)[1];
85 $serialized_request = fread(STDIN, $length);
86 if (strlen($serialized_request) != $length) {
87 trigger_error("I/O error", E_USER_ERROR);
88 }
89
90 $request = new \Conformance\ConformanceRequest();
Paul Yangdd8d5f52017-03-08 14:31:34 -080091 $request->mergeFromString($serialized_request);
Paul Yang39756642017-02-01 12:47:58 -080092
93 $response = doTest($request);
94
Paul Yangdd8d5f52017-03-08 14:31:34 -080095 $serialized_response = $response->serializeToString();
Paul Yang39756642017-02-01 12:47:58 -080096 fwrite(STDOUT, pack("V", strlen($serialized_response)));
97 fwrite(STDOUT, $serialized_response);
98
99 $GLOBALS['test_count'] += 1;
100
101 return true;
102}
103
104while(true){
105 if (!doTestIO()) {
106 fprintf(STDERR,
107 "conformance_php: received EOF from test runner " +
108 "after %d tests, exiting\n", $test_count);
109 exit;
110 }
111}