32 """A conformance test implementation for the Python protobuf library.
34 See conformance.proto for more information.
45 import conformance_pb2
47 sys.stdout = os.fdopen(sys.stdout.fileno(),
'wb', 0)
48 sys.stdin = os.fdopen(sys.stdin.fileno(),
'rb', 0)
53 class ProtocolError(Exception):
57 response = conformance_pb2.ConformanceResponse()
59 if request.message_type ==
"conformance.FailureSet":
60 failure_set = conformance_pb2.FailureSet()
64 hack_proto = test_messages_proto2_pb2.TestAllTypesProto2()
67 hack_proto.ParseFromString(b
"\322\002\001")
68 except message.DecodeError
as e:
75 "Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE",
76 "Required.Proto3.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE",
77 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.BOOL",
78 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.DOUBLE",
79 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.ENUM",
80 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.FIXED32",
81 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.FIXED64",
82 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.FLOAT",
83 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.INT32",
84 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.INT64",
85 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.SFIXED32",
86 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.SFIXED64",
87 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.SINT32",
88 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.SINT64",
89 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.UINT32",
90 "Required.Proto3.ProtobufInput.PrematureEofInPackedField.UINT64",
91 "Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE",
92 "Required.Proto2.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE",
93 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.BOOL",
94 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.DOUBLE",
95 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.ENUM",
96 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.FIXED32",
97 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.FIXED64",
98 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.FLOAT",
99 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.INT32",
100 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.INT64",
101 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.SFIXED32",
102 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.SFIXED64",
103 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT32",
104 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.SINT64",
105 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT32",
106 "Required.Proto2.ProtobufInput.PrematureEofInPackedField.UINT64",
109 failure_set.failure.append(x)
110 response.protobuf_payload = failure_set.SerializeToString()
113 isProto3 = (request.message_type ==
"protobuf_test_messages.proto3.TestAllTypesProto3")
114 isJson = (request.WhichOneof(
'payload') ==
'json_payload')
115 isProto2 = (request.message_type ==
"protobuf_test_messages.proto2.TestAllTypesProto2")
117 if (
not isProto3)
and (
not isJson)
and (
not isProto2):
118 raise ProtocolError(
"Protobuf request doesn't have specific payload type")
120 test_message = test_messages_proto2_pb2.TestAllTypesProto2()
if isProto2
else \
121 test_messages_proto3_pb2.TestAllTypesProto3()
124 if request.WhichOneof(
'payload') ==
'protobuf_payload':
126 test_message.ParseFromString(request.protobuf_payload)
127 except message.DecodeError
as e:
128 response.parse_error =
str(e)
131 elif request.WhichOneof(
'payload') ==
'json_payload':
133 ignore_unknown_fields = \
134 request.test_category == \
135 conformance_pb2.JSON_IGNORE_UNKNOWN_PARSING_TEST
136 json_format.Parse(request.json_payload, test_message,
137 ignore_unknown_fields)
138 except Exception
as e:
139 response.parse_error =
str(e)
142 elif request.WhichOneof(
'payload') ==
'text_payload':
144 text_format.Parse(request.text_payload, test_message)
145 except Exception
as e:
146 response.parse_error =
str(e)
150 raise ProtocolError(
"Request didn't have payload.")
152 if request.requested_output_format == conformance_pb2.UNSPECIFIED:
153 raise ProtocolError(
"Unspecified output format")
155 elif request.requested_output_format == conformance_pb2.PROTOBUF:
156 response.protobuf_payload = test_message.SerializeToString()
158 elif request.requested_output_format == conformance_pb2.JSON:
160 response.json_payload = json_format.MessageToJson(test_message)
161 except Exception
as e:
162 response.serialize_error =
str(e)
165 elif request.requested_output_format == conformance_pb2.TEXT_FORMAT:
166 response.text_payload = text_format.MessageToString(
167 test_message, print_unknown_fields=request.print_unknown_fields)
169 except Exception
as e:
170 response.runtime_error =
str(e)
175 length_bytes = sys.stdin.read(4)
176 if len(length_bytes) == 0:
178 elif len(length_bytes) != 4:
179 raise IOError(
"I/O error")
184 length = struct.unpack(
"<I", length_bytes)[0]
185 serialized_request = sys.stdin.read(length)
186 if len(serialized_request) != length:
187 raise IOError(
"I/O error")
189 request = conformance_pb2.ConformanceRequest()
190 request.ParseFromString(serialized_request)
194 serialized_response = response.SerializeToString()
195 sys.stdout.write(struct.pack(
"<I",
len(serialized_response)))
196 sys.stdout.write(serialized_response)
200 sys.stderr.write(
"conformance_python: request=%s, response=%s\n" % (
201 request.ShortDebugString().
c_str(),
202 response.ShortDebugString().
c_str()))
211 sys.stderr.write(
"conformance_python: received EOF from test runner " +
212 "after %s tests, exiting\n" % (test_count))