Commit 32281535 authored by Ilia Samsonov's avatar Ilia Samsonov Committed by Commit Bot

Save disabled test results.

If disabled tests run, test launcher was flagged to run them explicitly.
Since we will remove the MANUAL_ flag, we should track the results.

Instead of testing test result tracker procedurally,
We use test launcher unit tests for functional testing.

Bug: 936248
Change-Id: Iafb2d40a9c650964097cd3f1136d6a5012afda3a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1641805
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarErik Chen <erikchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#666438}
parent d11bc86e
...@@ -2691,7 +2691,6 @@ test("base_unittests") { ...@@ -2691,7 +2691,6 @@ test("base_unittests") {
"task_runner_util_unittest.cc", "task_runner_util_unittest.cc",
"template_util_unittest.cc", "template_util_unittest.cc",
"test/launcher/test_launcher_unittest.cc", "test/launcher/test_launcher_unittest.cc",
"test/launcher/test_results_tracker_unittest.cc",
"test/launcher/unit_test_launcher_unittest.cc", "test/launcher/unit_test_launcher_unittest.cc",
"test/metrics/histogram_enum_reader_unittest.cc", "test/metrics/histogram_enum_reader_unittest.cc",
"test/metrics/histogram_tester_unittest.cc", "test/metrics/histogram_tester_unittest.cc",
...@@ -2889,7 +2888,6 @@ test("base_unittests") { ...@@ -2889,7 +2888,6 @@ test("base_unittests") {
"sync_socket_unittest.cc", "sync_socket_unittest.cc",
"synchronization/waitable_event_watcher_unittest.cc", "synchronization/waitable_event_watcher_unittest.cc",
"test/launcher/test_launcher_unittest.cc", "test/launcher/test_launcher_unittest.cc",
"test/launcher/test_results_tracker_unittest.cc",
"test/launcher/unit_test_launcher_unittest.cc", "test/launcher/unit_test_launcher_unittest.cc",
] ]
......
...@@ -4,8 +4,12 @@ ...@@ -4,8 +4,12 @@
#include <stddef.h> #include <stddef.h>
#include "base/base64.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/json/json_reader.h"
#include "base/test/launcher/test_launcher.h" #include "base/test/launcher/test_launcher.h"
#include "base/test/launcher/unit_test_launcher.h" #include "base/test/launcher/unit_test_launcher.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
...@@ -16,6 +20,33 @@ ...@@ -16,6 +20,33 @@
namespace base { namespace base {
namespace { namespace {
TestResult GenerateTestResult(
const std::string& test_name,
TestResult::Status status,
TimeDelta elapsed_td = TimeDelta::FromMilliseconds(30),
const std::string& output_snippet = "output") {
TestResult result;
result.full_name = test_name;
result.status = status;
result.elapsed_time = elapsed_td;
result.output_snippet = output_snippet;
return result;
}
TestResultPart GenerateTestResultPart(TestResultPart::Type type,
const std::string& file_name,
int line_number,
const std::string& summary,
const std::string& message) {
TestResultPart test_result_part;
test_result_part.type = type;
test_result_part.file_name = file_name;
test_result_part.line_number = line_number;
test_result_part.summary = summary;
test_result_part.message = message;
return test_result_part;
}
// Mock TestLauncher to mock CreateAndStartThreadPool, // Mock TestLauncher to mock CreateAndStartThreadPool,
// unit test will provide a ScopedTaskEnvironment. // unit test will provide a ScopedTaskEnvironment.
class MockTestLauncher : public TestLauncher { class MockTestLauncher : public TestLauncher {
...@@ -76,10 +107,20 @@ class TestLauncherTest : public testing::Test { ...@@ -76,10 +107,20 @@ class TestLauncherTest : public testing::Test {
.WillRepeatedly(testing::Return(true)); .WillRepeatedly(testing::Return(true));
} }
void ReadSummary(FilePath path) {
File resultFile(path, File::FLAG_OPEN | File::FLAG_READ);
const int size = 2048;
std::string json;
ASSERT_TRUE(ReadFileToStringWithMaxSize(path, &json, size));
root = JSONReader::Read(json);
}
std::unique_ptr<CommandLine> command_line; std::unique_ptr<CommandLine> command_line;
MockTestLauncher test_launcher; MockTestLauncher test_launcher;
MockTestLauncherDelegate delegate; MockTestLauncherDelegate delegate;
base::test::ScopedTaskEnvironment scoped_task_environment; base::test::ScopedTaskEnvironment scoped_task_environment;
ScopedTempDir dir;
Optional<Value> root;
private: private:
std::vector<TestIdentifier> tests_; std::vector<TestIdentifier> tests_;
...@@ -87,9 +128,14 @@ class TestLauncherTest : public testing::Test { ...@@ -87,9 +128,14 @@ class TestLauncherTest : public testing::Test {
// Action to mock delegate invoking OnTestFinish on test launcher. // Action to mock delegate invoking OnTestFinish on test launcher.
ACTION_P2(OnTestResult, full_name, status) { ACTION_P2(OnTestResult, full_name, status) {
TestResult result; TestResult result = GenerateTestResult(full_name, status);
result.full_name = full_name; ThreadTaskRunnerHandle::Get()->PostTask(
result.status = status; FROM_HERE,
BindOnce(&TestLauncher::OnTestFinished, Unretained(arg0), result));
}
// Action to mock delegate invoking OnTestFinish on test launcher.
ACTION_P(OnTestResult, result) {
ThreadTaskRunnerHandle::Get()->PostTask( ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, FROM_HERE,
BindOnce(&TestLauncher::OnTestFinished, Unretained(arg0), result)); BindOnce(&TestLauncher::OnTestFinished, Unretained(arg0), result));
...@@ -196,10 +242,8 @@ TEST_F(TestLauncherTest, RunningMultipleIterations) { ...@@ -196,10 +242,8 @@ TEST_F(TestLauncherTest, RunningMultipleIterations) {
command_line->AppendSwitchASCII("gtest_repeat", "2"); command_line->AppendSwitchASCII("gtest_repeat", "2");
using ::testing::_; using ::testing::_;
EXPECT_CALL(delegate, RunTests(_, _)) EXPECT_CALL(delegate, RunTests(_, _))
.WillOnce(::testing::DoAll( .Times(2)
OnTestResult("Test.firstTest", TestResult::TEST_SUCCESS), .WillRepeatedly(::testing::DoAll(
testing::Return(1)))
.WillOnce(::testing::DoAll(
OnTestResult("Test.firstTest", TestResult::TEST_SUCCESS), OnTestResult("Test.firstTest", TestResult::TEST_SUCCESS),
testing::Return(1))); testing::Return(1)));
EXPECT_TRUE(test_launcher.Run(command_line.get())); EXPECT_TRUE(test_launcher.Run(command_line.get()));
...@@ -316,6 +360,171 @@ TEST_F(TestLauncherTest, RedirectStdio) { ...@@ -316,6 +360,171 @@ TEST_F(TestLauncherTest, RedirectStdio) {
EXPECT_TRUE(test_launcher.Run(command_line.get())); EXPECT_TRUE(test_launcher.Run(command_line.get()));
} }
void ValidateKeyValue(Value* dict_value,
const std::string& key,
const std::string& expected_value) {
const std::string* value = dict_value->FindStringKey(key);
ASSERT_TRUE(value);
EXPECT_EQ(expected_value, *value);
}
// Validate a json child node for a particular test result.
void ValidateTestResult(Value* root, TestResult& result) {
Value* val = root->FindListKey(result.full_name);
ASSERT_TRUE(val);
ASSERT_EQ(1u, val->GetList().size());
val = &val->GetList().at(0);
ASSERT_TRUE(val->is_dict());
EXPECT_EQ(result.elapsed_time.InMilliseconds(),
val->FindIntKey("elapsed_time_ms").value_or(0));
EXPECT_EQ(true, val->FindBoolKey("losless_snippet").value_or(false));
ValidateKeyValue(val, "output_snippet", result.output_snippet);
std::string base64_output_snippet;
Base64Encode(result.output_snippet, &base64_output_snippet);
ValidateKeyValue(val, "output_snippet_base64", base64_output_snippet);
ValidateKeyValue(val, "status", result.StatusAsString());
Value* value = val->FindListKey("result_parts");
ASSERT_TRUE(value);
EXPECT_EQ(result.test_result_parts.size(), value->GetList().size());
for (unsigned i = 0; i < result.test_result_parts.size(); i++) {
TestResultPart result_part = result.test_result_parts.at(0);
Value* part_dict = &(value->GetList().at(i));
ASSERT_TRUE(part_dict);
ASSERT_TRUE(part_dict->is_dict());
ValidateKeyValue(part_dict, "type", result_part.TypeAsString());
ValidateKeyValue(part_dict, "file", result_part.file_name);
EXPECT_EQ(result_part.line_number,
part_dict->FindIntKey("line").value_or(0));
ValidateKeyValue(part_dict, "summary", result_part.summary);
ValidateKeyValue(part_dict, "message", result_part.message);
}
}
void ValidateStringList(Optional<Value>& root,
const std::string& key,
std::vector<const char*> values) {
Value* val = root->FindListKey(key);
ASSERT_TRUE(val);
ASSERT_EQ(values.size(), val->GetList().size());
for (unsigned i = 0; i < values.size(); i++) {
ASSERT_TRUE(val->GetList().at(i).is_string());
EXPECT_EQ(values.at(i), val->GetList().at(i).GetString());
}
}
void ValidateTestLocation(Value* root,
const std::string& key,
const std::string& file,
int line) {
Value* val = root->FindDictKey(key);
ASSERT_TRUE(val);
EXPECT_EQ(2u, val->DictSize());
ValidateKeyValue(val, "file", file);
EXPECT_EQ(line, val->FindIntKey("line").value_or(0));
}
// Unit tests to validate TestLauncher outputs the correct JSON file.
TEST_F(TestLauncherTest, JsonSummary) {
AddMockedTests("DISABLED_TestDisabled", {"firstTest"});
AddMockedTests("Test",
{"firstTest", "secondTest", "DISABLED_firstTestDisabled"});
SetUpExpectCalls();
ASSERT_TRUE(dir.CreateUniqueTempDir());
FilePath path = dir.GetPath().AppendASCII("SaveSummaryResult.json");
command_line->AppendSwitchPath("test-launcher-summary-output", path);
command_line->AppendSwitchASCII("gtest_repeat", "2");
// Setup results to be returned by the test launcher delegate.
TestResult first_result =
GenerateTestResult("Test.firstTest", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(30), "output_first");
first_result.test_result_parts.push_back(GenerateTestResultPart(
TestResultPart::kSuccess, "TestFile", 110, "summary", "message"));
TestResult second_result =
GenerateTestResult("Test.secondTest", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(50), "output_second");
using ::testing::_;
EXPECT_CALL(delegate, RunTests(_, _))
.Times(2)
.WillRepeatedly(::testing::DoAll(OnTestResult(first_result),
OnTestResult(second_result),
testing::Return(2)));
EXPECT_TRUE(test_launcher.Run(command_line.get()));
// Validate the resulting JSON file is the expected output.
ReadSummary(path);
ValidateStringList(root, "all_tests",
{"Test.firstTest", "Test.firstTestDisabled",
"Test.secondTest", "TestDisabled.firstTest"});
ValidateStringList(root, "disabled_tests",
{"Test.firstTestDisabled", "TestDisabled.firstTest"});
Value* val = root->FindDictKey("test_locations");
ASSERT_TRUE(val);
EXPECT_EQ(2u, val->DictSize());
ValidateTestLocation(val, "Test.firstTest", "File", 100);
ValidateTestLocation(val, "Test.secondTest", "File", 100);
val = root->FindListKey("per_iteration_data");
ASSERT_TRUE(val);
ASSERT_EQ(2u, val->GetList().size());
for (size_t i = 0; i < val->GetList().size(); i++) {
Value* iteration_val = &(val->GetList().at(i));
ASSERT_TRUE(iteration_val);
ASSERT_TRUE(iteration_val->is_dict());
EXPECT_EQ(2u, iteration_val->DictSize());
ValidateTestResult(iteration_val, first_result);
ValidateTestResult(iteration_val, second_result);
}
}
// Validate TestLauncher outputs the correct JSON file
// when running disabled tests.
TEST_F(TestLauncherTest, JsonSummaryWithDisabledTests) {
AddMockedTests("Test", {"DISABLED_Test"});
SetUpExpectCalls();
ASSERT_TRUE(dir.CreateUniqueTempDir());
FilePath path = dir.GetPath().AppendASCII("SaveSummaryResult.json");
command_line->AppendSwitchPath("test-launcher-summary-output", path);
command_line->AppendSwitch("gtest_also_run_disabled_tests");
// Setup results to be returned by the test launcher delegate.
TestResult test_result =
GenerateTestResult("Test.DISABLED_Test", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(50), "output_second");
using ::testing::_;
EXPECT_CALL(delegate, RunTests(_, _))
.WillOnce(
::testing::DoAll(OnTestResult(test_result), testing::Return(1)));
EXPECT_TRUE(test_launcher.Run(command_line.get()));
// Validate the resulting JSON file is the expected output.
ReadSummary(path);
Value* val = root->FindDictKey("test_locations");
ASSERT_TRUE(val);
EXPECT_EQ(1u, val->DictSize());
ValidateTestLocation(val, "Test.DISABLED_Test", "File", 100);
val = root->FindListKey("per_iteration_data");
ASSERT_TRUE(val);
ASSERT_EQ(1u, val->GetList().size());
Value* iteration_val = &(val->GetList().at(0));
ASSERT_TRUE(iteration_val);
ASSERT_TRUE(iteration_val->is_dict());
EXPECT_EQ(1u, iteration_val->DictSize());
// We expect the result to be stripped of disabled prefix.
test_result.full_name = "Test.Test";
ValidateTestResult(iteration_val, test_result);
}
} // namespace } // namespace
} // namespace base } // namespace base
...@@ -276,10 +276,6 @@ void TestResultsTracker::GeneratePlaceholderIteration() { ...@@ -276,10 +276,6 @@ void TestResultsTracker::GeneratePlaceholderIteration() {
for (auto& full_test_name : test_placeholders_) { for (auto& full_test_name : test_placeholders_) {
std::string test_name = TestNameWithoutDisabledPrefix(full_test_name); std::string test_name = TestNameWithoutDisabledPrefix(full_test_name);
// Ignore disabled tests.
if (disabled_tests_.find(test_name) != disabled_tests_.end())
continue;
TestResult test_result; TestResult test_result;
test_result.full_name = test_name; test_result.full_name = test_name;
test_result.status = TestResult::TEST_NOT_RUN; test_result.status = TestResult::TEST_NOT_RUN;
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stddef.h>
#include "base/base64.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/json/json_reader.h"
#include "base/logging.h"
#include "base/test/launcher/test_result.h"
#include "base/test/launcher/test_results_tracker.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace base {
namespace {
// Unit tests to validate TestResultsTracker outputs the correct JSON file
// given the correct setup.
class TestResultsTrackerTester : public testing::Test {
protected:
void ValidateKeyValue(Value* dict_value,
const std::string& key,
int64_t expected_value) {
base::Optional<int> value = dict_value->FindIntKey(key);
ASSERT_TRUE(value);
EXPECT_EQ(expected_value, value.value());
}
void ValidateKeyValue(Value* dict_value,
const std::string& key,
int expected_value) {
base::Optional<int> value = dict_value->FindIntKey(key);
ASSERT_TRUE(value);
EXPECT_EQ(expected_value, value.value());
}
void ValidateKeyValue(Value* dict_value,
const std::string& key,
bool expected_value) {
base::Optional<bool> value = dict_value->FindBoolKey(key);
ASSERT_TRUE(value);
EXPECT_EQ(expected_value, value.value());
}
void ValidateKeyValue(Value* dict_value,
const std::string& key,
const std::string& expected_value) {
const std::string* value = dict_value->FindStringKey(key);
ASSERT_TRUE(value);
EXPECT_EQ(expected_value, *value);
}
// Validate a json child node for a particular test result.
void ValidateTestResult(Value* root, TestResult& result) {
Value* val = root->FindListKey(result.full_name);
ASSERT_TRUE(val);
ASSERT_EQ(1u, val->GetList().size());
val = &val->GetList().at(0);
ASSERT_TRUE(val->is_dict());
ValidateKeyValue(val, "elapsed_time_ms",
result.elapsed_time.InMilliseconds());
ValidateKeyValue(val, "losless_snippet", true);
ValidateKeyValue(val, "output_snippet", result.output_snippet);
std::string base64_output_snippet;
Base64Encode(result.output_snippet, &base64_output_snippet);
ValidateKeyValue(val, "output_snippet_base64", base64_output_snippet);
ValidateKeyValue(val, "status", result.StatusAsString());
Value* value = val->FindListKey("result_parts");
ASSERT_TRUE(value);
EXPECT_EQ(result.test_result_parts.size(), value->GetList().size());
for (unsigned i = 0; i < result.test_result_parts.size(); i++) {
TestResultPart result_part = result.test_result_parts.at(0);
Value* part_dict = &(value->GetList().at(i));
ASSERT_TRUE(part_dict);
ASSERT_TRUE(part_dict->is_dict());
ValidateKeyValue(part_dict, "type", result_part.TypeAsString());
ValidateKeyValue(part_dict, "file", result_part.file_name);
ValidateKeyValue(part_dict, "line", result_part.line_number);
ValidateKeyValue(part_dict, "summary", result_part.summary);
ValidateKeyValue(part_dict, "message", result_part.message);
}
}
void ValidateStringList(Optional<Value>& root,
const std::string& key,
std::vector<const char*> values) {
Value* val = root->FindListKey(key);
ASSERT_TRUE(val);
ASSERT_EQ(values.size(), val->GetList().size());
for (unsigned i = 0; i < values.size(); i++) {
ASSERT_TRUE(val->GetList().at(i).is_string());
EXPECT_EQ(values.at(i), val->GetList().at(i).GetString());
}
}
void ValidateTestLocation(Value* root,
const std::string& key,
const std::string& file,
int line) {
Value* val = root->FindDictKey(key);
ASSERT_TRUE(val);
EXPECT_EQ(2u, val->DictSize());
ValidateKeyValue(val, "file", file);
ValidateKeyValue(val, "line", line);
}
TestResult GenerateTestResult(const std::string& test_name,
TestResult::Status status,
TimeDelta elapsed_td,
const std::string& output_snippet) {
TestResult result;
result.full_name = test_name;
result.status = status;
result.elapsed_time = elapsed_td;
result.output_snippet = output_snippet;
return result;
}
TestResultPart GenerateTestResultPart(TestResultPart::Type type,
const std::string& file_name,
int line_number,
const std::string& summary,
const std::string& message) {
TestResultPart test_result_part;
test_result_part.type = type;
test_result_part.file_name = file_name;
test_result_part.line_number = line_number;
test_result_part.summary = summary;
test_result_part.message = message;
return test_result_part;
}
Optional<Value> SaveAndReadSummary() {
ScopedTempDir dir;
CHECK(dir.CreateUniqueTempDir());
FilePath path = dir.GetPath().AppendASCII("SaveSummaryResult.json");
CHECK(tracker.SaveSummaryAsJSON(path, std::vector<std::string>()));
File resultFile(path, File::FLAG_OPEN | File::FLAG_READ);
const int size = 2048;
std::string json;
CHECK(ReadFileToStringWithMaxSize(path, &json, size));
return JSONReader::Read(json);
}
TestResultsTracker tracker;
};
// Validate JSON result file is saved with the correct structure.
TEST_F(TestResultsTrackerTester, JsonSummaryEmptyResult) {
tracker.OnTestIterationStarting();
Optional<Value> root = SaveAndReadSummary();
ASSERT_TRUE(root);
ASSERT_TRUE(root->is_dict());
EXPECT_EQ(5u, root->DictSize());
}
// Validate global tags are saved correctly.
TEST_F(TestResultsTrackerTester, JsonSummaryRootTags) {
tracker.OnTestIterationStarting();
tracker.AddTest("Test2"); // Test should appear in alphabetical order.
tracker.AddTest("Test1");
tracker.AddTest("Test1"); // Test should only appear once.
// DISABLED_ prefix should be removed.
tracker.AddTest("DISABLED_Test3");
tracker.AddDisabledTest("DISABLED_Test3");
tracker.AddGlobalTag("global1");
Optional<Value> root = SaveAndReadSummary();
ValidateStringList(root, "global_tags", {"global1"});
ValidateStringList(root, "all_tests", {"Test1", "Test2", "Test3"});
ValidateStringList(root, "disabled_tests", {"Test3"});
}
// Validate test locations are saved correctly.
TEST_F(TestResultsTrackerTester, JsonSummaryTestLocation) {
tracker.OnTestIterationStarting();
tracker.AddTestLocation("Test1", "Test1File", 100);
tracker.AddTestLocation("Test2", "Test2File", 200);
Optional<Value> root = SaveAndReadSummary();
Value* val = root->FindDictKey("test_locations");
ASSERT_TRUE(val);
ASSERT_TRUE(val->is_dict());
EXPECT_EQ(2u, val->DictSize());
ValidateTestLocation(val, "Test1", "Test1File", 100);
ValidateTestLocation(val, "Test2", "Test2File", 200);
}
// Validate test results are saved correctly.
TEST_F(TestResultsTrackerTester, JsonSummaryTestResults) {
TestResult test_result =
GenerateTestResult("Test", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(30), "output");
test_result.test_result_parts.push_back(GenerateTestResultPart(
TestResultPart::kSuccess, "TestFile", 110, "summary", "message"));
tracker.AddTestPlaceholder("Test");
tracker.OnTestIterationStarting();
tracker.GeneratePlaceholderIteration();
tracker.AddTestResult(test_result);
Optional<Value> root = SaveAndReadSummary();
Value* val = root->FindListKey("per_iteration_data");
ASSERT_TRUE(val);
ASSERT_EQ(1u, val->GetList().size());
Value* iteration_val = &(val->GetList().at(0));
ASSERT_TRUE(iteration_val);
ASSERT_TRUE(iteration_val->is_dict());
EXPECT_EQ(1u, iteration_val->DictSize());
ValidateTestResult(iteration_val, test_result);
}
// Validate test results without a placeholder.
TEST_F(TestResultsTrackerTester, JsonSummaryTestWithoutPlaceholder) {
TestResult test_result =
GenerateTestResult("Test", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(30), "output");
tracker.OnTestIterationStarting();
tracker.GeneratePlaceholderIteration();
tracker.AddTestResult(test_result);
Optional<Value> root = SaveAndReadSummary();
Value* val = root->FindListKey("per_iteration_data");
ASSERT_TRUE(val);
ASSERT_EQ(1u, val->GetList().size());
Value* iteration_val = &(val->GetList().at(0));
// No result is saved since a placeholder was not specified.
EXPECT_EQ(0u, iteration_val->DictSize());
}
// Validate test results are saved correctly based on setup.
TEST_F(TestResultsTrackerTester, JsonSummaryTestPlaceholderOrder) {
TestResult test_result =
GenerateTestResult("Test", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(30), "output");
TestResult test_result_empty = GenerateTestResult(
"Test", TestResult::TEST_NOT_RUN, TimeDelta::FromMilliseconds(0), "");
tracker.AddTestPlaceholder("Test");
// Test added before GeneratePlaceholderIteration, will not record.
tracker.OnTestIterationStarting();
tracker.AddTestResult(test_result);
tracker.GeneratePlaceholderIteration();
// This is the correct order of operations.
tracker.OnTestIterationStarting();
tracker.GeneratePlaceholderIteration();
tracker.AddTestResult(test_result);
Optional<Value> root = SaveAndReadSummary();
Value* val = root->FindListKey("per_iteration_data");
ASSERT_TRUE(val);
ASSERT_EQ(2u, val->GetList().size());
Value* iteration_val = &(val->GetList().at(0));
ValidateTestResult(iteration_val, test_result_empty);
iteration_val = &(val->GetList().at(1));
ValidateTestResult(iteration_val, test_result);
}
// Disabled tests results are not saved in json summary.
TEST_F(TestResultsTrackerTester, JsonSummaryDisabledTestResults) {
tracker.AddDisabledTest("Test");
TestResult test_result =
GenerateTestResult("Test", TestResult::TEST_SUCCESS,
TimeDelta::FromMilliseconds(30), "output");
test_result.test_result_parts.push_back(GenerateTestResultPart(
TestResultPart::kSuccess, "TestFile", 110, "summary", "message"));
tracker.AddTestPlaceholder("Test");
tracker.OnTestIterationStarting();
tracker.GeneratePlaceholderIteration();
tracker.AddTestResult(test_result);
Optional<Value> root = SaveAndReadSummary();
Value* val = root->FindListKey("per_iteration_data");
ASSERT_TRUE(val);
ASSERT_EQ(1u, val->GetList().size());
Value* iteration_val = &(val->GetList().at(0));
// No result is saved since a placeholder was not specified.
EXPECT_EQ(0u, iteration_val->DictSize());
}
} // namespace
} // namespace base
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment