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