// Copyright 2018 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 <memory>
#include <utility>
#include <vector>

#include <base/bind.h>
#include <base/test/simple_test_tick_clock.h>
#include <gtest/gtest.h>

#include "smbprovider/fake_samba_interface.h"
#include "smbprovider/fake_samba_proxy.h"
#include "smbprovider/mount_config.h"
#include "smbprovider/mount_manager.h"
#include "smbprovider/smbprovider_test_helper.h"
#include "smbprovider/temp_file_manager.h"

namespace smbprovider {
namespace {

constexpr char kMountRoot[] = "smb://192.168.0.1/test";
constexpr char kWorkgroup[] = "domain";
constexpr char kUsername[] = "user1";
constexpr char kPassword[] = "admin";

constexpr int32_t kBufferSize = 256;
}  // namespace

class MountManagerTest : public testing::Test {
 public:
  std::unique_ptr<SambaInterface> SambaInterfaceFactoryFunction(
      FakeSambaInterface* fake_samba,
      MountManager* mount_manager,
      const MountConfig& mount_config) {
    enable_ntlm_ = mount_config.enable_ntlm;
    return std::make_unique<FakeSambaProxy>(fake_samba);
  }

  MountManagerTest() {
    auto tick_clock = std::make_unique<base::SimpleTestTickClock>();

    auto mount_tracker = std::make_unique<MountTracker>(
        std::move(tick_clock), false /* metadata_cache_enabled */);

    auto fake_samba_ = std::make_unique<FakeSambaInterface>();
    auto samba_interface_factory =
        base::Bind(&MountManagerTest::SambaInterfaceFactoryFunction,
                   base::Unretained(this), fake_samba_.get());

    mounts_ = std::make_unique<MountManager>(
        std::move(mount_tracker), std::move(samba_interface_factory));
  }

  ~MountManagerTest() override = default;

  bool AddMount(const std::string& root_path, int32_t* mount_id) {
    return AddMount(root_path, SmbCredential(), mount_id);
  }

  bool AddMount(const std::string& root_path,
                SmbCredential credential,
                int32_t* mount_id) {
    return mounts_->AddMount(root_path, std::move(credential),
                             MountConfig(true /* enable_ntlm */), mount_id);
  }

  bool AddMountWithMountConfig(const std::string& root_path,
                               SmbCredential credential,
                               const MountConfig& mount_config,
                               int32_t* mount_id) {
    return mounts_->AddMount(root_path, std::move(credential), mount_config,
                             mount_id);
  }

  bool Remount(const std::string& root_path, int32_t mount_id) {
    return Remount(root_path, mount_id, SmbCredential());
  }

  bool Remount(const std::string& root_path,
               int32_t mount_id,
               SmbCredential credential) {
    return mounts_->Remount(root_path, mount_id, std::move(credential),
                            MountConfig(true /* enable_ntlm */));
  }

  bool RemountWithMountConfig(const std::string& root_path,
                              SmbCredential credential,
                              const MountConfig& mount_config,
                              int32_t mount_id) {
    return mounts_->Remount(root_path, mount_id, std::move(credential),
                            mount_config);
  }

  void ExpectCredentialsEqual(int32_t mount_id,
                              const std::string& root_path,
                              const std::string& workgroup,
                              const std::string& username,
                              const std::string& password) {
    smbprovider::ExpectCredentialsEqual(mounts_.get(), mount_id, root_path,
                                        workgroup, username, password);
  }

  SmbCredential CreateCredential(const std::string& workgroup,
                                 const std::string& username,
                                 const std::string& password) {
    base::ScopedFD password_fd = WritePasswordToFile(&temp_files_, password);
    return SmbCredential(workgroup, username, GetPassword(password_fd));
  }

 protected:
  bool GetRootPath(int32_t mount_id, std::string* mount_path) const {
    return mounts_->GetFullPath(mount_id, "" /* entry_path */, mount_path);
  }

  std::unique_ptr<MountManager> mounts_;
  TempFileManager temp_files_;
  bool enable_ntlm_ = false;

 private:
  DISALLOW_COPY_AND_ASSIGN(MountManagerTest);
};

TEST_F(MountManagerTest, TestEmptyManager) {
  // Verify the state of an empty |MountManager|
  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(mounts_->RemoveMount(0 /* mount_id */));
  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(mounts_->IsAlreadyMounted(0 /* mount_id */));

  std::string full_path;
  EXPECT_FALSE(mounts_->GetFullPath(0 /* mount_id */, "foo.txt", &full_path));
}

TEST_F(MountManagerTest, TestAddRemoveMount) {
  // Add a new mount.
  const std::string root_path = "smb://server/share";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  // Verify the mount was added with a valid id.
  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  // Verify the mount can be removed.
  EXPECT_TRUE(mounts_->RemoveMount(mount_id));
  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(mounts_->IsAlreadyMounted(mount_id));
}

TEST_F(MountManagerTest, TestAddThenRemoveWrongMount) {
  // Add a new mount.
  const std::string root_path = "smb://server/share";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  // Verify RemoveMount fails with an invalid id and nothing is removed.
  const int32_t invalid_mount_id = mount_id + 1;
  EXPECT_FALSE(mounts_->IsAlreadyMounted(invalid_mount_id));
  EXPECT_FALSE(mounts_->RemoveMount(invalid_mount_id));
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  // Verify the valid id can still be removed.
  EXPECT_TRUE(mounts_->RemoveMount(mount_id));
  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(mounts_->IsAlreadyMounted(mount_id));
}

TEST_F(MountManagerTest, TestAddRemoveMultipleMounts) {
  // For this test it doesn't matter if the same root is used for both
  // mounts.
  const std::string root_path1 = "smb://server/share1";
  const std::string root_path2 = "smb://server/share2";

  // Add two mounts and verify they were both added.
  int32_t mount_id_1;
  int32_t mount_id_2;

  EXPECT_TRUE(AddMount(root_path1, &mount_id_1));
  EXPECT_TRUE(AddMount(root_path2, &mount_id_2));

  EXPECT_EQ(2, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id_1));
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id_2));

  // Verify the ids are valid and different.
  EXPECT_GE(mount_id_1, 0);
  EXPECT_GE(mount_id_2, 0);
  EXPECT_NE(mount_id_1, mount_id_2);

  // Remove the second id, verify it is removed, and the first remains.
  EXPECT_TRUE(mounts_->RemoveMount(mount_id_2));
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_FALSE(mounts_->IsAlreadyMounted(mount_id_2));
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id_1));

  // Remove the first id and verify it is also removed.
  EXPECT_TRUE(mounts_->RemoveMount(mount_id_1));
  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(mounts_->IsAlreadyMounted(mount_id_1));
}

TEST_F(MountManagerTest, TestGetFullPath) {
  // Add a new mount.
  const std::string root_path = "smb://server/share";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  // Verify the full path is as expected.
  const std::string entry_path = "/foo/bar";
  const std::string expected_full_path = root_path + entry_path;
  std::string actual_full_path;
  EXPECT_TRUE(mounts_->GetFullPath(mount_id, entry_path, &actual_full_path));
  EXPECT_EQ(expected_full_path, actual_full_path);
}

TEST_F(MountManagerTest, TestGetCacheNoMounts) {
  MetadataCache* cache = nullptr;

  EXPECT_FALSE(mounts_->GetMetadataCache(0, &cache));
}

TEST_F(MountManagerTest, TestGetCache) {
  int32_t mount_id;
  EXPECT_TRUE(AddMount("smb://server/share", &mount_id));

  MetadataCache* cache = nullptr;
  EXPECT_TRUE(mounts_->GetMetadataCache(mount_id, &cache));
  EXPECT_NE(nullptr, cache);
}

TEST_F(MountManagerTest, TestGetCacheForInvalidMount) {
  int32_t mount_id;
  EXPECT_TRUE(AddMount("smb://server/share", &mount_id));

  // mount_id + 1 does not exist.
  MetadataCache* cache = nullptr;
  EXPECT_FALSE(mounts_->GetMetadataCache(mount_id + 1, &cache));
}

TEST_F(MountManagerTest, TestGetFullPathWithInvalidId) {
  // Add a new mount.
  const std::string root_path = "smb://server/share";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  // Verify calling GetFullPath() with an invalid id fails.
  const int32_t invalid_mount_id = mount_id + 1;
  EXPECT_FALSE(mounts_->IsAlreadyMounted(invalid_mount_id));
  std::string full_path;
  EXPECT_FALSE(mounts_->GetFullPath(invalid_mount_id, "/foo/bar", &full_path));
}

TEST_F(MountManagerTest, TestGetFullPathMultipleMounts) {
  // Add two mounts with different roots.
  const std::string root_path_1 = "smb://server/share1";
  const std::string root_path_2 = "smb://server/share2";
  ASSERT_NE(root_path_1, root_path_2);
  int32_t mount_id_1;
  int32_t mount_id_2;

  EXPECT_TRUE(AddMount(root_path_1, &mount_id_1));
  EXPECT_TRUE(AddMount(root_path_2, &mount_id_2));

  // Verify correct ids map to the correct paths.
  std::string actual_full_path;
  const std::string entry_path = "/foo/bar";
  const std::string expected_full_path_1 = root_path_1 + entry_path;
  const std::string expected_full_path_2 = root_path_2 + entry_path;
  EXPECT_TRUE(mounts_->GetFullPath(mount_id_1, entry_path, &actual_full_path));
  EXPECT_EQ(expected_full_path_1, actual_full_path);
  EXPECT_TRUE(mounts_->GetFullPath(mount_id_2, entry_path, &actual_full_path));
  EXPECT_EQ(expected_full_path_2, actual_full_path);
}

TEST_F(MountManagerTest, TestGetRelativePath) {
  const std::string root_path = "smb://server/share1";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  const std::string full_path = "smb://server/share1/animals/dog.jpg";
  const std::string expected_relative_path = "/animals/dog.jpg";

  EXPECT_EQ(expected_relative_path,
            mounts_->GetRelativePath(mount_id, full_path));
}

TEST_F(MountManagerTest, TestGetRelativePathOnRoot) {
  const std::string root_path = "smb://server/share1";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  const std::string full_path = "smb://server/share1/";
  const std::string expected_relative_path = "/";

  EXPECT_EQ(expected_relative_path,
            mounts_->GetRelativePath(mount_id, full_path));
}

TEST_F(MountManagerTest, TestRemountSucceeds) {
  const std::string root_path = "smb://server/share1";
  const int32_t mount_id = 9;

  EXPECT_TRUE(Remount(root_path, mount_id));
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));
}

TEST_F(MountManagerTest, TestRemountSucceedsWithSameMount) {
  const std::string root_path = "smb://server/share1";
  const int32_t mount_id = 9;

  EXPECT_TRUE(Remount(root_path, mount_id));
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  const int32_t mount_id2 = 10;
  EXPECT_TRUE(Remount(root_path, mount_id2));
}

TEST_F(MountManagerTest, TestMountAfterRemounts) {
  const std::string root_path_1 = "smb://server/share1";
  const int32_t mount_id_1 = 9;

  const std::string root_path_2 = "smb://server/share2";
  const int32_t mount_id_2 = 4;

  const std::string new_root_path = "smb://server/share3";

  EXPECT_TRUE(Remount(root_path_1, mount_id_1));
  EXPECT_TRUE(Remount(root_path_2, mount_id_2));

  EXPECT_EQ(2, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id_1));
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id_2));

  int32_t mount_id_3;

  EXPECT_TRUE(AddMount(new_root_path, &mount_id_3));
  EXPECT_EQ(3, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id_3));
  EXPECT_GT(mount_id_3, mount_id_1);
}

TEST_F(MountManagerTest, TestAddMountWithCredential) {
  const std::string root_path = "smb://server/share1";
  const std::string workgroup = "google";
  const std::string username = "user1";
  const std::string password = "admin";
  int32_t mount_id;

  SmbCredential credential = CreateCredential(workgroup, username, password);
  EXPECT_TRUE(AddMount(root_path, std::move(credential), &mount_id));

  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  ExpectCredentialsEqual(mount_id, root_path, workgroup, username, password);
}

TEST_F(MountManagerTest, TestAddMountWithEmptyCredential) {
  const std::string root_path = "smb://server/share1";
  const std::string workgroup = "";
  const std::string username = "";
  const std::string password = "";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));

  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));
  ExpectCredentialsEqual(mount_id, root_path, workgroup, username, password);
}

TEST_F(MountManagerTest, TestAddMountWithoutWorkgroup) {
  const std::string root_path = "smb://server/share1";
  const std::string workgroup = "";
  const std::string username = "user1";
  const std::string password = "admin";
  int32_t mount_id;

  SmbCredential credential = CreateCredential(workgroup, username, password);

  EXPECT_TRUE(AddMount(root_path, std::move(credential), &mount_id));

  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  ExpectCredentialsEqual(mount_id, root_path, workgroup, username, password);
}

TEST_F(MountManagerTest, TestAddMountWithEmptyPassword) {
  const std::string root_path = "smb://server/share1";
  const std::string workgroup = "google";
  const std::string username = "user1";
  const std::string password = "";
  int32_t mount_id;

  SmbCredential credential = CreateCredential(workgroup, username, password);
  EXPECT_TRUE(AddMount(root_path, std::move(credential), &mount_id));

  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  ExpectCredentialsEqual(mount_id, root_path, workgroup, username, password);
}

TEST_F(MountManagerTest, TestAddSameMount) {
  const std::string workgroup2 = "workgroup2";
  const std::string username2 = "user2";
  const std::string password2 = "root2";
  int32_t mount_id;

  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential), &mount_id));

  EXPECT_EQ(1, mounts_->MountCount());

  SmbCredential credential2 =
      CreateCredential(workgroup2, username2, password2);

  int32_t mount_id2;
  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential2), &mount_id2));
  EXPECT_EQ(2, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id2));

  ExpectCredentialsEqual(mount_id, kMountRoot, kWorkgroup, kUsername,
                         kPassword);
  ExpectCredentialsEqual(mount_id2, kMountRoot, workgroup2, username2,
                         password2);
  EXPECT_NE(mount_id, mount_id2);
}

TEST_F(MountManagerTest, TestRemountWithSamePath) {
  const std::string root_path = "smb://server/share1";

  EXPECT_TRUE(Remount(root_path, 1 /* mount_id */));
  EXPECT_TRUE(Remount(root_path, 2 /* mount_id */));
}

TEST_F(MountManagerTest, TestRemovedMountCanBeRemounted) {
  const std::string root_path = "smb://server/share1";
  int32_t mount_id;

  EXPECT_TRUE(AddMount(root_path, &mount_id));
  EXPECT_TRUE(mounts_->RemoveMount(mount_id));

  // Should be able to be remounted again.
  EXPECT_TRUE(AddMount(root_path, &mount_id));
}

TEST_F(MountManagerTest, TestRemountWithCredential) {
  const std::string root_path = "smb://server/share1";
  const std::string workgroup = "google";
  const std::string username = "user1";
  const std::string password = "admin";
  const int32_t mount_id = 1;

  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(mounts_->IsAlreadyMounted(mount_id));

  SmbCredential credential = CreateCredential(workgroup, username, password);

  EXPECT_TRUE(Remount(root_path, mount_id, std::move(credential)));

  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  ExpectCredentialsEqual(mount_id, root_path, workgroup, username, password);
}

TEST_F(MountManagerTest, TestReturnsEmptyPasswordWithInvalidFd) {
  std::unique_ptr<password_provider::Password> password =
      GetPassword(base::ScopedFD());
  EXPECT_FALSE(password);
}

TEST_F(MountManagerTest, TestReturnsEmptyPasswordWithEmptyPassword) {
  base::ScopedFD password_fd =
      WritePasswordToFile(&temp_files_, "" /* password */);
  EXPECT_TRUE(password_fd.is_valid());

  // password_fd should be false since the password was empty.
  std::unique_ptr<password_provider::Password> password =
      GetPassword(password_fd);
  EXPECT_FALSE(password);
}

TEST_F(MountManagerTest, TestPasswordLengthHeaderLongerThanContent) {
  const std::string password = "a";
  const size_t password_length = 8;

  std::vector<uint8_t> password_data(sizeof(password_length) + password.size());

  std::memcpy(password_data.data(), &password_length, sizeof(password_length));
  std::memcpy(password_data.data() + sizeof(password_length), password.c_str(),
              password.size());

  base::ScopedFD password_fd = temp_files_.CreateTempFile(password_data);
  std::unique_ptr<password_provider::Password> password_ptr =
      GetPassword(password_fd);

  // password_ptr should be false since length header of password_data exceeds
  // the size of the password string.
  EXPECT_FALSE(password_ptr);
}

TEST_F(MountManagerTest, TestEmptyPasswordFile) {
  base::ScopedFD password_fd = temp_files_.CreateTempFile();

  std::unique_ptr<password_provider::Password> password_ptr =
      GetPassword(password_fd);

  // password_ptr should be false since empty_password has no data.
  EXPECT_FALSE(password_ptr);
}

TEST_F(MountManagerTest, TestGetPasswordGetsValidPassword) {
  const std::string password = "test123";
  base::ScopedFD password_fd = WritePasswordToFile(&temp_files_, password);
  EXPECT_TRUE(password_fd.is_valid());

  std::unique_ptr<password_provider::Password> password_ptr =
      GetPassword(password_fd);
  EXPECT_TRUE(password_ptr);

  EXPECT_EQ(password_ptr->size(), password.size());
  EXPECT_EQ(std::string(password_ptr->GetRaw()), password);
}

TEST_F(MountManagerTest, TestBufferNullTerminatedWhenLengthTooSmall) {
  int32_t mount_id;

  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential), &mount_id));
  EXPECT_EQ(1, mounts_->MountCount());

  // Initialize buffers with 1.
  char workgroup_buffer[kBufferSize] = {1};
  char username_buffer[kBufferSize] = {1};
  char password_buffer[kBufferSize] = {1};

  SambaInterface* samba_interface = nullptr;
  EXPECT_TRUE(mounts_->GetSambaInterface(mount_id, &samba_interface));

  // Call the authentication function while passing 1 as the buffer sizes. This
  // should return false since the buffer sizes are too small.
  EXPECT_FALSE(mounts_->GetAuthentication(
      samba_interface->GetSambaInterfaceId(), kMountRoot, workgroup_buffer,
      1 /* workgroup_length */, username_buffer, 1 /* username_length */,
      password_buffer, 1 /* password_length */));

  // Buffers should be null-terminated.
  EXPECT_EQ('\0', workgroup_buffer[0]);
  EXPECT_EQ('\0', username_buffer[0]);
  EXPECT_EQ('\0', password_buffer[0]);

  EXPECT_TRUE(mounts_->RemoveMount(mount_id));
}

TEST_F(MountManagerTest, TestBufferNullTerminatedWhenNoCredsFound) {
  // Initialize buffers with 1.
  char workgroup_buffer[kBufferSize] = {1};
  char username_buffer[kBufferSize] = {1};
  char password_buffer[kBufferSize] = {1};

  // This should return false when no credential are found.
  EXPECT_FALSE(mounts_->GetAuthentication(
      -2 /* non-existing samba_interface_id */, kMountRoot, workgroup_buffer,
      kBufferSize, username_buffer, kBufferSize, password_buffer, kBufferSize));

  // Buffers should be null-terminated.
  EXPECT_EQ('\0', workgroup_buffer[0]);
  EXPECT_EQ('\0', username_buffer[0]);
  EXPECT_EQ('\0', password_buffer[0]);
}

TEST_F(MountManagerTest, TestAddingRemovingMultipleCredentials) {
  const std::string mount_root2 = "smb://192.168.0.1/share";
  const std::string workgroup2 = "workgroup2";
  const std::string username2 = "user2";
  const std::string password2 = "root";
  int32_t mount_id1;
  int32_t mount_id2;

  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  SmbCredential credential2 =
      CreateCredential(workgroup2, username2, password2);

  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential), &mount_id1));
  EXPECT_TRUE(AddMount(mount_root2, std::move(credential2), &mount_id2));

  EXPECT_EQ(2, mounts_->MountCount());

  ExpectCredentialsEqual(mount_id1, kMountRoot, kWorkgroup, kUsername,
                         kPassword);

  ExpectCredentialsEqual(mount_id2, mount_root2, workgroup2, username2,
                         password2);

  EXPECT_TRUE(mounts_->RemoveMount(mount_id1));
  EXPECT_TRUE(mounts_->RemoveMount(mount_id2));
}

TEST_F(MountManagerTest, TestRemoveCredentialFromMultiple) {
  const std::string mount_root2 = "smb://192.168.0.1/share";
  const std::string workgroup2 = "workgroup2";
  const std::string username2 = "user2";
  const std::string password2 = "root";
  int32_t mount_id1;
  int32_t mount_id2;

  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  SmbCredential credential2 =
      CreateCredential(workgroup2, username2, password2);

  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential), &mount_id1));
  EXPECT_TRUE(AddMount(mount_root2, std::move(credential2), &mount_id2));
  EXPECT_EQ(2, mounts_->MountCount());

  EXPECT_TRUE(mounts_->RemoveMount(mount_id1));

  EXPECT_EQ(1, mounts_->MountCount());

  ExpectCredentialsEqual(mount_id2, mount_root2, workgroup2, username2,
                         password2);

  EXPECT_TRUE(mounts_->RemoveMount(mount_id2));
  EXPECT_EQ(0, mounts_->MountCount());
}

TEST_F(MountManagerTest, TestEnableNTLM) {
  EXPECT_FALSE(enable_ntlm_);

  int mount_id;
  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  MountConfig mount_config(true /* enable_ntlm */);

  EXPECT_TRUE(AddMountWithMountConfig(kMountRoot, std::move(credential),
                                      mount_config, &mount_id));
  EXPECT_TRUE(enable_ntlm_);
}

TEST_F(MountManagerTest, TestDisableNTLM) {
  EXPECT_FALSE(enable_ntlm_);

  int mount_id;
  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  MountConfig mount_config(false /* enable_ntlm */);

  EXPECT_TRUE(AddMountWithMountConfig(kMountRoot, std::move(credential),
                                      mount_config, &mount_id));
  EXPECT_FALSE(enable_ntlm_);
}

TEST_F(MountManagerTest, TestRemountEnableNTLM) {
  EXPECT_FALSE(enable_ntlm_);

  int mount_id = 2;
  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  MountConfig mount_config(true /* enable_ntlm */);

  EXPECT_TRUE(RemountWithMountConfig(kMountRoot, std::move(credential),
                                     mount_config, mount_id));
  EXPECT_TRUE(enable_ntlm_);
}

TEST_F(MountManagerTest, TestRemountDisableNTLM) {
  EXPECT_FALSE(enable_ntlm_);

  int mount_id = 2;
  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  MountConfig mount_config(false /* enable_ntlm */);

  EXPECT_TRUE(RemountWithMountConfig(kMountRoot, std::move(credential),
                                     mount_config, mount_id));
  EXPECT_FALSE(enable_ntlm_);
}

TEST_F(MountManagerTest, TestUpdateMountCredentials) {
  int mount_id = 1;
  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential), &mount_id));
  EXPECT_EQ(1, mounts_->MountCount());

  ExpectCredentialsEqual(mount_id, kMountRoot, kWorkgroup, kUsername,
                         kPassword);

  const std::string workgroup2 = "updated_workgroup";
  const std::string username2 = "updated_user";
  const std::string password2 = "updated_password";

  SmbCredential credential2 =
      CreateCredential(workgroup2, username2, password2);

  EXPECT_TRUE(mounts_->UpdateMountCredential(mount_id, std::move(credential2)));

  ExpectCredentialsEqual(mount_id, kMountRoot, workgroup2, username2,
                         password2);
}

TEST_F(MountManagerTest, TestUpdateMountCredentialsOnNonExistantMount) {
  int mount_id = 999;
  const std::string workgroup2 = "updated_workgroup";
  const std::string username2 = "updated_user";
  const std::string password2 = "updated_password";
  SmbCredential credential2 =
      CreateCredential(workgroup2, username2, password2);

  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_FALSE(
      mounts_->UpdateMountCredential(mount_id, std::move(credential2)));
}

TEST_F(MountManagerTest, TestUpdateMountCredentialsOnUnmountedMount) {
  int mount_id = 1;
  SmbCredential credential = CreateCredential(kWorkgroup, kUsername, kPassword);

  EXPECT_TRUE(AddMount(kMountRoot, std::move(credential), &mount_id));
  EXPECT_EQ(1, mounts_->MountCount());

  mounts_->RemoveMount(mount_id);

  EXPECT_EQ(0, mounts_->MountCount());

  const std::string workgroup2 = "updated_workgroup";
  const std::string username2 = "updated_user";
  const std::string password2 = "updated_password";

  SmbCredential credential2 =
      CreateCredential(workgroup2, username2, password2);

  EXPECT_FALSE(
      mounts_->UpdateMountCredential(mount_id, std::move(credential2)));
}

TEST_F(MountManagerTest, TestPremountSucceeds) {
  int mount_id = -1;

  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_TRUE(mounts_->Premount(kMountRoot, MountConfig(true /* enable_ntlm */),
                                &mount_id));

  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));
}

TEST_F(MountManagerTest, TestPremountSucceedsOnExistingMount) {
  int mount_id = -1;

  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_TRUE(AddMount(kMountRoot, &mount_id));

  EXPECT_GE(mount_id, 0);
  EXPECT_EQ(1, mounts_->MountCount());
  EXPECT_TRUE(mounts_->IsAlreadyMounted(mount_id));

  int mount_id2 = -1;
  EXPECT_TRUE(mounts_->Premount(kMountRoot, MountConfig(true /* enable_ntlm */),
                                &mount_id2));
  EXPECT_GE(mount_id2, 0);
  EXPECT_NE(mount_id, mount_id2);
}

TEST_F(MountManagerTest, TestUpdateSharePathSucceeds) {
  int mount_id;

  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_TRUE(AddMount(kMountRoot, &mount_id));

  const std::string new_path = "smb://192.168.50.105/testshare";
  EXPECT_TRUE(mounts_->UpdateSharePath(mount_id, new_path));

  std::string updated_path;
  EXPECT_TRUE(GetRootPath(mount_id, &updated_path));
  EXPECT_EQ(new_path, updated_path);
}

TEST_F(MountManagerTest, TestUpdateSharePathDoesNotAddANewMount) {
  int mount_id;

  EXPECT_EQ(0, mounts_->MountCount());
  EXPECT_TRUE(AddMount(kMountRoot, &mount_id));
  EXPECT_EQ(1, mounts_->MountCount());

  const std::string new_path = "smb://192.168.50.105/testshare";
  EXPECT_TRUE(mounts_->UpdateSharePath(mount_id, new_path));

  EXPECT_EQ(1, mounts_->MountCount());
}

TEST_F(MountManagerTest, TestUpdateShareFailsOnNonExistantMount) {
  EXPECT_EQ(0, mounts_->MountCount());

  const std::string new_path = "smb://192.168.50.105/testshare";
  EXPECT_FALSE(mounts_->UpdateSharePath(999 /* mount_id */, new_path));
}

}  // namespace smbprovider
