Index: tests/DataRefTest.cpp |
diff --git a/tests/DataRefTest.cpp b/tests/DataRefTest.cpp |
index 002abcbe894a816301db7383c17adb79d10a9880..03f66c5b04c5baf26340a7a18a13e60874769218 100644 |
--- a/tests/DataRefTest.cpp |
+++ b/tests/DataRefTest.cpp |
@@ -245,7 +245,7 @@ static void check_abcs(skiatest::Reporter* reporter, const char buffer[], size_t |
} |
} |
-// stream should contains an integral number of copies of gABC. |
+// stream should contain an integral number of copies of gABC. |
static void check_alphabet_stream(skiatest::Reporter* reporter, SkStream* stream) { |
REPORTER_ASSERT(reporter, stream->hasLength()); |
size_t size = stream->getLength(); |
@@ -284,6 +284,8 @@ static void check_alphabet_buffer(skiatest::Reporter* reporter, const SkROBuffer |
check_abcs(reporter, storage.get(), size); |
} |
+#include "SkTaskGroup.h" |
+ |
DEF_TEST(RWBuffer, reporter) { |
// Knowing that the default capacity is 4096, choose N large enough so we force it to use |
// multiple buffers internally. |
@@ -301,6 +303,7 @@ DEF_TEST(RWBuffer, reporter) { |
REPORTER_ASSERT(reporter, N*26 == buffer.size()); |
} |
+ // Verify that although the SkRWBuffer's destructor has run, the readers are still valid. |
for (int i = 0; i < N; ++i) { |
REPORTER_ASSERT(reporter, (i + 1) * 26U == readers[i]->size()); |
check_alphabet_buffer(reporter, readers[i]); |
@@ -310,6 +313,35 @@ DEF_TEST(RWBuffer, reporter) { |
} |
} |
+DEF_TEST(RWBuffer_threaded, reporter) { |
+ // Knowing that the default capacity is 4096, choose N large enough so we force it to use |
+ // multiple buffers internally. |
+ const int N = 1000; |
+ SkTaskGroup tasks; |
+ SkRWBuffer buffer; |
+ for (int i = 0; i < N; ++i) { |
+ buffer.append(gABC, 26); |
+ sk_sp<SkROBuffer> reader = sk_sp<SkROBuffer>(buffer.newRBufferSnapshot()); |
+ SkStream* stream = buffer.newStreamSnapshot(); |
+ REPORTER_ASSERT(reporter, reader->size() == buffer.size()); |
+ REPORTER_ASSERT(reporter, stream->getLength() == buffer.size()); |
+ |
+ // reader's copy constructor will ref the SkROBuffer, which will be unreffed |
+ // when the task ends. |
+ // Ownership of stream is passed to the task, which will delete it. |
+ tasks.add([reporter, i, reader, stream] { |
+ REPORTER_ASSERT(reporter, (i + 1) * 26U == reader->size()); |
+ REPORTER_ASSERT(reporter, stream->getLength() == reader->size()); |
+ check_alphabet_buffer(reporter, reader.get()); |
+ check_alphabet_stream(reporter, stream); |
+ REPORTER_ASSERT(reporter, stream->rewind()); |
+ delete stream; |
+ }); |
+ } |
+ REPORTER_ASSERT(reporter, N*26 == buffer.size()); |
+ tasks.wait(); |
+} |
+ |
// Tests that it is safe to call SkROBuffer::Iter::size() when exhausted. |
DEF_TEST(RWBuffer_size, r) { |
SkRWBuffer buffer; |
@@ -325,9 +357,27 @@ DEF_TEST(RWBuffer_size, r) { |
REPORTER_ASSERT(r, 0 == iter.size()); |
} |
-// Tests that it is safe to destruct an SkRWBuffer without appending |
-// anything to it. |
+// Tests that operations (including the destructor) are safe on an SkRWBuffer |
+// without any data appended. |
DEF_TEST(RWBuffer_noAppend, r) { |
SkRWBuffer buffer; |
REPORTER_ASSERT(r, 0 == buffer.size()); |
+ |
+ sk_sp<SkROBuffer> roBuffer = sk_sp<SkROBuffer>(buffer.newRBufferSnapshot()); |
+ REPORTER_ASSERT(r, roBuffer); |
+ if (roBuffer) { |
+ REPORTER_ASSERT(r, roBuffer->size() == 0); |
+ SkROBuffer::Iter iter(roBuffer.get()); |
+ REPORTER_ASSERT(r, iter.size() == 0); |
+ REPORTER_ASSERT(r, !iter.data()); |
+ REPORTER_ASSERT(r, !iter.next()); |
+ } |
+ |
+ SkAutoTDelete<SkStream> stream(buffer.newStreamSnapshot()); |
+ REPORTER_ASSERT(r, stream); |
+ if (stream) { |
+ REPORTER_ASSERT(r, stream->hasLength()); |
+ REPORTER_ASSERT(r, stream->getLength() == 0); |
+ REPORTER_ASSERT(r, stream->skip(10) == 0); |
+ } |
} |