Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(462)

Side by Side Diff: native_client_sdk/src/libraries/nacl_mounts_test/mount_node_test.cc

Issue 12194030: Rename mount (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix whitespace Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6 #include <errno.h>
7 #include <fcntl.h>
8
9 #include "nacl_mounts/kernel_proxy.h"
10 #include "nacl_mounts/mount_node.h"
11 #include "nacl_mounts/mount_node_dir.h"
12 #include "nacl_mounts/mount_node_mem.h"
13 #include "nacl_mounts/osdirent.h"
14
15 #include "gtest/gtest.h"
16
17 #define NULL_NODE ((MountNode *) NULL)
18
19 static int s_AllocNum = 0;
20
21 class MockMemory : public MountNodeMem {
22 public:
23 MockMemory() : MountNodeMem(NULL) {
24 s_AllocNum++;
25 }
26
27 ~MockMemory() {
28 s_AllocNum--;
29 }
30
31 bool Init(int mode) {
32 return MountNodeMem::Init(mode);
33 }
34 int AddChild(const std::string& name, MountNode *node) {
35 return MountNodeMem::AddChild(name, node);
36 }
37 int RemoveChild(const std::string& name) {
38 return MountNodeMem::RemoveChild(name);
39 }
40 MountNode* FindChild(const std::string& name) {
41 return MountNodeMem::FindChild(name);
42 }
43 void Link() { MountNodeMem::Link(); }
44 void Unlink() { MountNodeMem::Unlink(); }
45
46 protected:
47 using MountNodeMem::Init;
48 };
49
50 class MockDir : public MountNodeDir {
51 public:
52 MockDir() : MountNodeDir(NULL) {
53 s_AllocNum++;
54 }
55
56 ~MockDir() {
57 s_AllocNum--;
58 }
59
60 bool Init(int mode) {
61 return MountNodeDir::Init(mode);
62 }
63 int AddChild(const std::string& name, MountNode *node) {
64 return MountNodeDir::AddChild(name, node);
65 }
66 int RemoveChild(const std::string& name) {
67 return MountNodeDir::RemoveChild(name);
68 }
69 MountNode* FindChild(const std::string& name) {
70 return MountNodeDir::FindChild(name);
71 }
72 void Link() { MountNodeDir::Link(); }
73 void Unlink() { MountNodeDir::Unlink(); }
74
75 protected:
76 using MountNodeDir::Init;
77 };
78
79 TEST(MountNodeTest, File) {
80 MockMemory *file = new MockMemory;
81
82 EXPECT_TRUE(file->Init(S_IREAD | S_IWRITE));
83
84 // Test properties
85 EXPECT_EQ(0, file->GetLinks());
86 EXPECT_EQ(S_IREAD | S_IWRITE, file->GetMode());
87 EXPECT_EQ(S_IFREG, file->GetType());
88 EXPECT_FALSE(file->IsaDir());
89 EXPECT_TRUE(file->IsaFile());
90 EXPECT_FALSE(file->IsaTTY());
91 EXPECT_EQ(1, file->RefCount());
92
93 // Test IO
94 char buf1[1024];
95 char buf2[1024 * 2];
96 for (size_t a = 0; a < sizeof(buf1); a++)
97 buf1[a] = a;
98 memset(buf2, 0, sizeof(buf2));
99
100 EXPECT_EQ(0, file->GetSize());
101 EXPECT_EQ(0, file->Read(0, buf2, sizeof(buf2)));
102 EXPECT_EQ(0, file->GetSize());
103 EXPECT_EQ(sizeof(buf1), file->Write(0, buf1, sizeof(buf1)));
104 EXPECT_EQ(sizeof(buf1), file->GetSize());
105 EXPECT_EQ(sizeof(buf1), file->Read(0, buf2, sizeof(buf2)));
106 EXPECT_EQ(0, memcmp(buf1, buf2, sizeof(buf1)));
107
108 struct stat s;
109 EXPECT_EQ(0, file->GetStat(&s));
110 EXPECT_EQ(sizeof(buf1), s.st_size);
111
112 // Directory operations should fail
113 struct dirent d;
114 EXPECT_EQ(-1, file->GetDents(0, &d, sizeof(d)));
115 EXPECT_EQ(errno, ENOTDIR);
116 EXPECT_EQ(-1, file->AddChild("", file));
117 EXPECT_EQ(errno, ENOTDIR);
118 EXPECT_EQ(-1, file->RemoveChild(""));
119 EXPECT_EQ(errno, ENOTDIR);
120 EXPECT_EQ(NULL_NODE, file->FindChild(""));
121 EXPECT_EQ(errno, ENOTDIR);
122
123 delete file;
124 }
125
126 TEST(MountNodeTest, Directory) {
127 MockDir *root = new MockDir();
128 root->Init(S_IREAD | S_IWRITE);
129
130 // Test properties
131 EXPECT_EQ(0, root->GetLinks());
132 EXPECT_EQ(S_IREAD | S_IWRITE, root->GetMode());
133 EXPECT_EQ(S_IFDIR, root->GetType());
134 EXPECT_TRUE(root->IsaDir());
135 EXPECT_FALSE(root->IsaFile());
136 EXPECT_FALSE(root->IsaTTY());
137 EXPECT_EQ(1, root->RefCount());
138
139 // IO operations should fail
140 char buf1[1024];
141 EXPECT_EQ(0, root->GetSize());
142 EXPECT_EQ(-1, root->Read(0, buf1, sizeof(buf1)));
143 EXPECT_EQ(errno, EISDIR);
144 EXPECT_EQ(-1, root->Write(0, buf1, sizeof(buf1)));
145 EXPECT_EQ(errno, EISDIR);
146
147 // Test directory operations
148 MockMemory* file = new MockMemory;
149 EXPECT_TRUE(file->Init(S_IREAD | S_IWRITE));
150
151 EXPECT_EQ(1, root->RefCount());
152 EXPECT_EQ(1, file->RefCount());
153 EXPECT_EQ(0, root->AddChild("F1", file));
154 EXPECT_EQ(1, file->GetLinks());
155 EXPECT_EQ(2, file->RefCount());
156
157 // Test that the directory is there
158 struct dirent d;
159 EXPECT_EQ(sizeof(d), root->GetDents(0, &d, sizeof(d)));
160 EXPECT_EQ(0, strcmp("F1", d.d_name));
161 EXPECT_EQ(0, root->GetDents(sizeof(d), &d, sizeof(d)));
162
163 EXPECT_EQ(0, root->AddChild("F2", file));
164 EXPECT_EQ(2, file->GetLinks());
165 EXPECT_EQ(3, file->RefCount());
166 EXPECT_EQ(-1, root->AddChild("F1", file));
167 EXPECT_EQ(EEXIST, errno);
168 EXPECT_EQ(2, file->GetLinks());
169
170 EXPECT_EQ(2, s_AllocNum);
171 EXPECT_NE(NULL_NODE, root->FindChild("F1"));
172 EXPECT_NE(NULL_NODE, root->FindChild("F2"));
173 EXPECT_EQ(NULL_NODE, root->FindChild("F3"));
174 EXPECT_EQ(errno, ENOENT);
175
176 EXPECT_EQ(2, s_AllocNum);
177 EXPECT_EQ(0, root->RemoveChild("F1"));
178 EXPECT_EQ(1, file->GetLinks());
179 EXPECT_EQ(2, file->RefCount());
180 EXPECT_EQ(0, root->RemoveChild("F2"));
181 EXPECT_EQ(0, file->GetLinks());
182 EXPECT_EQ(1, file->RefCount());
183 EXPECT_EQ(2, s_AllocNum);
184
185 file->Release();
186 EXPECT_EQ(1, s_AllocNum);
187 root->Release();
188 EXPECT_EQ(0, s_AllocNum);
189 }
190
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698