//
// Copyright (C) 2014 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 "trunks/scoped_key_handle.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "trunks/mock_tpm.h"
#include "trunks/tpm_generated.h"
#include "trunks/trunks_factory_for_test.h"

using testing::_;
using testing::DoAll;
using testing::Invoke;
using testing::NiceMock;
using testing::Return;
using testing::SetArgPointee;
using testing::WithArgs;

namespace trunks {

// A test fixture for TpmState tests.
class ScopedKeyHandleTest : public testing::Test {
 public:
  ScopedKeyHandleTest() {}
  ~ScopedKeyHandleTest() override {}

  void SetUp() override {
    factory_.set_tpm(&mock_tpm_);
  }

 protected:
  TrunksFactoryForTest factory_;
  NiceMock<MockTpm> mock_tpm_;
};

TEST_F(ScopedKeyHandleTest, FlushHandle) {
  TPM_HANDLE handle = TPM_RH_FIRST;
  ScopedKeyHandle scoped_handle(factory_, handle);
  EXPECT_CALL(mock_tpm_, FlushContextSync(handle, _))
      .WillOnce(Return(TPM_RC_SUCCESS));
}

TEST_F(ScopedKeyHandleTest, GetTest) {
  TPM_HANDLE handle = TPM_RH_FIRST;
  ScopedKeyHandle scoped_handle(factory_, handle);
  EXPECT_EQ(handle, scoped_handle.get());
}

TEST_F(ScopedKeyHandleTest, ReleaseTest) {
  TPM_HANDLE handle = TPM_RH_FIRST;
  ScopedKeyHandle scoped_handle(factory_, handle);
  EXPECT_EQ(handle, scoped_handle.release());
  EXPECT_EQ(0, scoped_handle.get());
}

TEST_F(ScopedKeyHandleTest, ResetAndFlush) {
  TPM_HANDLE old_handle = TPM_RH_FIRST;
  TPM_HANDLE new_handle = TPM_RH_NULL;
  ScopedKeyHandle scoped_handle(factory_, old_handle);
  EXPECT_EQ(old_handle, scoped_handle.get());
  EXPECT_CALL(mock_tpm_, FlushContextSync(old_handle, _))
      .WillOnce(Return(TPM_RC_SUCCESS));
  scoped_handle.reset(new_handle);
  EXPECT_EQ(new_handle, scoped_handle.get());
  EXPECT_CALL(mock_tpm_, FlushContextSync(new_handle, _))
      .WillOnce(Return(TPM_RC_SUCCESS));
}

TEST_F(ScopedKeyHandleTest, NullReset) {
  TPM_HANDLE handle = TPM_RH_FIRST;
  ScopedKeyHandle scoped_handle(factory_, handle);
  EXPECT_EQ(handle, scoped_handle.get());
  EXPECT_CALL(mock_tpm_, FlushContextSync(handle, _))
      .WillOnce(Return(TPM_RC_SUCCESS));
  scoped_handle.reset();
  EXPECT_EQ(0, scoped_handle.get());
}

}  // namespace trunks
