blob: fda4facc276059e08eaf7a79c0435388baf264bb [file] [log] [blame]
#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__