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

Side by Side Diff: tests/FrontBufferedStreamTest.cpp

Issue 23717055: Add a buffered SkStream class. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Rename test Created 7 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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)
OLDNEW
« src/utils/SkFrontBufferedStream.cpp ('K') | « src/utils/SkFrontBufferedStream.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698