blob: 7da048cef8ce52a720f2d415cc37d8fded59e510 [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/post_depth_first_iterator.h"
#include "smbprovider/smbprovider_helper.h"
#include "smbprovider/smbprovider_test_helper.h"
namespace smbprovider {
class PostDepthFirstIteratorTest : public testing::Test {
public:
PostDepthFirstIteratorTest() {}
~PostDepthFirstIteratorTest() override = default;
protected:
void CreateDefaultMountRoot() {
fake_samba_.AddDirectory(GetDefaultServer());
fake_samba_.AddDirectory(GetDefaultMountRoot());
}
FakeSambaInterface fake_samba_;
private:
DISALLOW_COPY_AND_ASSIGN(PostDepthFirstIteratorTest);
};
// PostDepthFirstIterator iterates over a single empty directory correctly.
TEST_F(PostDepthFirstIteratorTest, ItSucceedsOnEmptyDir) {
CreateDefaultMountRoot();
fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
PostDepthFirstIterator 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());
}
// PostDepthFirstIterator iteratres over multiple nested dirs correctly.
TEST_F(PostDepthFirstIteratorTest, ItSuceedsOnNestedEmptyDirs) {
CreateDefaultMountRoot();
fake_samba_.AddDirectory(GetDefaultFullPath("/path"));
fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs"));
fake_samba_.AddDirectory(GetDefaultFullPath("/path/dogs/cats"));
PostDepthFirstIterator it(GetDefaultFullPath("/path"), &fake_samba_);
EXPECT_EQ(0, it.Init());
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("dogs", it.Get().name);
EXPECT_TRUE(it.Get().is_directory);
EXPECT_EQ(0, it.Next());
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());
}
// PostDepthFirstIterator iterates over a single dir of files correctly.
TEST_F(PostDepthFirstIteratorTest, 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"));
PostDepthFirstIterator 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.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_FALSE(it.IsDone());
EXPECT_EQ("path", it.Get().name);
EXPECT_TRUE(it.Get().is_directory);
EXPECT_EQ(0, it.Next());
EXPECT_TRUE(it.IsDone());
}
// PostDepthFirstIterator iterates over a dir with a file and a dir correctly.
TEST_F(PostDepthFirstIteratorTest, 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"));
PostDepthFirstIterator 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("dogs", it.Get().name);
EXPECT_TRUE(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("path", it.Get().name);
EXPECT_TRUE(it.Get().is_directory);
EXPECT_EQ(0, it.Next());
EXPECT_TRUE(it.IsDone());
}
// PostDepthFirstIterator correctly iterates over a complex filesystem.
// path/
// / / \
// 1 dogs/ cats/
// / | \ / \
// 2 mouse/ 3 4 5
TEST_F(PostDepthFirstIteratorTest, ItSucceedsOnComplexMultiLevelFileSystem) {
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"));
PostDepthFirstIterator 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("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("dogs", 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_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("path", it.Get().name);
EXPECT_TRUE(it.Get().is_directory);
EXPECT_EQ(0, it.Next());
EXPECT_TRUE(it.IsDone());
}
} // namespace smbprovider