Commit af43608d authored by Ben Reich's avatar Ben Reich Committed by Commit Bot

[Files App] Integrate DevToolsListener to FileManagerBrowserTestBase

Add the flag --devtools-code-coverage to FileManagerBrowserTestBase
and extend the class to attach a DevToolsListener instance to the
foreground Files app page.

The Files background_page is ignored due to crbug.com/v8/10820 which
causes any renderers sharing the same v8 isolate to report coverage
data on an isolate level not on the renderer level.

The remainder of renderers (Audio Player, Video Player, etc) are also
ignored for coverage to get a minimal set of coverage working end-to-
end first: additional renderer support will be added later.

Test: browser_tests --gtest_filter="*FilesApp*"
Test: browser_tests --gtest-filter="*FilesApp*" --devtools-code-coverage
Bug: 1113941

Change-Id: I75455c71bfb2d057f282e29194d5065261552fea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2345831
Commit-Queue: Ben Reich <benreich@chromium.org>
Reviewed-by: default avatarNoel Gordon <noel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#814555}
parent 663f6ccb
...@@ -1486,6 +1486,66 @@ FileManagerBrowserTestBase::FileManagerBrowserTestBase() = default; ...@@ -1486,6 +1486,66 @@ FileManagerBrowserTestBase::FileManagerBrowserTestBase() = default;
FileManagerBrowserTestBase::~FileManagerBrowserTestBase() = default; FileManagerBrowserTestBase::~FileManagerBrowserTestBase() = default;
static bool ShouldInspect(content::DevToolsAgentHost* host) {
// TODO(crbug.com/v8/10820): Add background_page back in once
// coverage can be collected when a background_page and app
// share the same v8 isolate.
if (host->GetTitle() == "Files" && host->GetType() == "app")
return true;
return false;
}
bool FileManagerBrowserTestBase::ShouldForceDevToolsAgentHostCreation() {
return devtools_code_coverage_;
}
void FileManagerBrowserTestBase::DevToolsAgentHostCreated(
content::DevToolsAgentHost* host) {
CHECK(devtools_agent_.find(host) == devtools_agent_.end());
if (ShouldInspect(host)) {
devtools_agent_[host].reset(new DevToolsListener(host, process_id_));
}
}
void FileManagerBrowserTestBase::DevToolsAgentHostAttached(
content::DevToolsAgentHost* host) {
if (auto* content = host->GetWebContents()) {
auto* manager = extensions::ProcessManager::Get(profile());
if (auto* extension = manager->GetExtensionForWebContents(content)) {
LOG(INFO) << "DevToolsAgentHostAttached: " << extension->name();
manager->IncrementLazyKeepaliveCount(
extension, extensions::Activity::Type::DEV_TOOLS, "");
}
}
}
void FileManagerBrowserTestBase::DevToolsAgentHostNavigated(
content::DevToolsAgentHost* host) {
if (devtools_agent_.find(host) == devtools_agent_.end())
return;
if (ShouldInspect(host)) {
LOG(INFO) << DevToolsListener::HostString(host, __FUNCTION__);
devtools_agent_.find(host)->second->Navigated(host);
} else {
devtools_agent_.find(host)->second->Detach(host);
}
}
void FileManagerBrowserTestBase::DevToolsAgentHostDetached(
content::DevToolsAgentHost* host) {}
void FileManagerBrowserTestBase::DevToolsAgentHostCrashed(
content::DevToolsAgentHost* host,
base::TerminationStatus status) {
if (devtools_agent_.find(host) == devtools_agent_.end())
return;
NOTREACHED();
}
void FileManagerBrowserTestBase::SetUp() { void FileManagerBrowserTestBase::SetUp() {
net::NetworkChangeNotifier::SetTestNotificationsOnly(true); net::NetworkChangeNotifier::SetTestNotificationsOnly(true);
extensions::ExtensionApiTest::SetUp(); extensions::ExtensionApiTest::SetUp();
...@@ -1588,6 +1648,10 @@ void FileManagerBrowserTestBase::SetUpCommandLine( ...@@ -1588,6 +1648,10 @@ void FileManagerBrowserTestBase::SetUpCommandLine(
enabled_features.push_back(chromeos::features::kFilesSinglePartitionFormat); enabled_features.push_back(chromeos::features::kFilesSinglePartitionFormat);
} }
if (command_line->HasSwitch("devtools-code-coverage")) {
devtools_code_coverage_ = options.guest_mode != IN_INCOGNITO;
}
// This is destroyed in |TearDown()|. We cannot initialize this in the // This is destroyed in |TearDown()|. We cannot initialize this in the
// constructor due to this feature values' above dependence on virtual // constructor due to this feature values' above dependence on virtual
// method calls, but by convention subclasses of this fixture may initialize // method calls, but by convention subclasses of this fixture may initialize
...@@ -1732,6 +1796,10 @@ void FileManagerBrowserTestBase::SetUpOnMainThread() { ...@@ -1732,6 +1796,10 @@ void FileManagerBrowserTestBase::SetUpOnMainThread() {
display_service_ = display_service_ =
std::make_unique<NotificationDisplayServiceTester>(profile()); std::make_unique<NotificationDisplayServiceTester>(profile());
process_id_ = base::GetUniqueIdForProcess().GetUnsafeValue();
if (devtools_code_coverage_)
content::DevToolsAgentHost::AddObserver(this);
content::NetworkConnectionChangeSimulator network_change_simulator; content::NetworkConnectionChangeSimulator network_change_simulator;
network_change_simulator.SetConnectionType( network_change_simulator.SetConnectionType(
options.offline ? network::mojom::ConnectionType::CONNECTION_NONE options.offline ? network::mojom::ConnectionType::CONNECTION_NONE
...@@ -1762,11 +1830,39 @@ void FileManagerBrowserTestBase::TearDown() { ...@@ -1762,11 +1830,39 @@ void FileManagerBrowserTestBase::TearDown() {
} }
void FileManagerBrowserTestBase::StartTest() { void FileManagerBrowserTestBase::StartTest() {
LOG(INFO) << "FileManagerBrowserTest::StartTest " << GetFullTestCaseName(); const std::string full_test_name = GetFullTestCaseName();
LOG(INFO) << "FileManagerBrowserTest::StartTest " << full_test_name;
static const base::FilePath test_extension_dir = static const base::FilePath test_extension_dir =
base::FilePath(FILE_PATH_LITERAL("ui/file_manager/integration_tests")); base::FilePath(FILE_PATH_LITERAL("ui/file_manager/integration_tests"));
LaunchExtension(test_extension_dir, GetTestExtensionManifestName()); LaunchExtension(test_extension_dir, GetTestExtensionManifestName());
RunTestMessageLoop(); RunTestMessageLoop();
if (!devtools_code_coverage_)
return;
content::DevToolsAgentHost::RemoveObserver(this);
content::RunAllTasksUntilIdle();
base::ScopedAllowBlockingForTesting allow_blocking;
base::FilePath store;
CHECK(base::PathService::Get(base::DIR_EXE, &store));
store = store.AppendASCII("coverage").AppendASCII("file_manager");
CHECK(base::CreateDirectory(store));
base::FilePath tests = store.AppendASCII("tests");
if (!base::PathExists(tests))
CHECK(base::CreateDirectory(tests));
for (auto& agent : devtools_agent_) {
auto* host = agent.first;
if (agent.second->HasCoverage(host))
agent.second->GetCoverage(host, store, full_test_name);
agent.second->Detach(host);
}
content::DevToolsAgentHost::DetachAllClients();
content::RunAllTasksUntilIdle();
} }
void FileManagerBrowserTestBase::LaunchExtension(const base::FilePath& path, void FileManagerBrowserTestBase::LaunchExtension(const base::FilePath& path,
......
...@@ -16,8 +16,10 @@ ...@@ -16,8 +16,10 @@
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/chromeos/crostini/fake_crostini_features.h" #include "chrome/browser/chromeos/crostini/fake_crostini_features.h"
#include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h"
#include "chrome/browser/chromeos/file_manager/devtools_listener.h"
#include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "content/public/browser/devtools_agent_host_observer.h"
class NotificationDisplayServiceTester; class NotificationDisplayServiceTester;
class SelectFileDialogExtensionTestFactory; class SelectFileDialogExtensionTestFactory;
...@@ -40,7 +42,8 @@ class DocumentsProviderTestVolume; ...@@ -40,7 +42,8 @@ class DocumentsProviderTestVolume;
class MediaViewTestVolume; class MediaViewTestVolume;
class SmbfsTestVolume; class SmbfsTestVolume;
class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { class FileManagerBrowserTestBase : public content::DevToolsAgentHostObserver,
public extensions::ExtensionApiTest {
public: public:
struct Options { struct Options {
Options(); Options();
...@@ -101,6 +104,15 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -101,6 +104,15 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
FileManagerBrowserTestBase(); FileManagerBrowserTestBase();
~FileManagerBrowserTestBase() override; ~FileManagerBrowserTestBase() override;
// content::DevToolsAgentHostObserver:
bool ShouldForceDevToolsAgentHostCreation() override;
void DevToolsAgentHostCreated(content::DevToolsAgentHost* host) override;
void DevToolsAgentHostAttached(content::DevToolsAgentHost* host) override;
void DevToolsAgentHostNavigated(content::DevToolsAgentHost* host) override;
void DevToolsAgentHostDetached(content::DevToolsAgentHost* host) override;
void DevToolsAgentHostCrashed(content::DevToolsAgentHost* host,
base::TerminationStatus status) override;
// extensions::ExtensionApiTest: // extensions::ExtensionApiTest:
void SetUp() override; void SetUp() override;
void SetUpCommandLine(base::CommandLine* command_line) override; void SetUpCommandLine(base::CommandLine* command_line) override;
...@@ -189,6 +201,11 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest { ...@@ -189,6 +201,11 @@ class FileManagerBrowserTestBase : public extensions::ExtensionApiTest {
base::HistogramTester histograms_; base::HistogramTester histograms_;
base::UserActionTester user_actions_; base::UserActionTester user_actions_;
bool devtools_code_coverage_ = false;
std::map<content::DevToolsAgentHost*, std::unique_ptr<DevToolsListener>>
devtools_agent_;
uint32_t process_id_ = 0;
// Not owned. // Not owned.
SelectFileDialogExtensionTestFactory* select_factory_; SelectFileDialogExtensionTestFactory* select_factory_;
......
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