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