// Copyright 2019 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 "biod/crypto_init/bio_crypto_init.h"

#include <memory>

#include "biod/crypto_init/mock_bio_crypto_init.h"
#include <libec/mock_ec_command_factory.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace biod {

using ec::FpSeedCommand;
using ::testing::Return;

TEST(BioCryptoInit, CheckTemplateVersionCompatible) {
  BioCryptoInit bio_crypto_init(std::make_unique<ec::EcCommandFactory>());
  EXPECT_TRUE(bio_crypto_init.CrosFpTemplateVersionCompatible(3, 3));
  EXPECT_TRUE(bio_crypto_init.CrosFpTemplateVersionCompatible(4, 4));
  // Format version 2 should not be in the field.
  EXPECT_FALSE(bio_crypto_init.CrosFpTemplateVersionCompatible(2, 2));

  // This should change when we deprecate firmware with template format v3
  EXPECT_TRUE(bio_crypto_init.CrosFpTemplateVersionCompatible(3, 4));

  // These are false because of the current rule and should change when we
  // launch format version 5.
  EXPECT_FALSE(bio_crypto_init.CrosFpTemplateVersionCompatible(4, 5));
  EXPECT_FALSE(bio_crypto_init.CrosFpTemplateVersionCompatible(5, 5));

  // This should break and be fixed when we uprev format version to 5 so that
  // we are guarding against unplanned uprev.
  EXPECT_TRUE(bio_crypto_init.CrosFpTemplateVersionCompatible(
      4, FP_TEMPLATE_FORMAT_VERSION));
}

class BioCryptoInitTest : public testing::Test {
 public:
  class MockFpSeedCommand : public FpSeedCommand {
   public:
    MOCK_METHOD(bool, Run, (int fd), (override));
  };

  BioCryptoInitTest() {
    auto mock_command_factory = std::make_unique<ec::MockEcCommandFactory>();
    mock_ec_command_factory_ = mock_command_factory.get();
    mock_bio_crypto_init_ =
        std::make_unique<MockBioCryptoInit>(std::move(mock_command_factory));
  }

 protected:
  ec::MockEcCommandFactory* mock_ec_command_factory_ = nullptr;
  std::unique_ptr<MockBioCryptoInit> mock_bio_crypto_init_;
};

TEST_F(BioCryptoInitTest, WriteSeedToCrosFp) {
  EXPECT_CALL(*mock_bio_crypto_init_, InitCrosFp).WillOnce(Return(true));
  EXPECT_CALL(*mock_bio_crypto_init_, GetFirmwareTemplateVersion)
      .WillOnce(Return(3));

  const brillo::SecureVector kSeed(FpSeedCommand::kTpmSeedSize, 0xFF);

  // Verify that the seed passed to WriteSeedToCrosFp matches and that the
  // command to set the seed is run.
  EXPECT_CALL(*mock_ec_command_factory_, FpSeedCommand)
      .WillOnce(
          [&kSeed](const brillo::SecureVector& seed, uint16_t seed_version) {
            EXPECT_EQ(seed, kSeed);
            auto mock_cmd =
                FpSeedCommand::Create<MockFpSeedCommand>(seed, seed_version);
            EXPECT_CALL(*mock_cmd, Run).WillOnce(Return(true));
            return mock_cmd;
          });

  mock_bio_crypto_init_->WriteSeedToCrosFpDelegate(kSeed);
}
}  // namespace biod
