Add test for new FrontBufferedStream behavior.

Test for https://skia.googlesource.com/skia/+/dd5a1e094c19fa10202c37c50a1f799e5af5dac0

Verify that FrontBufferedStream does not attempt to read beyond the
end of its underlying stream.

Review URL: https://codereview.chromium.org/641813009
This commit is contained in:
scroggo 2014-10-23 10:21:28 -07:00 committed by Commit bot
parent df78d0a81c
commit da59f05c67

View File

@ -5,7 +5,9 @@
* found in the LICENSE file.
*/
#include "SkBitmap.h"
#include "SkFrontBufferedStream.h"
#include "SkImageDecoder.h"
#include "SkRefCnt.h"
#include "SkStream.h"
#include "SkTypes.h"
@ -249,3 +251,45 @@ DEF_TEST(FrontBufferedStream, reporter) {
test_buffers(reporter, 15);
test_buffers(reporter, 64);
}
// Test that a FrontBufferedStream does not allow reading after the end of a stream.
// This class is a dummy SkStream which reports that it is at the end on the first
// read (simulating a failure). Then it tracks whether someone calls read() again.
class FailingStream : public SkStream {
public:
FailingStream()
: fAtEnd(false)
, fReadAfterEnd(false)
{}
virtual size_t read(void* buffer, size_t size) SK_OVERRIDE {
if (fAtEnd) {
fReadAfterEnd = true;
} else {
fAtEnd = true;
}
return 0;
}
virtual bool isAtEnd() const SK_OVERRIDE {
return fAtEnd;
}
bool readAfterEnd() const {
return fReadAfterEnd;
}
private:
bool fAtEnd;
bool fReadAfterEnd;
};
DEF_TEST(ShortFrontBufferedStream, reporter) {
FailingStream failingStream;
SkAutoTUnref<SkStreamRewindable> stream(SkFrontBufferedStream::Create(&failingStream, 64));
SkBitmap bm;
// The return value of DecodeStream is not important. We are just using DecodeStream because
// it simulates a bug. DecodeStream will read the stream, then rewind, then attempt to read
// again. FrontBufferedStream::read should not continue to read its underlying stream beyond
// its end.
SkImageDecoder::DecodeStream(stream, &bm);
REPORTER_ASSERT(reporter, !failingStream.readAfterEnd());
}