36 #include "conformance.pb.h"
47 using conformance::ConformanceRequest;
48 using conformance::ConformanceResponse;
49 using conformance::WireFormat;
62 conformance::WireFormat input_format,
63 conformance::WireFormat output_format,
64 conformance::TestCategory test_category,
65 const Message& prototype_message,
66 const string& test_name,
const string&
input)
68 input_format_(input_format),
69 output_format_(output_format),
70 prototype_message_(prototype_message),
71 prototype_message_for_compare_(prototype_message.
New()),
72 test_name_(test_name) {
73 switch (input_format) {
74 case conformance::PROTOBUF: {
79 case conformance::JSON: {
84 case conformance::JSPB: {
89 case conformance::TEXT_FORMAT: {
98 request_.set_test_category(test_category);
101 request_.set_requested_output_format(output_format);
106 return prototype_message_for_compare_->
New();
112 prototype_message_.GetDescriptor()->file()->syntax() ==
115 return StrCat(ConformanceLevelToString(level_),
".",
117 InputFormatString(input_format_),
118 ".", test_name_,
".",
119 OutputFormatString(output_format_));
136 case conformance::PROTOBUF:
137 return "ProtobufInput";
138 case conformance::JSON:
140 case conformance::TEXT_FORMAT:
141 return "TextFormatInput";
151 case conformance::PROTOBUF:
152 return "ProtobufOutput";
153 case conformance::JSON:
155 case conformance::TEXT_FORMAT:
156 return "TextFormatOutput";
166 "ERROR: test %s is in the failure list, but test succeeded. "
167 "Remove it from the failure list.\n",
176 const ConformanceRequest& request,
177 const ConformanceResponse& response,
178 const char*
fmt, ...) {
194 request.ShortDebugString().c_str(),
195 response.ShortDebugString().c_str());
199 const ConformanceRequest& request,
200 const ConformanceResponse& response) {
203 test_name.c_str(), request.ShortDebugString().c_str(),
204 response.ShortDebugString().c_str());
211 const string& equivalent_text_format) {
215 <<
"Failed to parse data for test case: " << setting.
GetTestName()
216 <<
", data: " << equivalent_text_format;
223 const string& equivalent_wire_format) {
224 const ConformanceRequest& request = setting.
GetRequest();
232 const string& equivalent_wire_format,
233 const ConformanceResponse& response,
234 bool need_report_success) {
236 const ConformanceRequest& request = setting.
GetRequest();
243 <<
"Failed to parse wire data for test case: " << test_name;
246 case ConformanceResponse::RESULT_NOT_SET:
248 "Response didn't have any field in the Response.");
251 case ConformanceResponse::kParseError:
252 case ConformanceResponse::kRuntimeError:
253 case ConformanceResponse::kSerializeError:
255 "Failed to parse input or produce output.");
258 case ConformanceResponse::kSkipped:
274 check = differencer.
Compare(*reference_message, *test_message);
276 if (need_report_success) {
281 "Output was not equivalent to reference message: %s.",
282 differences.c_str());
287 const ConformanceRequest& request,
288 ConformanceResponse* response) {
289 if (
test_names_.insert(test_name).second ==
false) {
293 string serialized_request;
294 string serialized_response;
295 request.SerializeToString(&serialized_request);
297 runner_->
RunTest(test_name, serialized_request, &serialized_response);
299 if (!
response->ParseFromString(serialized_response)) {
301 response->set_runtime_error(
"response proto could not be parsed.");
306 "conformance test: name=%s, request=%s, response=%s\n",
308 request.ShortDebugString().c_str(),
309 response->ShortDebugString().c_str());
314 const std::set<string>& set_to_check,
317 if (set_to_check.empty()) {
322 for (std::set<string>::const_iterator iter = set_to_check.begin();
323 iter != set_to_check.end(); ++iter) {
328 if (!write_to_file.empty()) {
329 std::ofstream os(write_to_file);
331 for (std::set<string>::const_iterator iter = set_to_check.begin();
332 iter != set_to_check.end(); ++iter) {
337 write_to_file.c_str());
347 switch (wire_format) {
348 case conformance::PROTOBUF:
350 case conformance::JSON:
352 case conformance::JSPB:
354 case conformance::TEXT_FORMAT:
355 return "TEXT_FORMAT";
356 case conformance::UNSPECIFIED:
357 return "UNSPECIFIED";
371 conformance::FailureSet* failure_list) {
380 output_ =
"\nCONFORMANCE TEST BEGIN ====================================\n\n";
384 for (
const string& failure : failure_list->failure()) {
391 "These tests were listed in the failure list, but they "
392 "don't exist. Remove them from the failure list by "
395 " --remove nonexistent_tests.txt")) {
399 "These tests failed. If they can't be fixed right now, "
400 "you can add them to the failure list so the overall "
401 "suite can succeed. Add them to the failure list by "
404 " --add failing_tests.txt")) {
408 "These tests succeeded, even though they were listed in "
409 "the failure list. Remove them from the failure list "
412 " --remove succeeding_tests.txt")) {
418 "These tests were skipped (probably because support for some "
419 "features is not implemented)");
423 "CONFORMANCE SUITE %s: %d successes, %d skipped, "
424 "%d expected failures, %d unexpected failures.\n",