| Index: tests/SerializationTest.cpp
|
| diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
|
| index 94d09c07354d1a21a12cd18d1a0632ee11918e46..c8f8e4926e050b98816ba97fcdcb90327da1b0cf 100644
|
| --- a/tests/SerializationTest.cpp
|
| +++ b/tests/SerializationTest.cpp
|
| @@ -66,6 +66,15 @@ template<> struct SerializationUtils<SkRegion> {
|
| }
|
| };
|
|
|
| +template<> struct SerializationUtils<SkString> {
|
| + static void Write(SkWriteBuffer& writer, const SkString* string) {
|
| + writer.writeString(string->c_str());
|
| + }
|
| + static void Read(SkValidatingReadBuffer& reader, SkString* string) {
|
| + reader.readString(string);
|
| + }
|
| +};
|
| +
|
| template<> struct SerializationUtils<unsigned char> {
|
| static void Write(SkWriteBuffer& writer, unsigned char* data, uint32_t arraySize) {
|
| writer.writeByteArray(data, arraySize);
|
| @@ -111,8 +120,18 @@ template<> struct SerializationUtils<SkScalar> {
|
| }
|
| };
|
|
|
| -template<typename T>
|
| -static void TestObjectSerialization(T* testObj, skiatest::Reporter* reporter) {
|
| +template<typename T, bool testInvalid> struct SerializationTestUtils {
|
| + static void InvalidateData(unsigned char* data) {}
|
| +};
|
| +
|
| +template<> struct SerializationTestUtils<SkString, true> {
|
| + static void InvalidateData(unsigned char* data) {
|
| + data[3] |= 0x80; // Reverse sign of 1st integer
|
| + }
|
| +};
|
| +
|
| +template<typename T, bool testInvalid>
|
| +static void TestObjectSerializationNoAlign(T* testObj, skiatest::Reporter* reporter) {
|
| SkWriteBuffer writer(SkWriteBuffer::kValidation_Flag);
|
| SerializationUtils<T>::Write(writer, testObj);
|
| size_t bytesWritten = writer.bytesWritten();
|
| @@ -121,6 +140,8 @@ static void TestObjectSerialization(T* testObj, skiatest::Reporter* reporter) {
|
| unsigned char dataWritten[1024];
|
| writer.writeToMemory(dataWritten);
|
|
|
| + SerializationTestUtils<T, testInvalid>::InvalidateData(dataWritten);
|
| +
|
| // Make sure this fails when it should (test with smaller size, but still multiple of 4)
|
| SkValidatingReadBuffer buffer(dataWritten, bytesWritten - 4);
|
| T obj;
|
| @@ -134,9 +155,15 @@ static void TestObjectSerialization(T* testObj, skiatest::Reporter* reporter) {
|
| SerializationUtils<T>::Read(buffer2, &obj2);
|
| const unsigned char* peekAfter = static_cast<const unsigned char*>(buffer2.skip(0));
|
| // This should have succeeded, since there are enough bytes to read this
|
| - REPORTER_ASSERT(reporter, buffer2.isValid());
|
| + REPORTER_ASSERT(reporter, buffer2.isValid() == !testInvalid);
|
| + // Note: This following test should always succeed, regardless of whether the buffer is valid,
|
| + // since if it is invalid, it will simply skip to the end, as if it had read the whole buffer.
|
| REPORTER_ASSERT(reporter, static_cast<size_t>(peekAfter - peekBefore) == bytesWritten);
|
| +}
|
|
|
| +template<typename T>
|
| +static void TestObjectSerialization(T* testObj, skiatest::Reporter* reporter) {
|
| + TestObjectSerializationNoAlign<T, false>(testObj, reporter);
|
| TestAlignment(testObj, reporter);
|
| }
|
|
|
| @@ -309,6 +336,13 @@ DEF_TEST(Serialization, reporter) {
|
| TestObjectSerialization(®ion, reporter);
|
| }
|
|
|
| + // Test string serialization
|
| + {
|
| + SkString string("string");
|
| + TestObjectSerializationNoAlign<SkString, false>(&string, reporter);
|
| + TestObjectSerializationNoAlign<SkString, true>(&string, reporter);
|
| + }
|
| +
|
| // Test rrect serialization
|
| {
|
| // SkRRect does not initialize anything.
|
|
|