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

#include <string>
#include <vector>

#include <gtest/gtest.h>

#include "smbprovider/fake_samba_interface.h"

namespace smbprovider {

namespace {

constexpr uint64_t kFileDate = 42;

std::string GetDefaultServer() {
  return "smb://wdshare";
}

std::string GetDefaultMountRoot() {
  return "smb://wdshare/test";
}

std::string GetDefaultDirectoryPath() {
  return "smb://wdshare/test/path";
}

std::string GetDefaultFilePath() {
  return "smb://wdshare/test/dog.jpg";
}

}  // namespace

class FakeSambaTest : public testing::Test {
 public:
  FakeSambaTest() {
    fake_samba_.AddDirectory(GetDefaultServer());
    fake_samba_.AddDirectory(GetDefaultMountRoot());
  }
  ~FakeSambaTest() = default;

  FakeSambaInterface fake_samba_;

 private:
  DISALLOW_COPY_AND_ASSIGN(FakeSambaTest);
};

TEST_F(FakeSambaTest, FileEqualReturnsFalseOnFileThatDoesntExist) {
  EXPECT_FALSE(fake_samba_.IsFileDataEqual("smb://wdshare/invalid.jpg",
                                           std::vector<uint8_t>()));
}

TEST_F(FakeSambaTest, FileEqualReturnsFalseOnDirectory) {
  fake_samba_.AddDirectory(GetDefaultDirectoryPath());
  EXPECT_FALSE(fake_samba_.IsFileDataEqual(GetDefaultDirectoryPath(),
                                           std::vector<uint8_t>()));
}

TEST_F(FakeSambaTest, FileEqualReturnsFalseOnFileWithNoData) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Should be false even if we pass in an empty vector.
  EXPECT_FALSE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(),
                                           std::vector<uint8_t>()));
}

TEST_F(FakeSambaTest, FileEqualReturnsFalseOnUnequalData) {
  const std::vector<uint8_t> file_data = {0};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);

  // Provide vector with different data.
  const std::vector<uint8_t> other_data = {1};
  EXPECT_FALSE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), other_data));
}

TEST_F(FakeSambaTest, FileEqualReturnsFalseOnSamePrefix) {
  const std::vector<uint8_t> file_data = {0, 1, 2};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);

  // Provide vector with different data but same prefix.
  const std::vector<uint8_t> other_data = {0, 1, 2, 3};
  EXPECT_FALSE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), other_data));
}

TEST_F(FakeSambaTest, FileEqualReturnsFalseOnSamePrefix2) {
  const std::vector<uint8_t> file_data = {0, 1, 2, 3};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);

  // Provide vector with different data but same prefix.
  const std::vector<uint8_t> other_data = {0, 1, 2};
  EXPECT_FALSE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), other_data));
}

TEST_F(FakeSambaTest, FileEqualReturnsTrueOnEmptyData) {
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, std::vector<uint8_t>());

  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(),
                                          std::vector<uint8_t>()));
}

TEST_F(FakeSambaTest, FileEqualReturnsTrueOnEqualData) {
  const std::vector<uint8_t> file_data = {0, 1, 2, 3};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);

  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), file_data));
}

TEST_F(FakeSambaTest, OpenFileOpensFileWithZeroSizeAndZeroOffset) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Verify that the offset and size is zero.
  EXPECT_EQ(0, fake_samba_.GetFileSize(GetDefaultFilePath()));
  EXPECT_EQ(0, fake_samba_.GetFileOffset(file_id));
}

TEST_F(FakeSambaTest, SeekCorrectlyChangesOffset) {
  std::vector<uint8_t> file_data = {0, 1, 2, 3, 4, 5};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Change the offset and verify it changed.
  int64_t new_offset = 2;
  EXPECT_EQ(0, fake_samba_.Seek(file_id, new_offset));
  EXPECT_EQ(new_offset, fake_samba_.GetFileOffset(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldFailIfDirectory) {
  fake_samba_.AddDirectory(GetDefaultDirectoryPath());

  // Open directory.
  int32_t dir_id;
  EXPECT_EQ(0, fake_samba_.OpenDirectory(GetDefaultDirectoryPath(), &dir_id));

  // Should fail writing any data to the directory.
  const std::vector<uint8_t> new_data = {'x'};
  EXPECT_EQ(EISDIR,
            fake_samba_.WriteFile(dir_id, new_data.data(), new_data.size()));

  EXPECT_EQ(0, fake_samba_.CloseDirectory(dir_id));
}

TEST_F(FakeSambaTest, WriteFileShouldFailIfNotWriteable) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Open the file with READ_ONLY permissions.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDONLY, &file_id));

  // Should fail writing any data to the file.
  const std::vector<uint8_t> new_data = {'x'};
  EXPECT_EQ(EINVAL,
            fake_samba_.WriteFile(file_id, new_data.data(), new_data.size()));

  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldChangeOffset) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Write the data into the file.
  const std::vector<uint8_t> new_data = {0, 1, 2, 3, 4, 5};
  EXPECT_EQ(0,
            fake_samba_.WriteFile(file_id, new_data.data(), new_data.size()));

  // Offset should be at the end of the written data + offset (which in this
  // case is 0).
  EXPECT_EQ(new_data.size(), fake_samba_.GetFileOffset(file_id));

  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldWriteCorrectDataWithReadWrite) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Write the data into the file.
  const std::vector<uint8_t> new_data = {0, 1, 2, 3, 4, 5};
  EXPECT_EQ(0,
            fake_samba_.WriteFile(file_id, new_data.data(), new_data.size()));

  // Read the contents of the file.
  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), new_data));
  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldWriteCorrectDataWithWriteOnly) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_WRONLY, &file_id));

  // Write the data into the file.
  const std::vector<uint8_t> new_data = {0, 1, 2, 3, 4, 5};
  EXPECT_EQ(0,
            fake_samba_.WriteFile(file_id, new_data.data(), new_data.size()));

  // Read the contents of the file.
  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), new_data));
  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldWriteFromOffset) {
  std::vector<uint8_t> file_data = {0, 1, 2, 3, 4, 5};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Change the offset to 1.
  EXPECT_EQ(0, fake_samba_.Seek(file_id, 1));

  // Write the data into the file.
  const std::vector<uint8_t> new_data = {'a', 'b'};
  EXPECT_EQ(0,
            fake_samba_.WriteFile(file_id, new_data.data(), new_data.size()));

  // Validate that the data read is the same as expected.
  const std::vector<uint8_t> expected = {0, 'a', 'b', 3, 4, 5};
  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), expected));

  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldWriteToLargerSize) {
  std::vector<uint8_t> file_data = {0, 1, 2, 3};
  fake_samba_.AddFile(GetDefaultFilePath(), kFileDate, file_data);
  EXPECT_EQ(file_data.size(), fake_samba_.GetFileSize(GetDefaultFilePath()));

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Write the data into the file.
  const std::vector<uint8_t> new_data = {5, 6, 7, 8, 9, 9, 9, 9};
  EXPECT_EQ(0, fake_samba_.GetFileOffset(file_id));
  EXPECT_EQ(0,
            fake_samba_.WriteFile(file_id, new_data.data(), new_data.size()));

  // Validate that the data read is the same as expected.
  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), new_data));

  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, WriteFileShouldWriteTwice) {
  fake_samba_.AddFile(GetDefaultFilePath());

  // Open the file to get a file_id.
  int32_t file_id;
  EXPECT_EQ(0, fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));

  // Do the first write.
  const std::vector<uint8_t> data1 = {1, 2, 3, 4};
  EXPECT_EQ(0, fake_samba_.GetFileOffset(file_id));
  EXPECT_EQ(0, fake_samba_.WriteFile(file_id, data1.data(), data1.size()));

  // Do the second write.
  const std::vector<uint8_t> data2 = {'a', 'b', 'c', 'd'};
  EXPECT_EQ(data1.size(), fake_samba_.GetFileOffset(file_id));
  EXPECT_EQ(0, fake_samba_.WriteFile(file_id, data2.data(), data2.size()));

  // Size of the data should be equal to the expected data.
  const std::vector<uint8_t> expected_data = {1, 2, 3, 4, 'a', 'b', 'c', 'd'};

  // Validate that the data read is the same as expected.
  EXPECT_TRUE(fake_samba_.IsFileDataEqual(GetDefaultFilePath(), expected_data));

  EXPECT_EQ(0, fake_samba_.CloseFile(file_id));
}

TEST_F(FakeSambaTest, CreateDirectoryFailsOnMissingParentDir) {
  EXPECT_EQ(ENOENT,
            fake_samba_.CreateDirectory("smb://wdshare/test/invalid/path"));
}

TEST_F(FakeSambaTest, CreateDirectoryFailsOnExistingDir) {
  fake_samba_.AddDirectory(GetDefaultDirectoryPath());
  EXPECT_EQ(EEXIST, fake_samba_.CreateDirectory(GetDefaultDirectoryPath()));
}

TEST_F(FakeSambaTest, CreateDirectoryFailsOnExistingFile) {
  fake_samba_.AddFile(GetDefaultFilePath());
  EXPECT_EQ(EEXIST, fake_samba_.CreateDirectory(GetDefaultFilePath()));
}

TEST_F(FakeSambaTest, CreateDirectorySucceedsOnValidPath) {
  EXPECT_EQ(0, fake_samba_.CreateDirectory(GetDefaultDirectoryPath()));
}

TEST_F(FakeSambaTest, UnlinkFailsOnLockedFile) {
  fake_samba_.AddLockedFile(GetDefaultFilePath());

  EXPECT_EQ(EACCES, fake_samba_.Unlink(GetDefaultFilePath()));
}

TEST_F(FakeSambaTest, RemoveDirectoryFailsOnLockedDirectory) {
  fake_samba_.AddLockedDirectory(GetDefaultDirectoryPath());

  EXPECT_EQ(EACCES, fake_samba_.RemoveDirectory(GetDefaultDirectoryPath()));
}

TEST_F(FakeSambaTest, OpenDirectoryFailsOnLockedDirectory) {
  fake_samba_.AddLockedDirectory(GetDefaultDirectoryPath());

  int32_t dir_id;
  EXPECT_EQ(EACCES,
            fake_samba_.OpenDirectory(GetDefaultDirectoryPath(), &dir_id));
  EXPECT_EQ(-1, dir_id);
}

TEST_F(FakeSambaTest, GetEntryStatusFailsOnLockedEntries) {
  fake_samba_.AddLockedDirectory(GetDefaultDirectoryPath());
  fake_samba_.AddLockedFile(GetDefaultFilePath());

  struct stat stat_info;
  EXPECT_EQ(EACCES,
            fake_samba_.GetEntryStatus(GetDefaultDirectoryPath(), &stat_info));
  EXPECT_EQ(EACCES,
            fake_samba_.GetEntryStatus(GetDefaultFilePath(), &stat_info));
}

TEST_F(FakeSambaTest, OpenFileFailsOnLockedFile) {
  fake_samba_.AddLockedFile(GetDefaultFilePath());

  int32_t file_id;
  EXPECT_EQ(EACCES,
            fake_samba_.OpenFile(GetDefaultFilePath(), O_RDWR, &file_id));
}

// Deleting an entry before the current entry does not move the current entry.
TEST_F(FakeSambaTest, DeleteBeforeCurrent) {
  fake_samba_.AddDirectory("smb://wdshare/test/path");
  fake_samba_.AddFile("smb://wdshare/test/path/dog.jpg");
  fake_samba_.AddFile("smb://wdshare/test/path/cat.txt");
  fake_samba_.AddFile("smb://wdshare/test/path/mouse.txt");

  int32_t dir_id;
  EXPECT_EQ(0, fake_samba_.OpenDirectory("smb://wdshare/test/path", &dir_id));
  fake_samba_.SetCurrentEntry(dir_id, 1);
  EXPECT_EQ("cat.txt", fake_samba_.GetCurrentEntry(dir_id));

  EXPECT_EQ(0, fake_samba_.Unlink("smb://wdshare/test/path/dog.jpg"));
  EXPECT_EQ("cat.txt", fake_samba_.GetCurrentEntry(dir_id));
}

// Deleting an entry after the current entry does not move the current entry.
TEST_F(FakeSambaTest, DeleteAfterCurrent) {
  fake_samba_.AddDirectory("smb://wdshare/test/path");
  fake_samba_.AddFile("smb://wdshare/test/path/dog.jpg");
  fake_samba_.AddFile("smb://wdshare/test/path/cat.txt");
  fake_samba_.AddFile("smb://wdshare/test/path/mouse.txt");

  int32_t dir_id;
  EXPECT_EQ(0, fake_samba_.OpenDirectory("smb://wdshare/test/path", &dir_id));
  fake_samba_.SetCurrentEntry(dir_id, 1);
  EXPECT_EQ("cat.txt", fake_samba_.GetCurrentEntry(dir_id));

  EXPECT_EQ(0, fake_samba_.Unlink("smb://wdshare/test/path/mouse.txt"));
  EXPECT_EQ("cat.txt", fake_samba_.GetCurrentEntry(dir_id));
}

TEST_F(FakeSambaTest, MoveEntryFailsWhenSrcIsNotDirAndTargetIsDir) {
  const std::string file_path = "smb://wdshare/test/dog.jpg";
  const std::string dir_path = "smb://wdshare/test/cats";

  fake_samba_.AddFile(file_path);
  fake_samba_.AddDirectory(dir_path);

  EXPECT_EQ(EISDIR, fake_samba_.MoveEntry(file_path, dir_path));
}

TEST_F(FakeSambaTest, MoveEntryFailsWhenSrcIsDirAndTargetIsNonEmptyDir) {
  const std::string src_dir_path = "smb://wdshare/test/cats";
  const std::string dst_dir_path = "smb://wdshare/test/dogs";

  fake_samba_.AddDirectory(src_dir_path);
  fake_samba_.AddDirectory(dst_dir_path);
  fake_samba_.AddFile(dst_dir_path + "/dog1.jpg");

  EXPECT_EQ(EEXIST, fake_samba_.MoveEntry(src_dir_path, dst_dir_path));
}

TEST_F(FakeSambaTest, MoveEntryFailsWhenSrcIsFileAndDstIsExistingFile) {
  const std::string src_path = "smb://wdshare/test/dog.jpg";
  const std::string dst_path = "smb://wdshare/test/cat.txt";

  fake_samba_.AddFile(src_path);
  fake_samba_.AddFile(dst_path);

  EXPECT_EQ(EEXIST, fake_samba_.MoveEntry(src_path, dst_path));
}

// MoveEntry should fail when attempting to make a directory a subdirectory of
// itself.
TEST_F(FakeSambaTest, MoveEntryFailsWhenDstIsSubDirectoryOfSrc) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");

  EXPECT_EQ(EINVAL, fake_samba_.MoveEntry("smb://wdshare/test/dogs",
                                          "smb://wdshare/test/dogs/cats"));
}

TEST_F(FakeSambaTest, MoveEntryFailsWhenSrcIsDirAndDstExistsAndIsFile) {
  const std::string file_path = "smb://wdshare/test/dog.jpg";
  const std::string dir_path = "smb://wdshare/test/cats";

  fake_samba_.AddFile(file_path);
  fake_samba_.AddDirectory(dir_path);

  EXPECT_EQ(ENOTDIR, fake_samba_.MoveEntry(dir_path, file_path));
}

TEST_F(FakeSambaTest, MoveEntryFailsWhenDstParentIsLocked) {
  fake_samba_.AddFile("smb://wdshare/test/dog.jpg");
  fake_samba_.AddLockedDirectory("smb://wdshare/test/locked");

  EXPECT_EQ(EACCES, fake_samba_.MoveEntry("smb://wdshare/test/dog.jpg",
                                          "smb://wdshare/test/locked/dog.jpg"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyRenamesDirectory) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/dogs",
                                     "smb://wdshare/test/cats"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/cats"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyRenamesDirectoryWithAppendedPath) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/dogs",
                                     "smb://wdshare/test/dogs123"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/dogs123"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyMovesEmptyDirectoryIntoDirectory) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");
  fake_samba_.AddDirectory("smb://wdshare/test/cats");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/dogs",
                                     "smb://wdshare/test/cats/dogs"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/cats/dogs"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyMovesNonEmptryDirectory) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");
  fake_samba_.AddFile("smb://wdshare/test/dogs/1.jpg");
  fake_samba_.AddDirectory("smb://wdshare/test/cats");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/dogs",
                                     "smb://wdshare/test/cats/dogs"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs"));
  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs/1.jpg"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/cats/dogs"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/cats/dogs/1.jpg"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyMovesFileIntoDirectory) {
  fake_samba_.AddFile("smb://wdshare/test/1.jpg");
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/1.jpg",
                                     "smb://wdshare/test/dogs/1.jpg"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/1.jpg"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/dogs/1.jpg"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyRenamesFile) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");
  fake_samba_.AddFile("smb://wdshare/test/dogs/1.txt");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/dogs/1.txt",
                                     "smb://wdshare/test/dogs/2.jpg"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs/1.txt"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/dogs/2.jpg"));
}

TEST_F(FakeSambaTest, MoveEntrySuccessfullyRenamesFileIntoDirectory) {
  fake_samba_.AddDirectory("smb://wdshare/test/dogs");
  fake_samba_.AddDirectory("smb://wdshare/test/cats");
  fake_samba_.AddFile("smb://wdshare/test/dogs/1.txt");

  EXPECT_EQ(0, fake_samba_.MoveEntry("smb://wdshare/test/dogs/1.txt",
                                     "smb://wdshare/test/cats/2.jpg"));

  EXPECT_FALSE(fake_samba_.EntryExists("smb://wdshare/test/dogs/1.txt"));
  EXPECT_TRUE(fake_samba_.EntryExists("smb://wdshare/test/cats/2.jpg"));
}

TEST_F(FakeSambaTest, MoveEntryFailsToMoveLockedDirectory) {
  fake_samba_.AddLockedDirectory("smb://wdshare/test/dogs");
  fake_samba_.AddDirectory("smb://wdshare/test/cats");

  EXPECT_EQ(EACCES, fake_samba_.MoveEntry("smb://wdshare/test/dogs",
                                          "smb://wdshare/test/cats/dogs"));
}

}  // namespace smbprovider
