diff options
author | adlr@google.com <adlr@google.com@06c00378-0e64-4dae-be16-12b19f9950a1> | 2009-12-04 20:57:17 +0000 |
---|---|---|
committer | adlr@google.com <adlr@google.com@06c00378-0e64-4dae-be16-12b19f9950a1> | 2009-12-04 20:57:17 +0000 |
commit | 3defe6acb3609e70e851a6eff062577d25a2af9d (patch) | |
tree | 341e979027fde117dd8906483db7a5c703a2e1cf /filesystem_iterator_unittest.cc | |
parent | c98a7edf648aad88b3f66df3b5a7d43d6a6d7fa9 (diff) |
Missed new files in last commit
Review URL: http://codereview.chromium.org/465067
git-svn-id: svn://chrome-svn/chromeos/trunk@336 06c00378-0e64-4dae-be16-12b19f9950a1
Diffstat (limited to 'filesystem_iterator_unittest.cc')
-rw-r--r-- | filesystem_iterator_unittest.cc | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/filesystem_iterator_unittest.cc b/filesystem_iterator_unittest.cc new file mode 100644 index 00000000..82b8d3f4 --- /dev/null +++ b/filesystem_iterator_unittest.cc @@ -0,0 +1,120 @@ +// Copyright (c) 2009 The Chromium 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 <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include <set> +#include <string> +#include <vector> +#include "base/string_util.h" +#include <gtest/gtest.h> +#include "update_engine/filesystem_iterator.h" +#include "update_engine/test_utils.h" +#include "update_engine/utils.h" + +using std::set; +using std::string; +using std::vector; + +namespace chromeos_update_engine { + +namespace { +const char* TestDir() { return "./FilesystemIteratorTest-dir"; } +} // namespace {} + +class FilesystemIteratorTest : public ::testing::Test { + protected: + virtual void SetUp() { + LOG(INFO) << "SetUp() mkdir"; + EXPECT_EQ(0, System(StringPrintf("rm -rf %s", TestDir()))); + EXPECT_EQ(0, System(StringPrintf("mkdir -p %s", TestDir()))); + } + virtual void TearDown() { + LOG(INFO) << "TearDown() rmdir"; + EXPECT_EQ(0, System(StringPrintf("rm -rf %s", TestDir()))); + } +}; + +TEST_F(FilesystemIteratorTest, RunAsRootSuccessTest) { + ASSERT_EQ(0, getuid()); + string first_image("FilesystemIteratorTest.image1"); + string sub_image("FilesystemIteratorTest.image2"); + + ASSERT_EQ(0, System(string("rm -f ") + first_image + " " + sub_image)); + vector<string> expected_paths_vector; + CreateExtImageAtPath(first_image, &expected_paths_vector); + CreateExtImageAtPath(sub_image, NULL); + ASSERT_EQ(0, System(string("mount -o loop ") + first_image + " " + + kMountPath)); + ASSERT_EQ(0, System(string("mount -o loop ") + sub_image + " " + + kMountPath + "/some_dir/mnt")); + for (vector<string>::iterator it = expected_paths_vector.begin(); + it != expected_paths_vector.end(); ++it) + *it = kMountPath + *it; + set<string> expected_paths(expected_paths_vector.begin(), + expected_paths_vector.end()); + VerifyAllPaths(kMountPath, expected_paths); + + EXPECT_EQ(0, System(string("umount ") + kMountPath + "/some_dir/mnt")); + EXPECT_EQ(0, System(string("umount ") + kMountPath)); + EXPECT_EQ(0, System(string("rm -f ") + first_image + " " + sub_image)); +} + +TEST_F(FilesystemIteratorTest, NegativeTest) { + { + FilesystemIterator iter("/non/existent/path", set<string>()); + EXPECT_TRUE(iter.IsEnd()); + EXPECT_TRUE(iter.IsErr()); + } + + { + FilesystemIterator iter(TestDir(), set<string>()); + EXPECT_FALSE(iter.IsEnd()); + EXPECT_FALSE(iter.IsErr()); + // Here I'm deleting the exact directory that iterator is point at, + // then incrementing (which normally would descend into that directory). + EXPECT_EQ(0, rmdir(TestDir())); + iter.Increment(); + EXPECT_TRUE(iter.IsEnd()); + EXPECT_FALSE(iter.IsErr()); + } +} + +TEST_F(FilesystemIteratorTest, DeleteWhileTraverseTest) { + ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest", 0755)); + ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/a", 0755)); + ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/a/b", 0755)); + ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/b", 0755)); + ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/c", 0755)); + + string expected_paths_arr[] = { + "", + "/a", + "/b", + "/c" + }; + set<string> expected_paths(expected_paths_arr, + expected_paths_arr + + arraysize(expected_paths_arr)); + + FilesystemIterator iter("DeleteWhileTraverseTest", set<string>()); + while (!iter.IsEnd()) { + string path = iter.GetPartialPath(); + EXPECT_TRUE(expected_paths.find(path) != expected_paths.end()); + if (expected_paths.find(path) != expected_paths.end()) { + expected_paths.erase(path); + } + if (path == "/a") { + EXPECT_EQ(0, rmdir("DeleteWhileTraverseTest/a/b")); + EXPECT_EQ(0, rmdir("DeleteWhileTraverseTest/a")); + } + iter.Increment(); + } + EXPECT_FALSE(iter.IsErr()); + EXPECT_TRUE(expected_paths.empty()); + EXPECT_EQ(0, system("rm -rf DeleteWhileTraverseTest")); +} + +} // namespace chromeos_update_engine |