blob: e377101be7005499c78704bf1595164da0e2ff54 [file] [log] [blame]
// 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 <memory>
#include <string>
#include "base/bind.h"
#include "base/macros.h"
#include "base/run_loop.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() : 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(
std::make_unique<chromeos::FakeDebugDaemonClient>());
}
void TearDown() override {
chromeos::DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient(
nullptr);
}
protected:
SysLogsSourceCallback fetch_callback() {
return base::BindOnce(&SingleDebugDaemonLogSourceTest::OnFetchComplete,
base::Unretained(this));
}
int num_callback_calls() const { return num_callback_calls_; }
const SystemLogsResponse& response() const { return response_; }
void ClearResponse() { response_.clear(); }
private:
void OnFetchComplete(std::unique_ptr<SystemLogsResponse> response) {
++num_callback_calls_;
response_ = *response;
}
// Creates the necessary browser threads.
content::TestBrowserThreadBundle browser_thread_bundle_;
// 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