blob: 8f38f46bea9ac4af4017936f3c416f1b2d9fa01d [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.com5e5adfd2009-03-07 03:39:23 +00008#include "Test.h"
9#include "SkRandom.h"
bungeman@google.com6cab1a42013-05-29 13:43:31 +000010#include "SkOSFile.h"
reed@android.com5e5adfd2009-03-07 03:39:23 +000011#include "SkStream.h"
reed@google.com8d0b5772011-06-24 13:07:31 +000012#include "SkData.h"
reed@android.com5e5adfd2009-03-07 03:39:23 +000013
reed@google.com789c6f22013-02-25 20:24:24 +000014#ifndef SK_BUILD_FOR_WIN
15#include <unistd.h>
16#include <fcntl.h>
17#endif
18
reed@android.com5e5adfd2009-03-07 03:39:23 +000019#define MAX_SIZE (256 * 1024)
20
reed@google.com789c6f22013-02-25 20:24:24 +000021static void test_loop_stream(skiatest::Reporter* reporter, SkStream* stream,
22 const void* src, size_t len, int repeat) {
23 SkAutoSMalloc<256> storage(len);
24 void* tmp = storage.get();
25
26 for (int i = 0; i < repeat; ++i) {
27 size_t bytes = stream->read(tmp, len);
28 REPORTER_ASSERT(reporter, bytes == len);
29 REPORTER_ASSERT(reporter, !memcmp(tmp, src, len));
30 }
31
32 // expect EOF
33 size_t bytes = stream->read(tmp, 1);
34 REPORTER_ASSERT(reporter, 0 == bytes);
35}
36
37static void test_filestreams(skiatest::Reporter* reporter, const char* tmpDir) {
38 SkString path;
39 path.printf("%s%s", tmpDir, "wstream_test");
40
41 const char s[] = "abcdefghijklmnopqrstuvwxyz";
42
43 {
44 SkFILEWStream writer(path.c_str());
45 if (!writer.isValid()) {
46 SkString msg;
47 msg.printf("Failed to create tmp file %s\n", path.c_str());
48 reporter->reportFailed(msg.c_str());
49 return;
50 }
51
52 for (int i = 0; i < 100; ++i) {
53 writer.write(s, 26);
54 }
55 }
56
57 {
58 SkFILEStream stream(path.c_str());
59 REPORTER_ASSERT(reporter, stream.isValid());
60 test_loop_stream(reporter, &stream, s, 26, 100);
bungeman@google.com6cab1a42013-05-29 13:43:31 +000061
62 SkAutoTUnref<SkStreamAsset> stream2(stream.duplicate());
63 test_loop_stream(reporter, stream2.get(), s, 26, 100);
reed@google.com789c6f22013-02-25 20:24:24 +000064 }
65
reed@google.com789c6f22013-02-25 20:24:24 +000066 {
bungeman@google.com6cab1a42013-05-29 13:43:31 +000067 FILE* file = ::fopen(path.c_str(), "rb");
68 SkFILEStream stream(file, SkFILEStream::kCallerPasses_Ownership);
reed@google.com789c6f22013-02-25 20:24:24 +000069 REPORTER_ASSERT(reporter, stream.isValid());
70 test_loop_stream(reporter, &stream, s, 26, 100);
bungeman@google.com6cab1a42013-05-29 13:43:31 +000071
72 SkAutoTUnref<SkStreamAsset> stream2(stream.duplicate());
73 test_loop_stream(reporter, stream2.get(), s, 26, 100);
reed@google.com789c6f22013-02-25 20:24:24 +000074 }
reed@google.com789c6f22013-02-25 20:24:24 +000075}
76
reed@android.com80e39a72009-04-02 16:59:40 +000077static void TestWStream(skiatest::Reporter* reporter) {
78 SkDynamicMemoryWStream ds;
79 const char s[] = "abcdefghijklmnopqrstuvwxyz";
80 int i;
81 for (i = 0; i < 100; i++) {
82 REPORTER_ASSERT(reporter, ds.write(s, 26));
reed@android.com5e5adfd2009-03-07 03:39:23 +000083 }
reed@android.com80e39a72009-04-02 16:59:40 +000084 REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
85 char* dst = new char[100 * 26 + 1];
86 dst[100*26] = '*';
87 ds.copyTo(dst);
88 REPORTER_ASSERT(reporter, dst[100*26] == '*');
reed@android.com80e39a72009-04-02 16:59:40 +000089 for (i = 0; i < 100; i++) {
90 REPORTER_ASSERT(reporter, memcmp(&dst[i * 26], s, 26) == 0);
reed@android.com5e5adfd2009-03-07 03:39:23 +000091 }
reed@google.com70442a62011-06-23 21:48:04 +000092
93 {
reed@google.com8d0b5772011-06-24 13:07:31 +000094 SkData* data = ds.copyToData();
reed@google.com70442a62011-06-23 21:48:04 +000095 REPORTER_ASSERT(reporter, 100 * 26 == data->size());
96 REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
97 data->unref();
98 }
reed@android.com80e39a72009-04-02 16:59:40 +000099 delete[] dst;
reed@google.com789c6f22013-02-25 20:24:24 +0000100
djsollen@google.comcb626502013-03-20 13:48:20 +0000101 if (!skiatest::Test::GetTmpDir().isEmpty()) {
102 test_filestreams(reporter, skiatest::Test::GetTmpDir().c_str());
reed@google.com789c6f22013-02-25 20:24:24 +0000103 }
reed@android.com5e5adfd2009-03-07 03:39:23 +0000104}
105
reed@google.com19f286b2011-10-18 11:49:52 +0000106static void TestPackedUInt(skiatest::Reporter* reporter) {
107 // we know that packeduint tries to write 1, 2 or 4 bytes for the length,
108 // so we test values around each of those transitions (and a few others)
109 const size_t sizes[] = {
110 0, 1, 2, 0xFC, 0xFD, 0xFE, 0xFF, 0x100, 0x101, 32767, 32768, 32769,
111 0xFFFD, 0xFFFE, 0xFFFF, 0x10000, 0x10001,
112 0xFFFFFD, 0xFFFFFE, 0xFFFFFF, 0x1000000, 0x1000001,
113 0x7FFFFFFE, 0x7FFFFFFF, 0x80000000, 0x80000001, 0xFFFFFFFE, 0xFFFFFFFF
114 };
rmistry@google.comd6176b02012-08-23 18:14:13 +0000115
116
reed@google.com19f286b2011-10-18 11:49:52 +0000117 size_t i;
118 char buffer[sizeof(sizes) * 4];
rmistry@google.comd6176b02012-08-23 18:14:13 +0000119
reed@google.com19f286b2011-10-18 11:49:52 +0000120 SkMemoryWStream wstream(buffer, sizeof(buffer));
121 for (i = 0; i < SK_ARRAY_COUNT(sizes); ++i) {
122 bool success = wstream.writePackedUInt(sizes[i]);
123 REPORTER_ASSERT(reporter, success);
124 }
125 wstream.flush();
rmistry@google.comd6176b02012-08-23 18:14:13 +0000126
reed@google.com19f286b2011-10-18 11:49:52 +0000127 SkMemoryStream rstream(buffer, sizeof(buffer));
128 for (i = 0; i < SK_ARRAY_COUNT(sizes); ++i) {
129 size_t n = rstream.readPackedUInt();
130 if (sizes[i] != n) {
131 SkDebugf("-- %d: sizes:%x n:%x\n", i, sizes[i], n);
132 }
133 REPORTER_ASSERT(reporter, sizes[i] == n);
134 }
135}
136
scroggo@google.come4904202013-01-09 22:02:58 +0000137// Test that setting an SkMemoryStream to a NULL data does not result in a crash when calling
138// methods that access fData.
139static void TestDereferencingData(SkMemoryStream* memStream) {
140 memStream->read(NULL, 0);
141 memStream->getMemoryBase();
142 SkAutoDataUnref data(memStream->copyToData());
143}
144
145static void TestNullData() {
146 SkData* nullData = NULL;
147 SkMemoryStream memStream(nullData);
148 TestDereferencingData(&memStream);
149
150 memStream.setData(nullData);
151 TestDereferencingData(&memStream);
152
153}
154
reed@android.com5e5adfd2009-03-07 03:39:23 +0000155static void TestStreams(skiatest::Reporter* reporter) {
reed@android.com5e5adfd2009-03-07 03:39:23 +0000156 TestWStream(reporter);
reed@google.com19f286b2011-10-18 11:49:52 +0000157 TestPackedUInt(reporter);
scroggo@google.come4904202013-01-09 22:02:58 +0000158 TestNullData();
reed@android.com5e5adfd2009-03-07 03:39:23 +0000159}
160
161#include "TestClassDef.h"
162DEFINE_TESTCLASS("Stream", StreamTestClass, TestStreams)