Index: mojo/edk/system/handle_table_unittest.cc |
diff --git a/mojo/edk/system/handle_table_unittest.cc b/mojo/edk/system/handle_table_unittest.cc |
index 55af970f05dbb4133c710672d4cb6c47893cf1fe..92bffd7f97a739bec9ac68861b9c2a8d02664cee 100644 |
--- a/mojo/edk/system/handle_table_unittest.cc |
+++ b/mojo/edk/system/handle_table_unittest.cc |
@@ -21,26 +21,28 @@ namespace { |
TEST(HandleTableTest, Basic) { |
HandleTable ht(1000u); |
- RefPtr<Dispatcher> d = MakeRefCounted<test::MockSimpleDispatcher>(); |
+ Handle h(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ); |
- MojoHandle hv = ht.AddHandle(Handle(d.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
+ MojoHandle hv = ht.AddHandle(h.Clone()); |
ASSERT_NE(hv, MOJO_HANDLE_INVALID); |
// Save the pointer value (without taking a ref), so we can check that we get |
// the same object back. |
- Dispatcher* dv = d.get(); |
+ Dispatcher* dv = h.dispatcher.get(); |
// Reset this, to make sure that the handle table takes a ref. |
- d = nullptr; |
+ h.reset(); |
- Handle h; |
EXPECT_EQ(MOJO_RESULT_OK, ht.GetHandle(hv, &h)); |
EXPECT_EQ(dv, h.dispatcher.get()); |
+ EXPECT_EQ(MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ, h.rights); |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(hv, &d)); |
- ASSERT_EQ(dv, d.get()); |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv, &h)); |
+ ASSERT_EQ(dv, h.dispatcher.get()); |
+ EXPECT_EQ(MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ, h.rights); |
- EXPECT_EQ(MOJO_RESULT_OK, d->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h.dispatcher->Close()); |
// We removed |hv|, so it should no longer be valid. |
h.reset(); |
@@ -50,132 +52,134 @@ TEST(HandleTableTest, Basic) { |
TEST(HandleTableTest, AddHandlePair) { |
HandleTable ht(1000u); |
- auto d1 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- auto d2 = MakeRefCounted<test::MockSimpleDispatcher>(); |
+ Handle h1(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_NONE); |
+ Handle h2(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_DUPLICATE); |
- auto hp = ht.AddHandlePair(Handle(d1.Clone(), MOJO_HANDLE_RIGHT_NONE), |
- Handle(d2.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
+ auto hp = ht.AddHandlePair(h1.Clone(), h2.Clone()); |
ASSERT_NE(hp.first, MOJO_HANDLE_INVALID); |
ASSERT_NE(hp.second, MOJO_HANDLE_INVALID); |
ASSERT_NE(hp.first, hp.second); |
- RefPtr<Dispatcher> d; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(hp.first, &d)); |
- ASSERT_EQ(d1, d); |
+ Handle h; |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hp.first, &h)); |
+ ASSERT_EQ(h1, h); |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(hp.second, &d)); |
- ASSERT_EQ(d2, d); |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hp.second, &h)); |
+ ASSERT_EQ(h2, h); |
- EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
- EXPECT_EQ(MOJO_RESULT_OK, d2->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h1.dispatcher->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h2.dispatcher->Close()); |
} |
TEST(HandleTableTest, AddHandleTooMany) { |
HandleTable ht(2u); |
- auto d1 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- auto d2 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- auto d3 = MakeRefCounted<test::MockSimpleDispatcher>(); |
+ Handle h1(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_NONE); |
+ Handle h2(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_DUPLICATE); |
+ Handle h3(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_TRANSFER); |
- MojoHandle h1 = ht.AddHandle(Handle(d1.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
- ASSERT_NE(h1, MOJO_HANDLE_INVALID); |
+ MojoHandle hv1 = ht.AddHandle(h1.Clone()); |
+ ASSERT_NE(hv1, MOJO_HANDLE_INVALID); |
- MojoHandle h2 = ht.AddHandle(Handle(d2.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
- ASSERT_NE(h2, MOJO_HANDLE_INVALID); |
- EXPECT_NE(h2, h1); |
+ MojoHandle hv2 = ht.AddHandle(h2.Clone()); |
+ ASSERT_NE(hv2, MOJO_HANDLE_INVALID); |
+ EXPECT_NE(hv2, hv1); |
- // Table should be full; adding |d3| should fail. |
- EXPECT_EQ(MOJO_HANDLE_INVALID, |
- ht.AddHandle(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE))); |
+ // Table should be full; adding |h3| should fail. |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, ht.AddHandle(h3.Clone())); |
- // Remove |h2|/|d2|. |
- RefPtr<Dispatcher> d; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h2, &d)); |
- ASSERT_EQ(d2, d); |
+ // Remove |hv2|/|h2|. |
+ Handle h; |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv2, &h)); |
+ ASSERT_EQ(h2, h); |
- // Now adding |d3| should succeed. |
- MojoHandle h3 = ht.AddHandle(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
- ASSERT_NE(h3, MOJO_HANDLE_INVALID); |
- EXPECT_NE(h3, h1); |
- // Note: |h3| may be equal to |h2| (handle values may be reused). |
+ // Now adding |h3| should succeed. |
+ MojoHandle hv3 = ht.AddHandle(h3.Clone()); |
+ ASSERT_NE(hv3, MOJO_HANDLE_INVALID); |
+ EXPECT_NE(hv3, hv1); |
+ // Note: |hv3| may be equal to |hv2| (handle values may be reused). |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h1, &d)); |
- ASSERT_EQ(d1, d); |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv1, &h)); |
+ ASSERT_EQ(h1, h); |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h3, &d)); |
- ASSERT_EQ(d3, d); |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv3, &h)); |
+ ASSERT_EQ(h3, h); |
- EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
- EXPECT_EQ(MOJO_RESULT_OK, d2->Close()); |
- EXPECT_EQ(MOJO_RESULT_OK, d3->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h1.dispatcher->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h2.dispatcher->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h3.dispatcher->Close()); |
} |
TEST(HandleTableTest, AddHandlePairTooMany) { |
HandleTable ht(2u); |
- auto d1 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- auto d2 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- auto d3 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- auto d4 = MakeRefCounted<test::MockSimpleDispatcher>(); |
- |
- auto hp = ht.AddHandlePair(Handle(d1.Clone(), MOJO_HANDLE_RIGHT_NONE), |
- Handle(d2.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
- auto h1 = hp.first; |
- auto h2 = hp.second; |
- ASSERT_NE(h1, MOJO_HANDLE_INVALID); |
- ASSERT_NE(h2, MOJO_HANDLE_INVALID); |
- ASSERT_NE(h1, h2); |
- |
- // Table should be full; adding |d3| should fail. |
- EXPECT_EQ(MOJO_HANDLE_INVALID, |
- ht.AddHandle(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE))); |
- |
- // Adding |d3| and |d4| as a pair should also fail. |
- auto hp2 = ht.AddHandlePair(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE), |
- Handle(d4.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
+ Handle h1(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_NONE); |
+ Handle h2(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_TRANSFER); |
+ Handle h3(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_READ); |
+ Handle h4(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ MOJO_HANDLE_RIGHT_WRITE); |
+ |
+ auto hp = ht.AddHandlePair(h1.Clone(), h2.Clone()); |
+ auto hv1 = hp.first; |
+ auto hv2 = hp.second; |
+ ASSERT_NE(hv1, MOJO_HANDLE_INVALID); |
+ ASSERT_NE(hv2, MOJO_HANDLE_INVALID); |
+ ASSERT_NE(hv1, hv2); |
+ |
+ // Table should be full; adding |h3| should fail. |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, ht.AddHandle(h3.Clone())); |
+ |
+ // Adding |h3| and |h4| as a pair should also fail. |
+ auto hp2 = ht.AddHandlePair(h3.Clone(), h4.Clone()); |
EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.first); |
EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.second); |
- // Remove |h2|/|d2|. |
- RefPtr<Dispatcher> d; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h2, &d)); |
- ASSERT_EQ(d2, d); |
+ // Remove |hv2|/|h2|. |
+ Handle h; |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv2, &h)); |
+ ASSERT_EQ(h2, h); |
- // Trying to add |d3| and |d4| as a pair should still fail. |
- hp2 = ht.AddHandlePair(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE), |
- Handle(d4.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
+ // Trying to add |h3| and |h4| as a pair should still fail. |
+ hp2 = ht.AddHandlePair(h3.Clone(), h4.Clone()); |
EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.first); |
EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.second); |
- // Remove |h1|/|d1|. |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h1, &d)); |
- ASSERT_EQ(d1, d); |
- |
- // Add |d3| and |d4| as a pair should now succeed fail. |
- hp2 = ht.AddHandlePair(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE), |
- Handle(d4.Clone(), MOJO_HANDLE_RIGHT_NONE)); |
- auto h3 = hp2.first; |
- auto h4 = hp2.second; |
- ASSERT_NE(h3, MOJO_HANDLE_INVALID); |
- ASSERT_NE(h4, MOJO_HANDLE_INVALID); |
- ASSERT_NE(h3, h4); |
- |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h3, &d)); |
- ASSERT_EQ(d3, d); |
- |
- d = nullptr; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h4, &d)); |
- ASSERT_EQ(d4, d); |
- |
- EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
- EXPECT_EQ(MOJO_RESULT_OK, d2->Close()); |
- EXPECT_EQ(MOJO_RESULT_OK, d3->Close()); |
- EXPECT_EQ(MOJO_RESULT_OK, d4->Close()); |
+ // Remove |hv1|/|h1|. |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv1, &h)); |
+ ASSERT_EQ(h1, h); |
+ |
+ // Add |h3| and |h4| as a pair should now succeed fail. |
+ hp2 = ht.AddHandlePair(h3.Clone(), h4.Clone()); |
+ auto hv3 = hp2.first; |
+ auto hv4 = hp2.second; |
+ ASSERT_NE(hv3, MOJO_HANDLE_INVALID); |
+ ASSERT_NE(hv4, MOJO_HANDLE_INVALID); |
+ ASSERT_NE(hv3, hv4); |
+ |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv3, &h)); |
+ ASSERT_EQ(h3, h); |
+ |
+ h.reset(); |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv4, &h)); |
+ ASSERT_EQ(h4, h); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, h1.dispatcher->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h2.dispatcher->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h3.dispatcher->Close()); |
+ EXPECT_EQ(MOJO_RESULT_OK, h4.dispatcher->Close()); |
} |
TEST(HandleTableTest, AddHandleVector) { |
@@ -184,27 +188,26 @@ TEST(HandleTableTest, AddHandleVector) { |
HandleTable ht(1000u); |
HandleVector handles; |
- std::vector<RefPtr<Dispatcher>> dispatchers; |
for (size_t i = 0u; i < kNumHandles; i++) { |
- dispatchers.push_back(MakeRefCounted<test::MockSimpleDispatcher>()); |
- handles.push_back( |
- Handle(dispatchers.back().Clone(), MOJO_HANDLE_RIGHT_NONE)); |
+ handles.push_back(Handle(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ static_cast<MojoHandleRights>(i))); |
ASSERT_TRUE(handles[i]) << i; |
} |
std::vector<MojoHandle> handle_values(kNumHandles, MOJO_HANDLE_INVALID); |
- ASSERT_TRUE(ht.AddHandleVector(&handles, handle_values.data())); |
+ HandleVector handles_copy = handles; |
+ ASSERT_TRUE(ht.AddHandleVector(&handles_copy, handle_values.data())); |
for (size_t i = 0u; i < kNumHandles; i++) { |
ASSERT_NE(handle_values[i], MOJO_HANDLE_INVALID) << i; |
+ EXPECT_FALSE(handles_copy[i]) << i; |
- RefPtr<Dispatcher> d; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(handle_values[i], &d)) |
- << i; |
- ASSERT_EQ(dispatchers[i], d) << i; |
+ Handle h; |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(handle_values[i], &h)) << i; |
+ ASSERT_EQ(handles[i], h) << i; |
- EXPECT_EQ(MOJO_RESULT_OK, dispatchers[i]->Close()) << i; |
+ EXPECT_EQ(MOJO_RESULT_OK, handles[i].dispatcher->Close()) << i; |
} |
} |
@@ -215,34 +218,33 @@ TEST(HandleTableTest, AddHandleVectorTooMany) { |
HandleTable ht(kHandleTableSize); |
HandleVector handles; |
- std::vector<RefPtr<Dispatcher>> dispatchers; |
for (size_t i = 0u; i < kNumHandles; i++) { |
- dispatchers.push_back(MakeRefCounted<test::MockSimpleDispatcher>()); |
- handles.push_back( |
- Handle(dispatchers.back().Clone(), MOJO_HANDLE_RIGHT_NONE)); |
+ handles.push_back(Handle(MakeRefCounted<test::MockSimpleDispatcher>(), |
+ static_cast<MojoHandleRights>(i))); |
ASSERT_TRUE(handles[i]) << i; |
} |
std::vector<MojoHandle> handle_values(kNumHandles, MOJO_HANDLE_INVALID); |
- EXPECT_FALSE(ht.AddHandleVector(&handles, handle_values.data())); |
+ HandleVector handles_copy = handles; |
+ EXPECT_FALSE(ht.AddHandleVector(&handles_copy, handle_values.data())); |
- handles.pop_back(); |
+ handles_copy.pop_back(); |
handle_values.pop_back(); |
- ASSERT_TRUE(ht.AddHandleVector(&handles, handle_values.data())); |
+ ASSERT_TRUE(ht.AddHandleVector(&handles_copy, handle_values.data())); |
for (size_t i = 0u; i < kNumHandles - 1u; i++) { |
ASSERT_NE(handle_values[i], MOJO_HANDLE_INVALID) << i; |
+ EXPECT_FALSE(handles_copy[i]) << i; |
- RefPtr<Dispatcher> d; |
- ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(handle_values[i], &d)) |
- << i; |
- ASSERT_EQ(dispatchers[i], d) << i; |
+ Handle h; |
+ ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(handle_values[i], &h)) << i; |
+ ASSERT_EQ(handles[i], h) << i; |
} |
for (size_t i = 0u; i < kNumHandles; i++) |
- EXPECT_EQ(MOJO_RESULT_OK, dispatchers[i]->Close()) << i; |
+ EXPECT_EQ(MOJO_RESULT_OK, handles[i].dispatcher->Close()) << i; |
} |
} // namespace |