// 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/pre_depth_first_iterator.h"
#include "smbprovider/smbprovider_helper.h"
#include "smbprovider/smbprovider_test_helper.h"

namespace smbprovider {

class PreDepthFirstIteratorTest : public testing::Test {
 public:
  PreDepthFirstIteratorTest() {}
  PreDepthFirstIteratorTest(const PreDepthFirstIteratorTest&) = delete;
  PreDepthFirstIteratorTest& operator=(const PreDepthFirstIteratorTest&) =
      delete;

  ~PreDepthFirstIteratorTest() override = default;

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

  FakeSambaInterface fake_samba_;
};

// PreDepthFirstIterator iterates over a single empty directory correctly.
TEST_F(PreDepthFirstIteratorTest, ItSucceedsOnEmptyDir) {
  CreateDefaultMountRoot();

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

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

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("path", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_TRUE(it.IsDone());
}

// PreDepthFirstIterator iteratres over multiple nested dirs correctly.
TEST_F(PreDepthFirstIteratorTest, ItSuceedsOnNestedEmptyDirs) {
  CreateDefaultMountRoot();

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

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

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("path", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("dogs", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("cats", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_TRUE(it.IsDone());
}

// PreDepthFirstIterator iterates over a single dir of files correctly.
TEST_F(PreDepthFirstIteratorTest, ItSucceedsOnSingleDirOfFiles) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/1.jpg"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/2.txt"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/3.png"));

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

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("path", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  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.txt", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

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

  EXPECT_TRUE(it.IsDone());
}

// PreDepthFirstIterator iterates over a dir with a file and a dir correctly.
TEST_F(PreDepthFirstIteratorTest, ItSucceedsOnDirWithFileAndNonEmptyDir) {
  CreateDefaultMountRoot();

  fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
  fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/dogs/1.jpg"));
  fake_samba_.AddFile(GetDefaultFullPath("/path/2.txt"));

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

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("path", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("dogs", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  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.txt", it.Get().name);
  EXPECT_FALSE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  EXPECT_TRUE(it.IsDone());
}

// PreDepthFirstIterator correctly iterates over a complex filesystem.
//                            path/
//                         /   /    \
//                       1  dogs/     cats/
//                         /  |   \    /  \
//                        2 mouse/ 3   4   5
TEST_F(PreDepthFirstIteratorTest, 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"));

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

  EXPECT_EQ(0, it.Init());

  EXPECT_FALSE(it.IsDone());
  EXPECT_EQ("path", it.Get().name);
  EXPECT_TRUE(it.Get().is_directory);
  EXPECT_EQ(0, it.Next());

  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("dogs", it.Get().name);
  EXPECT_TRUE(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("mouse", it.Get().name);
  EXPECT_TRUE(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("cats", it.Get().name);
  EXPECT_TRUE(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
