| // Copyright 2018 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include <memory> | |
| #include <string> | |
| #include <vector> | |
| #include <gtest/gtest.h> | |
| #include "smbprovider/fake_samba_interface.h" | |
| #include "smbprovider/recursive_copy_progress.h" | |
| #include "smbprovider/smbprovider_test_helper.h" | |
| namespace smbprovider { | |
| class RecursiveCopyProgressTest : public testing::Test { | |
| public: | |
| RecursiveCopyProgressTest() { | |
| fake_samba_ = std::make_unique<FakeSambaInterface>(); | |
| } | |
| RecursiveCopyProgressTest(const RecursiveCopyProgressTest&) = delete; | |
| RecursiveCopyProgressTest& operator=(const RecursiveCopyProgressTest&) = | |
| delete; | |
| ~RecursiveCopyProgressTest() override = default; | |
| protected: | |
| // Creates a share at smb://wdshare/test | |
| void PrepareFileSystem() { | |
| fake_samba_->AddDirectory(GetDefaultServer()); | |
| fake_samba_->AddDirectory(GetDefaultMountRoot()); | |
| } | |
| std::unique_ptr<FakeSambaInterface> fake_samba_; | |
| }; | |
| TEST_F(RecursiveCopyProgressTest, CopyFailsWhenSourceDoesNotExist) { | |
| const std::string source_path = GetDefaultFullPath("non_existent_source_dir"); | |
| const std::string target_path = GetDefaultFullPath("target"); | |
| PrepareFileSystem(); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_EQ(ENOENT, error); | |
| } | |
| TEST_F(RecursiveCopyProgressTest, CopyFailsWhenTargetExists) { | |
| const std::string source_path = GetDefaultFullPath("source_dir"); | |
| const std::string target_path = GetDefaultFullPath("target"); | |
| PrepareFileSystem(); | |
| fake_samba_->AddDirectory(source_path); | |
| fake_samba_->AddDirectory(target_path); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_EQ(EEXIST, error); | |
| } | |
| TEST_F(RecursiveCopyProgressTest, RecursiveCopyFailsOnFile) { | |
| const std::string source_path = GetDefaultFullPath("source_dir"); | |
| const std::string target_path = GetDefaultFullPath("target_dir"); | |
| PrepareFileSystem(); | |
| fake_samba_->AddFile(source_path); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_EQ(ENOTDIR, error); | |
| } | |
| TEST_F(RecursiveCopyProgressTest, RecursiveCopySucceedsOnEmptyDirectory) { | |
| const std::string source_path = GetDefaultFullPath("source_dir"); | |
| const std::string target_path = GetDefaultFullPath("target_dir"); | |
| PrepareFileSystem(); | |
| fake_samba_->AddDirectory(source_path); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_EQ(0, error); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path)); | |
| } | |
| TEST_F(RecursiveCopyProgressTest, RecursiveCopySucceedsOnNestedDirs) { | |
| const std::string source_path = GetDefaultFullPath("source_dir"); | |
| const std::string source_path_2 = GetDefaultFullPath("source_dir/inner"); | |
| const std::string target_path = GetDefaultFullPath("target_dir"); | |
| const std::string target_path_2 = GetDefaultFullPath("target_dir/inner"); | |
| PrepareFileSystem(); | |
| fake_samba_->AddDirectory(source_path); | |
| fake_samba_->AddDirectory(source_path_2); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_TRUE(should_continue_copy); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path)); | |
| should_continue_copy = recursive_copy_progress.ContinueCopy(&error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_EQ(0, error); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path_2)); | |
| } | |
| TEST_F(RecursiveCopyProgressTest, RecursiveCopySucceedsOnSingleFileInDir) { | |
| const std::string source_path = GetDefaultFullPath("source_dir"); | |
| const std::string source_path_2 = GetDefaultFullPath("source_dir/inner"); | |
| const std::string target_path = GetDefaultFullPath("target_dir"); | |
| const std::string target_path_2 = GetDefaultFullPath("target_dir/inner"); | |
| PrepareFileSystem(); | |
| fake_samba_->AddDirectory(source_path); | |
| fake_samba_->AddFile(source_path_2); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_TRUE(should_continue_copy); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path)); | |
| should_continue_copy = recursive_copy_progress.ContinueCopy(&error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_EQ(0, error); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path_2)); | |
| } | |
| TEST_F(RecursiveCopyProgressTest, RecursiveCopySucceedsWithFileData) { | |
| const std::string source_path = GetDefaultFullPath("source_dir"); | |
| const std::string source_path_2 = GetDefaultFullPath("source_dir/inner"); | |
| const std::string source_path_3 = GetDefaultFullPath("source_dir/file"); | |
| const std::vector<uint8_t> source_3_data = {1, 2, 3, 4, 5}; | |
| const std::string target_path = GetDefaultFullPath("target_dir"); | |
| const std::string target_path_2 = GetDefaultFullPath("target_dir/inner"); | |
| const std::string target_path_3 = GetDefaultFullPath("target_dir/file"); | |
| PrepareFileSystem(); | |
| fake_samba_->AddDirectory(source_path); | |
| fake_samba_->AddDirectory(source_path_2); | |
| fake_samba_->AddFile(source_path_3, 0 /* date */, source_3_data); | |
| RecursiveCopyProgress recursive_copy_progress(fake_samba_.get()); | |
| int32_t error; | |
| bool should_continue_copy = | |
| recursive_copy_progress.StartCopy(source_path, target_path, &error); | |
| EXPECT_TRUE(should_continue_copy); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path)); | |
| should_continue_copy = recursive_copy_progress.ContinueCopy(&error); | |
| EXPECT_TRUE(should_continue_copy); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path_2)); | |
| should_continue_copy = recursive_copy_progress.ContinueCopy(&error); | |
| EXPECT_FALSE(should_continue_copy); | |
| EXPECT_TRUE(fake_samba_->EntryExists(target_path_3)); | |
| EXPECT_TRUE(fake_samba_->IsFileDataEqual(target_path_3, source_3_data)); | |
| } | |
| } // namespace smbprovider |