1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef TESTING_PERF_LUCI_TEST_RESULT_H_ 6*6777b538SAndroid Build Coastguard Worker #define TESTING_PERF_LUCI_TEST_RESULT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <optional> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker #include <vector> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/containers/flat_map.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace perf_test { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker // Generates TestResultEntry dict in LUCI Test Results format. 19*6777b538SAndroid Build Coastguard Worker // See: go/luci-test-results-design 20*6777b538SAndroid Build Coastguard Worker // //infra/go/src/go.chromium.org/luci/results/proto/v1/test_result.proto 21*6777b538SAndroid Build Coastguard Worker class LuciTestResult { 22*6777b538SAndroid Build Coastguard Worker public: 23*6777b538SAndroid Build Coastguard Worker // Represents a test result status. 24*6777b538SAndroid Build Coastguard Worker enum class Status { 25*6777b538SAndroid Build Coastguard Worker // The test status is unspecified. 26*6777b538SAndroid Build Coastguard Worker kUnspecified, 27*6777b538SAndroid Build Coastguard Worker // The test has passed. 28*6777b538SAndroid Build Coastguard Worker kPass, 29*6777b538SAndroid Build Coastguard Worker // The test has failed. 30*6777b538SAndroid Build Coastguard Worker kFail, 31*6777b538SAndroid Build Coastguard Worker // The test did not complete because it crashed. 32*6777b538SAndroid Build Coastguard Worker kCrash, 33*6777b538SAndroid Build Coastguard Worker // The test did not complete because it was interrupted, e.g. timeout. 34*6777b538SAndroid Build Coastguard Worker kAbort, 35*6777b538SAndroid Build Coastguard Worker // The test or test framework decided not to run the test, or the test was 36*6777b538SAndroid Build Coastguard Worker // not run due to previous tests timing out. 37*6777b538SAndroid Build Coastguard Worker kSkip 38*6777b538SAndroid Build Coastguard Worker }; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Represents an artifact. 41*6777b538SAndroid Build Coastguard Worker struct Artifact { 42*6777b538SAndroid Build Coastguard Worker Artifact(); 43*6777b538SAndroid Build Coastguard Worker Artifact(const Artifact& other); 44*6777b538SAndroid Build Coastguard Worker Artifact(const base::FilePath file_path, const std::string& content_type); 45*6777b538SAndroid Build Coastguard Worker Artifact(const std::string& contents, const std::string& content_type); 46*6777b538SAndroid Build Coastguard Worker ~Artifact(); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Use only one of the two fields below. 49*6777b538SAndroid Build Coastguard Worker // Absolute path on the same machine running the test. 50*6777b538SAndroid Build Coastguard Worker std::optional<base::FilePath> file_path; 51*6777b538SAndroid Build Coastguard Worker // The data of the artifact. 52*6777b538SAndroid Build Coastguard Worker std::optional<std::string> contents; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker std::string content_type; 55*6777b538SAndroid Build Coastguard Worker }; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Represents a tag. 58*6777b538SAndroid Build Coastguard Worker struct Tag { 59*6777b538SAndroid Build Coastguard Worker std::string key; 60*6777b538SAndroid Build Coastguard Worker std::string value; 61*6777b538SAndroid Build Coastguard Worker }; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker LuciTestResult(); 64*6777b538SAndroid Build Coastguard Worker LuciTestResult(const LuciTestResult& other); 65*6777b538SAndroid Build Coastguard Worker LuciTestResult(LuciTestResult&& other); 66*6777b538SAndroid Build Coastguard Worker ~LuciTestResult(); 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker // Helper to create a LuciTestResult and fill in info for the current gtest. 69*6777b538SAndroid Build Coastguard Worker static LuciTestResult CreateForGTest(); 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker // Adds a variant key-value pair to |extra_variant_pairs_|. See VariantDef in 72*6777b538SAndroid Build Coastguard Worker // //infra/go/src/go.chromium.org/luci/resultdb/proto/v1/common.proto 73*6777b538SAndroid Build Coastguard Worker // for more details. 74*6777b538SAndroid Build Coastguard Worker void AddVariant(const std::string& key, const std::string& value); 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker // Adds an output artifact. 77*6777b538SAndroid Build Coastguard Worker void AddOutputArtifactFile(const std::string& artifact_name, 78*6777b538SAndroid Build Coastguard Worker const base::FilePath& file_path, 79*6777b538SAndroid Build Coastguard Worker const std::string& content_type); 80*6777b538SAndroid Build Coastguard Worker void AddOutputArtifactContents(const std::string& artifact_name, 81*6777b538SAndroid Build Coastguard Worker const std::string& contents, 82*6777b538SAndroid Build Coastguard Worker const std::string& content_type); 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker // Adds a tag. 85*6777b538SAndroid Build Coastguard Worker void AddTag(const std::string& key, const std::string& value); 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker // Writes to |result_file|. 88*6777b538SAndroid Build Coastguard Worker void WriteToFile(const base::FilePath& result_file) const; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker // Getters and setters. test_path()91*6777b538SAndroid Build Coastguard Worker const std::string& test_path() const { return test_path_; } set_test_path(const std::string & test_path)92*6777b538SAndroid Build Coastguard Worker void set_test_path(const std::string& test_path) { test_path_ = test_path; } 93*6777b538SAndroid Build Coastguard Worker extra_variant_pairs()94*6777b538SAndroid Build Coastguard Worker const base::flat_map<std::string, std::string>& extra_variant_pairs() const { 95*6777b538SAndroid Build Coastguard Worker return extra_variant_pairs_; 96*6777b538SAndroid Build Coastguard Worker } 97*6777b538SAndroid Build Coastguard Worker status()98*6777b538SAndroid Build Coastguard Worker Status status() const { return status_; } set_status(Status status)99*6777b538SAndroid Build Coastguard Worker void set_status(Status status) { status_ = status; } 100*6777b538SAndroid Build Coastguard Worker is_expected()101*6777b538SAndroid Build Coastguard Worker bool is_expected() const { return is_expected_; } set_is_expected(bool is_expcted)102*6777b538SAndroid Build Coastguard Worker void set_is_expected(bool is_expcted) { is_expected_ = is_expcted; } 103*6777b538SAndroid Build Coastguard Worker start_time()104*6777b538SAndroid Build Coastguard Worker base::Time start_time() const { return start_time_; } set_start_time(base::Time start_time)105*6777b538SAndroid Build Coastguard Worker void set_start_time(base::Time start_time) { start_time_ = start_time; } 106*6777b538SAndroid Build Coastguard Worker duration()107*6777b538SAndroid Build Coastguard Worker base::TimeDelta duration() const { return duration_; } set_duration(base::TimeDelta duration)108*6777b538SAndroid Build Coastguard Worker void set_duration(base::TimeDelta duration) { duration_ = duration; } 109*6777b538SAndroid Build Coastguard Worker output_artifacts()110*6777b538SAndroid Build Coastguard Worker const base::flat_map<std::string, Artifact>& output_artifacts() const { 111*6777b538SAndroid Build Coastguard Worker return output_artifacts_; 112*6777b538SAndroid Build Coastguard Worker } 113*6777b538SAndroid Build Coastguard Worker tags()114*6777b538SAndroid Build Coastguard Worker const std::vector<Tag>& tags() const { return tags_; } 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker private: 117*6777b538SAndroid Build Coastguard Worker // For gtest, |test_path_| is <test_suite_name>.<test_case_name>, without 118*6777b538SAndroid Build Coastguard Worker // the param annotations. E.g. "InstantiationName/SuiteName.CaseName/0" 119*6777b538SAndroid Build Coastguard Worker // will have "/0" stripped and be just "InstantiationName/SuiteName.CaseName". 120*6777b538SAndroid Build Coastguard Worker std::string test_path_; 121*6777b538SAndroid Build Coastguard Worker // For gtest, |extra_variant_pairs_| holds info about the type param and 122*6777b538SAndroid Build Coastguard Worker // value param for typed/parameterized tests. 123*6777b538SAndroid Build Coastguard Worker base::flat_map<std::string, std::string> extra_variant_pairs_; 124*6777b538SAndroid Build Coastguard Worker // Status of the test result. 125*6777b538SAndroid Build Coastguard Worker Status status_ = Status::kUnspecified; 126*6777b538SAndroid Build Coastguard Worker // Whether |status| is expected. 127*6777b538SAndroid Build Coastguard Worker bool is_expected_ = false; 128*6777b538SAndroid Build Coastguard Worker // Test start time. 129*6777b538SAndroid Build Coastguard Worker base::Time start_time_; 130*6777b538SAndroid Build Coastguard Worker // Duration of the test. 131*6777b538SAndroid Build Coastguard Worker base::TimeDelta duration_; 132*6777b538SAndroid Build Coastguard Worker // Artifacts of the test run. 133*6777b538SAndroid Build Coastguard Worker base::flat_map<std::string, Artifact> output_artifacts_; 134*6777b538SAndroid Build Coastguard Worker // Tags of the test run. 135*6777b538SAndroid Build Coastguard Worker std::vector<Tag> tags_; 136*6777b538SAndroid Build Coastguard Worker }; 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker } // namespace perf_test 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker #endif // TESTING_PERF_LUCI_TEST_RESULT_H_ 141