blob: c1bd9bedecdecbcbfca58fa0b47adeec70c452fd [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");
6require_once("Google/Protobuf/Any.php");
7require_once("Google/Protobuf/Duration.php");
8require_once("Google/Protobuf/FieldMask.php");
9require_once("Google/Protobuf/Struct.php");
10require_once("Google/Protobuf/Value.php");
11require_once("Google/Protobuf/ListValue.php");
12require_once("Google/Protobuf/NullValue.php");
13require_once("Google/Protobuf/Timestamp.php");
14require_once("Google/Protobuf/DoubleValue.php");
15require_once("Google/Protobuf/BytesValue.php");
16require_once("Google/Protobuf/FloatValue.php");
17require_once("Google/Protobuf/Int64Value.php");
18require_once("Google/Protobuf/UInt32Value.php");
19require_once("Google/Protobuf/BoolValue.php");
20require_once("Google/Protobuf/DoubleValue.php");
21require_once("Google/Protobuf/Int32Value.php");
22require_once("Google/Protobuf/StringValue.php");
23require_once("Google/Protobuf/UInt64Value.php");
24require_once("Protobuf_test_messages/Proto3/ForeignMessage.php");
25require_once("Protobuf_test_messages/Proto3/ForeignEnum.php");
Yilun Chong3adb0542017-06-30 17:22:32 -070026require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3.php");
27require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3_NestedMessage.php");
28require_once("Protobuf_test_messages/Proto3/TestAllTypesProto3_NestedEnum.php");
Paul Yang39756642017-02-01 12:47:58 -080029
30require_once("GPBMetadata/Conformance.php");
31require_once("GPBMetadata/Google/Protobuf/Any.php");
32require_once("GPBMetadata/Google/Protobuf/Duration.php");
33require_once("GPBMetadata/Google/Protobuf/FieldMask.php");
34require_once("GPBMetadata/Google/Protobuf/Struct.php");
35require_once("GPBMetadata/Google/Protobuf/Timestamp.php");
36require_once("GPBMetadata/Google/Protobuf/Wrappers.php");
37require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
38
39use \Conformance\WireFormat;
40
41$test_count = 0;
42
43function doTest($request)
44{
Yilun Chong3adb0542017-06-30 17:22:32 -070045 $test_message = new \Protobuf_test_messages\Proto3\TestAllTypesProto3();
Paul Yang39756642017-02-01 12:47:58 -080046 $response = new \Conformance\ConformanceResponse();
47 if ($request->getPayload() == "protobuf_payload") {
Yilun Chong3adb0542017-06-30 17:22:32 -070048 if ($request->getMessageType() == "protobuf_test_messages.proto3.TestAllTypesProto3") {
Yilun Chong18a0c2c2017-06-27 18:24:15 -070049 try {
Paul Yangdd8d5f52017-03-08 14:31:34 -080050 $test_message->mergeFromString($request->getProtobufPayload());
Yilun Chong18a0c2c2017-06-27 18:24:15 -070051 } catch (Exception $e) {
Paul Yangcba04b12017-02-08 10:27:54 -080052 $response->setParseError($e->getMessage());
53 return $response;
Yilun Chong18a0c2c2017-06-27 18:24:15 -070054 }
Yilun Chonga7d5be62017-06-29 15:04:50 -070055 } elseif ($request->getMessageType() == "protobuf_test_messages.proto2.TestAllTypesProto2") {
Yilun Chong18a0c2c2017-06-27 18:24:15 -070056 $response->setSkipped("PHP doesn't support proto2");
57 return $response;
58 } else {
59 trigger_error("Protobuf request doesn't have specific payload type", E_USER_ERROR);
Paul Yangcba04b12017-02-08 10:27:54 -080060 }
Paul Yang39756642017-02-01 12:47:58 -080061 } elseif ($request->getPayload() == "json_payload") {
Paul Yangcba04b12017-02-08 10:27:54 -080062 try {
63 $test_message->jsonDecode($request->getJsonPayload());
64 } catch (Exception $e) {
65 $response->setParseError($e->getMessage());
66 return $response;
67 }
Paul Yang39756642017-02-01 12:47:58 -080068 } else {
69 trigger_error("Request didn't have payload.", E_USER_ERROR);
70 }
71
72 if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) {
73 trigger_error("Unspecified output format.", E_USER_ERROR);
74 } elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) {
Paul Yangdd8d5f52017-03-08 14:31:34 -080075 $response->setProtobufPayload($test_message->serializeToString());
Paul Yang39756642017-02-01 12:47:58 -080076 } elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) {
Paul Yangcba04b12017-02-08 10:27:54 -080077 $response->setJsonPayload($test_message->jsonEncode());
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) {
89 trigger_error("I/O error", E_USER_ERROR);
90 }
91
92 $length = unpack("V", $length_bytes)[1];
93 $serialized_request = fread(STDIN, $length);
94 if (strlen($serialized_request) != $length) {
95 trigger_error("I/O error", E_USER_ERROR);
96 }
97
98 $request = new \Conformance\ConformanceRequest();
Paul Yangdd8d5f52017-03-08 14:31:34 -080099 $request->mergeFromString($serialized_request);
Paul Yang39756642017-02-01 12:47:58 -0800100
101 $response = doTest($request);
102
Paul Yangdd8d5f52017-03-08 14:31:34 -0800103 $serialized_response = $response->serializeToString();
Paul Yang39756642017-02-01 12:47:58 -0800104 fwrite(STDOUT, pack("V", strlen($serialized_response)));
105 fwrite(STDOUT, $serialized_response);
106
107 $GLOBALS['test_count'] += 1;
108
109 return true;
110}
111
112while(true){
113 if (!doTestIO()) {
114 fprintf(STDERR,
115 "conformance_php: received EOF from test runner " +
116 "after %d tests, exiting\n", $test_count);
117 exit;
118 }
119}