// Copyright 2019 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 "cros-disks/mount_point.h"

#include <utility>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace cros_disks {

namespace {

using testing::_;
using testing::Return;

constexpr char kMountPath[] = "/mount/path";

class MockMountPoint : public MountPoint {
 public:
  explicit MockMountPoint(const base::FilePath& path) : MountPoint(path) {}
  ~MockMountPoint() override { DestructorUnmount(); }

  MOCK_METHOD(MountErrorType, UnmountImpl, (), (override));
};

}  // namespace

TEST(MountPointTest, Unmount) {
  const auto mount_path = base::FilePath(kMountPath);
  auto mount_point = std::make_unique<MockMountPoint>(mount_path);

  EXPECT_CALL(*mount_point, UnmountImpl())
      .WillOnce(Return(MOUNT_ERROR_INVALID_ARCHIVE))
      .WillOnce(Return(MOUNT_ERROR_NONE));
  EXPECT_EQ(MOUNT_ERROR_INVALID_ARCHIVE, mount_point->Unmount());
  EXPECT_EQ(MOUNT_ERROR_NONE, mount_point->Unmount());
  EXPECT_EQ(MOUNT_ERROR_PATH_NOT_MOUNTED, mount_point->Unmount());
}

TEST(MountPointTest, UnmountOnDestroy) {
  const auto mount_path = base::FilePath(kMountPath);
  auto mount_point = std::make_unique<MockMountPoint>(mount_path);

  EXPECT_CALL(*mount_point, UnmountImpl())
      .WillOnce(Return(MOUNT_ERROR_INVALID_ARCHIVE));
}

TEST(MountPointTest, LeakMount) {
  auto mount_point =
      std::make_unique<MockMountPoint>(base::FilePath(kMountPath));

  EXPECT_CALL(*mount_point, UnmountImpl()).Times(0);

  mount_point->Release();
  EXPECT_EQ(MOUNT_ERROR_PATH_NOT_MOUNTED, mount_point->Unmount());
}

}  // namespace cros_disks
