1
1
// Protocol Buffers - Google's data interchange format
2
// Copyright 2008 Google Inc.
2
// Copyright 2008 Google Inc. All rights reserved.
3
3
// http://code.google.com/p/protobuf/
5
// Licensed under the Apache License, Version 2.0 (the "License");
6
// you may not use this file except in compliance with the License.
7
// You may obtain a copy of the License at
9
// http://www.apache.org/licenses/LICENSE-2.0
11
// Unless required by applicable law or agreed to in writing, software
12
// distributed under the License is distributed on an "AS IS" BASIS,
13
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
// See the License for the specific language governing permissions and
15
// limitations under the License.
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are
9
// * Redistributions of source code must retain the above copyright
10
// notice, this list of conditions and the following disclaimer.
11
// * Redistributions in binary form must reproduce the above
12
// copyright notice, this list of conditions and the following disclaimer
13
// in the documentation and/or other materials provided with the
15
// * Neither the name of Google Inc. nor the names of its
16
// contributors may be used to endorse or promote products derived from
17
// this software without specific prior written permission.
19
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17
31
// Author: kenton@google.com (Kenton Varda)
18
32
// Based on original Protocol Buffers design by
76
90
// Helper to read a fixed-length array of data from an input stream.
77
91
int ReadFromInput(ZeroCopyInputStream* input, void* data, int size);
78
92
// Write a string to the output stream.
79
void WriteString(ZeroCopyOutputStream* output, const char* str);
93
void WriteString(ZeroCopyOutputStream* output, const string& str);
80
94
// Read a number of bytes equal to the size of the given string and checks
81
95
// that it matches the string.
82
void ReadString(ZeroCopyInputStream* input, const char* str);
96
void ReadString(ZeroCopyInputStream* input, const string& str);
83
97
// Writes some text to the output stream in a particular order. Returns
84
98
// the number of bytes written, incase the caller needs that to set up an
88
102
// WriteStuff() writes.
89
103
void ReadStuff(ZeroCopyInputStream* input);
105
// Similar to WriteStuff, but performs more sophisticated testing.
106
int WriteStuffLarge(ZeroCopyOutputStream* output);
107
// Reads and tests a stream that should have been written to
108
// via WriteStuffLarge().
109
void ReadStuffLarge(ZeroCopyInputStream* input);
91
111
static const int kBlockSizes[];
92
112
static const int kBlockSizeCount;
131
152
if (!input->Next(&in, &in_size)) {
132
153
return size - out_size;
155
EXPECT_GT(in_size, 0);
135
157
if (out_size <= in_size) {
136
158
memcpy(out, in, out_size);
137
input->BackUp(in_size - out_size);
159
if (in_size > out_size) {
160
input->BackUp(in_size - out_size);
138
162
return size; // Copied all of it.
147
void IoTest::WriteString(ZeroCopyOutputStream* output, const char* str) {
148
EXPECT_TRUE(WriteToOutput(output, str, strlen(str)));
171
void IoTest::WriteString(ZeroCopyOutputStream* output, const string& str) {
172
EXPECT_TRUE(WriteToOutput(output, str.c_str(), str.size()));
151
void IoTest::ReadString(ZeroCopyInputStream* input, const char* str) {
152
int length = strlen(str);
153
scoped_array<char> buffer(new char[length + 1]);
154
buffer[length] = '\0';
155
EXPECT_EQ(ReadFromInput(input, buffer.get(), length), length);
156
EXPECT_STREQ(str, buffer.get());
175
void IoTest::ReadString(ZeroCopyInputStream* input, const string& str) {
176
scoped_array<char> buffer(new char[str.size() + 1]);
177
buffer[str.size()] = '\0';
178
EXPECT_EQ(ReadFromInput(input, buffer.get(), str.size()), str.size());
179
EXPECT_STREQ(str.c_str(), buffer.get());
159
182
int IoTest::WriteStuff(ZeroCopyOutputStream* output) {
188
211
EXPECT_EQ(ReadFromInput(input, &byte, 1), 0);
214
int IoTest::WriteStuffLarge(ZeroCopyOutputStream* output) {
215
WriteString(output, "Hello world!\n");
216
WriteString(output, "Some te");
217
WriteString(output, "xt. Blah blah.");
218
WriteString(output, string(100000, 'x')); // A very long string
219
WriteString(output, string(100000, 'y')); // A very long string
220
WriteString(output, "01234567890123456789");
222
EXPECT_EQ(output->ByteCount(), 200055);
224
int result = output->ByteCount();
228
// Reads text from an input stream and expects it to match what WriteStuff()
230
void IoTest::ReadStuffLarge(ZeroCopyInputStream* input) {
231
ReadString(input, "Hello world!\nSome text. ");
232
EXPECT_TRUE(input->Skip(5));
233
ReadString(input, "blah.");
234
EXPECT_TRUE(input->Skip(100000 - 10));
235
ReadString(input, string(10, 'x') + string(100000 - 20000, 'y'));
236
EXPECT_TRUE(input->Skip(20000 - 10));
237
ReadString(input, "yyyyyyyyyy01234567890123456789");
239
EXPECT_EQ(input->ByteCount(), 200055);
242
EXPECT_EQ(ReadFromInput(input, &byte, 1), 0);
191
245
// ===================================================================
193
247
TEST_F(IoTest, ArrayIo) {
355
409
TEST_F(IoTest, IostreamIo) {
356
410
for (int i = 0; i < kBlockSizeCount; i++) {
357
411
for (int j = 0; j < kBlockSizeCount; j++) {
361
OstreamOutputStream output(&stream, kBlockSizes[i]);
363
EXPECT_FALSE(stream.fail());
416
OstreamOutputStream output(&stream, kBlockSizes[i]);
418
EXPECT_FALSE(stream.fail());
422
IstreamInputStream input(&stream, kBlockSizes[j]);
424
EXPECT_TRUE(stream.eof());
367
IstreamInputStream input(&stream, kBlockSizes[j]);
369
EXPECT_TRUE(stream.eof());
432
OstreamOutputStream output(&stream, kBlockSizes[i]);
433
WriteStuffLarge(&output);
434
EXPECT_FALSE(stream.fail());
438
IstreamInputStream input(&stream, kBlockSizes[j]);
439
ReadStuffLarge(&input);
440
EXPECT_TRUE(stream.eof());