// Copyright (c) 2013 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 "cryptohome/mock_platform.h"

#include "cryptohome/fake_platform.h"

using testing::_;
using testing::Invoke;
using testing::NiceMock;
using testing::Return;

namespace cryptohome {

MockPlatform::MockPlatform()
    : mock_process_(new NiceMock<brillo::ProcessMock>()),
      fake_platform_(new FakePlatform()) {
  ON_CALL(*this, GetUserId(_, _, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::GetUserId));
  ON_CALL(*this, GetGroupId(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::GetGroupId));

  ON_CALL(*this, Rename(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::Rename));
  ON_CALL(*this, Move(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::Move));
  ON_CALL(*this, Copy(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::Copy));
  ON_CALL(*this, DeleteFile(_))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::DeleteFile));
  ON_CALL(*this, DeletePathRecursively(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::DeletePathRecursively));
  ON_CALL(*this, DeleteFileDurable(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::DeleteFileDurable));
  ON_CALL(*this, EnumerateDirectoryEntries(_, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::EnumerateDirectoryEntries));
  ON_CALL(*this, GetFileEnumerator(_, _, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::GetFileEnumerator));
  ON_CALL(*this, FileExists(_))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::FileExists));
  ON_CALL(*this, DirectoryExists(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::DirectoryExists));
  ON_CALL(*this, CreateDirectory(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::CreateDirectory));
  ON_CALL(*this, CreateSparseFile(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::CreateSparseFile));

  ON_CALL(*this, ReadFile(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::ReadFile));
  ON_CALL(*this, ReadFileToString(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::ReadFileToString));
  ON_CALL(*this, ReadFileToSecureBlob(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::ReadFileToSecureBlob));

  ON_CALL(*this, WriteFile(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::WriteFile));
  ON_CALL(*this, WriteSecureBlobToFile(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::WriteSecureBlobToFile));
  ON_CALL(*this, WriteFileAtomic(_, _, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::WriteFileAtomic));
  ON_CALL(*this, WriteSecureBlobToFileAtomic(_, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::WriteSecureBlobToFileAtomic));
  ON_CALL(*this, WriteFileAtomicDurable(_, _, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::WriteFileAtomicDurable));
  ON_CALL(*this, WriteSecureBlobToFileAtomicDurable(_, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::WriteSecureBlobToFileAtomicDurable));
  ON_CALL(*this, WriteStringToFile(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::WriteStringToFile));
  ON_CALL(*this, WriteStringToFileAtomicDurable(_, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::WriteStringToFileAtomicDurable));
  ON_CALL(*this, WriteArrayToFile(_, _, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::WriteArrayToFile));

  ON_CALL(*this, OpenFile(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::OpenFile));
  ON_CALL(*this, CloseFile(_))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::CloseFile));

  ON_CALL(*this, GetFileSize(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::GetFileSize));

  ON_CALL(*this, HasExtendedFileAttribute(_, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::HasExtendedFileAttribute));
  ON_CALL(*this, ListExtendedFileAttributes(_, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::ListExtendedFileAttributes));
  ON_CALL(*this, GetExtendedFileAttributeAsString(_, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::GetExtendedFileAttributeAsString));
  ON_CALL(*this, GetExtendedFileAttribute(_, _, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::GetExtendedFileAttribute));
  ON_CALL(*this, SetExtendedFileAttribute(_, _, _, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::SetExtendedFileAttribute));
  ON_CALL(*this, RemoveExtendedFileAttribute(_, _))
      .WillByDefault(Invoke(fake_platform_.get(),
                            &FakePlatform::RemoveExtendedFileAttribute));

  ON_CALL(*this, GetOwnership(_, _, _, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::GetOwnership));
  ON_CALL(*this, SetOwnership(_, _, _, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::SetOwnership));
  ON_CALL(*this, GetPermissions(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::GetPermissions));
  ON_CALL(*this, SetPermissions(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::SetPermissions));

  ON_CALL(*this, SetGroupAccessible(_, _, _)).WillByDefault(Return(true));
  ON_CALL(*this, GetCurrentTime())
      .WillByDefault(Return(base::Time::NowFromSystemTime()));
  ON_CALL(*this, StatVFS(_, _)).WillByDefault(CallStatVFS());
  ON_CALL(*this, ReportFilesystemDetails(_, _))
      .WillByDefault(CallReportFilesystemDetails());
  ON_CALL(*this, FindFilesystemDevice(_, _))
      .WillByDefault(CallFindFilesystemDevice());
  ON_CALL(*this, ComputeDirectoryDiskUsage(_))
      .WillByDefault(CallComputeDirectoryDiskUsage());
  ON_CALL(*this, SetupProcessKeyring()).WillByDefault(Return(true));
  ON_CALL(*this, GetDirCryptoKeyState(_))
      .WillByDefault(Return(dircrypto::KeyState::NO_KEY));
  ON_CALL(*this, CreateProcessInstance())
      .WillByDefault(Invoke(this, &MockPlatform::MockCreateProcessInstance));
  ON_CALL(*this, AreDirectoriesMounted(_))
      .WillByDefault([](const std::vector<base::FilePath>& directories) {
        return std::vector<bool>(directories.size(), false);
      });
}

MockPlatform::~MockPlatform() {}

}  // namespace cryptohome
