// Copyright 2017 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.

#ifndef LIBPASSWORDPROVIDER_FAKE_PASSWORD_PROVIDER_H_
#define LIBPASSWORDPROVIDER_FAKE_PASSWORD_PROVIDER_H_

#include "libpasswordprovider/password_provider.h"

#include <memory>
#include <string>

#include <base/macros.h>

#include "libpasswordprovider/password.h"

namespace password_provider {

// Fake implementation of password storage.
//
// TODO(maybelle): Export this into libpasswordprovider-test
class FakePasswordProvider : public PasswordProviderInterface {
 public:
  FakePasswordProvider() {}

  bool password_saved() const { return password_saved_; }
  bool password_discarded() const {
    return password_discarded_ && password_.size() == 0;
  }

  // PasswordProviderInterface overrides
  bool SavePassword(const Password& password) const override {
    password_saved_ = true;

    password_ = std::string(password.GetRaw(), password.size());
    return true;
  }

  std::unique_ptr<Password> GetPassword() const override {
    if (password_discarded()) {
      return nullptr;
    }

    auto password = std::make_unique<Password>();
    if (!password->Init()) {
      return nullptr;
    }

    memcpy(password->GetMutableRaw(), password_.c_str(), password_.size());
    password->SetSize(password_.size());

    return password;
  }

  bool DiscardPassword() const override {
    password_.clear();
    password_discarded_ = true;
    return true;
  }

 private:
  mutable bool password_saved_ = false;  // true if the password was ever saved.
  mutable bool password_discarded_ =
      false;  // true if password_ is cleared out.
  mutable std::string password_;

  DISALLOW_COPY_AND_ASSIGN(FakePasswordProvider);
};

}  // namespace password_provider

#endif  // LIBPASSWORDPROVIDER_FAKE_PASSWORD_PROVIDER_H_
