| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/handle_table.h" | 5 #include "mojo/edk/system/handle_table.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "mojo/edk/system/dispatcher.h" | 9 #include "mojo/edk/system/dispatcher.h" |
| 10 #include "mojo/edk/system/handle.h" | 10 #include "mojo/edk/system/handle.h" |
| 11 #include "mojo/edk/system/mock_simple_dispatcher.h" | 11 #include "mojo/edk/system/mock_simple_dispatcher.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 13 |
| 14 using mojo::util::MakeRefCounted; | 14 using mojo::util::MakeRefCounted; |
| 15 using mojo::util::RefPtr; | 15 using mojo::util::RefPtr; |
| 16 | 16 |
| 17 namespace mojo { | 17 namespace mojo { |
| 18 namespace system { | 18 namespace system { |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 TEST(HandleTableTest, Basic) { | 21 TEST(HandleTableTest, Basic) { |
| 22 HandleTable ht(1000u); | 22 HandleTable ht(1000u); |
| 23 | 23 |
| 24 RefPtr<Dispatcher> d = MakeRefCounted<test::MockSimpleDispatcher>(); | 24 Handle h(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 25 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ); |
| 25 | 26 |
| 26 MojoHandle hv = ht.AddHandle(Handle(d.Clone(), MOJO_HANDLE_RIGHT_NONE)); | 27 MojoHandle hv = ht.AddHandle(h.Clone()); |
| 27 ASSERT_NE(hv, MOJO_HANDLE_INVALID); | 28 ASSERT_NE(hv, MOJO_HANDLE_INVALID); |
| 28 | 29 |
| 29 // Save the pointer value (without taking a ref), so we can check that we get | 30 // Save the pointer value (without taking a ref), so we can check that we get |
| 30 // the same object back. | 31 // the same object back. |
| 31 Dispatcher* dv = d.get(); | 32 Dispatcher* dv = h.dispatcher.get(); |
| 32 // Reset this, to make sure that the handle table takes a ref. | 33 // Reset this, to make sure that the handle table takes a ref. |
| 33 d = nullptr; | 34 h.reset(); |
| 34 | 35 |
| 35 Handle h; | |
| 36 EXPECT_EQ(MOJO_RESULT_OK, ht.GetHandle(hv, &h)); | 36 EXPECT_EQ(MOJO_RESULT_OK, ht.GetHandle(hv, &h)); |
| 37 EXPECT_EQ(dv, h.dispatcher.get()); | 37 EXPECT_EQ(dv, h.dispatcher.get()); |
| 38 EXPECT_EQ(MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ, h.rights); |
| 38 | 39 |
| 39 d = nullptr; | 40 h.reset(); |
| 40 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(hv, &d)); | 41 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv, &h)); |
| 41 ASSERT_EQ(dv, d.get()); | 42 ASSERT_EQ(dv, h.dispatcher.get()); |
| 43 EXPECT_EQ(MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ, h.rights); |
| 42 | 44 |
| 43 EXPECT_EQ(MOJO_RESULT_OK, d->Close()); | 45 EXPECT_EQ(MOJO_RESULT_OK, h.dispatcher->Close()); |
| 44 | 46 |
| 45 // We removed |hv|, so it should no longer be valid. | 47 // We removed |hv|, so it should no longer be valid. |
| 46 h.reset(); | 48 h.reset(); |
| 47 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, ht.GetHandle(hv, &h)); | 49 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, ht.GetHandle(hv, &h)); |
| 48 } | 50 } |
| 49 | 51 |
| 50 TEST(HandleTableTest, AddHandlePair) { | 52 TEST(HandleTableTest, AddHandlePair) { |
| 51 HandleTable ht(1000u); | 53 HandleTable ht(1000u); |
| 52 | 54 |
| 53 auto d1 = MakeRefCounted<test::MockSimpleDispatcher>(); | 55 Handle h1(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 54 auto d2 = MakeRefCounted<test::MockSimpleDispatcher>(); | 56 MOJO_HANDLE_RIGHT_NONE); |
| 57 Handle h2(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 58 MOJO_HANDLE_RIGHT_DUPLICATE); |
| 55 | 59 |
| 56 auto hp = ht.AddHandlePair(Handle(d1.Clone(), MOJO_HANDLE_RIGHT_NONE), | 60 auto hp = ht.AddHandlePair(h1.Clone(), h2.Clone()); |
| 57 Handle(d2.Clone(), MOJO_HANDLE_RIGHT_NONE)); | |
| 58 ASSERT_NE(hp.first, MOJO_HANDLE_INVALID); | 61 ASSERT_NE(hp.first, MOJO_HANDLE_INVALID); |
| 59 ASSERT_NE(hp.second, MOJO_HANDLE_INVALID); | 62 ASSERT_NE(hp.second, MOJO_HANDLE_INVALID); |
| 60 ASSERT_NE(hp.first, hp.second); | 63 ASSERT_NE(hp.first, hp.second); |
| 61 | 64 |
| 62 RefPtr<Dispatcher> d; | 65 Handle h; |
| 63 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(hp.first, &d)); | 66 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hp.first, &h)); |
| 64 ASSERT_EQ(d1, d); | 67 ASSERT_EQ(h1, h); |
| 65 | 68 |
| 66 d = nullptr; | 69 h.reset(); |
| 67 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(hp.second, &d)); | 70 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hp.second, &h)); |
| 68 ASSERT_EQ(d2, d); | 71 ASSERT_EQ(h2, h); |
| 69 | 72 |
| 70 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 73 EXPECT_EQ(MOJO_RESULT_OK, h1.dispatcher->Close()); |
| 71 EXPECT_EQ(MOJO_RESULT_OK, d2->Close()); | 74 EXPECT_EQ(MOJO_RESULT_OK, h2.dispatcher->Close()); |
| 72 } | 75 } |
| 73 | 76 |
| 74 TEST(HandleTableTest, AddHandleTooMany) { | 77 TEST(HandleTableTest, AddHandleTooMany) { |
| 75 HandleTable ht(2u); | 78 HandleTable ht(2u); |
| 76 | 79 |
| 77 auto d1 = MakeRefCounted<test::MockSimpleDispatcher>(); | 80 Handle h1(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 78 auto d2 = MakeRefCounted<test::MockSimpleDispatcher>(); | 81 MOJO_HANDLE_RIGHT_NONE); |
| 79 auto d3 = MakeRefCounted<test::MockSimpleDispatcher>(); | 82 Handle h2(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 83 MOJO_HANDLE_RIGHT_DUPLICATE); |
| 84 Handle h3(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 85 MOJO_HANDLE_RIGHT_TRANSFER); |
| 80 | 86 |
| 81 MojoHandle h1 = ht.AddHandle(Handle(d1.Clone(), MOJO_HANDLE_RIGHT_NONE)); | 87 MojoHandle hv1 = ht.AddHandle(h1.Clone()); |
| 82 ASSERT_NE(h1, MOJO_HANDLE_INVALID); | 88 ASSERT_NE(hv1, MOJO_HANDLE_INVALID); |
| 83 | 89 |
| 84 MojoHandle h2 = ht.AddHandle(Handle(d2.Clone(), MOJO_HANDLE_RIGHT_NONE)); | 90 MojoHandle hv2 = ht.AddHandle(h2.Clone()); |
| 85 ASSERT_NE(h2, MOJO_HANDLE_INVALID); | 91 ASSERT_NE(hv2, MOJO_HANDLE_INVALID); |
| 86 EXPECT_NE(h2, h1); | 92 EXPECT_NE(hv2, hv1); |
| 87 | 93 |
| 88 // Table should be full; adding |d3| should fail. | 94 // Table should be full; adding |h3| should fail. |
| 89 EXPECT_EQ(MOJO_HANDLE_INVALID, | 95 EXPECT_EQ(MOJO_HANDLE_INVALID, ht.AddHandle(h3.Clone())); |
| 90 ht.AddHandle(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE))); | |
| 91 | 96 |
| 92 // Remove |h2|/|d2|. | 97 // Remove |hv2|/|h2|. |
| 93 RefPtr<Dispatcher> d; | 98 Handle h; |
| 94 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h2, &d)); | 99 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv2, &h)); |
| 95 ASSERT_EQ(d2, d); | 100 ASSERT_EQ(h2, h); |
| 96 | 101 |
| 97 // Now adding |d3| should succeed. | 102 // Now adding |h3| should succeed. |
| 98 MojoHandle h3 = ht.AddHandle(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE)); | 103 MojoHandle hv3 = ht.AddHandle(h3.Clone()); |
| 99 ASSERT_NE(h3, MOJO_HANDLE_INVALID); | 104 ASSERT_NE(hv3, MOJO_HANDLE_INVALID); |
| 100 EXPECT_NE(h3, h1); | 105 EXPECT_NE(hv3, hv1); |
| 101 // Note: |h3| may be equal to |h2| (handle values may be reused). | 106 // Note: |hv3| may be equal to |hv2| (handle values may be reused). |
| 102 | 107 |
| 103 d = nullptr; | 108 h.reset(); |
| 104 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h1, &d)); | 109 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv1, &h)); |
| 105 ASSERT_EQ(d1, d); | 110 ASSERT_EQ(h1, h); |
| 106 | 111 |
| 107 d = nullptr; | 112 h.reset(); |
| 108 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h3, &d)); | 113 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv3, &h)); |
| 109 ASSERT_EQ(d3, d); | 114 ASSERT_EQ(h3, h); |
| 110 | 115 |
| 111 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 116 EXPECT_EQ(MOJO_RESULT_OK, h1.dispatcher->Close()); |
| 112 EXPECT_EQ(MOJO_RESULT_OK, d2->Close()); | 117 EXPECT_EQ(MOJO_RESULT_OK, h2.dispatcher->Close()); |
| 113 EXPECT_EQ(MOJO_RESULT_OK, d3->Close()); | 118 EXPECT_EQ(MOJO_RESULT_OK, h3.dispatcher->Close()); |
| 114 } | 119 } |
| 115 | 120 |
| 116 TEST(HandleTableTest, AddHandlePairTooMany) { | 121 TEST(HandleTableTest, AddHandlePairTooMany) { |
| 117 HandleTable ht(2u); | 122 HandleTable ht(2u); |
| 118 | 123 |
| 119 auto d1 = MakeRefCounted<test::MockSimpleDispatcher>(); | 124 Handle h1(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 120 auto d2 = MakeRefCounted<test::MockSimpleDispatcher>(); | 125 MOJO_HANDLE_RIGHT_NONE); |
| 121 auto d3 = MakeRefCounted<test::MockSimpleDispatcher>(); | 126 Handle h2(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 122 auto d4 = MakeRefCounted<test::MockSimpleDispatcher>(); | 127 MOJO_HANDLE_RIGHT_TRANSFER); |
| 128 Handle h3(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 129 MOJO_HANDLE_RIGHT_READ); |
| 130 Handle h4(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 131 MOJO_HANDLE_RIGHT_WRITE); |
| 123 | 132 |
| 124 auto hp = ht.AddHandlePair(Handle(d1.Clone(), MOJO_HANDLE_RIGHT_NONE), | 133 auto hp = ht.AddHandlePair(h1.Clone(), h2.Clone()); |
| 125 Handle(d2.Clone(), MOJO_HANDLE_RIGHT_NONE)); | 134 auto hv1 = hp.first; |
| 126 auto h1 = hp.first; | 135 auto hv2 = hp.second; |
| 127 auto h2 = hp.second; | 136 ASSERT_NE(hv1, MOJO_HANDLE_INVALID); |
| 128 ASSERT_NE(h1, MOJO_HANDLE_INVALID); | 137 ASSERT_NE(hv2, MOJO_HANDLE_INVALID); |
| 129 ASSERT_NE(h2, MOJO_HANDLE_INVALID); | 138 ASSERT_NE(hv1, hv2); |
| 130 ASSERT_NE(h1, h2); | |
| 131 | 139 |
| 132 // Table should be full; adding |d3| should fail. | 140 // Table should be full; adding |h3| should fail. |
| 133 EXPECT_EQ(MOJO_HANDLE_INVALID, | 141 EXPECT_EQ(MOJO_HANDLE_INVALID, ht.AddHandle(h3.Clone())); |
| 134 ht.AddHandle(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE))); | |
| 135 | 142 |
| 136 // Adding |d3| and |d4| as a pair should also fail. | 143 // Adding |h3| and |h4| as a pair should also fail. |
| 137 auto hp2 = ht.AddHandlePair(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE), | 144 auto hp2 = ht.AddHandlePair(h3.Clone(), h4.Clone()); |
| 138 Handle(d4.Clone(), MOJO_HANDLE_RIGHT_NONE)); | |
| 139 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.first); | 145 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.first); |
| 140 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.second); | 146 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.second); |
| 141 | 147 |
| 142 // Remove |h2|/|d2|. | 148 // Remove |hv2|/|h2|. |
| 143 RefPtr<Dispatcher> d; | 149 Handle h; |
| 144 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h2, &d)); | 150 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv2, &h)); |
| 145 ASSERT_EQ(d2, d); | 151 ASSERT_EQ(h2, h); |
| 146 | 152 |
| 147 // Trying to add |d3| and |d4| as a pair should still fail. | 153 // Trying to add |h3| and |h4| as a pair should still fail. |
| 148 hp2 = ht.AddHandlePair(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE), | 154 hp2 = ht.AddHandlePair(h3.Clone(), h4.Clone()); |
| 149 Handle(d4.Clone(), MOJO_HANDLE_RIGHT_NONE)); | |
| 150 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.first); | 155 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.first); |
| 151 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.second); | 156 EXPECT_EQ(MOJO_HANDLE_INVALID, hp2.second); |
| 152 | 157 |
| 153 // Remove |h1|/|d1|. | 158 // Remove |hv1|/|h1|. |
| 154 d = nullptr; | 159 h.reset(); |
| 155 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h1, &d)); | 160 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv1, &h)); |
| 156 ASSERT_EQ(d1, d); | 161 ASSERT_EQ(h1, h); |
| 157 | 162 |
| 158 // Add |d3| and |d4| as a pair should now succeed fail. | 163 // Add |h3| and |h4| as a pair should now succeed fail. |
| 159 hp2 = ht.AddHandlePair(Handle(d3.Clone(), MOJO_HANDLE_RIGHT_NONE), | 164 hp2 = ht.AddHandlePair(h3.Clone(), h4.Clone()); |
| 160 Handle(d4.Clone(), MOJO_HANDLE_RIGHT_NONE)); | 165 auto hv3 = hp2.first; |
| 161 auto h3 = hp2.first; | 166 auto hv4 = hp2.second; |
| 162 auto h4 = hp2.second; | 167 ASSERT_NE(hv3, MOJO_HANDLE_INVALID); |
| 163 ASSERT_NE(h3, MOJO_HANDLE_INVALID); | 168 ASSERT_NE(hv4, MOJO_HANDLE_INVALID); |
| 164 ASSERT_NE(h4, MOJO_HANDLE_INVALID); | 169 ASSERT_NE(hv3, hv4); |
| 165 ASSERT_NE(h3, h4); | |
| 166 | 170 |
| 167 d = nullptr; | 171 h.reset(); |
| 168 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h3, &d)); | 172 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv3, &h)); |
| 169 ASSERT_EQ(d3, d); | 173 ASSERT_EQ(h3, h); |
| 170 | 174 |
| 171 d = nullptr; | 175 h.reset(); |
| 172 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(h4, &d)); | 176 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(hv4, &h)); |
| 173 ASSERT_EQ(d4, d); | 177 ASSERT_EQ(h4, h); |
| 174 | 178 |
| 175 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); | 179 EXPECT_EQ(MOJO_RESULT_OK, h1.dispatcher->Close()); |
| 176 EXPECT_EQ(MOJO_RESULT_OK, d2->Close()); | 180 EXPECT_EQ(MOJO_RESULT_OK, h2.dispatcher->Close()); |
| 177 EXPECT_EQ(MOJO_RESULT_OK, d3->Close()); | 181 EXPECT_EQ(MOJO_RESULT_OK, h3.dispatcher->Close()); |
| 178 EXPECT_EQ(MOJO_RESULT_OK, d4->Close()); | 182 EXPECT_EQ(MOJO_RESULT_OK, h4.dispatcher->Close()); |
| 179 } | 183 } |
| 180 | 184 |
| 181 TEST(HandleTableTest, AddHandleVector) { | 185 TEST(HandleTableTest, AddHandleVector) { |
| 182 static constexpr size_t kNumHandles = 10u; | 186 static constexpr size_t kNumHandles = 10u; |
| 183 | 187 |
| 184 HandleTable ht(1000u); | 188 HandleTable ht(1000u); |
| 185 | 189 |
| 186 HandleVector handles; | 190 HandleVector handles; |
| 187 std::vector<RefPtr<Dispatcher>> dispatchers; | |
| 188 for (size_t i = 0u; i < kNumHandles; i++) { | 191 for (size_t i = 0u; i < kNumHandles; i++) { |
| 189 dispatchers.push_back(MakeRefCounted<test::MockSimpleDispatcher>()); | 192 handles.push_back(Handle(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 190 handles.push_back( | 193 static_cast<MojoHandleRights>(i))); |
| 191 Handle(dispatchers.back().Clone(), MOJO_HANDLE_RIGHT_NONE)); | |
| 192 ASSERT_TRUE(handles[i]) << i; | 194 ASSERT_TRUE(handles[i]) << i; |
| 193 } | 195 } |
| 194 | 196 |
| 195 std::vector<MojoHandle> handle_values(kNumHandles, MOJO_HANDLE_INVALID); | 197 std::vector<MojoHandle> handle_values(kNumHandles, MOJO_HANDLE_INVALID); |
| 196 | 198 |
| 197 ASSERT_TRUE(ht.AddHandleVector(&handles, handle_values.data())); | 199 HandleVector handles_copy = handles; |
| 200 ASSERT_TRUE(ht.AddHandleVector(&handles_copy, handle_values.data())); |
| 198 | 201 |
| 199 for (size_t i = 0u; i < kNumHandles; i++) { | 202 for (size_t i = 0u; i < kNumHandles; i++) { |
| 200 ASSERT_NE(handle_values[i], MOJO_HANDLE_INVALID) << i; | 203 ASSERT_NE(handle_values[i], MOJO_HANDLE_INVALID) << i; |
| 204 EXPECT_FALSE(handles_copy[i]) << i; |
| 201 | 205 |
| 202 RefPtr<Dispatcher> d; | 206 Handle h; |
| 203 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(handle_values[i], &d)) | 207 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(handle_values[i], &h)) << i; |
| 204 << i; | 208 ASSERT_EQ(handles[i], h) << i; |
| 205 ASSERT_EQ(dispatchers[i], d) << i; | |
| 206 | 209 |
| 207 EXPECT_EQ(MOJO_RESULT_OK, dispatchers[i]->Close()) << i; | 210 EXPECT_EQ(MOJO_RESULT_OK, handles[i].dispatcher->Close()) << i; |
| 208 } | 211 } |
| 209 } | 212 } |
| 210 | 213 |
| 211 TEST(HandleTableTest, AddHandleVectorTooMany) { | 214 TEST(HandleTableTest, AddHandleVectorTooMany) { |
| 212 static constexpr size_t kHandleTableSize = 10u; | 215 static constexpr size_t kHandleTableSize = 10u; |
| 213 static constexpr size_t kNumHandles = kHandleTableSize + 1u; | 216 static constexpr size_t kNumHandles = kHandleTableSize + 1u; |
| 214 | 217 |
| 215 HandleTable ht(kHandleTableSize); | 218 HandleTable ht(kHandleTableSize); |
| 216 | 219 |
| 217 HandleVector handles; | 220 HandleVector handles; |
| 218 std::vector<RefPtr<Dispatcher>> dispatchers; | |
| 219 for (size_t i = 0u; i < kNumHandles; i++) { | 221 for (size_t i = 0u; i < kNumHandles; i++) { |
| 220 dispatchers.push_back(MakeRefCounted<test::MockSimpleDispatcher>()); | 222 handles.push_back(Handle(MakeRefCounted<test::MockSimpleDispatcher>(), |
| 221 handles.push_back( | 223 static_cast<MojoHandleRights>(i))); |
| 222 Handle(dispatchers.back().Clone(), MOJO_HANDLE_RIGHT_NONE)); | |
| 223 ASSERT_TRUE(handles[i]) << i; | 224 ASSERT_TRUE(handles[i]) << i; |
| 224 } | 225 } |
| 225 | 226 |
| 226 std::vector<MojoHandle> handle_values(kNumHandles, MOJO_HANDLE_INVALID); | 227 std::vector<MojoHandle> handle_values(kNumHandles, MOJO_HANDLE_INVALID); |
| 227 | 228 |
| 228 EXPECT_FALSE(ht.AddHandleVector(&handles, handle_values.data())); | 229 HandleVector handles_copy = handles; |
| 230 EXPECT_FALSE(ht.AddHandleVector(&handles_copy, handle_values.data())); |
| 229 | 231 |
| 230 handles.pop_back(); | 232 handles_copy.pop_back(); |
| 231 handle_values.pop_back(); | 233 handle_values.pop_back(); |
| 232 | 234 |
| 233 ASSERT_TRUE(ht.AddHandleVector(&handles, handle_values.data())); | 235 ASSERT_TRUE(ht.AddHandleVector(&handles_copy, handle_values.data())); |
| 234 | 236 |
| 235 for (size_t i = 0u; i < kNumHandles - 1u; i++) { | 237 for (size_t i = 0u; i < kNumHandles - 1u; i++) { |
| 236 ASSERT_NE(handle_values[i], MOJO_HANDLE_INVALID) << i; | 238 ASSERT_NE(handle_values[i], MOJO_HANDLE_INVALID) << i; |
| 239 EXPECT_FALSE(handles_copy[i]) << i; |
| 237 | 240 |
| 238 RefPtr<Dispatcher> d; | 241 Handle h; |
| 239 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveDispatcher(handle_values[i], &d)) | 242 ASSERT_EQ(MOJO_RESULT_OK, ht.GetAndRemoveHandle(handle_values[i], &h)) << i; |
| 240 << i; | 243 ASSERT_EQ(handles[i], h) << i; |
| 241 ASSERT_EQ(dispatchers[i], d) << i; | |
| 242 } | 244 } |
| 243 | 245 |
| 244 for (size_t i = 0u; i < kNumHandles; i++) | 246 for (size_t i = 0u; i < kNumHandles; i++) |
| 245 EXPECT_EQ(MOJO_RESULT_OK, dispatchers[i]->Close()) << i; | 247 EXPECT_EQ(MOJO_RESULT_OK, handles[i].dispatcher->Close()) << i; |
| 246 } | 248 } |
| 247 | 249 |
| 248 } // namespace | 250 } // namespace |
| 249 } // namespace system | 251 } // namespace system |
| 250 } // namespace mojo | 252 } // namespace mojo |
| OLD | NEW |