Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1143)

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix assertion Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2015 Google Inc. All rights reserved. 2 * Copyright (C) 2015 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 11 matching lines...) Expand all
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "platform/image-decoders/FastSharedBufferReader.h" 31 #include "platform/image-decoders/FastSharedBufferReader.h"
32 #include "platform/image-decoders/SegmentReader.h"
32 33
33 #include "testing/gtest/include/gtest/gtest.h" 34 #include "testing/gtest/include/gtest/gtest.h"
34 35
35 namespace blink { 36 namespace blink {
36 37
37 namespace { 38 namespace {
38 39
39 const unsigned kDefaultTestSize = 4 * SharedBuffer::kSegmentSize; 40 const unsigned kDefaultTestSize = 4 * SharedBuffer::kSegmentSize;
40 41
41 void prepareReferenceData(char* buffer, size_t size) 42 void prepareReferenceData(char* buffer, size_t size)
42 { 43 {
43 for (size_t i = 0; i < size; ++i) 44 for (size_t i = 0; i < size; ++i)
44 buffer[i] = static_cast<char>(i); 45 buffer[i] = static_cast<char>(i);
45 } 46 }
46 47
48 PassRefPtr<SegmentReader> copyToROBufferSegmentReader(PassRefPtr<SegmentReader> input)
49 {
50 SkRWBuffer rwBuffer;
51 const char* segment = 0;
52 size_t position = 0;
53 while (size_t length = input->getSomeData(segment, position)) {
54 rwBuffer.append(segment, length);
55 position += length;
56 }
57 return SegmentReader::createFromSkROBuffer(adoptRef(rwBuffer.newRBufferSnaps hot()));
58 }
59
60 PassRefPtr<SegmentReader> copyToDataSegmentReader(PassRefPtr<SegmentReader> inpu t)
61 {
62 return SegmentReader::createFromSkData(input->getAsSkData());
63 }
64
65 struct SegmentReaders {
66 RefPtr<SegmentReader> segmentReaders[3];
67 };
68
69 void createReaders(SegmentReaders* s, PassRefPtr<SharedBuffer> input)
Peter Kasting 2016/03/25 06:24:36 Nit: Why not use a constructor for SegmentReaders
scroggo 2016/03/25 15:49:53 Agreed, that is much better. Done.
70 {
71 s->segmentReaders[0] = SegmentReader::createFromSharedBuffer(input);
72 s->segmentReaders[1] = copyToROBufferSegmentReader(s->segmentReaders[0]);
73 s->segmentReaders[2] = copyToDataSegmentReader(s->segmentReaders[0]);
74 }
75
47 } // namespace 76 } // namespace
48 77
49 TEST(FastSharedBufferReaderTest, nonSequentialReads) 78 TEST(FastSharedBufferReaderTest, nonSequentialReads)
50 { 79 {
51 char referenceData[kDefaultTestSize]; 80 char referenceData[kDefaultTestSize];
52 prepareReferenceData(referenceData, sizeof(referenceData)); 81 prepareReferenceData(referenceData, sizeof(referenceData));
53 RefPtr<SharedBuffer> data = SharedBuffer::create(); 82 RefPtr<SharedBuffer> data = SharedBuffer::create();
54 data->append(referenceData, sizeof(referenceData)); 83 data->append(referenceData, sizeof(referenceData));
55 84
56 FastSharedBufferReader reader(data); 85 SegmentReaders readerStruct;
57 86 createReaders(&readerStruct, data);
58 // Read size is prime such there will be a segment-spanning 87 for (auto segmentReader : readerStruct.segmentReaders) {
59 // read eventually. 88 FastSharedBufferReader reader(segmentReader);
60 char tempBuffer[17]; 89 // Read size is prime such there will be a segment-spanning
61 for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(ref erenceData); dataPosition += sizeof(tempBuffer)) { 90 // read eventually.
62 const char* block = reader.getConsecutiveData( 91 char tempBuffer[17];
63 dataPosition, sizeof(tempBuffer), tempBuffer); 92 for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof (referenceData); dataPosition += sizeof(tempBuffer)) {
64 ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuff er))); 93 const char* block = reader.getConsecutiveData(
94 dataPosition, sizeof(tempBuffer), tempBuffer);
95 ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(temp Buffer)));
96 }
65 } 97 }
66 } 98 }
67 99
68 TEST(FastSharedBufferReaderTest, readBackwards) 100 TEST(FastSharedBufferReaderTest, readBackwards)
69 { 101 {
70 char referenceData[kDefaultTestSize]; 102 char referenceData[kDefaultTestSize];
71 prepareReferenceData(referenceData, sizeof(referenceData)); 103 prepareReferenceData(referenceData, sizeof(referenceData));
72 RefPtr<SharedBuffer> data = SharedBuffer::create(); 104 RefPtr<SharedBuffer> data = SharedBuffer::create();
73 data->append(referenceData, sizeof(referenceData)); 105 data->append(referenceData, sizeof(referenceData));
74 106
75 FastSharedBufferReader reader(data); 107 SegmentReaders readerStruct;
76 108 createReaders(&readerStruct, data);
77 // Read size is prime such there will be a segment-spanning 109 for (auto segmentReader : readerStruct.segmentReaders) {
78 // read eventually. 110 FastSharedBufferReader reader(segmentReader);
79 char tempBuffer[17]; 111 // Read size is prime such there will be a segment-spanning
80 for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceDa ta); dataOffset += sizeof(tempBuffer)) { 112 // read eventually.
81 const char* block = reader.getConsecutiveData( 113 char tempBuffer[17];
82 sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer); 114 for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referen ceData); dataOffset += sizeof(tempBuffer)) {
83 ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataO ffset, sizeof(tempBuffer))); 115 const char* block = reader.getConsecutiveData(
116 sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuff er);
117 ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - d ataOffset, sizeof(tempBuffer)));
118 }
84 } 119 }
85 } 120 }
86 121
87 TEST(FastSharedBufferReaderTest, byteByByte) 122 TEST(FastSharedBufferReaderTest, byteByByte)
88 { 123 {
89 char referenceData[kDefaultTestSize]; 124 char referenceData[kDefaultTestSize];
90 prepareReferenceData(referenceData, sizeof(referenceData)); 125 prepareReferenceData(referenceData, sizeof(referenceData));
91 RefPtr<SharedBuffer> data = SharedBuffer::create(); 126 RefPtr<SharedBuffer> data = SharedBuffer::create();
92 data->append(referenceData, sizeof(referenceData)); 127 data->append(referenceData, sizeof(referenceData));
93 128
94 FastSharedBufferReader reader(data); 129 SegmentReaders readerStruct;
95 for (size_t i = 0; i < sizeof(referenceData); ++i) { 130 createReaders(&readerStruct, data);
96 ASSERT_EQ(referenceData[i], reader.getOneByte(i)); 131 for (auto segmentReader : readerStruct.segmentReaders) {
132 FastSharedBufferReader reader(segmentReader);
133 for (size_t i = 0; i < sizeof(referenceData); ++i) {
134 ASSERT_EQ(referenceData[i], reader.getOneByte(i));
135 }
97 } 136 }
98 } 137 }
99 138
100 // Tests that a read from inside the penultimate segment to the very end of the 139 // Tests that a read from inside the penultimate segment to the very end of the
101 // buffer doesn't try to read off the end of the buffer. 140 // buffer doesn't try to read off the end of the buffer.
102 TEST(FastSharedBufferReaderTest, readAllOverlappingLastSegmentBoundary) 141 TEST(FastSharedBufferReaderTest, readAllOverlappingLastSegmentBoundary)
103 { 142 {
104 const unsigned dataSize = 2 * SharedBuffer::kSegmentSize; 143 const unsigned dataSize = 2 * SharedBuffer::kSegmentSize;
105 char referenceData[dataSize]; 144 char referenceData[dataSize];
106 prepareReferenceData(referenceData, dataSize); 145 prepareReferenceData(referenceData, dataSize);
107 RefPtr<SharedBuffer> data = SharedBuffer::create(); 146 RefPtr<SharedBuffer> data = SharedBuffer::create();
108 data->append(referenceData, dataSize); 147 data->append(referenceData, dataSize);
109 148
110 char buffer[dataSize]; 149 SegmentReaders readerStruct;
111 FastSharedBufferReader reader(data); 150 createReaders(&readerStruct, data);
112 reader.getConsecutiveData(0, dataSize, buffer); 151 for (auto segmentReader : readerStruct.segmentReaders) {
152 FastSharedBufferReader reader(segmentReader);
153 char buffer[dataSize];
154 reader.getConsecutiveData(0, dataSize, buffer);
155 ASSERT_FALSE(memcmp(buffer, referenceData, dataSize));
156 }
157 }
113 158
114 ASSERT_FALSE(memcmp(buffer, referenceData, dataSize)); 159 // Verify that reading past the end of the buffer does not break future reads.
160 TEST(SegmentReaderTest, readPastEndThenRead)
161 {
162 const unsigned dataSize = SharedBuffer::kSegmentSize;
Peter Kasting 2016/03/25 06:24:37 Should this test test a buffer with more than one
scroggo 2016/03/25 15:49:53 My goal in this test was to test reading past the
163 char referenceData[dataSize];
164 prepareReferenceData(referenceData, dataSize);
165 RefPtr<SharedBuffer> data = SharedBuffer::create();
166 data->append(referenceData, dataSize);
167
168 SegmentReaders readerStruct;
169 createReaders(&readerStruct, data);
170 for (auto segmentReader : readerStruct.segmentReaders) {
171 const char* contents;
172 size_t length = segmentReader->getSomeData(contents, dataSize);
173 EXPECT_EQ(length, 0u);
Peter Kasting 2016/03/25 06:24:36 Nit: (expected, actual) (2 places)
scroggo 2016/03/25 15:49:53 Done.
174
175 length = segmentReader->getSomeData(contents, static_cast<size_t>(0));
Peter Kasting 2016/03/25 06:24:36 Nit: Shouldn't need to static_cast here.
scroggo 2016/03/25 15:49:53 Done.
176 EXPECT_EQ(length, dataSize);
177 }
115 } 178 }
116 179
117 } // namespace blink 180 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698