• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
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
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  */
18 
19 #include <grpc/grpc.h>
20 #include <grpc/slice_buffer.h>
21 #include <grpc/support/log.h>
22 #include "src/core/lib/slice/slice_internal.h"
23 #include "test/core/util/test_config.h"
24 
test_slice_buffer_add()25 void test_slice_buffer_add() {
26   grpc_slice_buffer buf;
27   grpc_slice aaa = grpc_slice_from_copied_string("aaa");
28   grpc_slice bb = grpc_slice_from_copied_string("bb");
29   size_t i;
30 
31   grpc_slice_buffer_init(&buf);
32   for (i = 0; i < 10; i++) {
33     grpc_slice_ref(aaa);
34     grpc_slice_ref(bb);
35     grpc_slice_buffer_add(&buf, aaa);
36     grpc_slice_buffer_add(&buf, bb);
37   }
38   GPR_ASSERT(buf.count > 0);
39   GPR_ASSERT(buf.length == 50);
40   grpc_slice_buffer_reset_and_unref(&buf);
41   GPR_ASSERT(buf.count == 0);
42   GPR_ASSERT(buf.length == 0);
43   for (i = 0; i < 10; i++) {
44     grpc_slice_ref(aaa);
45     grpc_slice_ref(bb);
46     grpc_slice_buffer_add(&buf, aaa);
47     grpc_slice_buffer_add(&buf, bb);
48   }
49   GPR_ASSERT(buf.count > 0);
50   GPR_ASSERT(buf.length == 50);
51   for (i = 0; i < 10; i++) {
52     grpc_slice_buffer_pop(&buf);
53     grpc_slice_unref(aaa);
54     grpc_slice_unref(bb);
55   }
56   GPR_ASSERT(buf.count == 0);
57   GPR_ASSERT(buf.length == 0);
58   grpc_slice_buffer_destroy(&buf);
59 }
60 
test_slice_buffer_move_first()61 void test_slice_buffer_move_first() {
62   grpc_slice slices[3];
63   grpc_slice_buffer src;
64   grpc_slice_buffer dst;
65   int idx = 0;
66   size_t src_len = 0;
67   size_t dst_len = 0;
68 
69   slices[0] = grpc_slice_from_copied_string("aaa");
70   slices[1] = grpc_slice_from_copied_string("bbbb");
71   slices[2] = grpc_slice_from_copied_string("ccc");
72 
73   grpc_slice_buffer_init(&src);
74   grpc_slice_buffer_init(&dst);
75   for (idx = 0; idx < 3; idx++) {
76     grpc_slice_ref(slices[idx]);
77     /* For this test, it is important that we add each slice at a new
78        slice index */
79     grpc_slice_buffer_add_indexed(&src, slices[idx]);
80     grpc_slice_buffer_add_indexed(&dst, slices[idx]);
81   }
82 
83   /* Case 1: Move more than the first slice's length from src to dst */
84   src_len = src.length;
85   dst_len = dst.length;
86   grpc_slice_buffer_move_first(&src, 4, &dst);
87   src_len -= 4;
88   dst_len += 4;
89   GPR_ASSERT(src.length == src_len);
90   GPR_ASSERT(dst.length == dst_len);
91 
92   /* src now has two slices ["bbb"] and  ["ccc"] */
93   /* Case 2: Move the first slice from src to dst */
94   grpc_slice_buffer_move_first(&src, 3, &dst);
95   src_len -= 3;
96   dst_len += 3;
97   GPR_ASSERT(src.length == src_len);
98   GPR_ASSERT(dst.length == dst_len);
99 
100   /* src now has one slice ["ccc"] */
101   /* Case 3: Move less than the first slice's length from src to dst*/
102   grpc_slice_buffer_move_first(&src, 2, &dst);
103   src_len -= 2;
104   dst_len += 2;
105   GPR_ASSERT(src.length == src_len);
106   GPR_ASSERT(dst.length == dst_len);
107 }
108 
test_slice_buffer_first()109 void test_slice_buffer_first() {
110   grpc_slice slices[3];
111   slices[0] = grpc_slice_from_copied_string("aaa");
112   slices[1] = grpc_slice_from_copied_string("bbbb");
113   slices[2] = grpc_slice_from_copied_string("ccccc");
114 
115   grpc_slice_buffer buf;
116   grpc_slice_buffer_init(&buf);
117   for (int idx = 0; idx < 3; ++idx) {
118     grpc_slice_ref(slices[idx]);
119     grpc_slice_buffer_add_indexed(&buf, slices[idx]);
120   }
121 
122   grpc_slice* first = grpc_slice_buffer_peek_first(&buf);
123   GPR_ASSERT(GPR_SLICE_LENGTH(*first) == GPR_SLICE_LENGTH(slices[0]));
124   GPR_ASSERT(buf.count == 3);
125   GPR_ASSERT(buf.length == 12);
126 
127   grpc_slice_buffer_sub_first(&buf, 1, 2);
128   first = grpc_slice_buffer_peek_first(&buf);
129   GPR_ASSERT(GPR_SLICE_LENGTH(*first) == 1);
130   GPR_ASSERT(buf.count == 3);
131   GPR_ASSERT(buf.length == 10);
132 
133   grpc_slice_buffer_remove_first(&buf);
134   first = grpc_slice_buffer_peek_first(&buf);
135   GPR_ASSERT(GPR_SLICE_LENGTH(*first) == GPR_SLICE_LENGTH(slices[1]));
136   GPR_ASSERT(buf.count == 2);
137   GPR_ASSERT(buf.length == 9);
138 
139   grpc_slice_buffer_remove_first(&buf);
140   first = grpc_slice_buffer_peek_first(&buf);
141   GPR_ASSERT(GPR_SLICE_LENGTH(*first) == GPR_SLICE_LENGTH(slices[2]));
142   GPR_ASSERT(buf.count == 1);
143   GPR_ASSERT(buf.length == 5);
144 
145   grpc_slice_buffer_remove_first(&buf);
146   GPR_ASSERT(buf.count == 0);
147   GPR_ASSERT(buf.length == 0);
148 }
149 
main(int argc,char ** argv)150 int main(int argc, char** argv) {
151   grpc::testing::TestEnvironment env(argc, argv);
152   grpc_init();
153 
154   test_slice_buffer_add();
155   test_slice_buffer_move_first();
156   test_slice_buffer_first();
157 
158   grpc_shutdown();
159   return 0;
160 }
161