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

Unified 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, 9 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp
diff --git a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp
index 3ea9aa0300bc6dd4d3d38fe71a80f148f303e972..eb3b3734138cb82e765fcb04863acb70529126eb 100644
--- a/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/FastSharedBufferReaderTest.cpp
@@ -29,6 +29,7 @@
*/
#include "platform/image-decoders/FastSharedBufferReader.h"
+#include "platform/image-decoders/SegmentReader.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -44,6 +45,34 @@ void prepareReferenceData(char* buffer, size_t size)
buffer[i] = static_cast<char>(i);
}
+PassRefPtr<SegmentReader> copyToROBufferSegmentReader(PassRefPtr<SegmentReader> input)
+{
+ SkRWBuffer rwBuffer;
+ const char* segment = 0;
+ size_t position = 0;
+ while (size_t length = input->getSomeData(segment, position)) {
+ rwBuffer.append(segment, length);
+ position += length;
+ }
+ return SegmentReader::createFromSkROBuffer(adoptRef(rwBuffer.newRBufferSnapshot()));
+}
+
+PassRefPtr<SegmentReader> copyToDataSegmentReader(PassRefPtr<SegmentReader> input)
+{
+ return SegmentReader::createFromSkData(input->getAsSkData());
+}
+
+struct SegmentReaders {
+ RefPtr<SegmentReader> segmentReaders[3];
+};
+
+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.
+{
+ s->segmentReaders[0] = SegmentReader::createFromSharedBuffer(input);
+ s->segmentReaders[1] = copyToROBufferSegmentReader(s->segmentReaders[0]);
+ s->segmentReaders[2] = copyToDataSegmentReader(s->segmentReaders[0]);
+}
+
} // namespace
TEST(FastSharedBufferReaderTest, nonSequentialReads)
@@ -53,15 +82,18 @@ TEST(FastSharedBufferReaderTest, nonSequentialReads)
RefPtr<SharedBuffer> data = SharedBuffer::create();
data->append(referenceData, sizeof(referenceData));
- FastSharedBufferReader reader(data);
-
- // Read size is prime such there will be a segment-spanning
- // read eventually.
- char tempBuffer[17];
- for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(referenceData); dataPosition += sizeof(tempBuffer)) {
- const char* block = reader.getConsecutiveData(
- dataPosition, sizeof(tempBuffer), tempBuffer);
- ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuffer)));
+ SegmentReaders readerStruct;
+ createReaders(&readerStruct, data);
+ for (auto segmentReader : readerStruct.segmentReaders) {
+ FastSharedBufferReader reader(segmentReader);
+ // Read size is prime such there will be a segment-spanning
+ // read eventually.
+ char tempBuffer[17];
+ for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(referenceData); dataPosition += sizeof(tempBuffer)) {
+ const char* block = reader.getConsecutiveData(
+ dataPosition, sizeof(tempBuffer), tempBuffer);
+ ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuffer)));
+ }
}
}
@@ -72,15 +104,18 @@ TEST(FastSharedBufferReaderTest, readBackwards)
RefPtr<SharedBuffer> data = SharedBuffer::create();
data->append(referenceData, sizeof(referenceData));
- FastSharedBufferReader reader(data);
-
- // Read size is prime such there will be a segment-spanning
- // read eventually.
- char tempBuffer[17];
- for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceData); dataOffset += sizeof(tempBuffer)) {
- const char* block = reader.getConsecutiveData(
- sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer);
- ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataOffset, sizeof(tempBuffer)));
+ SegmentReaders readerStruct;
+ createReaders(&readerStruct, data);
+ for (auto segmentReader : readerStruct.segmentReaders) {
+ FastSharedBufferReader reader(segmentReader);
+ // Read size is prime such there will be a segment-spanning
+ // read eventually.
+ char tempBuffer[17];
+ for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceData); dataOffset += sizeof(tempBuffer)) {
+ const char* block = reader.getConsecutiveData(
+ sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer);
+ ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataOffset, sizeof(tempBuffer)));
+ }
}
}
@@ -91,9 +126,13 @@ TEST(FastSharedBufferReaderTest, byteByByte)
RefPtr<SharedBuffer> data = SharedBuffer::create();
data->append(referenceData, sizeof(referenceData));
- FastSharedBufferReader reader(data);
- for (size_t i = 0; i < sizeof(referenceData); ++i) {
- ASSERT_EQ(referenceData[i], reader.getOneByte(i));
+ SegmentReaders readerStruct;
+ createReaders(&readerStruct, data);
+ for (auto segmentReader : readerStruct.segmentReaders) {
+ FastSharedBufferReader reader(segmentReader);
+ for (size_t i = 0; i < sizeof(referenceData); ++i) {
+ ASSERT_EQ(referenceData[i], reader.getOneByte(i));
+ }
}
}
@@ -107,11 +146,35 @@ TEST(FastSharedBufferReaderTest, readAllOverlappingLastSegmentBoundary)
RefPtr<SharedBuffer> data = SharedBuffer::create();
data->append(referenceData, dataSize);
- char buffer[dataSize];
- FastSharedBufferReader reader(data);
- reader.getConsecutiveData(0, dataSize, buffer);
+ SegmentReaders readerStruct;
+ createReaders(&readerStruct, data);
+ for (auto segmentReader : readerStruct.segmentReaders) {
+ FastSharedBufferReader reader(segmentReader);
+ char buffer[dataSize];
+ reader.getConsecutiveData(0, dataSize, buffer);
+ ASSERT_FALSE(memcmp(buffer, referenceData, dataSize));
+ }
+}
- ASSERT_FALSE(memcmp(buffer, referenceData, dataSize));
+// Verify that reading past the end of the buffer does not break future reads.
+TEST(SegmentReaderTest, readPastEndThenRead)
+{
+ 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
+ char referenceData[dataSize];
+ prepareReferenceData(referenceData, dataSize);
+ RefPtr<SharedBuffer> data = SharedBuffer::create();
+ data->append(referenceData, dataSize);
+
+ SegmentReaders readerStruct;
+ createReaders(&readerStruct, data);
+ for (auto segmentReader : readerStruct.segmentReaders) {
+ const char* contents;
+ size_t length = segmentReader->getSomeData(contents, dataSize);
+ 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.
+
+ 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.
+ EXPECT_EQ(length, dataSize);
+ }
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698