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
diff --git a/filesystem_iterator_unittest.cc b/filesystem_iterator_unittest.cc
new file mode 100644
index 0000000..82b8d3f
--- /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