blob: 1552c1a2500a50131528976889300ec6a62e87ea [file] [log] [blame]
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +09001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/test/gtest_util.h"
6
avif09d5392015-12-24 12:28:02 +09007#include <stddef.h>
8
dcheng7219b062016-06-11 12:41:48 +09009#include <memory>
10
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090011#include "base/files/file_path.h"
12#include "base/json/json_file_value_serializer.h"
stgao05f1ea32016-11-01 06:38:44 +090013#include "base/strings/string_util.h"
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090014#include "base/values.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17namespace base {
18
phajdan.jr700cfba2015-07-29 18:49:54 +090019TestIdentifier::TestIdentifier() {
20}
21
vmpstrc8651bf2016-02-25 09:50:31 +090022TestIdentifier::TestIdentifier(const TestIdentifier& other) = default;
23
Paweł Hajdan1509f2c2015-01-23 22:33:49 +090024std::string FormatFullTestName(const std::string& test_case_name,
25 const std::string& test_name) {
26 return test_case_name + "." + test_name;
27}
28
stgao05f1ea32016-11-01 06:38:44 +090029std::string TestNameWithoutDisabledPrefix(const std::string& full_test_name) {
30 std::string test_name_no_disabled(full_test_name);
31 ReplaceSubstringsAfterOffset(&test_name_no_disabled, 0, "DISABLED_", "");
32 return test_name_no_disabled;
33}
34
phajdan.jr700cfba2015-07-29 18:49:54 +090035std::vector<TestIdentifier> GetCompiledInTests() {
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090036 testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
37
phajdan.jr700cfba2015-07-29 18:49:54 +090038 std::vector<TestIdentifier> tests;
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090039 for (int i = 0; i < unit_test->total_test_case_count(); ++i) {
40 const testing::TestCase* test_case = unit_test->GetTestCase(i);
41 for (int j = 0; j < test_case->total_test_count(); ++j) {
42 const testing::TestInfo* test_info = test_case->GetTestInfo(j);
phajdan.jr700cfba2015-07-29 18:49:54 +090043 TestIdentifier test_data;
44 test_data.test_case_name = test_case->name();
45 test_data.test_name = test_info->name();
46 test_data.file = test_info->file();
47 test_data.line = test_info->line();
48 tests.push_back(test_data);
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090049 }
50 }
51 return tests;
52}
53
54bool WriteCompiledInTestsToFile(const FilePath& path) {
phajdan.jr700cfba2015-07-29 18:49:54 +090055 std::vector<TestIdentifier> tests(GetCompiledInTests());
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090056
57 ListValue root;
58 for (size_t i = 0; i < tests.size(); ++i) {
dchenge1a4cd52016-09-09 06:04:33 +090059 std::unique_ptr<DictionaryValue> test_info(new DictionaryValue);
phajdan.jr700cfba2015-07-29 18:49:54 +090060 test_info->SetString("test_case_name", tests[i].test_case_name);
61 test_info->SetString("test_name", tests[i].test_name);
62 test_info->SetString("file", tests[i].file);
63 test_info->SetInteger("line", tests[i].line);
dcheng7219b062016-06-11 12:41:48 +090064 root.Append(std::move(test_info));
Paweł Hajdan, Jra4797a32014-11-25 00:58:51 +090065 }
66
67 JSONFileValueSerializer serializer(path);
68 return serializer.Serialize(root);
69}
70
Paweł Hajdan22733472015-01-15 22:32:01 +090071bool ReadTestNamesFromFile(const FilePath& path,
phajdan.jr700cfba2015-07-29 18:49:54 +090072 std::vector<TestIdentifier>* output) {
prashhir58322f42015-03-05 18:30:57 +090073 JSONFileValueDeserializer deserializer(path);
Paweł Hajdan22733472015-01-15 22:32:01 +090074 int error_code = 0;
75 std::string error_message;
dchengcc8e4d82016-04-05 06:25:51 +090076 std::unique_ptr<base::Value> value =
olli.raula6dc6aca2015-10-16 15:16:40 +090077 deserializer.Deserialize(&error_code, &error_message);
Paweł Hajdan22733472015-01-15 22:32:01 +090078 if (!value.get())
79 return false;
80
81 base::ListValue* tests = nullptr;
82 if (!value->GetAsList(&tests))
83 return false;
84
phajdan.jr700cfba2015-07-29 18:49:54 +090085 std::vector<base::TestIdentifier> result;
Paweł Hajdan22733472015-01-15 22:32:01 +090086 for (base::ListValue::iterator i = tests->begin(); i != tests->end(); ++i) {
87 base::DictionaryValue* test = nullptr;
jdoerrie45184002017-04-12 03:09:14 +090088 if (!i->GetAsDictionary(&test))
Paweł Hajdan22733472015-01-15 22:32:01 +090089 return false;
90
phajdan.jr700cfba2015-07-29 18:49:54 +090091 TestIdentifier test_data;
92
93 if (!test->GetStringASCII("test_case_name", &test_data.test_case_name))
Paweł Hajdan22733472015-01-15 22:32:01 +090094 return false;
95
phajdan.jr700cfba2015-07-29 18:49:54 +090096 if (!test->GetStringASCII("test_name", &test_data.test_name))
Paweł Hajdan22733472015-01-15 22:32:01 +090097 return false;
98
phajdan.jr700cfba2015-07-29 18:49:54 +090099 if (!test->GetStringASCII("file", &test_data.file))
100 return false;
101
102 if (!test->GetInteger("line", &test_data.line))
103 return false;
104
105 result.push_back(test_data);
Paweł Hajdan22733472015-01-15 22:32:01 +0900106 }
107
108 output->swap(result);
109 return true;
110}
111
prashhir58322f42015-03-05 18:30:57 +0900112} // namespace base