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

#include "smbprovider/fake_samba_interface.h"
#include "smbprovider/iterator/depth_first_iterator.h"
#include "smbprovider/smbprovider_helper.h"
#include "smbprovider/smbprovider_test_helper.h"

namespace smbprovider {

// Derived version of DepthFirstIterator. Since this class does not override
// niether OnPush nor OnPop, it performs an Inorder traversal of files only.
class TestDepthFirstIterator : public DepthFirstIterator {
 public:
  TestDepthFirstIterator(const std::string& dir_path,
                         SambaInterface* samba_interface)
      : DepthFirstIterator(dir_path, samba_interface) {}

 private:
  DISALLOW_COPY_AND_ASSIGN(TestDepthFirstIterator);
};

class DepthFirstIteratorTest : public testing::Test {
 public:
  DepthFirstIteratorTest() {}
  ~DepthFirstIteratorTest() override = default;

 protected:
  void CreateDefaultMountRoot() {
    fake_samba_.AddDirectory(GetDefaultServer());
    fake_samba_.AddDirectory(GetDefaultMountRoot());
  }

  FakeSambaInterface fake_samba_;

 private:
  DISALLOW_COPY_AND_ASSIGN(DepthFirstIteratorTest);
};

// DepthFirstIterator fails to initialize on a non-existant directory.
TEST_F(DepthFirstIteratorTest, InitFailsOnNonExistantDir) {
  TestDepthFirstIterator it("smb://non-existant-path/", &fake_samba_);

  EXPECT_EQ(ENOENT, it.Init());
}

// DepthFirstIterator fails to initialize on a file.
TEST_F(DepthFirstIteratorTest, InitFailsOnFile) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetAddedFullDirectoryPath());
  fake_samba_.AddFile(GetAddedFullFilePath());

  TestDepthFirstIterator it(GetAddedFullFilePath(), &fake_samba_);

  EXPECT_EQ(ENOTDIR, it.Init());
}

// DepthFirstIterator fails to initialize on a non-file, non-directory.
TEST_F(DepthFirstIteratorTest, InitFailsOnNonFileNonDirectory) {
  CreateDefaultMountRoot();
  const std::string printer_path = "/path/canon.cn";

  fake_samba_.AddDirectory(GetAddedFullDirectoryPath());
  fake_samba_.AddEntry(GetDefaultFullPath(printer_path), SMBC_PRINTER_SHARE);

  TestDepthFirstIterator it(GetDefaultFullPath(printer_path), &fake_samba_);

  EXPECT_EQ(ENOTDIR, it.Init());
}

// DepthFirstIterator initializes successfully and sets is_done on a directory
// with nothing in it.
TEST_F(DepthFirstIteratorTest, InitSucceedsAndSetsDoneOnCompletelyEmptyDir) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));

  TestDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);

  EXPECT_EQ(0, it.Init());
  EXPECT_TRUE(it.IsDone());
}

// DepthFirstIterator initializes successfully and sets is_done on a directory
// with only empty nested directories and no files.
TEST_F(DepthFirstIteratorTest, InitSucceedsAndSetsDoneOnDirOfEmptyDirs) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats"));

  TestDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);

  // Should be done iterating since there are no files.
  EXPECT_EQ(0, it.Init());
  EXPECT_TRUE(it.IsDone());
}

// DepthFirstIterator initializies successfully and sets is_done on a directory
// with nested directories with their own nested directories, but no files.
TEST_F(DepthFirstIteratorTest, InitSucceedsAndSetsDoneOnDirOfDirOfEmtpyDir) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs/lab"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs/golden"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats/shorthair"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats/persian"));

  TestDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);

  EXPECT_EQ(0, it.Init());
  EXPECT_TRUE(it.IsDone());
}

// DepthFirstIterator initializes correctly on a directory with one file.
TEST_F(DepthFirstIteratorTest, InitSucceedsOnOneFile) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/dog.jpg"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats"));

  TestDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("dog.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_TRUE(it.IsDone());
}

// DepthFirstIterator initializes correctly and iterates over a directory with
// an entry and another directory with an entry.
TEST_F(DepthFirstIteratorTest, NextSucceedsOnSimpleMultiLevelFileSystem) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/dog.jpg"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/cats/kitty.jpg"));

  TestDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("dog.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("kitty.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_TRUE(it.IsDone());
}

// DepthFirstIterator iterates over files in muli-level filesystem correctly.
TEST_F(DepthFirstIteratorTest, NextSucceedsOnComplexMultiLevelFileSystem) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/1.jpg"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/dogs/2.jpg"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs/mouse"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/dogs/3.jpg"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/cats"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/cats/4.jpg"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/cats/5.jpg"));

  TestDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("1.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("2.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("3.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("4.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("5.jpg", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_TRUE(it.IsDone());
}

}  // namespace smbprovider
