// 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, TouchFileDurable(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::TouchFileDurable));
  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, IsDirectoryEmpty(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::IsDirectoryEmpty));
  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, DataSyncFile(_))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::DataSyncFile));
  ON_CALL(*this, SyncFile(_))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::SyncFile));
  ON_CALL(*this, SyncDirectory(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::SyncDirectory));
  ON_CALL(*this, Sync())
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::Sync));

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

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

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

  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, Stat(_, _))
      .WillByDefault(Invoke(fake_platform_.get(), &FakePlatform::Stat));

  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, GetExtFileAttributes(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::GetExtFileAttributes));
  ON_CALL(*this, SetExtFileAttributes(_, _))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::SetExtFileAttributes));
  ON_CALL(*this, HasNoDumpFileAttribute(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::HasNoDumpFileAttribute));

  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, AmountOfFreeDiskSpace(_))
      .WillByDefault(
          Invoke(fake_platform_.get(), &FakePlatform::AmountOfFreeDiskSpace));

  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
