#ifndef GOOGLE_PROTOBUF_CONFORMANCE_TEST_MANAGER_H__ #define GOOGLE_PROTOBUF_CONFORMANCE_TEST_MANAGER_H__ #include #include #include "absl/container/btree_map.h" #include "absl/container/flat_hash_map.h" #include "absl/container/flat_hash_set.h" #include "absl/status/status.h" #include "absl/strings/string_view.h" #include "conformance/conformance.pb.h" #include "failure_list_trie_node.h" namespace google { namespace protobuf { namespace conformance { namespace internal { // This class is used to manage the expected failures and actual results of // a test suite. Our matchers should all report their results into here so that // results get properly tracked. The results get reported to googletest via // custom properties and the populate the new failure list when the --fix flag // is provided. class TestManager { public: TestManager() : expected_failure_list_("root") {} ~TestManager(); // Loads a list of expected failures from disk. absl::Status LoadFailureList(absl::string_view filename); // Saves an updated list of failures to disk based on the reported results. absl::Status SaveFailureList(absl::string_view filename) const; // Reports a successful test run. This will return an error if the test was // expected to fail. absl::Status ReportSuccess(absl::string_view test_name); // Reports a failed test run along with the failure message. This will return // an error if the test wasn't expected to fail, or if it was expected to fail // with a different message. absl::Status ReportFailure(absl::string_view test_name, absl::string_view failure_message); // Reports a test that was skipped. absl::Status ReportSkip(absl::string_view test_name); // Runs sanity checks over the failure list to make sure everything we // expected to run was reported. Must be called before destruction. absl::Status Finalize(); // The number of tests that were reported skipped. int skipped() const { return skipped_; } // The number of tests that were expected to fail and did. int expected_failures() const { return expected_failures_; } // The number of tests that were expected to fail and didn't. int unexpected_failures() const { return unexpected_failures_; } // The number of tests that were expected to succeed and did. int expected_successes() const { return expected_successes_; } // The number of tests that were expected to succeed and didn't. int unexpected_successes() const { return unexpected_successes_; } private: FailureListTrieNode expected_failure_list_; absl::flat_hash_map expected_failure_messages_; absl::flat_hash_set unseen_expected_failures_; absl::flat_hash_set seen_unexpected_successes_; absl::flat_hash_map number_of_matches_; // We have to track which tests we've already seen, because gtest will call // the matcher twice on failure. absl::flat_hash_set seen_tests_; std::vector failure_list_lines_; absl::btree_map new_failures_; int skipped_ = 0; int expected_failures_ = 0; int unexpected_failures_ = 0; int expected_successes_ = 0; int unexpected_successes_ = 0; bool finalized_ = false; }; } // namespace internal } // namespace conformance } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_CONFORMANCE_TEST_MANAGER_H__