| 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 |