blob: 88b9fbbc2e9162b46099988993cb95318d08843b [file] [log] [blame]
commit-bot@chromium.org02512882013-10-31 18:37:50 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkOrderedWriteBuffer.h"
9#include "SkValidatingReadBuffer.h"
10#include "Test.h"
11
sugoi@google.com305f78e2013-11-04 16:18:15 +000012static const uint32_t kArraySize = 64;
13
14template<typename T>
15static void TestAlignment(T* testObj, skiatest::Reporter* reporter) {
16 // Test memory read/write functions directly
17 unsigned char dataWritten[1024];
18 size_t bytesWrittenToMemory = testObj->writeToMemory(dataWritten);
19 REPORTER_ASSERT(reporter, SkAlign4(bytesWrittenToMemory) == bytesWrittenToMemory);
20 size_t bytesReadFromMemory = testObj->readFromMemory(dataWritten, bytesWrittenToMemory);
21 REPORTER_ASSERT(reporter, SkAlign4(bytesReadFromMemory) == bytesReadFromMemory);
22}
23
24template<typename T> struct SerializationUtils {
25};
26
27template<> struct SerializationUtils<SkMatrix> {
28 static void Write(SkOrderedWriteBuffer& writer, const SkMatrix* matrix) {
29 writer.writeMatrix(*matrix);
30 }
31 static void Read(SkValidatingReadBuffer& reader, SkMatrix* matrix) {
32 reader.readMatrix(matrix);
33 }
34};
35
36template<> struct SerializationUtils<SkPath> {
37 static void Write(SkOrderedWriteBuffer& writer, const SkPath* path) {
38 writer.writePath(*path);
39 }
40 static void Read(SkValidatingReadBuffer& reader, SkPath* path) {
41 reader.readPath(path);
42 }
43};
44
45template<> struct SerializationUtils<SkRegion> {
46 static void Write(SkOrderedWriteBuffer& writer, const SkRegion* region) {
47 writer.writeRegion(*region);
48 }
49 static void Read(SkValidatingReadBuffer& reader, SkRegion* region) {
50 reader.readRegion(region);
51 }
52};
53
54template<> struct SerializationUtils<unsigned char> {
55 static void Write(SkOrderedWriteBuffer& writer, unsigned char* data, uint32_t arraySize) {
commit-bot@chromium.org02512882013-10-31 18:37:50 +000056 writer.writeByteArray(data, arraySize);
commit-bot@chromium.org02512882013-10-31 18:37:50 +000057 }
sugoi@google.com305f78e2013-11-04 16:18:15 +000058 static bool Read(SkValidatingReadBuffer& reader, unsigned char* data, uint32_t arraySize) {
59 return reader.readByteArray(data, arraySize);
60 }
61};
commit-bot@chromium.org02512882013-10-31 18:37:50 +000062
sugoi@google.com305f78e2013-11-04 16:18:15 +000063template<> struct SerializationUtils<SkColor> {
64 static void Write(SkOrderedWriteBuffer& writer, SkColor* data, uint32_t arraySize) {
commit-bot@chromium.org02512882013-10-31 18:37:50 +000065 writer.writeColorArray(data, arraySize);
commit-bot@chromium.org02512882013-10-31 18:37:50 +000066 }
sugoi@google.com305f78e2013-11-04 16:18:15 +000067 static bool Read(SkValidatingReadBuffer& reader, SkColor* data, uint32_t arraySize) {
68 return reader.readColorArray(data, arraySize);
69 }
70};
commit-bot@chromium.org02512882013-10-31 18:37:50 +000071
sugoi@google.com305f78e2013-11-04 16:18:15 +000072template<> struct SerializationUtils<int32_t> {
73 static void Write(SkOrderedWriteBuffer& writer, int32_t* data, uint32_t arraySize) {
commit-bot@chromium.org02512882013-10-31 18:37:50 +000074 writer.writeIntArray(data, arraySize);
commit-bot@chromium.org02512882013-10-31 18:37:50 +000075 }
sugoi@google.com305f78e2013-11-04 16:18:15 +000076 static bool Read(SkValidatingReadBuffer& reader, int32_t* data, uint32_t arraySize) {
77 return reader.readIntArray(data, arraySize);
78 }
79};
commit-bot@chromium.org02512882013-10-31 18:37:50 +000080
sugoi@google.com305f78e2013-11-04 16:18:15 +000081template<> struct SerializationUtils<SkPoint> {
82 static void Write(SkOrderedWriteBuffer& writer, SkPoint* data, uint32_t arraySize) {
commit-bot@chromium.org02512882013-10-31 18:37:50 +000083 writer.writePointArray(data, arraySize);
sugoi@google.com305f78e2013-11-04 16:18:15 +000084 }
85 static bool Read(SkValidatingReadBuffer& reader, SkPoint* data, uint32_t arraySize) {
86 return reader.readPointArray(data, arraySize);
87 }
88};
commit-bot@chromium.org02512882013-10-31 18:37:50 +000089
sugoi@google.com305f78e2013-11-04 16:18:15 +000090template<> struct SerializationUtils<SkScalar> {
91 static void Write(SkOrderedWriteBuffer& writer, SkScalar* data, uint32_t arraySize) {
92 writer.writeScalarArray(data, arraySize);
93 }
94 static bool Read(SkValidatingReadBuffer& reader, SkScalar* data, uint32_t arraySize) {
95 return reader.readScalarArray(data, arraySize);
96 }
97};
commit-bot@chromium.org02512882013-10-31 18:37:50 +000098
sugoi@google.com305f78e2013-11-04 16:18:15 +000099template<typename T>
100static void TestObjectSerialization(T* testObj, skiatest::Reporter* reporter) {
101 SkOrderedWriteBuffer writer(1024);
102 writer.setFlags(SkOrderedWriteBuffer::kValidation_Flag);
103 SerializationUtils<T>::Write(writer, testObj);
104 size_t bytesWritten = writer.bytesWritten();
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000105
sugoi@google.com305f78e2013-11-04 16:18:15 +0000106 unsigned char dataWritten[1024];
107 writer.writeToMemory(dataWritten);
108
109 // Make sure this fails when it should
110 SkValidatingReadBuffer buffer(dataWritten, bytesWritten - 1);
111 const unsigned char* peekBefore = static_cast<const unsigned char*>(buffer.skip(0));
112 SerializationUtils<T>::Read(buffer, testObj);
113 const unsigned char* peekAfter = static_cast<const unsigned char*>(buffer.skip(0));
114 // This should have failed, since the buffer is too small to read a matrix from it
115 REPORTER_ASSERT(reporter, peekBefore == peekAfter);
116
117 // Make sure this succeeds when it should
118 SkValidatingReadBuffer buffer2(dataWritten, bytesWritten);
119 peekBefore = static_cast<const unsigned char*>(buffer2.skip(0));
120 SerializationUtils<T>::Read(buffer2, testObj);
121 peekAfter = static_cast<const unsigned char*>(buffer2.skip(0));
122 // This should have succeeded, since there are enough bytes to read this
123 REPORTER_ASSERT(reporter, static_cast<size_t>(peekAfter - peekBefore) == bytesWritten);
124
125 TestAlignment(testObj, reporter);
126}
127
128template<typename T>
129static void TestArraySerialization(T* data, skiatest::Reporter* reporter) {
130 SkOrderedWriteBuffer writer(1024);
131 writer.setFlags(SkOrderedWriteBuffer::kValidation_Flag);
132 SerializationUtils<T>::Write(writer, data, kArraySize);
133 size_t bytesWritten = writer.bytesWritten();
134 // This should write the length (in 4 bytes) and the array
135 REPORTER_ASSERT(reporter, (4 + kArraySize * sizeof(T)) == bytesWritten);
136
137 unsigned char dataWritten[1024];
138 writer.writeToMemory(dataWritten);
139
140 // Make sure this fails when it should
141 SkValidatingReadBuffer buffer(dataWritten, bytesWritten);
142 T dataRead[kArraySize];
143 bool success = SerializationUtils<T>::Read(buffer, dataRead, kArraySize / 2);
144 // This should have failed, since the provided size was too small
145 REPORTER_ASSERT(reporter, !success);
146
147 // Make sure this succeeds when it should
148 SkValidatingReadBuffer buffer2(dataWritten, bytesWritten);
149 success = SerializationUtils<T>::Read(buffer2, dataRead, kArraySize);
150 // This should have succeeded, since there are enough bytes to read this
151 REPORTER_ASSERT(reporter, success);
152}
153
154static void Tests(skiatest::Reporter* reporter) {
155 // Test matrix serialization
156 {
157 SkMatrix matrix = SkMatrix::I();
158 TestObjectSerialization(&matrix, reporter);
159 }
160
161 // Test path serialization
162 {
163 SkPath path;
164 TestObjectSerialization(&path, reporter);
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000165 }
166
sugoi@google.com305f78e2013-11-04 16:18:15 +0000167 // Test region serialization
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000168 {
sugoi@google.com305f78e2013-11-04 16:18:15 +0000169 SkRegion region;
170 TestObjectSerialization(&region, reporter);
171 }
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000172
sugoi@google.com305f78e2013-11-04 16:18:15 +0000173 // Test rrect serialization
174 {
175 SkRRect rrect;
176 TestAlignment(&rrect, reporter);
177 }
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000178
sugoi@google.com305f78e2013-11-04 16:18:15 +0000179 // Test readByteArray
180 {
181 unsigned char data[kArraySize] = {0};
182 TestArraySerialization(data, reporter);
183 }
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000184
sugoi@google.com305f78e2013-11-04 16:18:15 +0000185 // Test readColorArray
186 {
187 SkColor data[kArraySize];
188 TestArraySerialization(data, reporter);
189 }
190
191 // Test readIntArray
192 {
193 int32_t data[kArraySize];
194 TestArraySerialization(data, reporter);
195 }
196
197 // Test readPointArray
198 {
199 SkPoint data[kArraySize];
200 TestArraySerialization(data, reporter);
201 }
202
203 // Test readScalarArray
204 {
205 SkScalar data[kArraySize];
206 TestArraySerialization(data, reporter);
commit-bot@chromium.org02512882013-10-31 18:37:50 +0000207 }
208}
209
210#include "TestClassDef.h"
211DEFINE_TESTCLASS("Serialization", SerializationClass, Tests)