| // 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-existent directory. |
| TEST_F(DepthFirstIteratorTest, InitFailsOnNonExistentDir) { |
| TestDepthFirstIterator it("smb://non-existent-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 |