blob: 3236c17999e7c7529d87dd23407e234b573e3cfe [file] [log] [blame] [edit]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <memory>
#include <utility>
#include <base/test/task_environment.h>
#include <base/test/test_future.h>
#include <gtest/gtest.h>
#include <libhwsec-foundation/error/testing_helper.h>
#include <tpm_manager/proto_bindings/tpm_manager.pb.h>
#include <tpm_manager-client-test/tpm_manager/dbus-proxy-mocks.h>
#include "libhwsec/backend/tpm1/backend_test_base.h"
using base::test::TestFuture;
using hwsec_foundation::error::testing::IsOk;
using hwsec_foundation::error::testing::IsOkAndHolds;
using hwsec_foundation::error::testing::ReturnError;
using hwsec_foundation::error::testing::ReturnValue;
using testing::_;
using testing::DoAll;
using testing::NiceMock;
using testing::Return;
using testing::SaveArg;
using testing::SetArgPointee;
using tpm_manager::TpmManagerStatus;
namespace hwsec {
class BackendStateTpm1Test : public BackendTpm1TestBase {
protected:
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::ThreadingMode::MAIN_THREAD_ONLY,
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
TEST_F(BackendStateTpm1Test, IsEnabled) {
tpm_manager::GetTpmNonsensitiveStatusReply reply;
reply.set_status(TpmManagerStatus::STATUS_SUCCESS);
reply.set_is_enabled(true);
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
GetTpmNonsensitiveStatus(_, _, _, _))
.WillOnce(DoAll(SetArgPointee<1>(reply), Return(true)));
EXPECT_THAT(backend_->GetStateTpm1().IsEnabled(), IsOkAndHolds(true));
}
TEST_F(BackendStateTpm1Test, IsReady) {
tpm_manager::GetTpmNonsensitiveStatusReply reply;
reply.set_status(TpmManagerStatus::STATUS_SUCCESS);
reply.set_is_owned(true);
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
GetTpmNonsensitiveStatus(_, _, _, _))
.WillOnce(DoAll(SetArgPointee<1>(reply), Return(true)));
EXPECT_THAT(backend_->GetStateTpm1().IsReady(), IsOkAndHolds(true));
}
TEST_F(BackendStateTpm1Test, Prepare) {
tpm_manager::TakeOwnershipReply reply;
reply.set_status(TpmManagerStatus::STATUS_SUCCESS);
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(), TakeOwnership(_, _, _, _))
.WillOnce(DoAll(SetArgPointee<1>(reply), Return(true)));
EXPECT_THAT(backend_->GetStateTpm1().Prepare(), IsOk());
}
TEST_F(BackendStateTpm1Test, WaitUntilReadyEarly) {
tpm_manager::GetTpmNonsensitiveStatusReply reply;
reply.set_status(TpmManagerStatus::STATUS_SUCCESS);
reply.set_is_enabled(true);
reply.set_is_owned(true);
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
GetTpmNonsensitiveStatus(_, _, _, _))
.WillOnce(DoAll(SetArgPointee<1>(reply), Return(true)));
TestFuture<Status> future;
backend_->GetStateTpm1().WaitUntilReady(future.GetCallback<Status>());
EXPECT_THAT(future.Get(), IsOk());
}
TEST_F(BackendStateTpm1Test, WaitUntilReadySignal) {
tpm_manager::GetTpmNonsensitiveStatusReply reply;
reply.set_status(TpmManagerStatus::STATUS_SUCCESS);
reply.set_is_enabled(false);
reply.set_is_owned(false);
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
GetTpmNonsensitiveStatus(_, _, _, _))
.WillOnce(DoAll(SetArgPointee<1>(reply), Return(true)));
base::RepeatingCallback<void(const tpm_manager::OwnershipTakenSignal&)>
signal_callback = base::NullCallback();
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
DoRegisterSignalOwnershipTakenSignalHandler(_, _))
.WillOnce(SaveArg<0>(&signal_callback));
TestFuture<Status> future;
backend_->GetStateTpm1().WaitUntilReady(future.GetCallback<Status>());
task_environment_.RunUntilIdle();
ASSERT_NE(signal_callback, base::NullCallback());
// Trigger the signal.
signal_callback.Run(tpm_manager::OwnershipTakenSignal());
EXPECT_THAT(future.Get(), IsOk());
}
TEST_F(BackendStateTpm1Test, WaitUntilReadyEarlyAndSignal) {
tpm_manager::GetTpmNonsensitiveStatusReply reply;
reply.set_status(TpmManagerStatus::STATUS_SUCCESS);
reply.set_is_enabled(true);
reply.set_is_owned(true);
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
GetTpmNonsensitiveStatus(_, _, _, _))
.WillOnce(DoAll(SetArgPointee<1>(reply), Return(true)));
base::RepeatingCallback<void(const tpm_manager::OwnershipTakenSignal&)>
signal_callback = base::NullCallback();
EXPECT_CALL(proxy_->GetMockTpmManagerProxy(),
DoRegisterSignalOwnershipTakenSignalHandler(_, _))
.WillOnce(SaveArg<0>(&signal_callback));
TestFuture<Status> future;
backend_->GetStateTpm1().WaitUntilReady(future.GetCallback<Status>());
EXPECT_THAT(future.Get(), IsOk());
// Trigger the signal and no crash.
signal_callback.Run(tpm_manager::OwnershipTakenSignal());
}
} // namespace hwsec