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