• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?php
2
3require_once('Conformance/WireFormat.php');
4require_once('Conformance/ConformanceResponse.php');
5require_once('Conformance/ConformanceRequest.php');
6require_once('Conformance/FailureSet.php');
7require_once('Conformance/JspbEncodingConfig.php');
8require_once('Conformance/TestCategory.php');
9require_once('Protobuf_test_messages/Proto3/ForeignMessage.php');
10require_once('Protobuf_test_messages/Proto3/ForeignEnum.php');
11require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3.php');
12require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3/AliasedEnum.php');
13require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedMessage.php');
14require_once('Protobuf_test_messages/Proto3/TestAllTypesProto3/NestedEnum.php');
15require_once('Protobuf_test_messages/Editions/Proto3/EnumOnlyProto3/PBBool.php');
16require_once('Protobuf_test_messages/Editions/Proto3/EnumOnlyProto3.php');
17require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3/NestedMessage.php');
18require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3/NestedEnum.php');
19require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3/AliasedEnum.php');
20require_once('Protobuf_test_messages/Editions/Proto3/TestAllTypesProto3.php');
21require_once('Protobuf_test_messages/Editions/Proto3/NullHypothesisProto3.php');
22require_once('Protobuf_test_messages/Editions/Proto3/ForeignEnum.php');
23require_once('Protobuf_test_messages/Editions/Proto3/ForeignMessage.php');
24require_once('GPBMetadata/Conformance.php');
25require_once('GPBMetadata/TestMessagesProto3.php');
26require_once('GPBMetadata/TestMessagesProto3Editions.php');
27
28use Conformance\ConformanceRequest;
29use Conformance\ConformanceResponse;
30use Conformance\TestCategory;
31use Conformance\WireFormat;
32use Protobuf_test_messages\Proto3\TestAllTypesProto3;
33use Protobuf_test_messages\Editions\Proto3\TestAllTypesProto3 as TestAllTypesProto3Editions;
34
35if (!ini_get('date.timezone')) {
36    ini_set('date.timezone', 'UTC');
37}
38
39$test_count = 0;
40
41function doTest($request)
42{
43    $response = new ConformanceResponse();
44
45    switch ($request->getPayload()) {
46        case 'protobuf_payload':
47            switch ($request->getMessageType()) {
48                case 'protobuf_test_messages.proto3.TestAllTypesProto3':
49                    $test_message = new TestAllTypesProto3();
50                    break;
51                case 'protobuf_test_messages.editions.proto3.TestAllTypesProto3':
52                    $test_message = new TestAllTypesProto3Editions();
53                    break;
54                case 'conformance.FailureSet':
55                    $response->setProtobufPayload('');
56                    return $response;
57                case 'protobuf_test_messages.proto2.TestAllTypesProto2':
58                case 'protobuf_test_messages.editions.proto2.TestAllTypesProto2':
59                    $response->setSkipped('PHP doesn\'t support proto2');
60                    return $response;
61                case 'protobuf_test_messages.editions.TestAllTypesEdition2023':
62                    $response->setSkipped('PHP doesn\'t support editions-specific features yet');
63                    return $response;
64                case '':
65                    trigger_error(
66                        'Protobuf request doesn\'t have specific payload type',
67                        E_USER_ERROR
68                    );
69                default:
70                    trigger_error(sprintf(
71                        'Protobuf request doesn\'t support %s message type',
72                        $request->getMessageType(),
73                    ), E_USER_ERROR);
74            }
75
76            try {
77                $test_message->mergeFromString($request->getProtobufPayload());
78            } catch (Exception $e) {
79                $response->setParseError($e->getMessage());
80                return $response;
81            }
82            break;
83
84        case 'json_payload':
85            switch ($request->getMessageType()) {
86                case 'protobuf_test_messages.editions.proto3.TestAllTypesProto3':
87                    $test_message = new TestAllTypesProto3Editions();
88                    break;
89                case 'protobuf_test_messages.editions.proto2.TestAllTypesProto2':
90                    $response->setSkipped('PHP doesn\'t support proto2');
91                    return $response;
92                default:
93                    $test_message = new TestAllTypesProto3();
94            }
95
96            $ignore_json_unknown =
97                ($request->getTestCategory() == TestCategory::JSON_IGNORE_UNKNOWN_PARSING_TEST);
98            try {
99                $test_message->mergeFromJsonString(
100                    $request->getJsonPayload(),
101                    $ignore_json_unknown
102                );
103            } catch (Exception $e) {
104                $response->setParseError($e->getMessage());
105                return $response;
106            }
107            break;
108
109        case 'text_payload':
110            $response->setSkipped('PHP doesn\'t support text format yet');
111            return $response;
112        default:
113            trigger_error('Request didn\'t have payload.', E_USER_ERROR);
114    }
115
116    switch ($request->getRequestedOutputFormat()) {
117        case WireFormat::TEXT_FORMAT:
118            $response->setSkipped('PHP doesn\'t support text format yet');
119            return $response;
120        case WireFormat::UNSPECIFIED:
121            trigger_error('Unspecified output format.', E_USER_ERROR);
122        case WireFormat::PROTOBUF:
123            $response->setProtobufPayload($test_message->serializeToString());
124            break;
125        case WireFormat::JSON:
126            try {
127                $response->setJsonPayload($test_message->serializeToJsonString());
128            } catch (Exception $e) {
129                $response->setSerializeError($e->getMessage());
130                return $response;
131            }
132    }
133
134    return $response;
135}
136
137function doTestIO()
138{
139    $length_bytes = fread(STDIN, 4);
140    if (strlen($length_bytes) == 0) {
141        return false;   # EOF
142    } elseif (strlen($length_bytes) != 4) {
143        fwrite(STDERR, "I/O error\n");
144        return false;
145    }
146
147    $length = unpack('V', $length_bytes)[1];
148    $serialized_request = fread(STDIN, $length);
149    if (strlen($serialized_request) != $length) {
150        trigger_error('I/O error', E_USER_ERROR);
151    }
152
153    $request = new ConformanceRequest();
154    $request->mergeFromString($serialized_request);
155
156    $response = doTest($request);
157
158    $serialized_response = $response->serializeToString();
159    fwrite(STDOUT, pack('V', strlen($serialized_response)));
160    fwrite(STDOUT, $serialized_response);
161
162    $GLOBALS['test_count'] += 1;
163
164    return true;
165}
166
167while(true){
168    if (!doTestIO()) {
169        fprintf(STDERR,
170            'conformance_php: received EOF from test runner ' .
171            "after %d tests, exiting\n", $test_count);
172        exit;
173    }
174}
175