| Index: src/platform/update_engine/filesystem_iterator_unittest.cc
|
| diff --git a/src/platform/update_engine/filesystem_iterator_unittest.cc b/src/platform/update_engine/filesystem_iterator_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..82b8d3f4fe4b561bad8f663772d4aab624cda01b
|
| --- /dev/null
|
| +++ b/src/platform/update_engine/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
|
|
|