Commit f1f0b837 authored by sque's avatar sque Committed by Commit Bot

Add log source to read from one DebugDaemon log

DebugDaemon has a function, GetLog(), that returns the output of one
log command. This patch adds a new log source class to fetch the output
of GetLog().

BUG=733846

Review-Url: https://codereview.chromium.org/2955463002
Cr-Commit-Position: refs/heads/master@{#481884}
parent e4175877
...@@ -1435,6 +1435,8 @@ source_set("chromeos") { ...@@ -1435,6 +1435,8 @@ source_set("chromeos") {
"system_logs/device_event_log_source.h", "system_logs/device_event_log_source.h",
"system_logs/lsb_release_log_source.cc", "system_logs/lsb_release_log_source.cc",
"system_logs/lsb_release_log_source.h", "system_logs/lsb_release_log_source.h",
"system_logs/single_debug_daemon_log_source.cc",
"system_logs/single_debug_daemon_log_source.h",
"system_logs/single_log_source.cc", "system_logs/single_log_source.cc",
"system_logs/single_log_source.h", "system_logs/single_log_source.h",
"system_logs/touch_log_source.h", "system_logs/touch_log_source.h",
...@@ -1864,6 +1866,7 @@ source_set("unit_tests") { ...@@ -1864,6 +1866,7 @@ source_set("unit_tests") {
"status/data_promo_notification_unittest.cc", "status/data_promo_notification_unittest.cc",
"system/automatic_reboot_manager_unittest.cc", "system/automatic_reboot_manager_unittest.cc",
"system/device_disabling_manager_unittest.cc", "system/device_disabling_manager_unittest.cc",
"system_logs/single_debug_daemon_log_source_unittest.cc",
"system_logs/single_log_source_unittest.cc", "system_logs/single_log_source_unittest.cc",
"tether/tether_service_unittest.cc", "tether/tether_service_unittest.cc",
"ui/accessibility_focus_ring_controller_unittest.cc", "ui/accessibility_focus_ring_controller_unittest.cc",
......
// Copyright 2017 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 "chrome/browser/chromeos/system_logs/single_debug_daemon_log_source.h"
#include "base/bind.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/debug_daemon_client.h"
#include "components/feedback/anonymizer_tool.h"
#include "content/public/browser/browser_thread.h"
namespace system_logs {
namespace {
using SupportedSource = SingleDebugDaemonLogSource::SupportedSource;
// Converts a logs source type to the corresponding debugd log name.
std::string GetLogName(SupportedSource source_type) {
switch (source_type) {
case SupportedSource::kModetest:
return "modetest";
case SupportedSource::kLsusb:
return "lsusb";
}
NOTREACHED();
return "";
}
} // namespace
SingleDebugDaemonLogSource::SingleDebugDaemonLogSource(
SupportedSource source_type)
: SystemLogsSource(GetLogName(source_type)), weak_ptr_factory_(this) {}
SingleDebugDaemonLogSource::~SingleDebugDaemonLogSource() {}
void SingleDebugDaemonLogSource::Fetch(const SysLogsSourceCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
DCHECK(!callback.is_null());
chromeos::DebugDaemonClient* client =
chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
client->GetLog(
source_name(),
base::Bind(&SingleDebugDaemonLogSource::OnFetchComplete,
weak_ptr_factory_.GetWeakPtr(), source_name(), callback));
}
void SingleDebugDaemonLogSource::OnFetchComplete(
const std::string& log_name,
const SysLogsSourceCallback& callback,
bool success,
const std::string& result) const {
// |result| and |response| are the same type, but |result| is passed in from
// DebugDaemonClient, which does not use the SystemLogsResponse alias.
SystemLogsResponse response;
// Return an empty result if the call to GetLog() failed.
std::string final_result;
if (success)
response.emplace(log_name, feedback::AnonymizerTool().Anonymize(result));
callback.Run(&response);
}
} // namespace system_logs
// Copyright 2017 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.
#ifndef CHROME_BROWSER_CHROMEOS_SYSTEM_LOGS_SINGLE_DEBUG_DAEMON_LOG_SOURCE_H_
#define CHROME_BROWSER_CHROMEOS_SYSTEM_LOGS_SINGLE_DEBUG_DAEMON_LOG_SOURCE_H_
#include <stddef.h>
#include "base/macros.h"
#include "chrome/browser/feedback/system_logs/system_logs_fetcher.h"
namespace system_logs {
// Gathers log data from a single debugd log source, via DebugDaemonClient.
class SingleDebugDaemonLogSource : public SystemLogsSource {
public:
enum class SupportedSource {
// For "modetest" command.
kModetest,
// For "lsusb" command.
kLsusb,
};
explicit SingleDebugDaemonLogSource(SupportedSource source);
~SingleDebugDaemonLogSource() override;
// system_logs::SystemLogsSource:
void Fetch(const SysLogsSourceCallback& callback) override;
private:
// Callback for handling response from DebugDaemonClient.
void OnFetchComplete(const std::string& log_name,
const SysLogsSourceCallback& callback,
bool success,
const std::string& result) const;
base::WeakPtrFactory<SingleDebugDaemonLogSource> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(SingleDebugDaemonLogSource);
};
} // namespace system_logs
#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_LOGS_SINGLE_DEBUG_DAEMON_LOG_SOURCE_H_
// Copyright 2017 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 "chrome/browser/chromeos/system_logs/single_debug_daemon_log_source.h"
#include <string>
#include "base/bind.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_debug_daemon_client.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace system_logs {
using SupportedSource = SingleDebugDaemonLogSource::SupportedSource;
class SingleDebugDaemonLogSourceTest : public ::testing::Test {
public:
SingleDebugDaemonLogSourceTest()
: scoped_task_environment_(
base::test::ScopedTaskEnvironment::MainThreadType::UI),
fetch_callback_(
base::Bind(&SingleDebugDaemonLogSourceTest::OnFetchComplete,
base::Unretained(this))),
num_callback_calls_(0) {}
void SetUp() override {
// Since no debug daemon will be available during a unit test, use
// FakeDebugDaemonClient to provide dummy DebugDaemonClient functionality.
chromeos::DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient(
base::MakeUnique<chromeos::FakeDebugDaemonClient>());
}
void TearDown() override {
chromeos::DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient(
nullptr);
}
protected:
const SysLogsSourceCallback& fetch_callback() const {
return fetch_callback_;
}
int num_callback_calls() const { return num_callback_calls_; }
const SystemLogsResponse& response() const { return response_; }
void ClearResponse() { response_.clear(); }
private:
void OnFetchComplete(SystemLogsResponse* response) {
++num_callback_calls_;
response_ = *response;
}
// For running scheduled tasks.
base::test::ScopedTaskEnvironment scoped_task_environment_;
// Creates the necessary browser threads. Defined after
// |scoped_task_environment_| in order to use the MessageLoop it created.
content::TestBrowserThreadBundle browser_thread_bundle_;
// Pre-made callback object for passing OnFetchComplete() to an asynchronous
// function.
const SysLogsSourceCallback fetch_callback_;
// Used to verify that OnFetchComplete was called the correct number of times.
int num_callback_calls_;
// Stores results from the log source.
SystemLogsResponse response_;
DISALLOW_COPY_AND_ASSIGN(SingleDebugDaemonLogSourceTest);
};
TEST_F(SingleDebugDaemonLogSourceTest, SingleCall) {
SingleDebugDaemonLogSource source(SupportedSource::kModetest);
source.Fetch(fetch_callback());
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_callback_calls());
ASSERT_EQ(1U, response().size());
EXPECT_EQ("modetest", response().begin()->first);
EXPECT_EQ("modetest: response from GetLog", response().begin()->second);
}
TEST_F(SingleDebugDaemonLogSourceTest, MultipleCalls) {
SingleDebugDaemonLogSource source(SupportedSource::kLsusb);
source.Fetch(fetch_callback());
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_callback_calls());
ASSERT_EQ(1U, response().size());
EXPECT_EQ("lsusb", response().begin()->first);
EXPECT_EQ("lsusb: response from GetLog", response().begin()->second);
ClearResponse();
source.Fetch(fetch_callback());
base::RunLoop().RunUntilIdle();
EXPECT_EQ(2, num_callback_calls());
ASSERT_EQ(1U, response().size());
EXPECT_EQ("lsusb", response().begin()->first);
EXPECT_EQ("lsusb: response from GetLog", response().begin()->second);
ClearResponse();
source.Fetch(fetch_callback());
base::RunLoop().RunUntilIdle();
EXPECT_EQ(3, num_callback_calls());
ASSERT_EQ(1U, response().size());
EXPECT_EQ("lsusb", response().begin()->first);
EXPECT_EQ("lsusb: response from GetLog", response().begin()->second);
}
TEST_F(SingleDebugDaemonLogSourceTest, MultipleSources) {
SingleDebugDaemonLogSource source1(SupportedSource::kModetest);
source1.Fetch(fetch_callback());
base::RunLoop().RunUntilIdle();
EXPECT_EQ(1, num_callback_calls());
ASSERT_EQ(1U, response().size());
EXPECT_EQ("modetest", response().begin()->first);
EXPECT_EQ("modetest: response from GetLog", response().begin()->second);
ClearResponse();
SingleDebugDaemonLogSource source2(SupportedSource::kLsusb);
source2.Fetch(fetch_callback());
base::RunLoop().RunUntilIdle();
EXPECT_EQ(2, num_callback_calls());
ASSERT_EQ(1U, response().size());
EXPECT_EQ("lsusb", response().begin()->first);
EXPECT_EQ("lsusb: response from GetLog", response().begin()->second);
}
} // namespace system_logs
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