| #include "conformance/test_manager.h" |
| |
| #include <initializer_list> |
| #include <string> |
| |
| #include "google/protobuf/testing/file.h" |
| #include "google/protobuf/testing/file.h" |
| #include "google/protobuf/testing/file.h" |
| #include <gmock/gmock.h> |
| #include "google/protobuf/testing/googletest.h" |
| #include <gtest/gtest.h> |
| #include "absl/log/absl_check.h" |
| #include "absl/status/status.h" |
| #include "absl/status/status_matchers.h" |
| #include "absl/strings/str_cat.h" |
| #include "absl/strings/string_view.h" |
| #include "absl/types/optional.h" |
| #include "conformance/testee.h" |
| |
| namespace google { |
| namespace protobuf { |
| namespace conformance { |
| namespace internal { |
| namespace { |
| |
| using ::absl_testing::IsOk; |
| using ::absl_testing::StatusIs; |
| using ::testing::AllOf; |
| using ::testing::ElementsAre; |
| using ::testing::FieldsAre; |
| using ::testing::HasSubstr; |
| using ::testing::IsEmpty; |
| using ::testing::Not; |
| using ::testing::Optional; |
| using ::testing::Pair; |
| using ::testing::SizeIs; |
| |
| class TestManagerTest : public ::testing::Test { |
| protected: |
| TestManagerTest() |
| : tmp_dir_(absl::StrCat(TestTempDir(), "/test_manager_test/")), |
| failure_list_path_(absl::StrCat( |
| tmp_dir_, |
| testing::UnitTest::GetInstance()->current_test_info()->name())) { |
| if (!File::Exists(tmp_dir_)) { |
| ABSL_CHECK_OK( |
| File::RecursivelyCreateDir(tmp_dir_, 0777)); |
| } |
| } |
| |
| struct Failure { |
| absl::string_view name; |
| absl::string_view message; |
| |
| Failure( // NOLINT(google-explicit-constructor) |
| absl::string_view name) |
| : name(name), message("") {} |
| Failure(absl::string_view name, absl::string_view message) |
| : name(name), message(message) {} |
| }; |
| |
| void CreateFailureList( |
| std::initializer_list<const Failure> expected_failures) { |
| std::string content; |
| for (auto failure : expected_failures) { |
| absl::StrAppend(&content, failure.name, " # ", failure.message, "\n"); |
| } |
| ABSL_CHECK_OK( |
| File::SetContents(failure_list_path_, content, true)); |
| } |
| |
| void CreateFailureList(absl::string_view content) { |
| ABSL_CHECK_OK( |
| File::SetContents(failure_list_path_, content, true)); |
| } |
| |
| absl::string_view failure_list() const { return failure_list_path_; } |
| |
| ~TestManagerTest() override { |
| File::DeleteRecursively(failure_list_path_, NULL, NULL); |
| } |
| |
| private: |
| std::string tmp_dir_; |
| std::string failure_list_path_; |
| std::string output_path_; |
| }; |
| |
| TEST_F(TestManagerTest, RequiresFinalize) { |
| EXPECT_DEATH({ TestManager manager; }, "Finalize"); |
| } |
| |
| TEST_F(TestManagerTest, ReportSuccess) { |
| CreateFailureList({}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportSuccess("foo"), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 1); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportSkipped) { |
| CreateFailureList({}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportSkip("foo", "reason"), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 1); |
| EXPECT_EQ(manager.listed_skips(), 0); |
| EXPECT_THAT(manager.ListedSkips(), IsEmpty()); |
| } |
| |
| TEST_F(TestManagerTest, ReportSkipMarksListedEntrySeenAndMatched) { |
| CreateFailureList({{"foo", "abc"}, {"bar.*", "abc"}, {"baz", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| // A listed skip is reported like an unexpected success, naming the entry. |
| EXPECT_THAT(manager.ReportSkip("foo", "not supported"), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| "test foo (matched to foo) is in the failure list but " |
| "was skipped by the testee: not supported. Remove its " |
| "match from the failure list.")); |
| EXPECT_THAT(manager.ReportSkip("bar.x", "no"), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| "test bar.x (matched to bar.*) is in the failure list " |
| "but was skipped by the testee: no. Remove its match " |
| "from the failure list.")); |
| // Reporting a test twice returns the error again but counts it once. |
| EXPECT_THAT(manager.ReportSkip("bar.x", "no"), Not(IsOk())); |
| |
| // A skip is only counted as a skip, but the entries it matched are neither |
| // unmatched nor unseen: whether the entry is still needed is unknown. |
| EXPECT_THAT(manager.UnmatchedExpectedFailures(), ElementsAre("baz")); |
| EXPECT_THAT(manager.Finalize(), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| HasSubstr("were not seen: baz"))); |
| EXPECT_EQ(manager.skipped(), 2); |
| EXPECT_EQ(manager.listed_skips(), 2); |
| EXPECT_THAT(manager.ListedSkips(), |
| ElementsAre(Pair("bar.x", "bar.*"), Pair("foo", "foo"))); |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_THAT(manager.UnexpectedFailures(), IsEmpty()); |
| EXPECT_THAT(manager.UnexpectedSuccesses(), IsEmpty()); |
| } |
| |
| TEST_F(TestManagerTest, ReportNotSelected) { |
| CreateFailureList({{"foo"}, {"bar.*"}, {"baz"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| manager.ReportNotSelected("foo"); |
| manager.ReportNotSelected("bar.x"); |
| manager.ReportNotSelected("unlisted"); |
| |
| // Only the matched entries stop being unmatched; nothing else changes. |
| EXPECT_THAT(manager.UnmatchedExpectedFailures(), ElementsAre("baz")); |
| EXPECT_THAT(manager.Finalize(), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| "The following expected failures were not seen: bar.*, " |
| "baz, foo")); |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| EXPECT_EQ(manager.tolerated_failures(), 0); |
| } |
| |
| TEST_F(TestManagerTest, WasReported) { |
| CreateFailureList({}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| EXPECT_FALSE(manager.WasReported("success")); |
| |
| EXPECT_THAT(manager.ReportSuccess("success"), IsOk()); |
| EXPECT_THAT(manager.ReportFailure("failure", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportSkip("skip", "reason"), IsOk()); |
| manager.ReportNotSelected("not_selected"); |
| |
| EXPECT_TRUE(manager.WasReported("success")); |
| EXPECT_TRUE(manager.WasReported("failure")); |
| EXPECT_TRUE(manager.WasReported("skip")); |
| EXPECT_TRUE(manager.WasReported("not_selected")); |
| EXPECT_FALSE(manager.WasReported("other")); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, ReportExpectedFailure) { |
| CreateFailureList({{"foo", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, "abc"), IsOk()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportDuplicates) { |
| CreateFailureList({{"foo", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| ASSERT_THAT(manager.ReportSuccess("bar"), IsOk()); |
| ASSERT_THAT(manager.ReportSuccess("bar"), IsOk()); |
| ASSERT_THAT(manager.ReportSkip("baz", "reason"), IsOk()); |
| ASSERT_THAT(manager.ReportSkip("baz", "reason"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc"), IsOk()); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 1); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 1); |
| } |
| |
| TEST_F(TestManagerTest, ReportExpectedFailureWildcard) { |
| CreateFailureList({{"foo.*.bar", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo.baz.bar", kP0, "abc"), IsOk()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportUnseenFailure) { |
| CreateFailureList({{"foo.bar"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT( |
| manager.Finalize(), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| AllOf(HasSubstr("were not seen"), HasSubstr("foo.bar")))); |
| |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportUnseenFailureUnrelatedSkip) { |
| CreateFailureList({{"foo.bar"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| // "foo" doesn't match the entry "foo.bar", so the entry stays unseen. |
| ASSERT_THAT(manager.ReportSkip("foo", "reason"), IsOk()); |
| |
| EXPECT_THAT( |
| manager.Finalize(), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| AllOf(HasSubstr("were not seen"), HasSubstr("foo.bar")))); |
| |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 1); |
| } |
| |
| TEST_F(TestManagerTest, ReportUnexpectedFailure) { |
| CreateFailureList({}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| ASSERT_THAT(manager.ReportFailure("foo_failing", kP0, ""), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| AllOf(HasSubstr("Unexpected failure"), |
| HasSubstr("foo_failing")))); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportUnexpectedFailureMismatchedName) { |
| CreateFailureList({{"foo"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| ASSERT_THAT(manager.ReportFailure("foo_failing", kP0, ""), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| AllOf(HasSubstr("Unexpected failure"), |
| HasSubstr("foo_failing")))); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, ""), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportUnexpectedFailureMismatchedMessage) { |
| CreateFailureList({{"foo.*.bar", "message"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| ASSERT_THAT(manager.ReportFailure("foo.a.bar", kP0, "abc"), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| AllOf(HasSubstr("Unexpected failure"), HasSubstr("foo"), |
| HasSubstr("message"), HasSubstr("abc")))); |
| EXPECT_THAT(manager.ReportFailure("foo.b.bar", kP0, "message"), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportFailureMatchesExpectedMessagePrefix) { |
| CreateFailureList({{"foo", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| // Like the legacy runner, the actual message only has to start with the |
| // expected one. |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, "abc: more details"), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportFailureRejectsExpectedMessageSuffix) { |
| CreateFailureList({{"foo", "abc: more details"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| // The expected message is longer than the actual one, so it's not a prefix. |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, "abc"), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| HasSubstr("Unexpected failure message"))); |
| |
| // Like any other message mismatch, the stale entry is still reported as |
| // unseen so that --fix replaces it. |
| EXPECT_THAT(manager.Finalize(), Not(IsOk())); |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| } |
| |
| TEST_F(TestManagerTest, ReportFailureEmptyExpectedMessageMatchesAnything) { |
| CreateFailureList({{"foo"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, "any message at all"), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| } |
| |
| TEST_F(TestManagerTest, ReportFailurePrefixMatchIgnoresNewlinesAndWhitespace) { |
| CreateFailureList({{"foo", "abc def"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, " abc def\nghi\n"), IsOk()); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| } |
| |
| TEST_F(TestManagerTest, PrefixMatchedFailureIsNotAnUnexpectedFailure) { |
| CreateFailureList({{"foo", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc: more details"), IsOk()); |
| |
| EXPECT_THAT(manager.UnexpectedFailures(), IsEmpty()); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, FinalizeReportsUnseenExpectedFailures) { |
| CreateFailureList({{"ccc"}, {"aaa"}, {"bbb.*.baz"}, {"ddd"}, {"eee"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| // Failures, unexpected successes and skips all count as "seen". |
| ASSERT_THAT(manager.ReportFailure("bbb.x.baz", kP0, ""), IsOk()); |
| ASSERT_THAT(manager.ReportSuccess("ccc"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportSkip("ddd", "reason"), Not(IsOk())); |
| // Tests that weren't selected to run do not. |
| manager.ReportNotSelected("eee"); |
| |
| EXPECT_THAT(manager.Finalize(), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| "The following expected failures were not seen: aaa, " |
| "eee")); |
| } |
| |
| TEST_F(TestManagerTest, UnmatchedExpectedFailures) { |
| CreateFailureList({{"ccc"}, {"aaa"}, {"bbb.*.baz"}, {"ddd"}, {"eee", "msg"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.UnmatchedExpectedFailures(), |
| ElementsAre("aaa", "bbb.*.baz", "ccc", "ddd", "eee")); |
| |
| // Any report whose name matches an entry counts, whatever the outcome. |
| ASSERT_THAT(manager.ReportFailure("bbb.x.baz", kP0, ""), IsOk()); |
| ASSERT_THAT(manager.ReportSuccess("ccc"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportSkip("ddd", "reason"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportFailure("eee", kP0, "other message"), Not(IsOk())); |
| // Reports that match no entry change nothing. |
| ASSERT_THAT(manager.ReportSuccess("aaa.child"), IsOk()); |
| ASSERT_THAT(manager.ReportSkip("zzz", "reason"), IsOk()); |
| |
| EXPECT_THAT(manager.UnmatchedExpectedFailures(), ElementsAre("aaa")); |
| // Message mismatches are still unseen, though. |
| EXPECT_THAT(manager.Finalize(), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| "The following expected failures were not seen: aaa, " |
| "eee")); |
| } |
| |
| TEST_F(TestManagerTest, UnmatchedExpectedFailuresEmpty) { |
| TestManager manager; |
| EXPECT_THAT(manager.UnmatchedExpectedFailures(), IsEmpty()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, UnexpectedFailures) { |
| CreateFailureList({{"foo.*.bar", "expected"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.UnexpectedFailures(), IsEmpty()); |
| |
| // Not in the failure list at all, in the list with another message, and the |
| // messages are formatted as SaveFailureList() would write them. |
| ASSERT_THAT(manager.ReportFailure("zzz", kP0, " new\nfailure "), |
| Not(IsOk())); |
| ASSERT_THAT(manager.ReportFailure("foo.a.bar", kP0, "other message"), |
| Not(IsOk())); |
| ASSERT_THAT(manager.ReportFailure("aaa", kP0, std::string(1000, 'x')), |
| Not(IsOk())); |
| // Expected failures, successes and skips are not reported. |
| ASSERT_THAT(manager.ReportFailure("foo.b.bar", kP0, "expected: more"), |
| IsOk()); |
| ASSERT_THAT(manager.ReportSuccess("bbb"), IsOk()); |
| ASSERT_THAT(manager.ReportSkip("ccc", "reason"), IsOk()); |
| |
| EXPECT_THAT( |
| manager.UnexpectedFailures(), |
| ElementsAre(FieldsAre("aaa", std::string(128, 'x'), absl::nullopt), |
| FieldsAre("foo.a.bar", "other message", absl::nullopt), |
| FieldsAre("zzz", "newfailure", absl::nullopt))); |
| EXPECT_EQ(manager.unexpected_failures(), 3); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, UnexpectedFailuresIncludeExceededWildcardMatches) { |
| CreateFailureList({{"foo.*.bar"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| for (int i = 0; i < 100; ++i) { |
| ASSERT_THAT(manager.ReportSuccess(absl::StrCat("foo.", i, ".bar")), |
| Not(IsOk())); |
| } |
| ASSERT_THAT(manager.ReportFailure("foo.baz.bar", kP0, "msg"), Not(IsOk())); |
| |
| EXPECT_THAT(manager.UnexpectedFailures(), |
| ElementsAre(FieldsAre("foo.baz.bar", "msg", absl::nullopt))); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_THAT(manager.UnexpectedSuccesses(), SizeIs(100)); |
| EXPECT_EQ(manager.unexpected_successes(), 100); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, UnexpectedFailuresIgnoreDuplicateReports) { |
| TestManager manager; |
| |
| // Only the first report of a test counts. |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "first"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "second"), Not(IsOk())); |
| |
| EXPECT_THAT(manager.UnexpectedFailures(), |
| ElementsAre(FieldsAre("foo", "first", absl::nullopt))); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, UnexpectedSuccesses) { |
| CreateFailureList({{"foo.*.bar", "wildcard message"}, {"zzz", " zzz msg "}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.UnexpectedSuccesses(), IsEmpty()); |
| |
| ASSERT_THAT(manager.ReportSuccess("zzz"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportSuccess("foo.b.bar"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportSuccess("foo.a.bar"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportSuccess("foo.a.bar"), Not(IsOk())); |
| // Expected successes are not reported. |
| ASSERT_THAT(manager.ReportSuccess("aaa"), IsOk()); |
| |
| // Sorted by test name; the message is the (normalized) one of the entry the |
| // test matched. |
| EXPECT_THAT( |
| manager.UnexpectedSuccesses(), |
| ElementsAre(FieldsAre("foo.a.bar", "wildcard message", |
| Optional(std::string("foo.*.bar"))), |
| FieldsAre("foo.b.bar", "wildcard message", |
| Optional(std::string("foo.*.bar"))), |
| FieldsAre("zzz", "zzz msg", Optional(std::string("zzz"))))); |
| EXPECT_EQ(manager.unexpected_successes(), 3); |
| EXPECT_THAT(manager.UnexpectedFailures(), IsEmpty()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, ReportUnexpectedFailureTooManyWildcardMatches) { |
| CreateFailureList({{"foo.*.bar"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| for (int i = 0; i < 100; ++i) { |
| EXPECT_THAT(manager.ReportSuccess(absl::StrCat("foo.", i, ".bar")), |
| StatusIs(absl::StatusCode::kFailedPrecondition)); |
| } |
| ASSERT_THAT(manager.ReportFailure("foo.baz.bar", kP0, ""), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| AllOf(HasSubstr("too many test names"), |
| HasSubstr("foo.baz.bar")))); |
| |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 0); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 100); |
| EXPECT_EQ(manager.skipped(), 0); |
| } |
| |
| TEST_F(TestManagerTest, LoadFailureListInvalidFile) { |
| TestManager manager; |
| EXPECT_THAT(manager.LoadFailureList(absl::StrCat(failure_list(), "/invalid")), |
| StatusIs(absl::StatusCode::kInternal, HasSubstr("/invalid"))); |
| manager.Finalize().IgnoreError(); |
| } |
| |
| TEST_F(TestManagerTest, LoadFailureListDuplicateFailure) { |
| CreateFailureList(R"( |
| foo # abc |
| foo # zyx |
| )"); |
| TestManager manager; |
| |
| EXPECT_THAT(manager.LoadFailureList(failure_list()), |
| StatusIs(absl::StatusCode::kAlreadyExists, |
| AllOf(HasSubstr("already exists"), HasSubstr("foo")))); |
| manager.Finalize().IgnoreError(); |
| } |
| |
| TEST_F(TestManagerTest, LoadFailureListOverlappingFailure) { |
| CreateFailureList(R"( |
| foo.*.bar # abc |
| foo.bar.* # zyx |
| )"); |
| TestManager manager; |
| |
| EXPECT_THAT(manager.LoadFailureList(failure_list()), |
| StatusIs(absl::StatusCode::kAlreadyExists, |
| AllOf(HasSubstr("foo.bar.*"), HasSubstr("foo.*.bar")))); |
| manager.Finalize().IgnoreError(); |
| } |
| |
| TEST_F(TestManagerTest, UnexpectedSuccessMessageNamesTheEntry) { |
| CreateFailureList({{"foo", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| // The message is the legacy runner's, including the matched entry. |
| EXPECT_THAT(manager.ReportSuccess("foo"), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| "test foo (matched to foo) is in the failure list, but " |
| "test succeeded. Remove its match from the failure " |
| "list.")); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.unexpected_successes(), 1); |
| } |
| |
| TEST_F(TestManagerTest, UnexpectedSuccessMessageNamesTheWildcardEntry) { |
| CreateFailureList({{"foo.*.bar", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportSuccess("foo.a.bar"), |
| StatusIs(absl::StatusCode::kFailedPrecondition, |
| HasSubstr("test foo.a.bar (matched to foo.*.bar) is in " |
| "the failure list"))); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, EveryPriorityIsEnforcedByDefault) { |
| TestManager manager; |
| EXPECT_THAT(manager.ReportFailure("p0", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportFailure("p1", kP1, "abc"), Not(IsOk())); |
| EXPECT_EQ(manager.unexpected_failures(), 2); |
| EXPECT_EQ(manager.tolerated_failures(), 0); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, EnforcementLevelZeroToleratesP1) { |
| // Only kP0 is enforced: an unlisted kP1 failure is tolerated. |
| TestManager manager; |
| manager.set_enforcement_level(kP0); |
| EXPECT_THAT(manager.ReportFailure("p0", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportFailure("p1", kP1, "abc"), IsOk()); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_EQ(manager.tolerated_failures(), 1); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, ToleratedFailure) { |
| CreateFailureList({{"listed", "abc"}}); |
| TestManager manager; |
| manager.set_enforcement_level(kP0); |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| ASSERT_THAT(manager.ReportFailure("foo", kP1, "abc"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("bar", kP1, "xyz"), IsOk()); |
| // Duplicates only count once. |
| ASSERT_THAT(manager.ReportFailure("foo", kP1, "abc"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("listed", kP0, "abc"), IsOk()); |
| |
| EXPECT_EQ(manager.tolerated_failures(), 2); |
| // A tolerated failure is neither a skip nor a failure of any kind, and it |
| // isn't written to the failure list. |
| EXPECT_EQ(manager.skipped(), 0); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 0); |
| EXPECT_EQ(manager.expected_successes(), 0); |
| EXPECT_EQ(manager.unexpected_successes(), 0); |
| EXPECT_THAT(manager.UnexpectedFailures(), IsEmpty()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, "listed # abc\n"); |
| } |
| |
| TEST_F(TestManagerTest, ToleratedFailureIsCountedOnceAcrossKinds) { |
| TestManager manager; |
| manager.set_enforcement_level(kP0); |
| // The same test name can only be counted under one outcome. |
| ASSERT_THAT(manager.ReportSuccess("foo"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("foo", kP1, "abc"), IsOk()); |
| |
| EXPECT_EQ(manager.expected_successes(), 1); |
| EXPECT_EQ(manager.tolerated_failures(), 0); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, ListedFailureIsCheckedWhateverItsPriority) { |
| // A listed test is never tolerated, so that the failure list can't go stale |
| // unnoticed. |
| CreateFailureList({{"foo", "abc"}, {"bar", "abc"}}); |
| TestManager manager; |
| manager.set_enforcement_level(kP0); |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo", kP1, "abc"), IsOk()); |
| EXPECT_THAT(manager.ReportFailure("bar", kP1, "xyz"), Not(IsOk())); |
| |
| EXPECT_EQ(manager.expected_failures(), 1); |
| EXPECT_EQ(manager.unexpected_failures(), 1); |
| EXPECT_EQ(manager.tolerated_failures(), 0); |
| manager.Finalize().IgnoreError(); |
| } |
| |
| TEST_F(TestManagerTest, LoadFailureListInvalidWildcard) { |
| CreateFailureList({{"foo.b*r", "abc"}}); |
| TestManager manager; |
| EXPECT_THAT(manager.LoadFailureList(failure_list()), |
| StatusIs(absl::StatusCode::kInvalidArgument)); |
| manager.Finalize().IgnoreError(); |
| } |
| |
| TEST_F(TestManagerTest, LoadFailureListTruncatesMessage) { |
| // Like a reported message, so that the two still compare equal. |
| std::string message(1000, 'b'); |
| CreateFailureList({{"foo", message}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, message), IsOk()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 1); |
| } |
| |
| TEST_F(TestManagerTest, LoadSecondFailureList) { |
| CreateFailureList({{"foo", "abc"}}); |
| const std::string second = absl::StrCat(failure_list(), ".2"); |
| ABSL_CHECK_OK(File::SetContents(second, "bar # zyx\n", true)); |
| const std::string third = absl::StrCat(failure_list(), ".3"); |
| ABSL_CHECK_OK(File::SetContents(third, "foo # zyx\n", true)); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.LoadFailureList(second), IsOk()); |
| |
| // Entries must not repeat across files either. |
| EXPECT_THAT(manager.LoadFailureList(third), |
| StatusIs(absl::StatusCode::kAlreadyExists)); |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, "abc"), IsOk()); |
| EXPECT_THAT(manager.ReportFailure("bar", kP0, "zyx"), IsOk()); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| EXPECT_EQ(manager.expected_failures(), 2); |
| } |
| |
| TEST_F(TestManagerTest, FailureListMatchesWholeNameComponents) { |
| CreateFailureList({{"foo", "abc"}, {"bar.*.baz", "abc"}, {"qux", "abc"}}); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| |
| EXPECT_THAT(manager.ReportFailure("foo", kP0, "abc"), IsOk()); |
| EXPECT_THAT(manager.ReportFailure("qux", kP0, "abc"), IsOk()); |
| EXPECT_THAT(manager.ReportFailure("bar.a.baz", kP0, "abc"), IsOk()); |
| EXPECT_THAT(manager.ReportFailure("bar.b.baz", kP0, "abc"), IsOk()); |
| // Neither a prefix nor an extension of an entry matches it, and a wildcard |
| // stands for exactly one component. |
| EXPECT_THAT(manager.ReportFailure("foo.bar", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportFailure("bar", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportFailure("bar.a", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportFailure("bar.a.baz.qux", kP0, "abc"), Not(IsOk())); |
| EXPECT_THAT(manager.ReportFailure("other", kP0, "abc"), Not(IsOk())); |
| |
| EXPECT_EQ(manager.expected_failures(), 4); |
| EXPECT_EQ(manager.unexpected_failures(), 5); |
| EXPECT_THAT(manager.Finalize(), IsOk()); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListNoop) { |
| CreateFailureList(R"( |
| foo # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc"), IsOk()); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| foo # abc |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListNoopWildcard) { |
| CreateFailureList(R"( |
| foo.*.bar # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("foo.a.bar", kP0, "abc"), IsOk()); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| foo.*.bar # abc |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListKeepsPrefixMatchedEntryVerbatim) { |
| CreateFailureList(R"( |
| foo # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| // The actual message is longer than the entry's, which is only a prefix. |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc: more details"), IsOk()); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| foo # abc |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListRemoveNewPassing) { |
| CreateFailureList(R"( |
| foo # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportSuccess("foo"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListRemovePartialPassingWildcard) { |
| // This is a weird case where the wildcard no longer fully matches the |
| // failure. Users would have to updated the failure list twice to get the |
| // failure list to be correct. |
| CreateFailureList(R"( |
| foo.*.bar # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportSuccess("foo.a.bar"), Not(IsOk())); |
| ASSERT_THAT(manager.ReportFailure("foo.b.bar", kP0, "abc"), IsOk()); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListKeepsSkippedEntry) { |
| // A skipped test says nothing about whether its entry is still needed, so |
| // the entry is kept verbatim (whether the skip itself is acceptable is |
| // decided, and reported, by the caller). |
| CreateFailureList(R"( |
| foo # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportSkip("foo", "reason"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| foo # abc |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListUnwritablePath) { |
| TestManager manager; |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| // A directory can't be opened for writing. |
| const std::string directory = absl::StrCat(failure_list(), ".dir"); |
| ASSERT_THAT(File::RecursivelyCreateDir(directory, 0777), |
| IsOk()); |
| EXPECT_THAT(manager.SaveFailureList(directory), |
| StatusIs(absl::StatusCode::kInternal, HasSubstr(directory))); |
| // Neither can a file in a directory that doesn't exist. |
| const std::string missing_directory = |
| absl::StrCat(failure_list(), ".missing/list.txt"); |
| EXPECT_THAT( |
| manager.SaveFailureList(missing_directory), |
| StatusIs(absl::StatusCode::kInternal, HasSubstr(missing_directory))); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListWriteFailure) { |
| TestManager manager; |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| // /dev/full opens fine but every write to it fails with ENOSPC, which is |
| // the only way to reach the write-failure path without a filesystem mock. |
| // It is a Linux device. |
| #ifdef __linux__ |
| EXPECT_THAT(manager.SaveFailureList("/dev/full"), |
| StatusIs(absl::StatusCode::kInternal, |
| HasSubstr("Failed to write failure list file"))); |
| #else |
| GTEST_SKIP() << "/dev/full is Linux-only"; |
| #endif |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListChangeFailureMessage) { |
| CreateFailureList(R"( |
| foo # abc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "zyx"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), Not(IsOk())); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| foo # zyx |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListAddNewFailure) { |
| TestManager manager; |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, "abc"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"(foo # abc |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListAddNormalizedMessage) { |
| TestManager manager; |
| std::string message = absl::StrCat("aa\n", std::string(1000, 'b')); |
| std::string normalized_message = absl::StrCat("aa", std::string(126, 'b')); |
| ASSERT_THAT(manager.ReportFailure("foo", kP0, message), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, absl::StrCat("foo # ", normalized_message, "\n")); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListInsertAlphabetically) { |
| CreateFailureList(R"( |
| # This is a comment. |
| aaa # aaa |
| # This is another comment. |
| bbb # bbb |
| |
| ccc # ccc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("aaa", kP0, "aaa"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("bbb", kP0, "bbb"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("ccc", kP0, "ccc"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("abc", kP0, "abc"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| # This is a comment. |
| aaa # aaa |
| # This is another comment. |
| abc # abc |
| bbb # bbb |
| |
| ccc # ccc |
| )"); |
| } |
| |
| TEST_F(TestManagerTest, SaveFailureListInsertAligned) { |
| CreateFailureList(R"( |
| # This is a comment. |
| aa # aaa |
| # This is another comment. |
| bbbb #bbb |
| |
| cc # ccc |
| )"); |
| TestManager manager; |
| ASSERT_THAT(manager.LoadFailureList(failure_list()), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("aa", kP0, "aaa"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("bbbb", kP0, " bbb "), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("cc", kP0, "ccc"), IsOk()); |
| ASSERT_THAT(manager.ReportFailure("abcdef", kP0, "abc"), Not(IsOk())); |
| ASSERT_THAT(manager.Finalize(), IsOk()); |
| |
| EXPECT_THAT(manager.SaveFailureList(absl::StrCat(failure_list(), ".new")), |
| IsOk()); |
| |
| std::string content; |
| ASSERT_THAT(File::GetContents(absl::StrCat(failure_list(), ".new"), &content, |
| true), |
| IsOk()); |
| EXPECT_EQ(content, R"( |
| # This is a comment. |
| aa # aaa |
| # This is another comment. |
| abcdef # abc |
| bbbb # bbb |
| |
| cc # ccc |
| )"); |
| } |
| |
| } // namespace |
| } // namespace internal |
| } // namespace conformance |
| } // namespace protobuf |
| } // namespace google |