chromium/device/fido/mac/fake_icloud_keychain.mm

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

#include "device/fido/mac/fake_icloud_keychain.h"

#include "device/fido/mac/fake_icloud_keychain_sys.h"

namespace device::fido::icloud_keychain {

namespace {

struct API_AVAILABLE(macos(13.3)) FakeImpl : public Fake {
 public:
  FakeImpl(std::optional<bool> permission)
      : fake_(base::MakeRefCounted<FakeSystemInterface>()) {
    if (!permission) {
      fake_->set_auth_state(SystemInterface::kAuthNotAuthorized);
    } else if (*permission) {
      fake_->set_auth_state(SystemInterface::kAuthAuthorized);
    } else {
      fake_->set_auth_state(SystemInterface::kAuthDenied);
    }
    SetSystemInterfaceForTesting(fake_);
  }

  ~FakeImpl() override { SetSystemInterfaceForTesting(nullptr); }

  scoped_refptr<FakeSystemInterface> fake_;
};

}  // namespace

std::unique_ptr<Fake> NewFake() {
  return NewFakeWithPermission(true);
}

std::unique_ptr<Fake> NewFakeWithPermission(std::optional<bool> permission) {
  if (@available(macOS 13.5, *)) {
    return std::make_unique<FakeImpl>(permission);
  }
  return nullptr;
}

}  // namespace device::fido::icloud_keychain