3 * Copyright 2015 gRPC authors.
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.
21 #include <grpc/byte_buffer.h>
22 #include <grpc/byte_buffer_reader.h>
23 #include <grpc/grpc.h>
24 #include <grpc/slice.h>
25 #include <grpc/support/alloc.h>
26 #include <grpc/support/log.h>
27 #include <grpc/support/time.h>
29 #include "src/core/lib/gprpp/thd.h"
30 #include "src/core/lib/iomgr/exec_ctx.h"
31 #include "test/core/util/test_config.h"
33 #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x)
35 static void test_read_one_slice(void) {
37 grpc_byte_buffer* buffer;
38 grpc_byte_buffer_reader reader;
39 grpc_slice first_slice, second_slice;
40 int first_code, second_code;
42 LOG_TEST("test_read_one_slice");
43 slice = grpc_slice_from_copied_string("test");
44 buffer = grpc_raw_byte_buffer_create(&slice, 1);
45 grpc_slice_unref(slice);
46 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
47 "Couldn't init byte buffer reader");
48 first_code = grpc_byte_buffer_reader_next(&reader, &first_slice);
49 GPR_ASSERT(first_code != 0);
50 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(first_slice), "test", 4) == 0);
51 grpc_slice_unref(first_slice);
52 second_code = grpc_byte_buffer_reader_next(&reader, &second_slice);
53 GPR_ASSERT(second_code == 0);
54 grpc_byte_buffer_destroy(buffer);
57 static void test_read_one_slice_malloc(void) {
59 grpc_byte_buffer* buffer;
60 grpc_byte_buffer_reader reader;
61 grpc_slice first_slice, second_slice;
62 int first_code, second_code;
64 LOG_TEST("test_read_one_slice_malloc");
65 slice = grpc_slice_malloc(4);
66 memcpy(GRPC_SLICE_START_PTR(slice), "test", 4);
67 buffer = grpc_raw_byte_buffer_create(&slice, 1);
68 grpc_slice_unref(slice);
69 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
70 "Couldn't init byte buffer reader");
71 first_code = grpc_byte_buffer_reader_next(&reader, &first_slice);
72 GPR_ASSERT(first_code != 0);
73 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(first_slice), "test", 4) == 0);
74 grpc_slice_unref(first_slice);
75 second_code = grpc_byte_buffer_reader_next(&reader, &second_slice);
76 GPR_ASSERT(second_code == 0);
77 grpc_byte_buffer_destroy(buffer);
80 static void test_read_none_compressed_slice(void) {
82 grpc_byte_buffer* buffer;
83 grpc_byte_buffer_reader reader;
84 grpc_slice first_slice, second_slice;
85 int first_code, second_code;
87 LOG_TEST("test_read_none_compressed_slice");
88 slice = grpc_slice_from_copied_string("test");
89 buffer = grpc_raw_byte_buffer_create(&slice, 1);
90 grpc_slice_unref(slice);
91 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
92 "Couldn't init byte buffer reader");
93 first_code = grpc_byte_buffer_reader_next(&reader, &first_slice);
94 GPR_ASSERT(first_code != 0);
95 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(first_slice), "test", 4) == 0);
96 grpc_slice_unref(first_slice);
97 second_code = grpc_byte_buffer_reader_next(&reader, &second_slice);
98 GPR_ASSERT(second_code == 0);
99 grpc_byte_buffer_destroy(buffer);
102 static void test_peek_one_slice(void) {
104 grpc_byte_buffer* buffer;
105 grpc_byte_buffer_reader reader;
106 grpc_slice* first_slice;
107 grpc_slice* second_slice;
108 int first_code, second_code;
110 LOG_TEST("test_peek_one_slice");
111 slice = grpc_slice_from_copied_string("test");
112 buffer = grpc_raw_byte_buffer_create(&slice, 1);
113 grpc_slice_unref(slice);
114 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
115 "Couldn't init byte buffer reader");
116 first_code = grpc_byte_buffer_reader_peek(&reader, &first_slice);
117 GPR_ASSERT(first_code != 0);
118 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*first_slice), "test", 4) == 0);
119 second_code = grpc_byte_buffer_reader_peek(&reader, &second_slice);
120 GPR_ASSERT(second_code == 0);
121 grpc_byte_buffer_destroy(buffer);
124 static void test_peek_one_slice_malloc(void) {
126 grpc_byte_buffer* buffer;
127 grpc_byte_buffer_reader reader;
128 grpc_slice* first_slice;
129 grpc_slice* second_slice;
130 int first_code, second_code;
132 LOG_TEST("test_peek_one_slice_malloc");
133 slice = grpc_slice_malloc(4);
134 memcpy(GRPC_SLICE_START_PTR(slice), "test", 4);
135 buffer = grpc_raw_byte_buffer_create(&slice, 1);
136 grpc_slice_unref(slice);
137 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
138 "Couldn't init byte buffer reader");
139 first_code = grpc_byte_buffer_reader_peek(&reader, &first_slice);
140 GPR_ASSERT(first_code != 0);
141 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*first_slice), "test", 4) == 0);
142 second_code = grpc_byte_buffer_reader_peek(&reader, &second_slice);
143 GPR_ASSERT(second_code == 0);
144 grpc_byte_buffer_destroy(buffer);
147 static void test_peek_none_compressed_slice(void) {
149 grpc_byte_buffer* buffer;
150 grpc_byte_buffer_reader reader;
151 grpc_slice* first_slice;
152 grpc_slice* second_slice;
153 int first_code, second_code;
155 LOG_TEST("test_peek_none_compressed_slice");
156 slice = grpc_slice_from_copied_string("test");
157 buffer = grpc_raw_byte_buffer_create(&slice, 1);
158 grpc_slice_unref(slice);
159 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
160 "Couldn't init byte buffer reader");
161 first_code = grpc_byte_buffer_reader_peek(&reader, &first_slice);
162 GPR_ASSERT(first_code != 0);
163 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*first_slice), "test", 4) == 0);
164 second_code = grpc_byte_buffer_reader_peek(&reader, &second_slice);
165 GPR_ASSERT(second_code == 0);
166 grpc_byte_buffer_destroy(buffer);
169 static void test_byte_buffer_from_reader(void) {
171 grpc_byte_buffer *buffer, *buffer_from_reader;
172 grpc_byte_buffer_reader reader;
174 LOG_TEST("test_byte_buffer_from_reader");
175 slice = grpc_slice_malloc(4);
176 memcpy(GRPC_SLICE_START_PTR(slice), "test", 4);
177 buffer = grpc_raw_byte_buffer_create(&slice, 1);
178 grpc_slice_unref(slice);
179 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
180 "Couldn't init byte buffer reader");
182 buffer_from_reader = grpc_raw_byte_buffer_from_reader(&reader);
183 GPR_ASSERT(buffer->type == buffer_from_reader->type);
184 GPR_ASSERT(buffer_from_reader->data.raw.compression == GRPC_COMPRESS_NONE);
185 GPR_ASSERT(buffer_from_reader->data.raw.slice_buffer.count == 1);
186 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(
187 buffer_from_reader->data.raw.slice_buffer.slices[0]),
190 grpc_byte_buffer_destroy(buffer);
191 grpc_byte_buffer_destroy(buffer_from_reader);
194 static void test_readall(void) {
196 char* lotsa_bs[1024];
197 grpc_slice slices[2];
198 grpc_byte_buffer* buffer;
199 grpc_byte_buffer_reader reader;
200 grpc_slice slice_out;
202 LOG_TEST("test_readall");
204 memset(lotsa_as, 'a', 512 * sizeof(lotsa_as[0]));
205 memset(lotsa_bs, 'b', 1024 * sizeof(lotsa_bs[0]));
206 /* use slices large enough to overflow inlining */
207 slices[0] = grpc_slice_malloc(512);
208 memcpy(GRPC_SLICE_START_PTR(slices[0]), lotsa_as, 512);
209 slices[1] = grpc_slice_malloc(1024);
210 memcpy(GRPC_SLICE_START_PTR(slices[1]), lotsa_bs, 1024);
212 buffer = grpc_raw_byte_buffer_create(slices, 2);
213 grpc_slice_unref(slices[0]);
214 grpc_slice_unref(slices[1]);
216 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
217 "Couldn't init byte buffer reader");
218 slice_out = grpc_byte_buffer_reader_readall(&reader);
220 GPR_ASSERT(GRPC_SLICE_LENGTH(slice_out) == 512 + 1024);
221 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0);
222 GPR_ASSERT(memcmp(&(GRPC_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) ==
224 grpc_slice_unref(slice_out);
225 grpc_byte_buffer_destroy(buffer);
228 static void test_byte_buffer_copy(void) {
230 char* lotsa_bs[1024];
231 grpc_slice slices[2];
232 grpc_byte_buffer* buffer;
233 grpc_byte_buffer* copied_buffer;
234 grpc_byte_buffer_reader reader;
235 grpc_slice slice_out;
237 LOG_TEST("test_byte_buffer_copy");
239 memset(lotsa_as, 'a', 512 * sizeof(lotsa_as[0]));
240 memset(lotsa_bs, 'b', 1024 * sizeof(lotsa_bs[0]));
241 /* use slices large enough to overflow inlining */
242 slices[0] = grpc_slice_malloc(512);
243 memcpy(GRPC_SLICE_START_PTR(slices[0]), lotsa_as, 512);
244 slices[1] = grpc_slice_malloc(1024);
245 memcpy(GRPC_SLICE_START_PTR(slices[1]), lotsa_bs, 1024);
247 buffer = grpc_raw_byte_buffer_create(slices, 2);
248 grpc_slice_unref(slices[0]);
249 grpc_slice_unref(slices[1]);
250 copied_buffer = grpc_byte_buffer_copy(buffer);
252 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) &&
253 "Couldn't init byte buffer reader");
254 slice_out = grpc_byte_buffer_reader_readall(&reader);
256 GPR_ASSERT(GRPC_SLICE_LENGTH(slice_out) == 512 + 1024);
257 GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0);
258 GPR_ASSERT(memcmp(&(GRPC_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) ==
260 grpc_slice_unref(slice_out);
261 grpc_byte_buffer_destroy(buffer);
262 grpc_byte_buffer_destroy(copied_buffer);
265 int main(int argc, char** argv) {
267 grpc::testing::TestEnvironment env(argc, argv);
268 test_read_one_slice();
269 test_read_one_slice_malloc();
270 test_read_none_compressed_slice();
271 test_peek_one_slice();
272 test_peek_one_slice_malloc();
273 test_peek_none_compressed_slice();
274 test_byte_buffer_from_reader();
275 test_byte_buffer_copy();