blob: 00c079abc0436251fd81c864b07b122748055d97 [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) {
scroggo@google.comc76218d2013-06-06 14:59:56 +000038 SkString path = SkOSPath::SkPathJoin(tmpDir, "wstream_test");
reed@google.com789c6f22013-02-25 20:24:24 +000039
40 const char s[] = "abcdefghijklmnopqrstuvwxyz";
41
42 {
43 SkFILEWStream writer(path.c_str());
44 if (!writer.isValid()) {
45 SkString msg;
46 msg.printf("Failed to create tmp file %s\n", path.c_str());
47 reporter->reportFailed(msg.c_str());
48 return;
49 }
50
51 for (int i = 0; i < 100; ++i) {
52 writer.write(s, 26);
53 }
54 }
55
56 {
57 SkFILEStream stream(path.c_str());
58 REPORTER_ASSERT(reporter, stream.isValid());
59 test_loop_stream(reporter, &stream, s, 26, 100);
bungeman@google.com6cab1a42013-05-29 13:43:31 +000060
61 SkAutoTUnref<SkStreamAsset> stream2(stream.duplicate());
62 test_loop_stream(reporter, stream2.get(), s, 26, 100);
reed@google.com789c6f22013-02-25 20:24:24 +000063 }
64
reed@google.com789c6f22013-02-25 20:24:24 +000065 {
bungeman@google.com6cab1a42013-05-29 13:43:31 +000066 FILE* file = ::fopen(path.c_str(), "rb");
67 SkFILEStream stream(file, SkFILEStream::kCallerPasses_Ownership);
reed@google.com789c6f22013-02-25 20:24:24 +000068 REPORTER_ASSERT(reporter, stream.isValid());
69 test_loop_stream(reporter, &stream, s, 26, 100);
bungeman@google.com6cab1a42013-05-29 13:43:31 +000070
71 SkAutoTUnref<SkStreamAsset> stream2(stream.duplicate());
72 test_loop_stream(reporter, stream2.get(), s, 26, 100);
reed@google.com789c6f22013-02-25 20:24:24 +000073 }
reed@google.com789c6f22013-02-25 20:24:24 +000074}
75
reed@android.com80e39a72009-04-02 16:59:40 +000076static void TestWStream(skiatest::Reporter* reporter) {
77 SkDynamicMemoryWStream ds;
78 const char s[] = "abcdefghijklmnopqrstuvwxyz";
79 int i;
80 for (i = 0; i < 100; i++) {
81 REPORTER_ASSERT(reporter, ds.write(s, 26));
reed@android.com5e5adfd2009-03-07 03:39:23 +000082 }
reed@android.com80e39a72009-04-02 16:59:40 +000083 REPORTER_ASSERT(reporter, ds.getOffset() == 100 * 26);
84 char* dst = new char[100 * 26 + 1];
85 dst[100*26] = '*';
86 ds.copyTo(dst);
87 REPORTER_ASSERT(reporter, dst[100*26] == '*');
reed@android.com80e39a72009-04-02 16:59:40 +000088 for (i = 0; i < 100; i++) {
89 REPORTER_ASSERT(reporter, memcmp(&dst[i * 26], s, 26) == 0);
reed@android.com5e5adfd2009-03-07 03:39:23 +000090 }
reed@google.com70442a62011-06-23 21:48:04 +000091
92 {
reed@google.com8d0b5772011-06-24 13:07:31 +000093 SkData* data = ds.copyToData();
reed@google.com70442a62011-06-23 21:48:04 +000094 REPORTER_ASSERT(reporter, 100 * 26 == data->size());
95 REPORTER_ASSERT(reporter, memcmp(dst, data->data(), data->size()) == 0);
96 data->unref();
97 }
reed@android.com80e39a72009-04-02 16:59:40 +000098 delete[] dst;
reed@google.com789c6f22013-02-25 20:24:24 +000099
scroggo@google.comc76218d2013-06-06 14:59:56 +0000100 SkString tmpDir = skiatest::Test::GetTmpDir();
101 if (!tmpDir.isEmpty()) {
102 test_filestreams(reporter, tmpDir.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)