| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 /* | 
|  | 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 "SkBufferedStream.h" | 
|  | 9 #include "SkRefCnt.h" | 
|  | 10 #include "SkTypes.h" | 
|  | 11 #include "Test.h" | 
|  | 12 | 
|  | 13 static void test_read(skiatest::Reporter* reporter, SkStream* bufferedStream, | 
|  | 14                       const void* expectations, size_t bytesToRead) { | 
|  | 15     // output for reading bufferedStream. | 
|  | 16     SkAutoMalloc storage(bytesToRead); | 
|  | 17 | 
|  | 18     size_t bytesRead = bufferedStream->read(storage.get(), bytesToRead); | 
|  | 19     REPORTER_ASSERT(reporter, bytesRead == bytesToRead || bufferedStream->isAtEn
     d()); | 
|  | 20     REPORTER_ASSERT(reporter, memcmp(storage.get(), expectations, bytesRead) == 
     0); | 
|  | 21 } | 
|  | 22 | 
|  | 23 static void test_rewind(skiatest::Reporter* reporter, | 
|  | 24                         SkStream* bufferedStream, bool shouldSucceed) { | 
|  | 25     const bool success = bufferedStream->rewind(); | 
|  | 26     REPORTER_ASSERT(reporter, success == shouldSucceed); | 
|  | 27 } | 
|  | 28 | 
|  | 29 // All tests will buffer this string, and compare output to the original. | 
|  | 30 // The string is long to ensure that all of our lengths being tested are | 
|  | 31 // smaller than the string length. | 
|  | 32 const char gAbcs[] = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef
     ghijklmnopqrstuvwxyz"; | 
|  | 33 | 
|  | 34 // Tests reading the stream across boundaries of what has been buffered so far a
     nd what | 
|  | 35 // the total buffer size is. | 
|  | 36 static void test_incremental_buffering(skiatest::Reporter* reporter, size_t buff
     erSize) { | 
|  | 37     SkMemoryStream memStream(gAbcs, strlen(gAbcs), false); | 
|  | 38 | 
|  | 39     SkAutoTUnref<SkStream> bufferedStream(SkBufferedStream::Create(&memStream, b
     ufferSize)); | 
|  | 40 | 
|  | 41     // First, test reading less than the max buffer size. | 
|  | 42     test_read(reporter, bufferedStream, gAbcs, bufferSize >> 1); | 
|  | 43 | 
|  | 44     // Now test rewinding back to the beginning and reading less than what was | 
|  | 45     // already buffered. | 
|  | 46     test_rewind(reporter, bufferedStream, true); | 
|  | 47     test_read(reporter, bufferedStream, gAbcs, bufferSize >> 2); | 
|  | 48 | 
|  | 49     // Now test reading part of what was buffered, and buffering new data. | 
|  | 50     test_read(reporter, bufferedStream, gAbcs + bufferedStream->getPosition(), b
     ufferSize >> 1); | 
|  | 51 | 
|  | 52     // Now test reading what was buffered, buffering new data, and | 
|  | 53     // reading directly from the stream. | 
|  | 54     test_rewind(reporter, bufferedStream, true); | 
|  | 55     test_read(reporter, bufferedStream, gAbcs, bufferSize << 1); | 
|  | 56 | 
|  | 57     // We have reached the end of the buffer, so rewinding will fail. | 
|  | 58     // This test assumes that the stream is larger than the buffer; otherwise th
     e | 
|  | 59     // result of rewind should be true. | 
|  | 60     test_rewind(reporter, bufferedStream, false); | 
|  | 61 } | 
|  | 62 | 
|  | 63 static void test_perfectly_sized_buffer(skiatest::Reporter* reporter, size_t buf
     ferSize) { | 
|  | 64     SkMemoryStream memStream(gAbcs, strlen(gAbcs), false); | 
|  | 65     SkAutoTUnref<SkStream> bufferedStream(SkBufferedStream::Create(&memStream, b
     ufferSize)); | 
|  | 66 | 
|  | 67     // Read exactly the amount that fits in the buffer. | 
|  | 68     test_read(reporter, bufferedStream, gAbcs, bufferSize); | 
|  | 69 | 
|  | 70     // Rewinding should succeed. | 
|  | 71     test_rewind(reporter, bufferedStream, true); | 
|  | 72 | 
|  | 73     // Once again reading buffered info should succeed | 
|  | 74     test_read(reporter, bufferedStream, gAbcs, bufferSize); | 
|  | 75 | 
|  | 76     // Read past the size of the buffer. At this point, we cannot return. | 
|  | 77     test_read(reporter, bufferedStream, gAbcs + bufferedStream->getPosition(), 1
     ); | 
|  | 78     test_rewind(reporter, bufferedStream, false); | 
|  | 79 } | 
|  | 80 | 
|  | 81 static void test_skipping(skiatest::Reporter* reporter, size_t bufferSize) { | 
|  | 82     SkMemoryStream memStream(gAbcs, strlen(gAbcs), false); | 
|  | 83     SkAutoTUnref<SkStream> bufferedStream(SkBufferedStream::Create(&memStream, b
     ufferSize)); | 
|  | 84 | 
|  | 85     // Skip half the buffer. | 
|  | 86     bufferedStream->skip(bufferSize >> 1); | 
|  | 87 | 
|  | 88     // Rewind, then read part of the buffer, which should have been read. | 
|  | 89     test_rewind(reporter, bufferedStream, true); | 
|  | 90     test_read(reporter, bufferedStream, gAbcs, bufferSize >> 2); | 
|  | 91 | 
|  | 92     // Now skip beyond the buffered piece, but still within the total buffer. | 
|  | 93     bufferedStream->skip(bufferSize >> 1); | 
|  | 94 | 
|  | 95     // Test that reading will still work. | 
|  | 96     test_read(reporter, bufferedStream, gAbcs + bufferedStream->getPosition(), b
     ufferSize >> 2); | 
|  | 97 | 
|  | 98     test_rewind(reporter, bufferedStream, true); | 
|  | 99     test_read(reporter, bufferedStream, gAbcs, bufferSize); | 
|  | 100 } | 
|  | 101 | 
|  | 102 static void test_buffers(skiatest::Reporter* reporter, size_t bufferSize) { | 
|  | 103     test_incremental_buffering(reporter, bufferSize); | 
|  | 104     test_perfectly_sized_buffer(reporter, bufferSize); | 
|  | 105     test_skipping(reporter, bufferSize); | 
|  | 106 } | 
|  | 107 | 
|  | 108 static void TestStreams(skiatest::Reporter* reporter) { | 
|  | 109     // Test 6 and 64, which are used by Android, as well as another arbitrary le
     ngth. | 
|  | 110     test_buffers(reporter, 6); | 
|  | 111     test_buffers(reporter, 15); | 
|  | 112     test_buffers(reporter, 64); | 
|  | 113 } | 
|  | 114 | 
|  | 115 #include "TestClassDef.h" | 
|  | 116 DEFINE_TESTCLASS("BufferedStream", BufferedStreamTestClass, TestStreams) | 
| OLD | NEW | 
|---|