blob: 9584c0c027553c39e76fbe170d61e3cd1997374a [file] [log] [blame]
// 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) {}
TestDepthFirstIterator(const TestDepthFirstIterator&) = delete;
TestDepthFirstIterator& operator=(const TestDepthFirstIterator&) = delete;
};
class DepthFirstIteratorTest : public testing::Test {
public:
DepthFirstIteratorTest() {}
DepthFirstIteratorTest(const DepthFirstIteratorTest&) = delete;
DepthFirstIteratorTest& operator=(const DepthFirstIteratorTest&) = delete;
~DepthFirstIteratorTest() override = default;
protected:
void CreateDefaultMountRoot() {
fake_samba_.AddDirectory(GetDefaultServer());
fake_samba_.AddDirectory(GetDefaultMountRoot());
}
FakeSambaInterface fake_samba_;
};
// 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