// Copyright 2020 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 "arc/keymaster/context/crypto_operation.h"

#include <gtest/gtest.h>
#include "base/optional.h"

namespace arc {
namespace keymaster {
namespace context {

namespace {

const auto kMechanismA = MechanismDescription(OperationType::kSign,
                                              Algorithm::kRsa,
                                              Digest::kSha256,
                                              Padding::kPkcs7,
                                              BlockMode::kNone);

const auto kMechanismB = MechanismDescription(OperationType::kUnsupported,
                                              Algorithm::kRsa,
                                              Digest::kSha256,
                                              Padding::kPkcs7,
                                              BlockMode::kNone);

const auto kMechanismC = MechanismDescription(OperationType::kSign,
                                              Algorithm::kUnsupported,
                                              Digest::kSha256,
                                              Padding::kPkcs7,
                                              BlockMode::kNone);

// Concrete implementation of |CryptoOperation| for tests.
class TestOperation : public CryptoOperation {
 public:
  TestOperation() = default;
  ~TestOperation() = default;
  // Not copyable nor assignable.
  TestOperation(const TestOperation&) = delete;
  TestOperation& operator=(const TestOperation&) = delete;

  base::Optional<uint64_t> Begin(MechanismDescription description) {
    return base::nullopt;
  }

  base::Optional<brillo::Blob> Update(const brillo::Blob& input) {
    return base::nullopt;
  }

  base::Optional<brillo::Blob> Finish() { return base::nullopt; }

  bool Abort() { return false; }

  bool IsSupportedMechanism(MechanismDescription description) const {
    return kMechanismA == description || kMechanismB == description;
  }
};

}  // anonymous namespace

TEST(CryptoOperation, IsSupportedMechanism) {
  TestOperation operation;
  EXPECT_TRUE(operation.IsSupportedMechanism(kMechanismA));

  EXPECT_TRUE(operation.IsSupportedMechanism(kMechanismB));

  EXPECT_FALSE(operation.IsSupportedMechanism(kMechanismC));
}

TEST(MechanismDescription, EqualsOperator) {
  EXPECT_EQ(kMechanismA, kMechanismA);

  MechanismDescription copyOfA(kMechanismA);
  EXPECT_EQ(kMechanismA, copyOfA);

  EXPECT_FALSE(kMechanismA == kMechanismC);
  EXPECT_FALSE(kMechanismB == kMechanismC);
  EXPECT_FALSE(copyOfA == kMechanismC);
}

TEST(MechanismDescription, LessOperator) {
  EXPECT_LT(kMechanismA, kMechanismB);
  EXPECT_LT(kMechanismA, kMechanismC);
  EXPECT_LT(kMechanismB, kMechanismC);
}

}  // namespace context
}  // namespace keymaster
}  // namespace arc
