Index: mojo/public/cpp/bindings/tests/serialization_api_unittest.cc |
diff --git a/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc b/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc |
index 28ada48a0609dc46c2422c27d222d6870e346c70..8f19c348d6183ba5fe11a1335881965b781823ee 100644 |
--- a/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc |
+++ b/mojo/public/cpp/bindings/tests/serialization_api_unittest.cc |
@@ -23,25 +23,29 @@ class StructSerializationAPITest : public testing::Test { |
void SerializeAndDeserialize( |
Type* val, |
mojo::internal::ValidationError expected_validation_error) { |
+ size_t bytes_written = 0; |
size_t num_bytes = val->GetSerializedSize(); |
std::vector<uint8_t> bytes(num_bytes + 1); |
// Last byte is a magic value, helps catch a buffer overflow for |
// serialization. |
bytes[num_bytes] = 170; |
- val->Serialize(bytes.data(), num_bytes); |
+ val->Serialize(bytes.data(), num_bytes, &bytes_written); |
EXPECT_EQ(170u, bytes[num_bytes]); |
+ EXPECT_EQ(num_bytes, bytes_written); |
mojo::internal::BoundsChecker bounds_checker(bytes.data(), num_bytes, 0); |
auto actual_validation_error = |
Type::Data_::Validate(bytes.data(), &bounds_checker, nullptr); |
EXPECT_EQ(expected_validation_error, actual_validation_error); |
+ Type out_val; |
+ auto deserialize_ret = out_val.Deserialize(bytes.data(), bytes.size()); |
viettrungluu
2016/03/23 17:43:53
You may as well say "bool" instead of "auto", espe
vardhan
2016/03/23 23:28:42
Done.
|
if (actual_validation_error == mojo::internal::ValidationError::NONE) { |
- Type out_val; |
- out_val.Deserialize(bytes.data()); |
EXPECT_TRUE(val->Equals(out_val)); |
} |
+ EXPECT_EQ(actual_validation_error == mojo::internal::ValidationError::NONE, |
+ deserialize_ret); |
} |
private: |
@@ -90,6 +94,23 @@ TEST_F(StructSerializationAPITest, BasicStructSerialization) { |
SerializeAndDeserialize(&default_values, |
mojo::internal::ValidationError::NONE); |
} |
+ |
+ { |
+ SCOPED_TRACE("NoDefaultFieldValues.Serialize() should fail"); |
+ NoDefaultFieldValues nd; |
+ nd.f0 = true; |
+ nd.f23 = mojo::Array<mojo::String>::New(10); |
+ |
+ char buf[1000]; |
+ EXPECT_FALSE(nd.Serialize(buf, sizeof(buf))); |
+ |
+ size_t bytes_written; |
+ EXPECT_FALSE(nd.Serialize(buf, sizeof(buf), &bytes_written)); |
+ EXPECT_EQ(160UL, bytes_written); |
+ // The Serialize() shouldn't get around to reserving space for the |f23| |
+ // array field. |
+ EXPECT_LT(bytes_written, nd.GetSerializedSize()); |
+ } |
} |
// This tests serialization of handles -- These should be deaths or |
@@ -142,6 +163,43 @@ TEST_F(StructSerializationAPITest, NullableHandleSerialization) { |
mojo::internal::ValidationError::NONE); |
} |
+// Test that |Deserialize()| appropriately fails on validation. |
+TEST_F(StructSerializationAPITest, DeserializationFailure) { |
+ void* buf[100]; |
+ EmptyStruct es; |
+ |
+ // Bounds checker should fail this, since buf_size is too small. |
+ EXPECT_FALSE(es.Deserialize(buf, 1)); |
+ |
+ es.Serialize(buf, sizeof(buf)); |
+ EXPECT_TRUE(es.Deserialize(buf, sizeof(buf))); |
+ |
+ // Invalid struct header: this should happen inside |
+ // EmptyStruct::Data_::Validate()). |
+ es.Serialize(buf, sizeof(buf)); |
+ EmptyStruct::Data_* es_data = reinterpret_cast<EmptyStruct::Data_*>(buf); |
+ es_data->header_.num_bytes = 0; |
+ EXPECT_FALSE(es.Deserialize(buf, sizeof(buf))); |
+} |
+ |
+// Test DeserializeWithoutValidation |
viettrungluu
2016/03/23 17:43:53
nit: This comment would need some punctuation, but
vardhan
2016/03/23 23:28:43
Done.
|
+TEST_F(StructSerializationAPITest, DeserializationWithoutValidation) { |
+ void* buf[100]; |
viettrungluu
2016/03/23 17:43:53
void*?
vardhan
2016/03/23 23:28:42
Done.
|
+ EmptyStruct es; |
+ |
+ // Since there is no bounds checker, this will pass even though it's bad. |
viettrungluu
2016/03/23 17:43:53
Since you didn't initialize the contents of buf, y
vardhan
2016/03/23 23:28:43
oops!
|
+ EXPECT_TRUE(es.DeserializeWithoutValidation(buf, 1)); |
+ |
+ es.Serialize(buf, sizeof(buf)); |
+ EXPECT_TRUE(es.DeserializeWithoutValidation(buf, sizeof(buf))); |
+ |
+ // Invalid struct header, but will pass anyway because we don't Validate. |
+ es.Serialize(buf, sizeof(buf)); |
+ EmptyStruct::Data_* es_data = reinterpret_cast<EmptyStruct::Data_*>(buf); |
+ es_data->header_.num_bytes = 0; |
+ EXPECT_TRUE(es.DeserializeWithoutValidation(buf, sizeof(buf))); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace mojo |