You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.7 KiB
142 lines
4.7 KiB
// |
|
// 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() = default; |
|
virtual ~Tpm2StatusTest() = default; |
|
|
|
void SetUp() { |
|
factory_.set_tpm_state(&mock_tpm_state_); |
|
tpm_status_.reset(new Tpm2StatusImpl(factory_)); |
|
} |
|
|
|
protected: |
|
NiceMock<trunks::MockTpmState> mock_tpm_state_; |
|
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
|
|
|