xref: /aosp_15_r20/external/protobuf/conformance/conformance_php.php (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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