1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "tpm_manager/server/tpm2_status_impl.h"
18
19 #include <memory>
20
21 #include <gmock/gmock.h>
22 #include <gtest/gtest.h>
23 #include <trunks/mock_tpm_state.h>
24 #include <trunks/trunks_factory_for_test.h>
25
26 using testing::NiceMock;
27 using testing::Return;
28 using trunks::TPM_RC_FAILURE;
29 using trunks::TPM_RC_SUCCESS;
30
31 namespace tpm_manager {
32
33 class Tpm2StatusTest : public testing::Test {
34 public:
Tpm2StatusTest()35 Tpm2StatusTest() : factory_(new trunks::TrunksFactoryForTest()) {}
36 virtual ~Tpm2StatusTest() = default;
37
SetUp()38 void SetUp() {
39 factory_->set_tpm_state(&mock_tpm_state_);
40 tpm_status_.reset(new Tpm2StatusImpl(factory_.get()));
41 }
42
43 protected:
44 NiceMock<trunks::MockTpmState> mock_tpm_state_;
45 std::unique_ptr<trunks::TrunksFactoryForTest> factory_;
46 std::unique_ptr<TpmStatus> tpm_status_;
47 };
48
49
TEST_F(Tpm2StatusTest,IsEnabledSuccess)50 TEST_F(Tpm2StatusTest, IsEnabledSuccess) {
51 EXPECT_CALL(mock_tpm_state_, Initialize())
52 .WillRepeatedly(Return(TPM_RC_SUCCESS));
53 EXPECT_CALL(mock_tpm_state_, IsEnabled())
54 .WillRepeatedly(Return(true));
55 EXPECT_TRUE(tpm_status_->IsTpmEnabled());
56 }
57
TEST_F(Tpm2StatusTest,IsEnabledFailure)58 TEST_F(Tpm2StatusTest, IsEnabledFailure) {
59 EXPECT_CALL(mock_tpm_state_, IsEnabled())
60 .WillRepeatedly(Return(false));
61 EXPECT_FALSE(tpm_status_->IsTpmEnabled());
62 }
63
TEST_F(Tpm2StatusTest,IsEnabledNoRepeatedInitialization)64 TEST_F(Tpm2StatusTest, IsEnabledNoRepeatedInitialization) {
65 EXPECT_CALL(mock_tpm_state_, Initialize())
66 .WillOnce(Return(TPM_RC_SUCCESS));
67 EXPECT_TRUE(tpm_status_->IsTpmEnabled());
68 EXPECT_TRUE(tpm_status_->IsTpmEnabled());
69 }
70
TEST_F(Tpm2StatusTest,IsOwnedSuccess)71 TEST_F(Tpm2StatusTest, IsOwnedSuccess) {
72 EXPECT_CALL(mock_tpm_state_, Initialize())
73 .WillRepeatedly(Return(TPM_RC_SUCCESS));
74 EXPECT_CALL(mock_tpm_state_, IsOwned())
75 .WillRepeatedly(Return(true));
76 EXPECT_TRUE(tpm_status_->IsTpmOwned());
77 }
78
TEST_F(Tpm2StatusTest,IsOwnedFailure)79 TEST_F(Tpm2StatusTest, IsOwnedFailure) {
80 EXPECT_CALL(mock_tpm_state_, IsOwned())
81 .WillRepeatedly(Return(false));
82 EXPECT_FALSE(tpm_status_->IsTpmOwned());
83 }
84
TEST_F(Tpm2StatusTest,IsOwnedRepeatedInitializationOnFalse)85 TEST_F(Tpm2StatusTest, IsOwnedRepeatedInitializationOnFalse) {
86 EXPECT_CALL(mock_tpm_state_, Initialize())
87 .Times(2)
88 .WillRepeatedly(Return(TPM_RC_SUCCESS));
89 EXPECT_CALL(mock_tpm_state_, IsOwned())
90 .WillOnce(Return(false));
91 EXPECT_FALSE(tpm_status_->IsTpmOwned());
92 EXPECT_CALL(mock_tpm_state_, IsOwned())
93 .WillRepeatedly(Return(true));
94 EXPECT_TRUE(tpm_status_->IsTpmOwned());
95 }
96
TEST_F(Tpm2StatusTest,IsOwnedNoRepeatedInitializationOnTrue)97 TEST_F(Tpm2StatusTest, IsOwnedNoRepeatedInitializationOnTrue) {
98 EXPECT_CALL(mock_tpm_state_, Initialize())
99 .WillOnce(Return(TPM_RC_SUCCESS));
100 EXPECT_CALL(mock_tpm_state_, IsOwned())
101 .WillRepeatedly(Return(true));
102 EXPECT_TRUE(tpm_status_->IsTpmOwned());
103 EXPECT_TRUE(tpm_status_->IsTpmOwned());
104 }
105
TEST_F(Tpm2StatusTest,GetDictionaryAttackInfoInitializeFailure)106 TEST_F(Tpm2StatusTest, GetDictionaryAttackInfoInitializeFailure) {
107 EXPECT_CALL(mock_tpm_state_, Initialize())
108 .WillRepeatedly(Return(TPM_RC_FAILURE));
109 int count;
110 int threshold;
111 bool lockout;
112 int seconds_remaining;
113 EXPECT_FALSE(tpm_status_->GetDictionaryAttackInfo(&count,
114 &threshold,
115 &lockout,
116 &seconds_remaining));
117 }
118
TEST_F(Tpm2StatusTest,GetDictionaryAttackInfoForwarding)119 TEST_F(Tpm2StatusTest, GetDictionaryAttackInfoForwarding) {
120 int lockout_count = 3;
121 int lockout_threshold = 16;
122 bool is_locked = true;
123 int lockout_interval = 3600;
124 EXPECT_CALL(mock_tpm_state_, GetLockoutCounter())
125 .WillRepeatedly(Return(lockout_count));
126 EXPECT_CALL(mock_tpm_state_, GetLockoutThreshold())
127 .WillRepeatedly(Return(lockout_threshold));
128 EXPECT_CALL(mock_tpm_state_, IsInLockout())
129 .WillRepeatedly(Return(is_locked));
130 EXPECT_CALL(mock_tpm_state_, GetLockoutInterval())
131 .WillRepeatedly(Return(lockout_interval));
132 int count;
133 int threshold;
134 bool lockout;
135 int seconds_remaining;
136 EXPECT_TRUE(tpm_status_->GetDictionaryAttackInfo(&count,
137 &threshold,
138 &lockout,
139 &seconds_remaining));
140 EXPECT_EQ(count, lockout_count);
141 EXPECT_EQ(threshold, lockout_threshold);
142 EXPECT_EQ(lockout, is_locked);
143 EXPECT_EQ(seconds_remaining, lockout_count * lockout_interval);
144 }
145
TEST_F(Tpm2StatusTest,GetDictionaryAttackInfoAlwaysRefresh)146 TEST_F(Tpm2StatusTest, GetDictionaryAttackInfoAlwaysRefresh) {
147 EXPECT_CALL(mock_tpm_state_, Initialize())
148 .WillRepeatedly(Return(TPM_RC_SUCCESS));
149 int count;
150 int threshold;
151 bool lockout;
152 int seconds_remaining;
153 EXPECT_TRUE(tpm_status_->GetDictionaryAttackInfo(&count,
154 &threshold,
155 &lockout,
156 &seconds_remaining));
157 }
158
159 } // namespace tpm_manager
160