• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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