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/SharedBufferSegmentReader.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 |
| 47 } // namespace | 48 } // namespace |
| 48 | 49 |
| 49 TEST(FastSharedBufferReaderTest, nonSequentialReads) | 50 TEST(FastSharedBufferReaderTest, nonSequentialReads) |
| 50 { | 51 { |
| 51 char referenceData[kDefaultTestSize]; | 52 char referenceData[kDefaultTestSize]; |
| 52 prepareReferenceData(referenceData, sizeof(referenceData)); | 53 prepareReferenceData(referenceData, sizeof(referenceData)); |
| 53 RefPtr<SharedBuffer> data = SharedBuffer::create(); | 54 RefPtr<SharedBuffer> data = SharedBuffer::create(); |
| 54 data->append(referenceData, sizeof(referenceData)); | 55 data->append(referenceData, sizeof(referenceData)); |
| 55 | 56 |
| 56 FastSharedBufferReader reader(data); | 57 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data)); |
| 58 FastSharedBufferReader reader(segmentReader); | |
|
Peter Kasting
2016/03/23 02:42:58
This pattern happening repeatedly makes me wonder
f(malita)
2016/03/23 16:41:58
nit: segmentReader.release()
(here and below)
scroggo_chromium
2016/03/24 13:59:45
The typical caller (outside of tests) already has
scroggo_chromium
2016/03/24 13:59:45
Done.
Peter Kasting
2016/03/24 22:05:43
Up to you. I'm not opposed to another constructor
scroggo_chromium
2016/03/25 01:05:10
Acknowledged. Left out the constructor for now.
| |
| 57 | 59 |
| 58 // Read size is prime such there will be a segment-spanning | 60 // Read size is prime such there will be a segment-spanning |
| 59 // read eventually. | 61 // read eventually. |
| 60 char tempBuffer[17]; | 62 char tempBuffer[17]; |
| 61 for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(ref erenceData); dataPosition += sizeof(tempBuffer)) { | 63 for (size_t dataPosition = 0; dataPosition + sizeof(tempBuffer) < sizeof(ref erenceData); dataPosition += sizeof(tempBuffer)) { |
| 62 const char* block = reader.getConsecutiveData( | 64 const char* block = reader.getConsecutiveData( |
| 63 dataPosition, sizeof(tempBuffer), tempBuffer); | 65 dataPosition, sizeof(tempBuffer), tempBuffer); |
| 64 ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuff er))); | 66 ASSERT_FALSE(memcmp(block, referenceData + dataPosition, sizeof(tempBuff er))); |
| 65 } | 67 } |
| 66 } | 68 } |
| 67 | 69 |
| 68 TEST(FastSharedBufferReaderTest, readBackwards) | 70 TEST(FastSharedBufferReaderTest, readBackwards) |
| 69 { | 71 { |
| 70 char referenceData[kDefaultTestSize]; | 72 char referenceData[kDefaultTestSize]; |
| 71 prepareReferenceData(referenceData, sizeof(referenceData)); | 73 prepareReferenceData(referenceData, sizeof(referenceData)); |
| 72 RefPtr<SharedBuffer> data = SharedBuffer::create(); | 74 RefPtr<SharedBuffer> data = SharedBuffer::create(); |
| 73 data->append(referenceData, sizeof(referenceData)); | 75 data->append(referenceData, sizeof(referenceData)); |
| 74 | 76 |
| 75 FastSharedBufferReader reader(data); | 77 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data)); |
| 78 FastSharedBufferReader reader(segmentReader); | |
| 76 | 79 |
| 77 // Read size is prime such there will be a segment-spanning | 80 // Read size is prime such there will be a segment-spanning |
| 78 // read eventually. | 81 // read eventually. |
| 79 char tempBuffer[17]; | 82 char tempBuffer[17]; |
| 80 for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceDa ta); dataOffset += sizeof(tempBuffer)) { | 83 for (size_t dataOffset = sizeof(tempBuffer); dataOffset < sizeof(referenceDa ta); dataOffset += sizeof(tempBuffer)) { |
| 81 const char* block = reader.getConsecutiveData( | 84 const char* block = reader.getConsecutiveData( |
| 82 sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer); | 85 sizeof(referenceData) - dataOffset, sizeof(tempBuffer), tempBuffer); |
| 83 ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataO ffset, sizeof(tempBuffer))); | 86 ASSERT_FALSE(memcmp(block, referenceData + sizeof(referenceData) - dataO ffset, sizeof(tempBuffer))); |
| 84 } | 87 } |
| 85 } | 88 } |
| 86 | 89 |
| 87 TEST(FastSharedBufferReaderTest, byteByByte) | 90 TEST(FastSharedBufferReaderTest, byteByByte) |
| 88 { | 91 { |
| 89 char referenceData[kDefaultTestSize]; | 92 char referenceData[kDefaultTestSize]; |
| 90 prepareReferenceData(referenceData, sizeof(referenceData)); | 93 prepareReferenceData(referenceData, sizeof(referenceData)); |
| 91 RefPtr<SharedBuffer> data = SharedBuffer::create(); | 94 RefPtr<SharedBuffer> data = SharedBuffer::create(); |
| 92 data->append(referenceData, sizeof(referenceData)); | 95 data->append(referenceData, sizeof(referenceData)); |
| 93 | 96 |
| 94 FastSharedBufferReader reader(data); | 97 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data)); |
| 98 FastSharedBufferReader reader(segmentReader); | |
| 95 for (size_t i = 0; i < sizeof(referenceData); ++i) { | 99 for (size_t i = 0; i < sizeof(referenceData); ++i) { |
| 96 ASSERT_EQ(referenceData[i], reader.getOneByte(i)); | 100 ASSERT_EQ(referenceData[i], reader.getOneByte(i)); |
| 97 } | 101 } |
| 98 } | 102 } |
| 99 | 103 |
| 100 // Tests that a read from inside the penultimate segment to the very end of the | 104 // 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. | 105 // buffer doesn't try to read off the end of the buffer. |
| 102 TEST(FastSharedBufferReaderTest, readAllOverlappingLastSegmentBoundary) | 106 TEST(FastSharedBufferReaderTest, readAllOverlappingLastSegmentBoundary) |
| 103 { | 107 { |
| 104 const unsigned dataSize = 2 * SharedBuffer::kSegmentSize; | 108 const unsigned dataSize = 2 * SharedBuffer::kSegmentSize; |
| 105 char referenceData[dataSize]; | 109 char referenceData[dataSize]; |
| 106 prepareReferenceData(referenceData, dataSize); | 110 prepareReferenceData(referenceData, dataSize); |
| 107 RefPtr<SharedBuffer> data = SharedBuffer::create(); | 111 RefPtr<SharedBuffer> data = SharedBuffer::create(); |
| 108 data->append(referenceData, dataSize); | 112 data->append(referenceData, dataSize); |
| 109 | 113 |
| 114 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data)); | |
| 110 char buffer[dataSize]; | 115 char buffer[dataSize]; |
| 111 FastSharedBufferReader reader(data); | 116 FastSharedBufferReader reader(segmentReader); |
| 112 reader.getConsecutiveData(0, dataSize, buffer); | 117 reader.getConsecutiveData(0, dataSize, buffer); |
| 113 | 118 |
| 114 ASSERT_FALSE(memcmp(buffer, referenceData, dataSize)); | 119 ASSERT_FALSE(memcmp(buffer, referenceData, dataSize)); |
| 115 } | 120 } |
| 116 | 121 |
| 117 } // namespace blink | 122 } // namespace blink |
| OLD | NEW |