blob: aed16e56611568403632656bc9c148e5b9d21df1 [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
adlr@google.com3defe6a2009-12-04 20:57:17 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <sys/stat.h>
6#include <sys/types.h>
7#include <unistd.h>
8#include <set>
9#include <string>
10#include <vector>
adlr@google.com3defe6a2009-12-04 20:57:17 +000011#include <gtest/gtest.h>
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070012#include "base/string_util.h"
Mike Frysinger8155d082012-04-06 15:23:18 -040013#include <base/stringprintf.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +000014#include "update_engine/filesystem_iterator.h"
15#include "update_engine/test_utils.h"
16#include "update_engine/utils.h"
17
18using std::set;
19using std::string;
20using std::vector;
21
22namespace chromeos_update_engine {
23
24namespace {
25const char* TestDir() { return "./FilesystemIteratorTest-dir"; }
26} // namespace {}
27
28class FilesystemIteratorTest : public ::testing::Test {
29 protected:
30 virtual void SetUp() {
31 LOG(INFO) << "SetUp() mkdir";
32 EXPECT_EQ(0, System(StringPrintf("rm -rf %s", TestDir())));
33 EXPECT_EQ(0, System(StringPrintf("mkdir -p %s", TestDir())));
34 }
35 virtual void TearDown() {
36 LOG(INFO) << "TearDown() rmdir";
37 EXPECT_EQ(0, System(StringPrintf("rm -rf %s", TestDir())));
38 }
39};
40
41TEST_F(FilesystemIteratorTest, RunAsRootSuccessTest) {
42 ASSERT_EQ(0, getuid());
43 string first_image("FilesystemIteratorTest.image1");
44 string sub_image("FilesystemIteratorTest.image2");
45
46 ASSERT_EQ(0, System(string("rm -f ") + first_image + " " + sub_image));
47 vector<string> expected_paths_vector;
48 CreateExtImageAtPath(first_image, &expected_paths_vector);
49 CreateExtImageAtPath(sub_image, NULL);
50 ASSERT_EQ(0, System(string("mount -o loop ") + first_image + " " +
51 kMountPath));
52 ASSERT_EQ(0, System(string("mount -o loop ") + sub_image + " " +
53 kMountPath + "/some_dir/mnt"));
54 for (vector<string>::iterator it = expected_paths_vector.begin();
55 it != expected_paths_vector.end(); ++it)
56 *it = kMountPath + *it;
57 set<string> expected_paths(expected_paths_vector.begin(),
58 expected_paths_vector.end());
59 VerifyAllPaths(kMountPath, expected_paths);
Ben Chan77a1eba2012-10-07 22:54:55 -070060
61 EXPECT_TRUE(utils::UnmountFilesystem(kMountPath + string("/some_dir/mnt")));
62 EXPECT_TRUE(utils::UnmountFilesystem(kMountPath));
adlr@google.com3defe6a2009-12-04 20:57:17 +000063 EXPECT_EQ(0, System(string("rm -f ") + first_image + " " + sub_image));
64}
65
66TEST_F(FilesystemIteratorTest, NegativeTest) {
67 {
68 FilesystemIterator iter("/non/existent/path", set<string>());
69 EXPECT_TRUE(iter.IsEnd());
70 EXPECT_TRUE(iter.IsErr());
71 }
72
73 {
74 FilesystemIterator iter(TestDir(), set<string>());
75 EXPECT_FALSE(iter.IsEnd());
76 EXPECT_FALSE(iter.IsErr());
77 // Here I'm deleting the exact directory that iterator is point at,
78 // then incrementing (which normally would descend into that directory).
79 EXPECT_EQ(0, rmdir(TestDir()));
80 iter.Increment();
81 EXPECT_TRUE(iter.IsEnd());
82 EXPECT_FALSE(iter.IsErr());
83 }
84}
85
86TEST_F(FilesystemIteratorTest, DeleteWhileTraverseTest) {
87 ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest", 0755));
88 ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/a", 0755));
89 ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/a/b", 0755));
90 ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/b", 0755));
91 ASSERT_EQ(0, mkdir("DeleteWhileTraverseTest/c", 0755));
92
93 string expected_paths_arr[] = {
94 "",
95 "/a",
96 "/b",
97 "/c"
98 };
99 set<string> expected_paths(expected_paths_arr,
100 expected_paths_arr +
101 arraysize(expected_paths_arr));
102
103 FilesystemIterator iter("DeleteWhileTraverseTest", set<string>());
104 while (!iter.IsEnd()) {
105 string path = iter.GetPartialPath();
106 EXPECT_TRUE(expected_paths.find(path) != expected_paths.end());
107 if (expected_paths.find(path) != expected_paths.end()) {
108 expected_paths.erase(path);
109 }
110 if (path == "/a") {
111 EXPECT_EQ(0, rmdir("DeleteWhileTraverseTest/a/b"));
112 EXPECT_EQ(0, rmdir("DeleteWhileTraverseTest/a"));
113 }
114 iter.Increment();
115 }
116 EXPECT_FALSE(iter.IsErr());
117 EXPECT_TRUE(expected_paths.empty());
118 EXPECT_EQ(0, system("rm -rf DeleteWhileTraverseTest"));
119}
120
121} // namespace chromeos_update_engine