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 <string.h> | 5 #include <string.h> |
6 | 6 |
7 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" | 7 #include "mojo/public/cpp/bindings/lib/fixed_buffer.h" |
8 #include "mojo/public/cpp/environment/environment.h" | 8 #include "mojo/public/cpp/environment/environment.h" |
9 #include "mojo/public/cpp/system/message_pipe.h" | 9 #include "mojo/public/cpp/system/message_pipe.h" |
10 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" | 10 #include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 output->f_int16 = 42; | 44 output->f_int16 = 42; |
45 | 45 |
46 return output.Pass(); | 46 return output.Pass(); |
47 } | 47 } |
48 | 48 |
49 template <typename U, typename T> | 49 template <typename U, typename T> |
50 U SerializeAndDeserialize(T input) { | 50 U SerializeAndDeserialize(T input) { |
51 typedef typename mojo::internal::WrapperTraits<T>::DataType InputDataType; | 51 typedef typename mojo::internal::WrapperTraits<T>::DataType InputDataType; |
52 typedef typename mojo::internal::WrapperTraits<U>::DataType OutputDataType; | 52 typedef typename mojo::internal::WrapperTraits<U>::DataType OutputDataType; |
53 | 53 |
54 size_t size = GetSerializedSize_(input); | 54 size_t size = GetSerializedSize_(*input); |
55 mojo::internal::FixedBufferForTesting buf(size + 32); | 55 mojo::internal::FixedBufferForTesting buf(size + 32); |
56 InputDataType data; | 56 InputDataType data; |
57 Serialize_(input.Pass(), &buf, &data); | 57 Serialize_(input.get(), &buf, &data); |
58 | 58 |
59 std::vector<Handle> handles; | 59 std::vector<Handle> handles; |
60 data->EncodePointersAndHandles(&handles); | 60 data->EncodePointersAndHandles(&handles); |
61 | 61 |
62 // Set the subsequent area to a special value, so that we can find out if we | 62 // Set the subsequent area to a special value, so that we can find out if we |
63 // mistakenly access the area. | 63 // mistakenly access the area. |
64 void* subsequent_area = buf.Allocate(32); | 64 void* subsequent_area = buf.Allocate(32); |
65 memset(subsequent_area, 0xAA, 32); | 65 memset(subsequent_area, 0xAA, 32); |
66 | 66 |
67 OutputDataType output_data = reinterpret_cast<OutputDataType>(data); | 67 OutputDataType output_data = reinterpret_cast<OutputDataType>(data); |
68 output_data->DecodePointersAndHandles(&handles); | 68 output_data->DecodePointersAndHandles(&handles); |
69 | 69 |
70 U output; | 70 using RawUType = typename mojo::internal::RemoveStructPtr<U>::type; |
71 Deserialize_(output_data, &output); | 71 U output(RawUType::New()); |
| 72 Deserialize_(output_data, output.get()); |
72 return output.Pass(); | 73 return output.Pass(); |
73 } | 74 } |
74 | 75 |
75 class StructTest : public testing::Test { | 76 class StructTest : public testing::Test { |
76 public: | 77 public: |
77 ~StructTest() override {} | 78 ~StructTest() override {} |
78 | 79 |
79 private: | 80 private: |
80 Environment env_; | 81 Environment env_; |
81 }; | 82 }; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 // NoDefaultFieldValues contains handles, so Clone() is not available, but | 132 // NoDefaultFieldValues contains handles, so Clone() is not available, but |
132 // NoDefaultFieldValuesPtr should still compile. | 133 // NoDefaultFieldValuesPtr should still compile. |
133 NoDefaultFieldValuesPtr no_default_field_values(NoDefaultFieldValues::New()); | 134 NoDefaultFieldValuesPtr no_default_field_values(NoDefaultFieldValues::New()); |
134 EXPECT_FALSE(no_default_field_values->f13.is_valid()); | 135 EXPECT_FALSE(no_default_field_values->f13.is_valid()); |
135 } | 136 } |
136 | 137 |
137 // Serialization test of a struct with no pointer or handle members. | 138 // Serialization test of a struct with no pointer or handle members. |
138 TEST_F(StructTest, Serialization_Basic) { | 139 TEST_F(StructTest, Serialization_Basic) { |
139 RectPtr rect(MakeRect()); | 140 RectPtr rect(MakeRect()); |
140 | 141 |
141 size_t size = GetSerializedSize_(rect); | 142 size_t size = GetSerializedSize_(*rect); |
142 EXPECT_EQ(8U + 16U, size); | 143 EXPECT_EQ(8U + 16U, size); |
143 | 144 |
144 mojo::internal::FixedBufferForTesting buf(size); | 145 mojo::internal::FixedBufferForTesting buf(size); |
145 internal::Rect_Data* data; | 146 internal::Rect_Data* data; |
146 Serialize_(rect.Pass(), &buf, &data); | 147 Serialize_(rect.get(), &buf, &data); |
147 | 148 |
148 RectPtr rect2; | 149 RectPtr rect2(Rect::New()); |
149 Deserialize_(data, &rect2); | 150 Deserialize_(data, rect2.get()); |
150 | 151 |
151 CheckRect(*rect2); | 152 CheckRect(*rect2); |
152 } | 153 } |
153 | 154 |
154 // Construction of a struct with struct pointers from null. | 155 // Construction of a struct with struct pointers from null. |
155 TEST_F(StructTest, Construction_StructPointers) { | 156 TEST_F(StructTest, Construction_StructPointers) { |
156 RectPairPtr pair; | 157 RectPairPtr pair; |
157 EXPECT_TRUE(pair.is_null()); | 158 EXPECT_TRUE(pair.is_null()); |
158 | 159 |
159 pair = RectPair::New(); | 160 pair = RectPair::New(); |
160 EXPECT_FALSE(pair.is_null()); | 161 EXPECT_FALSE(pair.is_null()); |
161 EXPECT_TRUE(pair->first.is_null()); | 162 EXPECT_TRUE(pair->first.is_null()); |
162 EXPECT_TRUE(pair->first.is_null()); | 163 EXPECT_TRUE(pair->first.is_null()); |
163 | 164 |
164 pair = nullptr; | 165 pair = nullptr; |
165 EXPECT_TRUE(pair.is_null()); | 166 EXPECT_TRUE(pair.is_null()); |
166 } | 167 } |
167 | 168 |
168 // Serialization test of a struct with struct pointers. | 169 // Serialization test of a struct with struct pointers. |
169 TEST_F(StructTest, Serialization_StructPointers) { | 170 TEST_F(StructTest, Serialization_StructPointers) { |
170 RectPairPtr pair(RectPair::New()); | 171 RectPairPtr pair(RectPair::New()); |
171 pair->first = MakeRect(); | 172 pair->first = MakeRect(); |
172 pair->second = MakeRect(); | 173 pair->second = MakeRect(); |
173 | 174 |
174 size_t size = GetSerializedSize_(pair); | 175 size_t size = GetSerializedSize_(*pair); |
175 EXPECT_EQ(8U + 16U + 2 * (8U + 16U), size); | 176 EXPECT_EQ(8U + 16U + 2 * (8U + 16U), size); |
176 | 177 |
177 mojo::internal::FixedBufferForTesting buf(size); | 178 mojo::internal::FixedBufferForTesting buf(size); |
178 internal::RectPair_Data* data; | 179 internal::RectPair_Data* data; |
179 Serialize_(pair.Pass(), &buf, &data); | 180 Serialize_(pair.get(), &buf, &data); |
180 | 181 |
181 RectPairPtr pair2; | 182 RectPairPtr pair2(RectPair::New()); |
182 Deserialize_(data, &pair2); | 183 Deserialize_(data, pair2.get()); |
183 | 184 |
184 CheckRect(*pair2->first); | 185 CheckRect(*pair2->first); |
185 CheckRect(*pair2->second); | 186 CheckRect(*pair2->second); |
186 } | 187 } |
187 | 188 |
188 // Serialization test of a struct with an array member. | 189 // Serialization test of a struct with an array member. |
189 TEST_F(StructTest, Serialization_ArrayPointers) { | 190 TEST_F(StructTest, Serialization_ArrayPointers) { |
190 NamedRegionPtr region(NamedRegion::New()); | 191 NamedRegionPtr region(NamedRegion::New()); |
191 region->name = "region"; | 192 region->name = "region"; |
192 region->rects = Array<RectPtr>::New(4); | 193 region->rects = Array<RectPtr>::New(4); |
193 for (size_t i = 0; i < region->rects.size(); ++i) | 194 for (size_t i = 0; i < region->rects.size(); ++i) |
194 region->rects[i] = MakeRect(static_cast<int32_t>(i) + 1); | 195 region->rects[i] = MakeRect(static_cast<int32_t>(i) + 1); |
195 | 196 |
196 size_t size = GetSerializedSize_(region); | 197 size_t size = GetSerializedSize_(*region); |
197 EXPECT_EQ(8U + // header | 198 EXPECT_EQ(8U + // header |
198 8U + // name pointer | 199 8U + // name pointer |
199 8U + // rects pointer | 200 8U + // rects pointer |
200 8U + // name header | 201 8U + // name header |
201 8U + // name payload (rounded up) | 202 8U + // name payload (rounded up) |
202 8U + // rects header | 203 8U + // rects header |
203 4 * 8U + // rects payload (four pointers) | 204 4 * 8U + // rects payload (four pointers) |
204 4 * (8U + // rect header | 205 4 * (8U + // rect header |
205 16U), // rect payload (four ints) | 206 16U), // rect payload (four ints) |
206 size); | 207 size); |
207 | 208 |
208 mojo::internal::FixedBufferForTesting buf(size); | 209 mojo::internal::FixedBufferForTesting buf(size); |
209 internal::NamedRegion_Data* data; | 210 internal::NamedRegion_Data* data; |
210 Serialize_(region.Pass(), &buf, &data); | 211 Serialize_(region.get(), &buf, &data); |
211 | 212 |
212 NamedRegionPtr region2; | 213 NamedRegionPtr region2(NamedRegion::New()); |
213 Deserialize_(data, ®ion2); | 214 Deserialize_(data, region2.get()); |
214 | 215 |
215 EXPECT_EQ(String("region"), region2->name); | 216 EXPECT_EQ(String("region"), region2->name); |
216 | 217 |
217 EXPECT_EQ(4U, region2->rects.size()); | 218 EXPECT_EQ(4U, region2->rects.size()); |
218 for (size_t i = 0; i < region2->rects.size(); ++i) | 219 for (size_t i = 0; i < region2->rects.size(); ++i) |
219 CheckRect(*region2->rects[i], static_cast<int32_t>(i) + 1); | 220 CheckRect(*region2->rects[i], static_cast<int32_t>(i) + 1); |
220 } | 221 } |
221 | 222 |
222 // Serialization test of a struct with null array pointers. | 223 // Serialization test of a struct with null array pointers. |
223 TEST_F(StructTest, Serialization_NullArrayPointers) { | 224 TEST_F(StructTest, Serialization_NullArrayPointers) { |
224 NamedRegionPtr region(NamedRegion::New()); | 225 NamedRegionPtr region(NamedRegion::New()); |
225 EXPECT_TRUE(region->name.is_null()); | 226 EXPECT_TRUE(region->name.is_null()); |
226 EXPECT_TRUE(region->rects.is_null()); | 227 EXPECT_TRUE(region->rects.is_null()); |
227 | 228 |
228 size_t size = GetSerializedSize_(region); | 229 size_t size = GetSerializedSize_(*region); |
229 EXPECT_EQ(8U + // header | 230 EXPECT_EQ(8U + // header |
230 8U + // name pointer | 231 8U + // name pointer |
231 8U, // rects pointer | 232 8U, // rects pointer |
232 size); | 233 size); |
233 | 234 |
234 mojo::internal::FixedBufferForTesting buf(size); | 235 mojo::internal::FixedBufferForTesting buf(size); |
235 internal::NamedRegion_Data* data; | 236 internal::NamedRegion_Data* data; |
236 Serialize_(region.Pass(), &buf, &data); | 237 Serialize_(region.get(), &buf, &data); |
237 | 238 |
238 NamedRegionPtr region2; | 239 NamedRegionPtr region2(NamedRegion::New()); |
239 Deserialize_(data, ®ion2); | 240 Deserialize_(data, region2.get()); |
240 | 241 |
241 EXPECT_TRUE(region2->name.is_null()); | 242 EXPECT_TRUE(region2->name.is_null()); |
242 EXPECT_TRUE(region2->rects.is_null()); | 243 EXPECT_TRUE(region2->rects.is_null()); |
243 } | 244 } |
244 | 245 |
245 // Tests deserializing structs as a newer version. | 246 // Tests deserializing structs as a newer version. |
246 TEST_F(StructTest, Versioning_OldToNew) { | 247 TEST_F(StructTest, Versioning_OldToNew) { |
247 { | 248 { |
248 MultiVersionStructV0Ptr input(MultiVersionStructV0::New()); | 249 MultiVersionStructV0Ptr input(MultiVersionStructV0::New()); |
249 input->f_int32 = 123; | 250 input->f_int32 = 123; |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 expected_output->f_int32 = 123; | 414 expected_output->f_int32 = 123; |
414 | 415 |
415 MultiVersionStructV0Ptr output = | 416 MultiVersionStructV0Ptr output = |
416 SerializeAndDeserialize<MultiVersionStructV0Ptr>(input.Pass()); | 417 SerializeAndDeserialize<MultiVersionStructV0Ptr>(input.Pass()); |
417 EXPECT_TRUE(output); | 418 EXPECT_TRUE(output); |
418 EXPECT_TRUE(output->Equals(*expected_output)); | 419 EXPECT_TRUE(output->Equals(*expected_output)); |
419 } | 420 } |
420 } | 421 } |
421 } // namespace test | 422 } // namespace test |
422 } // namespace mojo | 423 } // namespace mojo |
OLD | NEW |