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 "SkFrontBufferedStream.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"; | |
mtklein
2013/09/19 18:56:53
line wraps
scroggo
2013/09/25 17:36:01
Done.
| |
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(SkFrontBufferedStream::Create(&memStre am, bufferSize)); | |
40 | |
41 // First, test reading less than the max buffer size. | |
42 test_read(reporter, bufferedStream, gAbcs, bufferSize >> 1); | |
mtklein
2013/09/19 18:56:53
Just a nit: bufferSize / 2 here may be a little mo
scroggo
2013/09/25 17:36:01
Done.
| |
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(SkFrontBufferedStream::Create(&memStre am, bufferSize)); | |
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(SkFrontBufferedStream::Create(&memStre am, bufferSize)); | |
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("FrontBufferedStream", FrontBufferedStreamTestClass, TestStream s) | |
OLD | NEW |