// 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 <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() 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_;

  DISALLOW_COPY_AND_ASSIGN(RecursiveCopyProgressTest);
};

TEST_F(RecursiveCopyProgressTest, CopyFailsWhenSourceDoesNotExist) {
  const std::string source_path = GetDefaultFullPath("non_existant_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
