// // Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "tpm_manager/server/tpm2_status_impl.h" #include <memory> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <trunks/mock_tpm_state.h> #include <trunks/trunks_factory_for_test.h> using testing::NiceMock; using testing::Return; using trunks::TPM_RC_FAILURE; using trunks::TPM_RC_SUCCESS; namespace tpm_manager { class Tpm2StatusTest : public testing::Test { public: Tpm2StatusTest() : factory_(new trunks::TrunksFactoryForTest()) {} virtual ~Tpm2StatusTest() = default; void SetUp() { factory_->set_tpm_state(&mock_tpm_state_); tpm_status_.reset(new Tpm2StatusImpl(factory_.get())); } protected: NiceMock<trunks::MockTpmState> mock_tpm_state_; std::unique_ptr<trunks::TrunksFactoryForTest> factory_; std::unique_ptr<TpmStatus> tpm_status_; }; TEST_F(Tpm2StatusTest, IsEnabledSuccess) { EXPECT_CALL(mock_tpm_state_, Initialize()) .WillRepeatedly(Return(TPM_RC_SUCCESS)); EXPECT_CALL(mock_tpm_state_, IsEnabled()) .WillRepeatedly(Return(true)); EXPECT_TRUE(tpm_status_->IsTpmEnabled()); } TEST_F(Tpm2StatusTest, IsEnabledFailure) { EXPECT_CALL(mock_tpm_state_, IsEnabled()) .WillRepeatedly(Return(false)); EXPECT_FALSE(tpm_status_->IsTpmEnabled()); } TEST_F(Tpm2StatusTest, IsEnabledNoRepeatedInitialization) { EXPECT_CALL(mock_tpm_state_, Initialize()) .WillOnce(Return(TPM_RC_SUCCESS)); EXPECT_TRUE(tpm_status_->IsTpmEnabled()); EXPECT_TRUE(tpm_status_->IsTpmEnabled()); } TEST_F(Tpm2StatusTest, IsOwnedSuccess) { EXPECT_CALL(mock_tpm_state_, Initialize()) .WillRepeatedly(Return(TPM_RC_SUCCESS)); EXPECT_CALL(mock_tpm_state_, IsOwned()) .WillRepeatedly(Return(true)); EXPECT_TRUE(tpm_status_->IsTpmOwned()); } TEST_F(Tpm2StatusTest, IsOwnedFailure) { EXPECT_CALL(mock_tpm_state_, IsOwned()) .WillRepeatedly(Return(false)); EXPECT_FALSE(tpm_status_->IsTpmOwned()); } TEST_F(Tpm2StatusTest, IsOwnedRepeatedInitializationOnFalse) { EXPECT_CALL(mock_tpm_state_, Initialize()) .Times(2) .WillRepeatedly(Return(TPM_RC_SUCCESS)); EXPECT_CALL(mock_tpm_state_, IsOwned()) .WillOnce(Return(false)); EXPECT_FALSE(tpm_status_->IsTpmOwned()); EXPECT_CALL(mock_tpm_state_, IsOwned()) .WillRepeatedly(Return(true)); EXPECT_TRUE(tpm_status_->IsTpmOwned()); } TEST_F(Tpm2StatusTest, IsOwnedNoRepeatedInitializationOnTrue) { EXPECT_CALL(mock_tpm_state_, Initialize()) .WillOnce(Return(TPM_RC_SUCCESS)); EXPECT_CALL(mock_tpm_state_, IsOwned()) .WillRepeatedly(Return(true)); EXPECT_TRUE(tpm_status_->IsTpmOwned()); EXPECT_TRUE(tpm_status_->IsTpmOwned()); } TEST_F(Tpm2StatusTest, GetDictionaryAttackInfoInitializeFailure) { EXPECT_CALL(mock_tpm_state_, Initialize()) .WillRepeatedly(Return(TPM_RC_FAILURE)); int count; int threshold; bool lockout; int seconds_remaining; EXPECT_FALSE(tpm_status_->GetDictionaryAttackInfo(&count, &threshold, &lockout, &seconds_remaining)); } TEST_F(Tpm2StatusTest, GetDictionaryAttackInfoForwarding) { int lockout_count = 3; int lockout_threshold = 16; bool is_locked = true; int lockout_interval = 3600; EXPECT_CALL(mock_tpm_state_, GetLockoutCounter()) .WillRepeatedly(Return(lockout_count)); EXPECT_CALL(mock_tpm_state_, GetLockoutThreshold()) .WillRepeatedly(Return(lockout_threshold)); EXPECT_CALL(mock_tpm_state_, IsInLockout()) .WillRepeatedly(Return(is_locked)); EXPECT_CALL(mock_tpm_state_, GetLockoutInterval()) .WillRepeatedly(Return(lockout_interval)); int count; int threshold; bool lockout; int seconds_remaining; EXPECT_TRUE(tpm_status_->GetDictionaryAttackInfo(&count, &threshold, &lockout, &seconds_remaining)); EXPECT_EQ(count, lockout_count); EXPECT_EQ(threshold, lockout_threshold); EXPECT_EQ(lockout, is_locked); EXPECT_EQ(seconds_remaining, lockout_count * lockout_interval); } TEST_F(Tpm2StatusTest, GetDictionaryAttackInfoAlwaysRefresh) { EXPECT_CALL(mock_tpm_state_, Initialize()) .WillRepeatedly(Return(TPM_RC_SUCCESS)); int count; int threshold; bool lockout; int seconds_remaining; EXPECT_TRUE(tpm_status_->GetDictionaryAttackInfo(&count, &threshold, &lockout, &seconds_remaining)); } } // namespace tpm_manager