Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 |
| OLD | NEW |