| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 string binary_protobuf; | 292 string binary_protobuf; |
| 293 Status status = | 293 Status status = |
| 294 JsonToBinaryString(type_resolver_.get(), type_url_, | 294 JsonToBinaryString(type_resolver_.get(), type_url_, |
| 295 response.json_payload(), &binary_protobuf); | 295 response.json_payload(), &binary_protobuf); |
| 296 if (!status.ok()) { | 296 if (!status.ok()) { |
| 297 ReportFailure(test_name, request, response, | 297 ReportFailure(test_name, request, response, |
| 298 "JSON output we received from test was unparseable."); | 298 "JSON output we received from test was unparseable."); |
| 299 return; | 299 return; |
| 300 } | 300 } |
| 301 | 301 |
| 302 GOOGLE_CHECK(test_message.ParseFromString(binary_protobuf)); | 302 if (!test_message.ParseFromString(binary_protobuf)) { |
| 303 ReportFailure(test_name, request, response, |
| 304 "INTERNAL ERROR: internal JSON->protobuf transcode " |
| 305 "yielded unparseable proto."); |
| 306 return; |
| 307 } |
| 308 |
| 303 break; | 309 break; |
| 304 } | 310 } |
| 305 | 311 |
| 306 case ConformanceResponse::kProtobufPayload: { | 312 case ConformanceResponse::kProtobufPayload: { |
| 307 if (requested_output != conformance::PROTOBUF) { | 313 if (requested_output != conformance::PROTOBUF) { |
| 308 ReportFailure( | 314 ReportFailure( |
| 309 test_name, request, response, | 315 test_name, request, response, |
| 310 "Test was asked for JSON output but provided protobuf instead."); | 316 "Test was asked for JSON output but provided protobuf instead."); |
| 311 return; | 317 return; |
| 312 } | 318 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 request.set_protobuf_payload(proto); | 355 request.set_protobuf_payload(proto); |
| 350 string effective_test_name = "ProtobufInput." + test_name; | 356 string effective_test_name = "ProtobufInput." + test_name; |
| 351 | 357 |
| 352 // We don't expect output, but if the program erroneously accepts the protobuf | 358 // We don't expect output, but if the program erroneously accepts the protobuf |
| 353 // we let it send its response as this. We must not leave it unspecified. | 359 // we let it send its response as this. We must not leave it unspecified. |
| 354 request.set_requested_output_format(conformance::PROTOBUF); | 360 request.set_requested_output_format(conformance::PROTOBUF); |
| 355 | 361 |
| 356 RunTest(effective_test_name, request, &response); | 362 RunTest(effective_test_name, request, &response); |
| 357 if (response.result_case() == ConformanceResponse::kParseError) { | 363 if (response.result_case() == ConformanceResponse::kParseError) { |
| 358 ReportSuccess(effective_test_name); | 364 ReportSuccess(effective_test_name); |
| 365 } else if (response.result_case() == ConformanceResponse::kSkipped) { |
| 366 ReportSkip(effective_test_name, request, response); |
| 359 } else { | 367 } else { |
| 360 ReportFailure(effective_test_name, request, response, | 368 ReportFailure(effective_test_name, request, response, |
| 361 "Should have failed to parse, but didn't."); | 369 "Should have failed to parse, but didn't."); |
| 362 } | 370 } |
| 363 } | 371 } |
| 364 | 372 |
| 365 // Expect that this protobuf will cause a parse error, even if it is followed | 373 // Expect that this protobuf will cause a parse error, even if it is followed |
| 366 // by valid protobuf data. We can try running this twice: once with this | 374 // by valid protobuf data. We can try running this twice: once with this |
| 367 // data verbatim and once with this data followed by some valid data. | 375 // data verbatim and once with this data followed by some valid data. |
| 368 // | 376 // |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 const Validator& validator) { | 409 const Validator& validator) { |
| 402 ConformanceRequest request; | 410 ConformanceRequest request; |
| 403 ConformanceResponse response; | 411 ConformanceResponse response; |
| 404 request.set_json_payload(input_json); | 412 request.set_json_payload(input_json); |
| 405 request.set_requested_output_format(conformance::JSON); | 413 request.set_requested_output_format(conformance::JSON); |
| 406 | 414 |
| 407 string effective_test_name = "JsonInput." + test_name + ".Validator"; | 415 string effective_test_name = "JsonInput." + test_name + ".Validator"; |
| 408 | 416 |
| 409 RunTest(effective_test_name, request, &response); | 417 RunTest(effective_test_name, request, &response); |
| 410 | 418 |
| 419 if (response.result_case() == ConformanceResponse::kSkipped) { |
| 420 ReportSkip(effective_test_name, request, response); |
| 421 return; |
| 422 } |
| 423 |
| 411 if (response.result_case() != ConformanceResponse::kJsonPayload) { | 424 if (response.result_case() != ConformanceResponse::kJsonPayload) { |
| 412 ReportFailure(effective_test_name, request, response, | 425 ReportFailure(effective_test_name, request, response, |
| 413 "Expected JSON payload but got type %d.", | 426 "Expected JSON payload but got type %d.", |
| 414 response.result_case()); | 427 response.result_case()); |
| 415 return; | 428 return; |
| 416 } | 429 } |
| 417 Json::Reader reader; | 430 Json::Reader reader; |
| 418 Json::Value value; | 431 Json::Value value; |
| 419 if (!reader.parse(response.json_payload(), value)) { | 432 if (!reader.parse(response.json_payload(), value)) { |
| 420 ReportFailure(effective_test_name, request, response, | 433 ReportFailure(effective_test_name, request, response, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 437 request.set_json_payload(input_json); | 450 request.set_json_payload(input_json); |
| 438 string effective_test_name = "JsonInput." + test_name; | 451 string effective_test_name = "JsonInput." + test_name; |
| 439 | 452 |
| 440 // We don't expect output, but if the program erroneously accepts the protobuf | 453 // We don't expect output, but if the program erroneously accepts the protobuf |
| 441 // we let it send its response as this. We must not leave it unspecified. | 454 // we let it send its response as this. We must not leave it unspecified. |
| 442 request.set_requested_output_format(conformance::JSON); | 455 request.set_requested_output_format(conformance::JSON); |
| 443 | 456 |
| 444 RunTest(effective_test_name, request, &response); | 457 RunTest(effective_test_name, request, &response); |
| 445 if (response.result_case() == ConformanceResponse::kParseError) { | 458 if (response.result_case() == ConformanceResponse::kParseError) { |
| 446 ReportSuccess(effective_test_name); | 459 ReportSuccess(effective_test_name); |
| 460 } else if (response.result_case() == ConformanceResponse::kSkipped) { |
| 461 ReportSkip(effective_test_name, request, response); |
| 447 } else { | 462 } else { |
| 448 ReportFailure(effective_test_name, request, response, | 463 ReportFailure(effective_test_name, request, response, |
| 449 "Should have failed to parse, but didn't."); | 464 "Should have failed to parse, but didn't."); |
| 450 } | 465 } |
| 451 } | 466 } |
| 452 | 467 |
| 453 void ConformanceTestSuite::ExpectSerializeFailureForJson( | 468 void ConformanceTestSuite::ExpectSerializeFailureForJson( |
| 454 const string& test_name, const string& text_format) { | 469 const string& test_name, const string& text_format) { |
| 455 TestAllTypes payload_message; | 470 TestAllTypes payload_message; |
| 456 GOOGLE_CHECK( | 471 GOOGLE_CHECK( |
| 457 TextFormat::ParseFromString(text_format, &payload_message)) | 472 TextFormat::ParseFromString(text_format, &payload_message)) |
| 458 << "Failed to parse: " << text_format; | 473 << "Failed to parse: " << text_format; |
| 459 | 474 |
| 460 ConformanceRequest request; | 475 ConformanceRequest request; |
| 461 ConformanceResponse response; | 476 ConformanceResponse response; |
| 462 request.set_protobuf_payload(payload_message.SerializeAsString()); | 477 request.set_protobuf_payload(payload_message.SerializeAsString()); |
| 463 string effective_test_name = test_name + ".JsonOutput"; | 478 string effective_test_name = test_name + ".JsonOutput"; |
| 464 request.set_requested_output_format(conformance::JSON); | 479 request.set_requested_output_format(conformance::JSON); |
| 465 | 480 |
| 466 RunTest(effective_test_name, request, &response); | 481 RunTest(effective_test_name, request, &response); |
| 467 if (response.result_case() == ConformanceResponse::kSerializeError) { | 482 if (response.result_case() == ConformanceResponse::kSerializeError) { |
| 468 ReportSuccess(effective_test_name); | 483 ReportSuccess(effective_test_name); |
| 484 } else if (response.result_case() == ConformanceResponse::kSkipped) { |
| 485 ReportSkip(effective_test_name, request, response); |
| 469 } else { | 486 } else { |
| 470 ReportFailure(effective_test_name, request, response, | 487 ReportFailure(effective_test_name, request, response, |
| 471 "Should have failed to serialize, but didn't."); | 488 "Should have failed to serialize, but didn't."); |
| 472 } | 489 } |
| 473 } | 490 } |
| 474 | 491 |
| 475 void ConformanceTestSuite::TestPrematureEOFForType(FieldDescriptor::Type type) { | 492 void ConformanceTestSuite::TestPrematureEOFForType(FieldDescriptor::Type type) { |
| 476 // Incomplete values for each wire type. | 493 // Incomplete values for each wire type. |
| 477 static const string incompletes[6] = { | 494 static const string incompletes[6] = { |
| 478 string("\x80"), // VARINT | 495 string("\x80"), // VARINT |
| (...skipping 1481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1960 ok = false; | 1977 ok = false; |
| 1961 } | 1978 } |
| 1962 | 1979 |
| 1963 // Sometimes the testee may be fixed before we update the failure list (e.g., | 1980 // Sometimes the testee may be fixed before we update the failure list (e.g., |
| 1964 // the testee is from a different component). We warn about this case but | 1981 // the testee is from a different component). We warn about this case but |
| 1965 // don't consider it an overall test failure. | 1982 // don't consider it an overall test failure. |
| 1966 CheckSetEmpty(unexpected_succeeding_tests_, | 1983 CheckSetEmpty(unexpected_succeeding_tests_, |
| 1967 "These tests succeeded, even though they were listed in " | 1984 "These tests succeeded, even though they were listed in " |
| 1968 "the failure list. Remove them from the failure list"); | 1985 "the failure list. Remove them from the failure list"); |
| 1969 | 1986 |
| 1970 CheckSetEmpty(skipped_, | |
| 1971 "These tests were skipped (probably because support for some " | |
| 1972 "features is not implemented)"); | |
| 1973 if (verbose_) { | 1987 if (verbose_) { |
| 1974 CheckSetEmpty(skipped_, | 1988 CheckSetEmpty(skipped_, |
| 1975 "These tests were skipped (probably because support for some " | 1989 "These tests were skipped (probably because support for some " |
| 1976 "features is not implemented)"); | 1990 "features is not implemented)"); |
| 1977 } | 1991 } |
| 1978 | 1992 |
| 1979 StringAppendF(&output_, | 1993 StringAppendF(&output_, |
| 1980 "CONFORMANCE SUITE %s: %d successes, %d skipped, " | 1994 "CONFORMANCE SUITE %s: %d successes, %d skipped, " |
| 1981 "%d expected failures, %d unexpected failures.\n", | 1995 "%d expected failures, %d unexpected failures.\n", |
| 1982 ok ? "PASSED" : "FAILED", successes_, skipped_.size(), | 1996 ok ? "PASSED" : "FAILED", successes_, skipped_.size(), |
| 1983 expected_failures_, unexpected_failing_tests_.size()); | 1997 expected_failures_, unexpected_failing_tests_.size()); |
| 1984 StringAppendF(&output_, "\n"); | 1998 StringAppendF(&output_, "\n"); |
| 1985 | 1999 |
| 1986 output->assign(output_); | 2000 output->assign(output_); |
| 1987 | 2001 |
| 1988 return ok; | 2002 return ok; |
| 1989 } | 2003 } |
| 1990 | 2004 |
| 1991 } // namespace protobuf | 2005 } // namespace protobuf |
| 1992 } // namespace google | 2006 } // namespace google |
| OLD | NEW |