blob: d1a6b81871bf07f6b9efe2f35529521a295d1e30 [file] [log] [blame]
// Copyright 2019 The Chromium OS 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 <memory>
#include <string>
#include <base/bind.h>
#include <base/bind_helpers.h>
#include <base/callback.h>
#include <brillo/errors/error.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "debugd/dbus-proxy-mocks.h"
#include "diagnostics/common/system/debugd_adapter.h"
#include "diagnostics/common/system/debugd_adapter_impl.h"
using ::testing::_;
using ::testing::Invoke;
using ::testing::StrictMock;
using ::testing::WithArg;
namespace diagnostics {
namespace {
constexpr char kSmartAttributes[] = "attributes";
constexpr char kNvmeIdentity[] = "identify_controller";
constexpr char kNvmeShortSelfTestOption[] = "short_self_test";
constexpr char kNvmeLongSelfTestOption[] = "long_self_test";
constexpr char kNvmeStopSelfTestOption[] = "stop_self_test";
constexpr int kNvmeGetLogPageId = 6;
constexpr int kNvmeGetLogDataLength = 16;
constexpr bool kNvmeGetLogRawBinary = true;
class MockCallback {
public:
MOCK_METHOD(void,
OnStringResultCallback,
(const std::string&, brillo::Error*));
};
} // namespace
class DebugdAdapterImplTest : public ::testing::Test {
public:
DebugdAdapterImplTest()
: debugd_proxy_mock_(new StrictMock<org::chromium::debugdProxyMock>()),
debugd_adapter_(std::make_unique<DebugdAdapterImpl>(
std::unique_ptr<org::chromium::debugdProxyMock>(
debugd_proxy_mock_))) {}
DebugdAdapterImplTest(const DebugdAdapterImplTest&) = delete;
DebugdAdapterImplTest& operator=(const DebugdAdapterImplTest&) = delete;
protected:
StrictMock<MockCallback> callback_;
// Owned by |debugd_adapter_|.
StrictMock<org::chromium::debugdProxyMock>* debugd_proxy_mock_;
std::unique_ptr<DebugdAdapter> debugd_adapter_;
};
// Tests that GetSmartAttributes calls callback with output on success.
TEST_F(DebugdAdapterImplTest, GetSmartAttributes) {
constexpr char kResult[] = "S.M.A.R.T. status";
EXPECT_CALL(*debugd_proxy_mock_, SmartctlAsync(kSmartAttributes, _, _, _))
.WillOnce(WithArg<1>(Invoke(
[kResult](const base::Callback<void(const std::string& /* result */)>&
success_callback) { success_callback.Run(kResult); })));
EXPECT_CALL(callback_, OnStringResultCallback(kResult, nullptr));
debugd_adapter_->GetSmartAttributes(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that GetSmartAttributes calls callback with error on failure.
TEST_F(DebugdAdapterImplTest, GetSmartAttributesError) {
const brillo::ErrorPtr kError = brillo::Error::Create(FROM_HERE, "", "", "");
EXPECT_CALL(*debugd_proxy_mock_, SmartctlAsync(kSmartAttributes, _, _, _))
.WillOnce(WithArg<2>(Invoke(
[error = kError.get()](
const base::Callback<void(brillo::Error*)>& error_callback) {
error_callback.Run(error);
})));
EXPECT_CALL(callback_, OnStringResultCallback("", kError.get()));
debugd_adapter_->GetSmartAttributes(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that GetNvmeIdentity calls callback with output on success.
TEST_F(DebugdAdapterImplTest, GetNvmeIdentity) {
constexpr char kResult[] = "NVMe identity data";
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeIdentity, _, _, _))
.WillOnce(WithArg<1>(Invoke(
[kResult](const base::Callback<void(const std::string& /* result */)>&
success_callback) { success_callback.Run(kResult); })));
EXPECT_CALL(callback_, OnStringResultCallback(kResult, nullptr));
debugd_adapter_->GetNvmeIdentity(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that GetNvmeIdentity calls callback with error on failure.
TEST_F(DebugdAdapterImplTest, GetNvmeIdentityError) {
const brillo::ErrorPtr kError = brillo::Error::Create(FROM_HERE, "", "", "");
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeIdentity, _, _, _))
.WillOnce(WithArg<2>(Invoke(
[error = kError.get()](
const base::Callback<void(brillo::Error*)>& error_callback) {
error_callback.Run(error);
})));
EXPECT_CALL(callback_, OnStringResultCallback("", kError.get()));
debugd_adapter_->GetNvmeIdentity(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that RunNvmeShortSelfTest calls callback with output on success.
TEST_F(DebugdAdapterImplTest, RunNvmeShortSelfTest) {
constexpr char kResult[] = "Device self-test started";
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeShortSelfTestOption, _, _, _))
.WillOnce(WithArg<1>(Invoke(
[kResult](const base::Callback<void(const std::string& /* result */)>&
success_callback) { success_callback.Run(kResult); })));
EXPECT_CALL(callback_, OnStringResultCallback(kResult, nullptr));
debugd_adapter_->RunNvmeShortSelfTest(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that RunNvmeShortSelfTest calls callback with error on failure.
TEST_F(DebugdAdapterImplTest, RunNvmeShortSelfTestError) {
const brillo::ErrorPtr kError = brillo::Error::Create(FROM_HERE, "", "", "");
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeShortSelfTestOption, _, _, _))
.WillOnce(WithArg<2>(Invoke(
[error = kError.get()](
const base::Callback<void(brillo::Error*)>& error_callback) {
error_callback.Run(error);
})));
EXPECT_CALL(callback_, OnStringResultCallback("", kError.get()));
debugd_adapter_->RunNvmeShortSelfTest(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that RunNvmeLongSelfTest calls callback with output on success.
TEST_F(DebugdAdapterImplTest, RunNvmeLongSelfTest) {
constexpr char kResult[] = "Device self-test started";
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeLongSelfTestOption, _, _, _))
.WillOnce(WithArg<1>(Invoke(
[kResult](const base::Callback<void(const std::string& /* result */)>&
success_callback) { success_callback.Run(kResult); })));
EXPECT_CALL(callback_, OnStringResultCallback(kResult, nullptr));
debugd_adapter_->RunNvmeLongSelfTest(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that RunNvmeLongSelfTest calls callback with error on failure.
TEST_F(DebugdAdapterImplTest, RunNvmeLongSelfTestError) {
const brillo::ErrorPtr kError = brillo::Error::Create(FROM_HERE, "", "", "");
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeLongSelfTestOption, _, _, _))
.WillOnce(WithArg<2>(Invoke(
[error = kError.get()](
const base::Callback<void(brillo::Error*)>& error_callback) {
error_callback.Run(error);
})));
EXPECT_CALL(callback_, OnStringResultCallback("", kError.get()));
debugd_adapter_->RunNvmeLongSelfTest(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that StopNvmeSelfTest calls callback with output on success.
TEST_F(DebugdAdapterImplTest, StopNvmeSelfTest) {
constexpr char kResult[] = "Aborting device self-test operation";
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeStopSelfTestOption, _, _, _))
.WillOnce(WithArg<1>(Invoke(
[kResult](const base::Callback<void(const std::string& /* result */)>&
success_callback) { success_callback.Run(kResult); })));
EXPECT_CALL(callback_, OnStringResultCallback(kResult, nullptr));
debugd_adapter_->StopNvmeSelfTest(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that StopNvmeSelfTest calls callback with error on failure.
TEST_F(DebugdAdapterImplTest, StopNvmeSelfTestError) {
const brillo::ErrorPtr kError = brillo::Error::Create(FROM_HERE, "", "", "");
EXPECT_CALL(*debugd_proxy_mock_, NvmeAsync(kNvmeStopSelfTestOption, _, _, _))
.WillOnce(WithArg<2>(Invoke(
[error = kError.get()](
const base::Callback<void(brillo::Error*)>& error_callback) {
error_callback.Run(error);
})));
EXPECT_CALL(callback_, OnStringResultCallback("", kError.get()));
debugd_adapter_->StopNvmeSelfTest(base::Bind(
&MockCallback::OnStringResultCallback, base::Unretained(&callback_)));
}
// Tests that GetNvmeLog calls callback with output on success.
TEST_F(DebugdAdapterImplTest, GetNvmeLog) {
constexpr char kResult[] = "AAAAABEAAACHEAAAAAAAAA==";
EXPECT_CALL(*debugd_proxy_mock_,
NvmeLogAsync(kNvmeGetLogPageId, kNvmeGetLogDataLength,
kNvmeGetLogRawBinary, _, _, _))
.WillOnce(WithArg<3>(Invoke(
[kResult](const base::Callback<void(const std::string& /* result */)>&
success_callback) { success_callback.Run(kResult); })));
EXPECT_CALL(callback_, OnStringResultCallback(kResult, nullptr));
debugd_adapter_->GetNvmeLog(kNvmeGetLogPageId, kNvmeGetLogDataLength,
kNvmeGetLogRawBinary,
base::Bind(&MockCallback::OnStringResultCallback,
base::Unretained(&callback_)));
}
// Tests that GetNvmeLog calls callback with error on failure.
TEST_F(DebugdAdapterImplTest, GetNvmeLogError) {
const brillo::ErrorPtr kError = brillo::Error::Create(FROM_HERE, "", "", "");
EXPECT_CALL(*debugd_proxy_mock_,
NvmeLogAsync(kNvmeGetLogPageId, kNvmeGetLogDataLength,
kNvmeGetLogRawBinary, _, _, _))
.WillOnce(WithArg<4>(Invoke(
[error = kError.get()](
const base::Callback<void(brillo::Error*)>& error_callback) {
error_callback.Run(error);
})));
EXPECT_CALL(callback_, OnStringResultCallback("", kError.get()));
debugd_adapter_->GetNvmeLog(kNvmeGetLogPageId, kNvmeGetLogDataLength,
kNvmeGetLogRawBinary,
base::Bind(&MockCallback::OnStringResultCallback,
base::Unretained(&callback_)));
}
} // namespace diagnostics