|  | #ifndef GOOGLE_PROTOBUF_CONFORMANCE_TEST_MANAGER_H__ | 
|  | #define GOOGLE_PROTOBUF_CONFORMANCE_TEST_MANAGER_H__ | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #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<std::string, std::string> expected_failure_messages_; | 
|  |  | 
|  | absl::flat_hash_set<std::string> unseen_expected_failures_; | 
|  | absl::flat_hash_set<std::string> seen_unexpected_successes_; | 
|  | absl::flat_hash_map<std::string, int> 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<std::string> seen_tests_; | 
|  |  | 
|  | std::vector<std::string> failure_list_lines_; | 
|  | absl::btree_map<std::string, std::string> 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__ |