| #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__ |