Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 1 | <?php |
| 2 | |
| 3 | require_once("Conformance/WireFormat.php"); |
| 4 | require_once("Conformance/ConformanceResponse.php"); |
| 5 | require_once("Conformance/ConformanceRequest.php"); |
Yilun Chong | 0adb74c | 2019-01-08 15:06:30 -0800 | [diff] [blame] | 6 | require_once("Conformance/FailureSet.php"); |
Paul Yang | cecba29 | 2018-12-14 16:05:03 -0800 | [diff] [blame] | 7 | require_once("Conformance/JspbEncodingConfig.php"); |
Feng Xiao | 6bbe197 | 2018-08-08 17:00:41 -0700 | [diff] [blame] | 8 | require_once("Conformance/TestCategory.php"); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 9 | require_once("Protobuf_test_messages/Proto3/ForeignMessage.php"); |
| 10 | require_once("Protobuf_test_messages/Proto3/ForeignEnum.php"); |
Yilun Chong | 3adb054 | 2017-06-30 17:22:32 -0700 | [diff] [blame] | 11 | require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php"); |
Hao Nguyen | e24d9a8 | 2018-12-19 15:48:57 -0800 | [diff] [blame] | 12 | require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php"); |
Paul Yang | 26eeec9 | 2018-07-09 14:29:23 -0700 | [diff] [blame] | 13 | require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php"); |
| 14 | require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php"); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 15 | |
| 16 | require_once("GPBMetadata/Conformance.php"); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 17 | require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php"); |
| 18 | |
Feng Xiao | 6bbe197 | 2018-08-08 17:00:41 -0700 | [diff] [blame] | 19 | use \Conformance\TestCategory; |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 20 | use \Conformance\WireFormat; |
| 21 | |
Jack Wakefield | 174c82d | 2017-09-10 23:17:50 +0100 | [diff] [blame] | 22 | if (!ini_get("date.timezone")) { |
| 23 | ini_set("date.timezone", "UTC"); |
| 24 | } |
| 25 | |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 26 | $test_count = 0; |
| 27 | |
| 28 | function doTest($request) |
| 29 | { |
Yilun Chong | 3adb054 | 2017-06-30 17:22:32 -0700 | [diff] [blame] | 30 | $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3(); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 31 | $response = new \Conformance\ConformanceResponse(); |
| 32 | if ($request->getPayload() == "protobuf_payload") { |
Yilun Chong | 0adb74c | 2019-01-08 15:06:30 -0800 | [diff] [blame] | 33 | if ($request->getMessageType() == "conformance.FailureSet") { |
| 34 | $response->setProtobufPayload(""); |
| 35 | return $response; |
| 36 | } elseif ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") { |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 37 | try { |
Paul Yang | dd8d5f5 | 2017-03-08 14:31:34 -0800 | [diff] [blame] | 38 | $test_message->mergeFromString($request->getProtobufPayload()); |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 39 | } catch (Exception $e) { |
Paul Yang | cba04b1 | 2017-02-08 10:27:54 -0800 | [diff] [blame] | 40 | $response->setParseError($e->getMessage()); |
| 41 | return $response; |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 42 | } |
Yilun Chong | a7d5be6 | 2017-06-29 15:04:50 -0700 | [diff] [blame] | 43 | } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") { |
Paul Yang | 23adfeb | 2017-10-26 14:41:43 -0700 | [diff] [blame] | 44 | $response->setSkipped("PHP doesn't support proto2"); |
| 45 | return $response; |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 46 | } else { |
Paul Yang | 23adfeb | 2017-10-26 14:41:43 -0700 | [diff] [blame] | 47 | trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR); |
Paul Yang | cba04b1 | 2017-02-08 10:27:54 -0800 | [diff] [blame] | 48 | } |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 49 | } elseif ($request->getPayload() == "json_payload") { |
Feng Xiao | 6bbe197 | 2018-08-08 17:00:41 -0700 | [diff] [blame] | 50 | $ignore_json_unknown = |
| 51 | ($request->getTestCategory() == |
| 52 | TestCategory::JSON_IGNORE_UNKNOWN_PARSING_TEST); |
Paul Yang | cba04b1 | 2017-02-08 10:27:54 -0800 | [diff] [blame] | 53 | try { |
Paul Yang | 26eeec9 | 2018-07-09 14:29:23 -0700 | [diff] [blame] | 54 | $test_message->mergeFromJsonString($request->getJsonPayload(), |
| 55 | $ignore_json_unknown); |
Paul Yang | cba04b1 | 2017-02-08 10:27:54 -0800 | [diff] [blame] | 56 | } catch (Exception $e) { |
| 57 | $response->setParseError($e->getMessage()); |
| 58 | return $response; |
| 59 | } |
Yilun Chong | 6d29c22 | 2019-02-26 13:46:30 -0800 | [diff] [blame] | 60 | } elseif ($request->getPayload() == "text_payload") { |
| 61 | $response->setSkipped("PHP doesn't support text format yet"); |
| 62 | return $response; |
| 63 | } else { |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 64 | 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 Yang | dd8d5f5 | 2017-03-08 14:31:34 -0800 | [diff] [blame] | 70 | $response->setProtobufPayload($test_message->serializeToString()); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 71 | } elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) { |
Paul Yang | bcda919 | 2017-11-03 12:30:09 -0700 | [diff] [blame] | 72 | try { |
| 73 | $response->setJsonPayload($test_message->serializeToJsonString()); |
| 74 | } catch (Exception $e) { |
| 75 | $response->setSerializeError($e->getMessage()); |
| 76 | return $response; |
| 77 | } |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 78 | } |
| 79 | |
| 80 | return $response; |
| 81 | } |
| 82 | |
| 83 | function 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 Yang | ecca6ea | 2017-06-30 12:14:09 -0700 | [diff] [blame] | 89 | fwrite(STDERR, "I/O error\n"); |
| 90 | return false; |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 91 | } |
| 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 Yang | dd8d5f5 | 2017-03-08 14:31:34 -0800 | [diff] [blame] | 100 | $request->mergeFromString($serialized_request); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 101 | |
| 102 | $response = doTest($request); |
| 103 | |
Paul Yang | dd8d5f5 | 2017-03-08 14:31:34 -0800 | [diff] [blame] | 104 | $serialized_response = $response->serializeToString(); |
Paul Yang | 3975664 | 2017-02-01 12:47:58 -0800 | [diff] [blame] | 105 | fwrite(STDOUT, pack("V", strlen($serialized_response))); |
| 106 | fwrite(STDOUT, $serialized_response); |
| 107 | |
| 108 | $GLOBALS['test_count'] += 1; |
| 109 | |
| 110 | return true; |
| 111 | } |
| 112 | |
| 113 | while(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 | } |