// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <optional>
#include <set>
#include <utility>

#include <cryptohome/proto_bindings/UserDataAuth.pb.h>
#include <gtest/gtest.h>
#include <libhwsec/error/tpm1_error.h>
#include <libhwsec-foundation/status/status_chain.h>

#include "cryptohome/error/action.h"
#include "cryptohome/error/cryptohome_tpm_error.h"

namespace cryptohome {

namespace error {

class CryptohomeTPM1ErrorTest : public ::testing::Test {};

namespace {

using hwsec::TPM1Error;
using hwsec::TPMRetryAction;
using hwsec_foundation::status::MakeStatus;
using hwsec_foundation::status::StatusChain;

TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorSize) {
  auto tpm_err = MakeStatus<TPM1Error>(TPM_E_SIZE);
  // TPM_E_SIZE results in TPMRetryAction::kReboot and ErrorAction::kReboot.

  auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));

  ASSERT_FALSE(err1.ok());
  EXPECT_EQ(err1->local_location(),
            static_cast<CryptohomeError::ErrorLocation>(TPM_E_SIZE) |
                hwsec::unified_tpm_error::kUnifiedErrorBit);
  EXPECT_EQ(err1->local_actions(), ErrorActionSet({ErrorAction::kReboot}));
  EXPECT_EQ(err1->ToTPMRetryAction(), TPMRetryAction::kReboot);
}

TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorDefend) {
  auto tpm_err = MakeStatus<TPM1Error>(TPM_E_DEFEND_LOCK_RUNNING);
  // TPM_E_DEFEND_LOCK_RUNNING results in TPMRetryAction::kDefend and
  // ErrorAction::kTpmLockout.

  auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));

  ASSERT_FALSE(err1.ok());
  EXPECT_EQ(
      err1->local_location(),
      static_cast<CryptohomeError::ErrorLocation>(TPM_E_DEFEND_LOCK_RUNNING) |
          hwsec::unified_tpm_error::kUnifiedErrorBit);
  EXPECT_EQ(err1->local_actions(), ErrorActionSet({ErrorAction::kTpmLockout}));
  EXPECT_EQ(err1->ToTPMRetryAction(), TPMRetryAction::kDefend);
}

TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorComm) {
  auto tpm_err = MakeStatus<TPM1Error>(TSS_E_COMM_FAILURE);
  // TSS_E_COMM_FAILURE results in TPMRetryAction::kCommunication and
  // ErrorAction::kReboot.

  auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));

  ASSERT_FALSE(err1.ok());
  EXPECT_EQ(err1->local_location(),
            static_cast<CryptohomeError::ErrorLocation>(TSS_E_COMM_FAILURE) |
                hwsec::unified_tpm_error::kUnifiedErrorBit);
  EXPECT_EQ(err1->local_actions(), ErrorActionSet({ErrorAction::kReboot}));
  EXPECT_EQ(err1->ToTPMRetryAction(), TPMRetryAction::kCommunication);
}

TEST_F(CryptohomeTPM1ErrorTest, FromTPM1ErrorSuccess) {
  StatusChain<TPM1Error> tpm_err;
  auto err1 = MakeStatus<CryptohomeTPMError>(std::move(tpm_err));

  EXPECT_TRUE(err1.ok());
}

}  // namespace

}  // namespace error

}  // namespace cryptohome
