Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 1 | // Protocol Buffers - Google's data interchange format |
| 2 | // Copyright 2008 Google Inc. All rights reserved. |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 3 | // |
Joshua Haberman | 8a4bfd6 | 2023-09-08 19:26:10 -0700 | [diff] [blame] | 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file or at |
| 6 | // https://developers.google.com/open-source/licenses/bsd |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 7 | |
| 8 | #include <errno.h> |
| 9 | #include <stdarg.h> |
| 10 | #include <unistd.h> |
| 11 | |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 12 | #include <memory> |
| 13 | #include <string> |
| 14 | #include <utility> |
| 15 | |
Mike Kruskal | 1595417 | 2022-09-09 10:42:19 -0700 | [diff] [blame] | 16 | #include "google/protobuf/util/json_util.h" |
| 17 | #include "google/protobuf/util/type_resolver_util.h" |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 18 | #include "absl/log/absl_check.h" |
| 19 | #include "absl/log/absl_log.h" |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 20 | #include "absl/status/status.h" |
| 21 | #include "absl/status/statusor.h" |
Mike Kruskal | ed5c57a | 2022-08-10 22:51:29 -0700 | [diff] [blame] | 22 | #include "conformance/conformance.pb.h" |
Mike Kruskal | ca4b063 | 2022-08-11 20:55:01 -0700 | [diff] [blame] | 23 | #include "conformance/conformance.pb.h" |
Mike Kruskal | a2ba8bc | 2023-10-18 13:12:07 -0700 | [diff] [blame] | 24 | #include "google/protobuf/editions/golden/test_messages_proto2_editions.pb.h" |
| 25 | #include "google/protobuf/editions/golden/test_messages_proto3_editions.pb.h" |
Jonathan Albrecht | 5e03386 | 2023-08-04 17:44:30 -0700 | [diff] [blame] | 26 | #include "google/protobuf/endian.h" |
Protobuf Team Bot | 0287cf4 | 2023-08-22 07:26:58 -0700 | [diff] [blame] | 27 | #include "google/protobuf/message.h" |
Mike Kruskal | 1595417 | 2022-09-09 10:42:19 -0700 | [diff] [blame] | 28 | #include "google/protobuf/test_messages_proto2.pb.h" |
| 29 | #include "google/protobuf/test_messages_proto3.pb.h" |
| 30 | #include "google/protobuf/test_messages_proto3.pb.h" |
Protobuf Team Bot | 0287cf4 | 2023-08-22 07:26:58 -0700 | [diff] [blame] | 31 | #include "google/protobuf/text_format.h" |
Mike Kruskal | 1595417 | 2022-09-09 10:42:19 -0700 | [diff] [blame] | 32 | #include "google/protobuf/util/type_resolver.h" |
| 33 | #include "google/protobuf/stubs/status_macros.h" |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 34 | |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 35 | // Must be included last. |
Mike Kruskal | 1595417 | 2022-09-09 10:42:19 -0700 | [diff] [blame] | 36 | #include "google/protobuf/port_def.inc" |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 37 | |
Rafi Kamal | 58d4420 | 2019-11-11 17:06:56 -0800 | [diff] [blame] | 38 | namespace google { |
| 39 | namespace protobuf { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 40 | namespace { |
| 41 | using ::conformance::ConformanceRequest; |
| 42 | using ::conformance::ConformanceResponse; |
| 43 | using ::google::protobuf::util::BinaryToJsonString; |
| 44 | using ::google::protobuf::util::JsonParseOptions; |
| 45 | using ::google::protobuf::util::JsonToBinaryString; |
| 46 | using ::google::protobuf::util::NewTypeResolverForDescriptorPool; |
| 47 | using ::google::protobuf::util::TypeResolver; |
| 48 | using ::protobuf_test_messages::proto2::TestAllTypesProto2; |
| 49 | using ::protobuf_test_messages::proto3::TestAllTypesProto3; |
Mike Kruskal | a2ba8bc | 2023-10-18 13:12:07 -0700 | [diff] [blame] | 50 | using TestAllTypesProto2Editions = |
| 51 | ::protobuf_test_messages::editions::proto2::TestAllTypesProto2; |
| 52 | using TestAllTypesProto3Editions = |
| 53 | ::protobuf_test_messages::editions::proto3::TestAllTypesProto3; |
Rafi Kamal | 58d4420 | 2019-11-11 17:06:56 -0800 | [diff] [blame] | 54 | |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 55 | absl::Status ReadFd(int fd, char* buf, size_t len) { |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 56 | while (len > 0) { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 57 | ssize_t bytes_read = read(fd, buf, len); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 58 | |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 59 | if (bytes_read == 0) { |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 60 | return absl::DataLossError("unexpected EOF"); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 61 | } |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 62 | |
| 63 | if (bytes_read < 0) { |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 64 | return absl::ErrnoToStatus(errno, "error reading from test runner"); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 65 | } |
| 66 | |
| 67 | len -= bytes_read; |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 68 | buf += bytes_read; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 69 | } |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 70 | return absl::OkStatus(); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 71 | } |
| 72 | |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 73 | absl::Status WriteFd(int fd, const void* buf, size_t len) { |
Mike Kruskal | d220b43 | 2022-08-29 18:19:38 -0400 | [diff] [blame] | 74 | if (static_cast<size_t>(write(fd, buf, len)) != len) { |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 75 | return absl::ErrnoToStatus(errno, "error reading to test runner"); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 76 | } |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 77 | return absl::OkStatus(); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 78 | } |
| 79 | |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 80 | class Harness { |
| 81 | public: |
| 82 | Harness() { |
| 83 | google::protobuf::LinkMessageReflection<TestAllTypesProto2>(); |
| 84 | google::protobuf::LinkMessageReflection<TestAllTypesProto3>(); |
Mike Kruskal | a2ba8bc | 2023-10-18 13:12:07 -0700 | [diff] [blame] | 85 | google::protobuf::LinkMessageReflection<TestAllTypesProto2Editions>(); |
| 86 | google::protobuf::LinkMessageReflection<TestAllTypesProto3Editions>(); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 87 | |
| 88 | resolver_.reset(NewTypeResolverForDescriptorPool( |
| 89 | "type.googleapis.com", DescriptorPool::generated_pool())); |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 90 | type_url_ = absl::StrCat("type.googleapis.com/", |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 91 | TestAllTypesProto3::GetDescriptor()->full_name()); |
Yilun Chong | 020a24d | 2017-06-29 11:33:22 -0700 | [diff] [blame] | 92 | } |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 93 | |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 94 | absl::StatusOr<ConformanceResponse> RunTest( |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 95 | const ConformanceRequest& request); |
| 96 | |
| 97 | // Returns Ok(true) if we're done processing requests. |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 98 | absl::StatusOr<bool> ServeConformanceRequest(); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 99 | |
| 100 | private: |
| 101 | bool verbose_ = false; |
| 102 | std::unique_ptr<TypeResolver> resolver_; |
| 103 | std::string type_url_; |
| 104 | }; |
| 105 | |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 106 | absl::StatusOr<ConformanceResponse> Harness::RunTest( |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 107 | const ConformanceRequest& request) { |
| 108 | const Descriptor* descriptor = |
| 109 | DescriptorPool::generated_pool()->FindMessageTypeByName( |
| 110 | request.message_type()); |
| 111 | if (descriptor == nullptr) { |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 112 | return absl::NotFoundError( |
| 113 | absl::StrCat("No such message type: ", request.message_type())); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 114 | } |
| 115 | |
| 116 | std::unique_ptr<Message> test_message( |
| 117 | MessageFactory::generated_factory()->GetPrototype(descriptor)->New()); |
| 118 | ConformanceResponse response; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 119 | |
| 120 | switch (request.payload_case()) { |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 121 | case ConformanceRequest::kProtobufPayload: { |
Yilun Chong | 020a24d | 2017-06-29 11:33:22 -0700 | [diff] [blame] | 122 | if (!test_message->ParseFromString(request.protobuf_payload())) { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 123 | response.set_parse_error("parse error (no more details available)"); |
| 124 | return response; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 125 | } |
| 126 | break; |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 127 | } |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 128 | |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 129 | case ConformanceRequest::kJsonPayload: { |
Feng Xiao | 6bbe197 | 2018-08-08 17:00:41 -0700 | [diff] [blame] | 130 | JsonParseOptions options; |
| 131 | options.ignore_unknown_fields = |
| 132 | (request.test_category() == |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 133 | conformance::JSON_IGNORE_UNKNOWN_PARSING_TEST); |
| 134 | |
| 135 | std::string proto_binary; |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 136 | absl::Status status = |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 137 | JsonToBinaryString(resolver_.get(), type_url_, request.json_payload(), |
Joshua Haberman | 5c028d6 | 2020-11-20 10:44:58 -0800 | [diff] [blame] | 138 | &proto_binary, options); |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 139 | if (!status.ok()) { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 140 | response.set_parse_error( |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 141 | absl::StrCat("parse error: ", status.message())); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 142 | return response; |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 143 | } |
| 144 | |
Yilun Chong | 020a24d | 2017-06-29 11:33:22 -0700 | [diff] [blame] | 145 | if (!test_message->ParseFromString(proto_binary)) { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 146 | response.set_runtime_error( |
| 147 | "parsing JSON generated invalid proto output"); |
| 148 | return response; |
Feng Xiao | e841bac | 2015-12-11 17:09:20 -0800 | [diff] [blame] | 149 | } |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 150 | |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 151 | break; |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 152 | } |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 153 | |
Yilun Chong | cb95a7f | 2019-01-11 11:40:52 -0800 | [diff] [blame] | 154 | case ConformanceRequest::kTextPayload: { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 155 | if (!TextFormat::ParseFromString(request.text_payload(), |
| 156 | test_message.get())) { |
| 157 | response.set_parse_error("parse error (no more details available)"); |
| 158 | return response; |
Yilun Chong | cb95a7f | 2019-01-11 11:40:52 -0800 | [diff] [blame] | 159 | } |
| 160 | break; |
| 161 | } |
| 162 | |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 163 | case ConformanceRequest::PAYLOAD_NOT_SET: |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 164 | return absl::InvalidArgumentError("request didn't have payload"); |
Paul Yang | cecba29 | 2018-12-14 16:05:03 -0800 | [diff] [blame] | 165 | |
| 166 | default: |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 167 | return absl::InvalidArgumentError( |
| 168 | absl::StrCat("unknown payload type", request.payload_case())); |
Yilun Chong | 0adb74c | 2019-01-08 15:06:30 -0800 | [diff] [blame] | 169 | } |
| 170 | |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 171 | switch (request.requested_output_format()) { |
| 172 | case conformance::UNSPECIFIED: |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 173 | return absl::InvalidArgumentError("unspecified output format"); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 174 | |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 175 | case conformance::PROTOBUF: { |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 176 | ABSL_CHECK( |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 177 | test_message->SerializeToString(response.mutable_protobuf_payload())); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 178 | break; |
Yilun Chong | 18a0c2c | 2017-06-27 18:24:15 -0700 | [diff] [blame] | 179 | } |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 180 | |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 181 | case conformance::JSON: { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 182 | std::string proto_binary; |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 183 | ABSL_CHECK(test_message->SerializeToString(&proto_binary)); |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 184 | absl::Status status = |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 185 | BinaryToJsonString(resolver_.get(), type_url_, proto_binary, |
| 186 | response.mutable_json_payload()); |
Feng Xiao | e841bac | 2015-12-11 17:09:20 -0800 | [diff] [blame] | 187 | if (!status.ok()) { |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 188 | response.set_serialize_error(absl::StrCat( |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 189 | "failed to serialize JSON output: ", status.message())); |
Feng Xiao | e841bac | 2015-12-11 17:09:20 -0800 | [diff] [blame] | 190 | } |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 191 | break; |
Josh Haberman | b0500b3 | 2015-07-10 16:36:59 -0700 | [diff] [blame] | 192 | } |
Feng Xiao | e841bac | 2015-12-11 17:09:20 -0800 | [diff] [blame] | 193 | |
Yilun Chong | cb95a7f | 2019-01-11 11:40:52 -0800 | [diff] [blame] | 194 | case conformance::TEXT_FORMAT: { |
Hao Nguyen | 2f864fd | 2019-03-20 11:45:01 -0700 | [diff] [blame] | 195 | TextFormat::Printer printer; |
| 196 | printer.SetHideUnknownFields(!request.print_unknown_fields()); |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 197 | ABSL_CHECK(printer.PrintToString(*test_message, |
Mike Kruskal | a02c902 | 2022-12-08 12:15:31 -0800 | [diff] [blame] | 198 | response.mutable_text_payload())); |
Yilun Chong | cb95a7f | 2019-01-11 11:40:52 -0800 | [diff] [blame] | 199 | break; |
| 200 | } |
| 201 | |
Feng Xiao | e841bac | 2015-12-11 17:09:20 -0800 | [diff] [blame] | 202 | default: |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 203 | return absl::InvalidArgumentError(absl::StrCat( |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 204 | "unknown output format", request.requested_output_format())); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 205 | } |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 206 | |
| 207 | return response; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 208 | } |
| 209 | |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 210 | absl::StatusOr<bool> Harness::ServeConformanceRequest() { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 211 | uint32_t in_len; |
| 212 | if (!ReadFd(STDIN_FILENO, reinterpret_cast<char*>(&in_len), sizeof(in_len)) |
| 213 | .ok()) { |
| 214 | // EOF means we're done. |
| 215 | return true; |
| 216 | } |
Jonathan Albrecht | 5e03386 | 2023-08-04 17:44:30 -0700 | [diff] [blame] | 217 | in_len = internal::little_endian::ToHost(in_len); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 218 | |
| 219 | std::string serialized_input; |
| 220 | serialized_input.resize(in_len); |
Zouhair Mahieddine | d8861a7 | 2022-07-11 18:32:33 +0200 | [diff] [blame] | 221 | RETURN_IF_ERROR(ReadFd(STDIN_FILENO, &serialized_input[0], in_len)); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 222 | |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 223 | ConformanceRequest request; |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 224 | ABSL_CHECK(request.ParseFromString(serialized_input)); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 225 | |
Mike Kruskal | a3c8e2d | 2022-08-24 10:46:33 -0700 | [diff] [blame] | 226 | absl::StatusOr<ConformanceResponse> response = RunTest(request); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 227 | RETURN_IF_ERROR(response.status()); |
| 228 | |
| 229 | std::string serialized_output; |
| 230 | response->SerializeToString(&serialized_output); |
| 231 | |
Jonathan Albrecht | 5e03386 | 2023-08-04 17:44:30 -0700 | [diff] [blame] | 232 | uint32_t out_len = internal::little_endian::FromHost( |
| 233 | static_cast<uint32_t>(serialized_output.size())); |
| 234 | |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 235 | RETURN_IF_ERROR(WriteFd(STDOUT_FILENO, &out_len, sizeof(out_len))); |
Jonathan Albrecht | 5e03386 | 2023-08-04 17:44:30 -0700 | [diff] [blame] | 236 | RETURN_IF_ERROR(WriteFd(STDOUT_FILENO, serialized_output.data(), |
| 237 | serialized_output.size())); |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 238 | |
| 239 | if (verbose_) { |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 240 | ABSL_LOG(INFO) << "conformance-cpp: request=" << request.ShortDebugString() |
Mike Kruskal | a02c902 | 2022-12-08 12:15:31 -0800 | [diff] [blame] | 241 | << ", response=" << response->ShortDebugString(); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 242 | } |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 243 | return false; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 244 | } |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 245 | } // namespace |
Rafi Kamal | 58d4420 | 2019-11-11 17:06:56 -0800 | [diff] [blame] | 246 | } // namespace protobuf |
| 247 | } // namespace google |
| 248 | |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 249 | int main() { |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 250 | google::protobuf::Harness harness; |
| 251 | int total_runs = 0; |
| 252 | while (true) { |
| 253 | auto is_done = harness.ServeConformanceRequest(); |
| 254 | if (!is_done.ok()) { |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 255 | ABSL_LOG(FATAL) << is_done.status(); |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 256 | } |
Jorg Brown | a3e1de0 | 2022-06-17 04:13:20 -0700 | [diff] [blame] | 257 | if (*is_done) { |
| 258 | break; |
| 259 | } |
| 260 | total_runs++; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 261 | } |
Mike Kruskal | a9f1ea6 | 2023-01-24 21:49:33 -0800 | [diff] [blame] | 262 | ABSL_LOG(INFO) << "conformance-cpp: received EOF from test runner after " |
Mike Kruskal | a02c902 | 2022-12-08 12:15:31 -0800 | [diff] [blame] | 263 | << total_runs << " tests"; |
Josh Haberman | 35a1cc7 | 2015-04-01 17:23:48 -0700 | [diff] [blame] | 264 | } |