OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/edk/system/shared_buffer_dispatcher.h" | 5 #include "mojo/edk/system/shared_buffer_dispatcher.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "mojo/edk/embedder/platform_shared_buffer.h" | 10 #include "mojo/edk/embedder/platform_shared_buffer.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 ~0u // |flags|. | 106 ~0u // |flags|. |
107 }; | 107 }; |
108 MojoCreateSharedBufferOptions unused; | 108 MojoCreateSharedBufferOptions unused; |
109 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 109 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
110 SharedBufferDispatcher::ValidateCreateOptions( | 110 SharedBufferDispatcher::ValidateCreateOptions( |
111 MakeUserPointer(&options), &unused)); | 111 MakeUserPointer(&options), &unused)); |
112 } | 112 } |
113 } | 113 } |
114 | 114 |
115 TEST_F(SharedBufferDispatcherTest, CreateAndMapBuffer) { | 115 TEST_F(SharedBufferDispatcherTest, CreateAndMapBuffer) { |
116 scoped_refptr<SharedBufferDispatcher> dispatcher; | 116 MojoResult result = MOJO_RESULT_INTERNAL; |
117 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( | 117 auto dispatcher = SharedBufferDispatcher::Create( |
118 platform_support(), | 118 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
119 SharedBufferDispatcher::kDefaultCreateOptions, | 119 &result); |
120 100, &dispatcher)); | 120 EXPECT_EQ(MOJO_RESULT_OK, result); |
| 121 |
121 ASSERT_TRUE(dispatcher); | 122 ASSERT_TRUE(dispatcher); |
122 EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType()); | 123 EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType()); |
123 | 124 |
124 // Make a couple of mappings. | 125 // Make a couple of mappings. |
125 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping1; | 126 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping1; |
126 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer( | 127 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer( |
127 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1)); | 128 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1)); |
128 ASSERT_TRUE(mapping1); | 129 ASSERT_TRUE(mapping1); |
129 ASSERT_TRUE(mapping1->GetBase()); | 130 ASSERT_TRUE(mapping1->GetBase()); |
130 EXPECT_EQ(100u, mapping1->GetLength()); | 131 EXPECT_EQ(100u, mapping1->GetLength()); |
(...skipping 10 matching lines...) Expand all Loading... |
141 | 142 |
142 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); | 143 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
143 | 144 |
144 // Check that we can still read/write to mappings after the dispatcher has | 145 // Check that we can still read/write to mappings after the dispatcher has |
145 // gone away. | 146 // gone away. |
146 static_cast<char*>(mapping2->GetBase())[1] = 'y'; | 147 static_cast<char*>(mapping2->GetBase())[1] = 'y'; |
147 EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]); | 148 EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]); |
148 } | 149 } |
149 | 150 |
150 TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandle) { | 151 TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandle) { |
151 scoped_refptr<SharedBufferDispatcher> dispatcher1; | 152 MojoResult result = MOJO_RESULT_INTERNAL; |
152 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( | 153 auto dispatcher1 = SharedBufferDispatcher::Create( |
153 platform_support(), | 154 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
154 SharedBufferDispatcher::kDefaultCreateOptions, | 155 &result); |
155 100, &dispatcher1)); | 156 EXPECT_EQ(MOJO_RESULT_OK, result); |
156 | 157 |
157 // Map and write something. | 158 // Map and write something. |
158 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; | 159 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; |
159 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->MapBuffer( | 160 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->MapBuffer( |
160 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 161 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
161 static_cast<char*>(mapping->GetBase())[0] = 'x'; | 162 static_cast<char*>(mapping->GetBase())[0] = 'x'; |
162 mapping.reset(); | 163 mapping.reset(); |
163 | 164 |
164 // Duplicate |dispatcher1| and then close it. | 165 // Duplicate |dispatcher1| and then close it. |
165 scoped_refptr<Dispatcher> dispatcher2; | 166 RefPtr<Dispatcher> dispatcher2; |
166 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle( | 167 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle( |
167 NullUserPointer(), &dispatcher2)); | 168 NullUserPointer(), &dispatcher2)); |
168 ASSERT_TRUE(dispatcher2); | 169 ASSERT_TRUE(dispatcher2); |
169 EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType()); | 170 EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType()); |
170 | 171 |
171 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close()); | 172 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close()); |
172 | 173 |
173 // Map |dispatcher2| and read something. | 174 // Map |dispatcher2| and read something. |
174 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer( | 175 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer( |
175 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 176 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
176 EXPECT_EQ('x', static_cast<char*>(mapping->GetBase())[0]); | 177 EXPECT_EQ('x', static_cast<char*>(mapping->GetBase())[0]); |
177 | 178 |
178 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close()); | 179 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close()); |
179 } | 180 } |
180 | 181 |
181 TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsValid) { | 182 TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsValid) { |
182 scoped_refptr<SharedBufferDispatcher> dispatcher1; | 183 MojoResult result = MOJO_RESULT_INTERNAL; |
183 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( | 184 auto dispatcher1 = SharedBufferDispatcher::Create( |
184 platform_support(), | 185 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
185 SharedBufferDispatcher::kDefaultCreateOptions, | 186 &result); |
186 100, &dispatcher1)); | 187 EXPECT_EQ(MOJO_RESULT_OK, result); |
187 | 188 |
188 MojoDuplicateBufferHandleOptions options[] = { | 189 MojoDuplicateBufferHandleOptions options[] = { |
189 {sizeof(MojoDuplicateBufferHandleOptions), | 190 {sizeof(MojoDuplicateBufferHandleOptions), |
190 MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE}, | 191 MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE}, |
191 {sizeof(MojoDuplicateBufferHandleOptionsFlags), ~0u}}; | 192 {sizeof(MojoDuplicateBufferHandleOptionsFlags), ~0u}}; |
192 for (size_t i = 0; i < MOJO_ARRAYSIZE(options); i++) { | 193 for (size_t i = 0; i < MOJO_ARRAYSIZE(options); i++) { |
193 scoped_refptr<Dispatcher> dispatcher2; | 194 RefPtr<Dispatcher> dispatcher2; |
194 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle( | 195 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle( |
195 MakeUserPointer(&options[i]), &dispatcher2)); | 196 MakeUserPointer(&options[i]), &dispatcher2)); |
196 ASSERT_TRUE(dispatcher2); | 197 ASSERT_TRUE(dispatcher2); |
197 EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType()); | 198 EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType()); |
198 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close()); | 199 EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close()); |
199 } | 200 } |
200 | 201 |
201 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close()); | 202 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close()); |
202 } | 203 } |
203 | 204 |
204 TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsInvalid) { | 205 TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsInvalid) { |
205 scoped_refptr<SharedBufferDispatcher> dispatcher1; | 206 MojoResult result = MOJO_RESULT_INTERNAL; |
206 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( | 207 auto dispatcher1 = SharedBufferDispatcher::Create( |
207 platform_support(), | 208 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
208 SharedBufferDispatcher::kDefaultCreateOptions, | 209 &result); |
209 100, &dispatcher1)); | 210 EXPECT_EQ(MOJO_RESULT_OK, result); |
210 | 211 |
211 // Invalid |struct_size|. | 212 // Invalid |struct_size|. |
212 { | 213 { |
213 MojoDuplicateBufferHandleOptions options = { | 214 MojoDuplicateBufferHandleOptions options = { |
214 1u, MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE}; | 215 1u, MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE}; |
215 scoped_refptr<Dispatcher> dispatcher2; | 216 RefPtr<Dispatcher> dispatcher2; |
216 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 217 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
217 dispatcher1->DuplicateBufferHandle(MakeUserPointer(&options), | 218 dispatcher1->DuplicateBufferHandle(MakeUserPointer(&options), |
218 &dispatcher2)); | 219 &dispatcher2)); |
219 EXPECT_FALSE(dispatcher2); | 220 EXPECT_FALSE(dispatcher2); |
220 } | 221 } |
221 | 222 |
222 // Unknown |flags|. | 223 // Unknown |flags|. |
223 { | 224 { |
224 MojoDuplicateBufferHandleOptions options = { | 225 MojoDuplicateBufferHandleOptions options = { |
225 sizeof(MojoDuplicateBufferHandleOptions), ~0u}; | 226 sizeof(MojoDuplicateBufferHandleOptions), ~0u}; |
226 scoped_refptr<Dispatcher> dispatcher2; | 227 RefPtr<Dispatcher> dispatcher2; |
227 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, | 228 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, |
228 dispatcher1->DuplicateBufferHandle(MakeUserPointer(&options), | 229 dispatcher1->DuplicateBufferHandle(MakeUserPointer(&options), |
229 &dispatcher2)); | 230 &dispatcher2)); |
230 EXPECT_FALSE(dispatcher2); | 231 EXPECT_FALSE(dispatcher2); |
231 } | 232 } |
232 | 233 |
233 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close()); | 234 EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close()); |
234 } | 235 } |
235 | 236 |
236 TEST_F(SharedBufferDispatcherTest, CreateInvalidNumBytes) { | 237 TEST_F(SharedBufferDispatcherTest, CreateInvalidNumBytes) { |
237 // Size too big. | 238 // Size too big. |
238 scoped_refptr<SharedBufferDispatcher> dispatcher; | 239 MojoResult result = MOJO_RESULT_INTERNAL; |
239 EXPECT_EQ( | 240 auto dispatcher = SharedBufferDispatcher::Create( |
240 MOJO_RESULT_RESOURCE_EXHAUSTED, | 241 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, |
241 SharedBufferDispatcher::Create( | 242 std::numeric_limits<uint64_t>::max(), &result); |
242 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, | 243 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, result); |
243 std::numeric_limits<uint64_t>::max(), &dispatcher)); | |
244 EXPECT_FALSE(dispatcher); | 244 EXPECT_FALSE(dispatcher); |
245 | 245 |
246 // Zero size. | 246 // Zero size. |
247 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 247 result = MOJO_RESULT_INTERNAL; |
248 SharedBufferDispatcher::Create( | 248 dispatcher = SharedBufferDispatcher::Create( |
249 platform_support(), | 249 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 0, |
250 SharedBufferDispatcher::kDefaultCreateOptions, 0, &dispatcher)); | 250 &result); |
| 251 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, result); |
251 EXPECT_FALSE(dispatcher); | 252 EXPECT_FALSE(dispatcher); |
252 } | 253 } |
253 | 254 |
254 TEST_F(SharedBufferDispatcherTest, MapBufferInvalidArguments) { | 255 TEST_F(SharedBufferDispatcherTest, MapBufferInvalidArguments) { |
255 scoped_refptr<SharedBufferDispatcher> dispatcher; | 256 MojoResult result = MOJO_RESULT_INTERNAL; |
256 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( | 257 auto dispatcher = SharedBufferDispatcher::Create( |
257 platform_support(), | 258 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
258 SharedBufferDispatcher::kDefaultCreateOptions, | 259 &result); |
259 100, &dispatcher)); | 260 EXPECT_EQ(MOJO_RESULT_OK, result); |
260 | 261 |
261 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; | 262 std::unique_ptr<embedder::PlatformSharedBufferMapping> mapping; |
262 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 263 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
263 dispatcher->MapBuffer(0, 101, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 264 dispatcher->MapBuffer(0, 101, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
264 EXPECT_FALSE(mapping); | 265 EXPECT_FALSE(mapping); |
265 | 266 |
266 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 267 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
267 dispatcher->MapBuffer(1, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 268 dispatcher->MapBuffer(1, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
268 EXPECT_FALSE(mapping); | 269 EXPECT_FALSE(mapping); |
269 | 270 |
270 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 271 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
271 dispatcher->MapBuffer(0, 0, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 272 dispatcher->MapBuffer(0, 0, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
272 EXPECT_FALSE(mapping); | 273 EXPECT_FALSE(mapping); |
273 | 274 |
274 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); | 275 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
275 } | 276 } |
276 | 277 |
277 } // namespace | 278 } // namespace |
278 } // namespace system | 279 } // namespace system |
279 } // namespace mojo | 280 } // namespace mojo |
OLD | NEW |