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 |