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