| 30 |
ashish |
1 |
/*
|
|
|
2 |
* Licensed to the Apache Software Foundation (ASF) under one
|
|
|
3 |
* or more contributor license agreements. See the NOTICE file
|
|
|
4 |
* distributed with this work for additional information
|
|
|
5 |
* regarding copyright ownership. The ASF licenses this file
|
|
|
6 |
* to you under the Apache License, Version 2.0 (the
|
|
|
7 |
* "License"); you may not use this file except in compliance
|
|
|
8 |
* with the License. You may obtain a copy of the License at
|
|
|
9 |
*
|
|
|
10 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
11 |
*
|
|
|
12 |
* Unless required by applicable law or agreed to in writing,
|
|
|
13 |
* software distributed under the License is distributed on an
|
|
|
14 |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
15 |
* KIND, either express or implied. See the License for the
|
|
|
16 |
* specific language governing permissions and limitations
|
|
|
17 |
* under the License.
|
|
|
18 |
*/
|
|
|
19 |
|
|
|
20 |
#include <algorithm>
|
|
|
21 |
#include <boost/foreach.hpp>
|
|
|
22 |
#include <boost/test/unit_test.hpp>
|
|
|
23 |
#include <transport/TBufferTransports.h>
|
|
|
24 |
#include <transport/TShortReadTransport.h>
|
|
|
25 |
|
|
|
26 |
using std::string;
|
|
|
27 |
using boost::shared_ptr;
|
|
|
28 |
using apache::thrift::transport::TMemoryBuffer;
|
|
|
29 |
using apache::thrift::transport::TBufferedTransport;
|
|
|
30 |
using apache::thrift::transport::TFramedTransport;
|
|
|
31 |
using apache::thrift::transport::test::TShortReadTransport;
|
|
|
32 |
|
|
|
33 |
#define foreach BOOST_FOREACH
|
|
|
34 |
|
|
|
35 |
// Shamelessly copied from ZlibTransport. TODO: refactor.
|
|
|
36 |
unsigned int dist[][5000] = {
|
|
|
37 |
{ 1<<15 },
|
|
|
38 |
|
|
|
39 |
{
|
|
|
40 |
5,13,9,1,8,9,11,13,18,48,24,13,21,13,5,11,35,2,4,20,17,72,27,14,15,4,7,26,
|
|
|
41 |
12,1,14,9,2,16,29,41,7,24,4,27,14,4,1,4,25,3,6,34,10,8,50,2,14,13,55,29,3,
|
|
|
42 |
43,53,49,14,4,10,32,27,48,1,3,1,11,5,17,16,51,17,30,15,11,9,2,2,11,52,12,2,
|
|
|
43 |
13,94,1,19,1,38,2,8,43,8,33,7,30,8,17,22,2,15,14,12,34,2,12,6,37,29,74,3,
|
|
|
44 |
165,16,11,17,5,14,3,10,7,37,11,24,7,1,3,12,37,8,9,34,17,12,8,21,13,37,1,4,
|
|
|
45 |
30,14,78,4,15,2,40,37,17,12,36,82,14,4,1,4,7,17,11,16,88,77,2,3,15,3,34,11,
|
|
|
46 |
5,79,22,34,8,4,4,40,22,24,28,9,13,3,34,27,9,16,39,16,39,13,2,4,3,41,26,10,4,
|
|
|
47 |
33,4,7,12,5,6,3,10,30,8,21,16,58,19,9,0,47,7,13,11,19,15,7,53,57,2,13,28,22,
|
|
|
48 |
3,16,9,25,33,12,40,7,12,64,7,14,24,44,9,2,14,11,2,58,1,26,30,11,9,5,24,7,9,
|
|
|
49 |
94,2,10,21,5,5,4,5,6,179,9,18,2,7,13,31,41,17,4,36,3,21,6,26,8,15,18,44,27,
|
|
|
50 |
11,9,25,7,0,14,2,12,20,23,13,2,163,9,5,15,65,2,14,6,8,98,11,15,14,34,2,3,10,
|
|
|
51 |
22,9,92,7,10,32,67,13,3,4,35,8,2,1,5,0,26,381,7,27,8,2,16,93,4,19,5,8,25,9,
|
|
|
52 |
31,14,4,21,5,3,9,22,56,4,18,3,11,18,6,4,3,40,12,16,110,8,35,14,1,18,40,9,12,
|
|
|
53 |
14,3,11,7,57,13,18,116,53,19,22,7,16,11,5,8,21,16,1,75,21,20,1,28,2,6,1,7,
|
|
|
54 |
19,38,5,6,9,9,4,1,7,55,36,62,5,4,4,24,15,1,12,35,48,20,5,17,1,5,26,15,4,54,
|
|
|
55 |
13,5,5,15,5,19,32,29,31,7,6,40,7,80,11,18,8,128,48,6,12,84,13,4,7,2,13,9,16,
|
|
|
56 |
17,3,254,1,4,181,8,44,7,6,24,27,9,23,14,34,16,22,25,10,3,3,4,4,12,2,12,6,7,
|
|
|
57 |
13,58,13,6,11,19,53,11,66,18,19,10,4,13,2,5,49,58,1,67,7,21,64,14,11,14,8,3,
|
|
|
58 |
26,33,91,31,20,7,9,42,39,4,3,55,11,10,0,7,4,75,8,12,0,27,3,8,9,0,12,12,23,
|
|
|
59 |
28,23,20,4,13,30,2,22,20,19,30,6,22,2,6,4,24,7,19,55,86,5,33,2,161,6,7,1,62,
|
|
|
60 |
13,3,72,12,12,9,7,12,10,5,10,29,1,5,22,13,13,5,2,12,3,7,14,18,2,3,46,21,17,
|
|
|
61 |
15,19,3,27,5,16,45,31,10,8,17,18,18,3,7,24,6,55,9,3,6,12,10,12,8,91,9,4,4,4,
|
|
|
62 |
27,29,16,5,7,22,43,28,11,14,8,11,28,109,55,71,40,3,8,22,26,15,44,3,25,29,5,
|
|
|
63 |
3,32,17,12,3,29,27,25,15,11,8,40,39,38,17,3,9,11,2,32,11,6,20,48,75,27,3,7,
|
|
|
64 |
54,12,95,12,7,24,23,2,13,8,15,16,5,12,4,17,7,19,88,2,6,13,115,45,12,21,2,86,
|
|
|
65 |
74,9,7,5,16,32,16,2,21,18,6,34,5,18,260,7,12,16,44,19,92,31,7,8,2,9,0,0,15,
|
|
|
66 |
8,38,4,8,20,18,2,83,3,3,4,9,5,3,10,3,5,29,15,7,11,8,48,17,23,2,17,4,11,22,
|
|
|
67 |
21,64,8,8,4,19,95,0,17,28,9,11,20,71,5,11,18,12,13,45,49,4,1,33,32,23,13,5,
|
|
|
68 |
52,2,2,16,3,4,7,12,2,1,12,6,24,1,22,155,21,3,45,4,12,44,26,5,40,36,9,9,8,20,
|
|
|
69 |
35,31,3,2,32,50,10,8,37,2,75,35,22,15,192,8,11,23,1,4,29,6,8,8,5,12,18,32,4,
|
|
|
70 |
7,12,2,0,0,9,5,48,11,35,3,1,123,6,29,8,11,8,23,51,16,6,63,12,2,5,4,14,2,15,
|
|
|
71 |
7,14,3,2,7,17,32,8,8,10,1,23,62,2,49,6,49,47,23,3,20,7,11,39,10,24,6,15,5,5,
|
|
|
72 |
11,8,16,36,8,13,20,3,10,44,7,52,7,10,36,6,15,10,5,11,4,14,19,17,10,12,3,6,
|
|
|
73 |
23,4,13,94,70,7,36,7,38,7,28,8,4,15,3,19,4,33,39,21,109,4,80,6,40,4,432,4,4,
|
|
|
74 |
7,8,3,31,8,28,37,34,10,2,21,5,22,0,7,36,14,12,6,24,1,21,5,9,2,29,20,54,113,
|
|
|
75 |
13,31,39,27,6,0,27,4,5,2,43,7,8,57,8,62,7,9,12,22,90,30,6,19,7,10,20,6,5,58,
|
|
|
76 |
32,30,41,4,10,25,13,3,8,7,10,2,9,6,151,44,16,12,16,20,8,3,18,11,17,4,10,45,
|
|
|
77 |
15,8,56,38,52,25,40,14,4,17,15,8,2,19,7,8,26,30,2,3,180,8,26,17,38,35,5,16,
|
|
|
78 |
28,5,15,56,13,14,18,9,15,83,27,3,9,4,11,8,27,27,44,10,12,8,3,48,14,7,9,4,4,
|
|
|
79 |
8,4,5,9,122,8,14,12,19,17,21,4,29,63,21,17,10,12,18,47,10,10,53,4,18,16,4,8,
|
|
|
80 |
118,9,5,12,9,11,9,3,12,32,3,23,2,15,3,3,30,3,17,235,15,22,9,299,14,17,1,5,
|
|
|
81 |
16,8,3,7,3,13,2,7,6,4,8,66,2,13,6,15,16,47,3,36,5,7,10,24,1,9,9,8,13,16,26,
|
|
|
82 |
12,7,24,21,18,49,23,39,10,41,4,13,4,27,11,12,12,19,4,147,8,10,9,40,21,2,83,
|
|
|
83 |
10,5,6,11,25,9,50,57,40,12,12,21,1,3,24,23,9,3,9,13,2,3,12,57,8,11,13,15,26,
|
|
|
84 |
15,10,47,36,4,25,1,5,8,5,4,0,12,49,5,19,4,6,16,14,6,10,69,10,33,29,7,8,61,
|
|
|
85 |
12,4,0,3,7,6,3,16,29,27,38,4,21,0,24,3,2,1,19,16,22,2,8,138,11,7,7,3,12,22,
|
|
|
86 |
3,16,5,7,3,53,9,10,32,14,5,7,3,6,22,9,59,26,8,7,58,5,16,11,55,7,4,11,146,91,
|
|
|
87 |
8,13,18,14,6,8,8,31,26,22,6,11,30,11,30,15,18,31,3,48,17,7,6,4,9,2,25,3,35,
|
|
|
88 |
13,13,7,8,4,31,10,8,10,4,3,45,10,23,2,7,259,17,21,13,14,3,26,3,8,27,4,18,9,
|
|
|
89 |
66,7,12,5,8,17,4,23,55,41,51,2,32,26,66,4,21,14,12,65,16,22,17,5,14,2,29,24,
|
|
|
90 |
7,3,36,2,43,53,86,5,28,4,58,13,49,121,6,2,73,2,1,47,4,2,27,10,35,28,27,10,
|
|
|
91 |
17,10,56,7,10,14,28,20,24,40,7,4,7,3,10,11,32,6,6,3,15,11,54,573,2,3,6,2,3,
|
|
|
92 |
14,64,4,16,12,16,42,10,26,4,6,11,69,18,27,2,2,17,22,9,13,22,11,6,1,15,49,3,
|
|
|
93 |
14,1
|
|
|
94 |
},
|
|
|
95 |
|
|
|
96 |
{
|
|
|
97 |
11,11,11,15,47,1,3,1,23,5,8,18,3,23,15,21,1,7,19,10,26,1,17,11,31,21,41,18,
|
|
|
98 |
34,4,9,58,19,3,3,36,5,18,13,3,14,4,9,10,4,19,56,15,3,5,3,11,27,9,4,10,13,4,
|
|
|
99 |
11,6,9,2,18,3,10,19,11,4,53,4,2,2,3,4,58,16,3,0,5,30,2,11,93,10,2,14,10,6,2,
|
|
|
100 |
115,2,25,16,22,38,101,4,18,13,2,145,51,45,15,14,15,13,20,7,24,5,13,14,30,40,
|
|
|
101 |
10,4,107,12,24,14,39,12,6,13,20,7,7,11,5,18,18,45,22,6,39,3,2,1,51,9,11,4,
|
|
|
102 |
13,9,38,44,8,11,9,15,19,9,23,17,17,17,13,9,9,1,10,4,18,6,2,9,5,27,32,72,8,
|
|
|
103 |
37,9,4,10,30,17,20,15,17,66,10,4,73,35,37,6,4,16,117,45,13,4,75,5,24,65,10,
|
|
|
104 |
4,9,4,13,46,5,26,29,10,4,4,52,3,13,18,63,6,14,9,24,277,9,88,2,48,27,123,14,
|
|
|
105 |
61,7,5,10,8,7,90,3,10,3,3,48,17,13,10,18,33,2,19,36,6,21,1,16,12,5,6,2,16,
|
|
|
106 |
15,29,88,28,2,15,6,11,4,6,11,3,3,4,18,9,53,5,4,3,33,8,9,8,6,7,36,9,62,14,2,
|
|
|
107 |
1,10,1,16,7,32,7,23,20,11,10,23,2,1,0,9,16,40,2,81,5,22,8,5,4,37,51,37,10,
|
|
|
108 |
19,57,11,2,92,31,6,39,10,13,16,8,20,6,9,3,10,18,25,23,12,30,6,2,26,7,64,18,
|
|
|
109 |
6,30,12,13,27,7,10,5,3,33,24,99,4,23,4,1,27,7,27,49,8,20,16,3,4,13,9,22,67,
|
|
|
110 |
28,3,10,16,3,2,10,4,8,1,8,19,3,85,6,21,1,9,16,2,30,10,33,12,4,9,3,1,60,38,6,
|
|
|
111 |
24,32,3,14,3,40,8,34,115,5,9,27,5,96,3,40,6,15,5,8,22,112,5,5,25,17,58,2,7,
|
|
|
112 |
36,21,52,1,3,95,12,21,4,11,8,59,24,5,21,4,9,15,8,7,21,3,26,5,11,6,7,17,65,
|
|
|
113 |
14,11,10,2,17,5,12,22,4,4,2,21,8,112,3,34,63,35,2,25,1,2,15,65,23,0,3,5,15,
|
|
|
114 |
26,27,9,5,48,11,15,4,9,5,33,20,15,1,18,19,11,24,40,10,21,74,6,6,32,30,40,5,
|
|
|
115 |
4,7,44,10,25,46,16,12,5,40,7,18,5,18,9,12,8,4,25,5,6,36,4,43,8,9,12,35,17,4,
|
|
|
116 |
8,9,11,27,5,10,17,40,8,12,4,18,9,18,12,20,25,39,42,1,24,13,22,15,7,112,35,3,
|
|
|
117 |
7,17,33,2,5,5,19,8,4,12,24,14,13,2,1,13,6,5,19,11,7,57,0,19,6,117,48,14,8,
|
|
|
118 |
10,51,17,12,14,2,5,8,9,15,4,48,53,13,22,4,25,12,11,19,45,5,2,6,54,22,9,15,9,
|
|
|
119 |
13,2,7,11,29,82,16,46,4,26,14,26,40,22,4,26,6,18,13,4,4,20,3,3,7,12,17,8,9,
|
|
|
120 |
23,6,20,7,25,23,19,5,15,6,23,15,11,19,11,3,17,59,8,18,41,4,54,23,44,75,13,
|
|
|
121 |
20,6,11,2,3,1,13,10,3,7,12,3,4,7,8,30,6,6,7,3,32,9,5,28,6,114,42,13,36,27,
|
|
|
122 |
59,6,93,13,74,8,69,140,3,1,17,48,105,6,11,5,15,1,10,10,14,8,53,0,8,24,60,2,
|
|
|
123 |
6,35,2,12,32,47,16,17,75,2,5,4,37,28,10,5,9,57,4,59,5,12,13,7,90,5,11,5,24,
|
|
|
124 |
22,13,30,1,2,10,9,6,19,3,18,47,2,5,7,9,35,15,3,6,1,21,14,14,18,14,9,12,8,73,
|
|
|
125 |
6,19,3,32,9,14,17,17,5,55,23,6,16,28,3,11,48,4,6,6,6,12,16,30,10,30,27,51,
|
|
|
126 |
18,29,2,3,15,1,76,0,16,33,4,27,3,62,4,10,2,4,8,15,9,41,26,22,2,4,20,4,49,0,
|
|
|
127 |
8,1,57,13,12,39,3,63,10,19,34,35,2,7,8,29,72,4,10,0,77,8,6,7,9,15,21,9,4,1,
|
|
|
128 |
20,23,1,9,18,9,15,36,4,7,6,15,5,7,7,40,2,9,22,2,3,20,4,12,34,13,6,18,15,1,
|
|
|
129 |
38,20,12,7,16,3,19,85,12,16,18,16,2,17,1,13,8,6,12,15,97,17,12,9,3,21,15,12,
|
|
|
130 |
23,44,81,26,30,2,5,17,6,6,0,22,42,19,6,19,41,14,36,7,3,56,7,9,3,2,6,9,69,3,
|
|
|
131 |
15,4,30,28,29,7,9,15,17,17,6,1,6,153,9,33,5,12,14,16,28,3,8,7,14,12,4,6,36,
|
|
|
132 |
9,24,13,13,4,2,9,15,19,9,53,7,13,4,150,17,9,2,6,12,7,3,5,58,19,58,28,8,14,3,
|
|
|
133 |
20,3,0,32,56,7,5,4,27,1,68,4,29,13,5,58,2,9,65,41,27,16,15,12,14,2,10,9,24,
|
|
|
134 |
3,2,9,2,2,3,14,32,10,22,3,13,11,4,6,39,17,0,10,5,5,10,35,16,19,14,1,8,63,19,
|
|
|
135 |
14,8,56,10,2,12,6,12,6,7,16,2,9,9,12,20,73,25,13,21,17,24,5,32,8,12,25,8,14,
|
|
|
136 |
16,5,23,3,7,6,3,11,24,6,30,4,21,13,28,4,6,29,15,5,17,6,26,8,15,8,3,7,7,50,
|
|
|
137 |
11,30,6,2,28,56,16,24,25,23,24,89,31,31,12,7,22,4,10,17,3,3,8,11,13,5,3,27,
|
|
|
138 |
1,12,1,14,8,10,29,2,5,2,2,20,10,0,31,10,21,1,48,3,5,43,4,5,18,13,5,18,25,34,
|
|
|
139 |
18,3,5,22,16,3,4,20,3,9,3,25,6,6,44,21,3,12,7,5,42,3,2,14,4,36,5,3,45,51,15,
|
|
|
140 |
9,11,28,9,7,6,6,12,26,5,14,10,11,42,55,13,21,4,28,6,7,23,27,11,1,41,36,0,32,
|
|
|
141 |
15,26,2,3,23,32,11,2,15,7,29,26,144,33,20,12,7,21,10,7,11,65,46,10,13,20,32,
|
|
|
142 |
4,4,5,19,2,19,15,49,41,1,75,10,11,25,1,2,45,11,8,27,18,10,60,28,29,12,30,19,
|
|
|
143 |
16,4,24,11,19,27,17,49,18,7,40,13,19,22,8,55,12,11,3,6,5,11,8,10,22,5,9,9,
|
|
|
144 |
25,7,17,7,64,1,24,2,12,17,44,4,12,27,21,11,10,7,47,5,9,13,12,38,27,21,7,29,
|
|
|
145 |
7,1,17,3,3,5,48,62,10,3,11,17,15,15,6,3,8,10,8,18,19,13,3,9,7,6,44,9,10,4,
|
|
|
146 |
43,8,6,6,14,20,38,24,2,4,5,5,7,5,9,39,8,44,40,9,19,7,3,15,25,2,37,18,15,9,5,
|
|
|
147 |
8,32,10,5,18,4,7,46,20,17,23,4,11,16,18,31,11,3,11,1,14,1,25,4,27,13,13,39,
|
|
|
148 |
14,6,6,35,6,16,13,11,122,21,15,20,24,10,5,152,15,39,5,20,16,9,14,7,53,6,3,8,
|
|
|
149 |
19,63,32,6,2,3,20,1,19,5,13,42,15,4,6,68,31,46,11,38,10,24,5,5,8,9,12,3,35,
|
|
|
150 |
46,26,16,2,8,4,74,16,44,4,5,1,16,4,14,23,16,69,15,42,31,14,7,7,6,97,14,40,1,
|
|
|
151 |
8,7,34,9,39,19,13,15,10,21,18,10,5,15,38,7,5,12,7,20,15,4,11,6,14,5,17,7,39,
|
|
|
152 |
35,36,18,20,26,22,4,2,36,21,64,0,5,9,10,6,4,1,7,3,1,3,3,4,10,20,90,2,22,48,
|
|
|
153 |
16,23,2,33,40,1,21,21,17,20,8,8,12,4,83,14,48,4,21,3,9,27,5,11,40,15,9,3,16,
|
|
|
154 |
17,9,11,4,24,31,17,3,4,2,11,1,8,4,8,6,41,17,4,13,3,7,17,8,27,5,13,6,10,7,13,
|
|
|
155 |
12,18,13,60,18,3,8,1,12,125,2,7,16,2,11,2,4,7,26,5,9,14,14,16,8,14,7,14,6,9,
|
|
|
156 |
13,9,6,4,26,35,49,36,55,3,9,6,40,26,23,31,19,41,2,10,31,6,54,5,69,16,7,8,16,
|
|
|
157 |
1,5,7,4,22,7,7,5,4,48,11,13,3,98,4,11,19,4,2,14,7,34,7,10,3,2,12,7,6,2,5,118
|
|
|
158 |
},
|
|
|
159 |
};
|
|
|
160 |
|
|
|
161 |
uint8_t data[1<<15];
|
|
|
162 |
string data_str;
|
|
|
163 |
void init_data() {
|
|
|
164 |
static bool initted = false;
|
|
|
165 |
if (initted) return;
|
|
|
166 |
initted = true;
|
|
|
167 |
|
|
|
168 |
// Repeatability. Kind of.
|
|
|
169 |
std::srand(42);
|
|
|
170 |
for (int i = 0; i < (int)(sizeof(data)/sizeof(data[0])); ++i) {
|
|
|
171 |
data[i] = (uint8_t)rand();
|
|
|
172 |
}
|
|
|
173 |
|
|
|
174 |
data_str.assign((char*)data, sizeof(data));
|
|
|
175 |
}
|
|
|
176 |
|
|
|
177 |
|
|
|
178 |
BOOST_AUTO_TEST_SUITE( TBufferBaseTest )
|
|
|
179 |
|
|
|
180 |
BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_GetBuffer ) {
|
|
|
181 |
init_data();
|
|
|
182 |
|
|
|
183 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
184 |
TMemoryBuffer buffer(16);
|
|
|
185 |
int offset = 0;
|
|
|
186 |
int index = 0;
|
|
|
187 |
|
|
|
188 |
while (offset < 1<<15) {
|
|
|
189 |
buffer.write(&data[offset], dist[d1][index]);
|
|
|
190 |
offset += dist[d1][index];
|
|
|
191 |
index++;
|
|
|
192 |
}
|
|
|
193 |
|
|
|
194 |
string output = buffer.getBufferAsString();
|
|
|
195 |
BOOST_CHECK_EQUAL(data_str, output);
|
|
|
196 |
}
|
|
|
197 |
}
|
|
|
198 |
|
|
|
199 |
BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_Read ) {
|
|
|
200 |
init_data();
|
|
|
201 |
|
|
|
202 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
203 |
for (int d2 = 0; d2 < 3; d2++) {
|
|
|
204 |
TMemoryBuffer buffer(16);
|
|
|
205 |
uint8_t data_out[1<<15];
|
|
|
206 |
int offset;
|
|
|
207 |
int index;
|
|
|
208 |
|
|
|
209 |
offset = 0;
|
|
|
210 |
index = 0;
|
|
|
211 |
while (offset < 1<<15) {
|
|
|
212 |
buffer.write(&data[offset], dist[d1][index]);
|
|
|
213 |
offset += dist[d1][index];
|
|
|
214 |
index++;
|
|
|
215 |
}
|
|
|
216 |
|
|
|
217 |
offset = 0;
|
|
|
218 |
index = 0;
|
|
|
219 |
while (offset < 1<<15) {
|
|
|
220 |
unsigned int got = buffer.read(&data_out[offset], dist[d2][index]);
|
|
|
221 |
BOOST_CHECK_EQUAL(got, dist[d2][index]);
|
|
|
222 |
offset += dist[d2][index];
|
|
|
223 |
index++;
|
|
|
224 |
}
|
|
|
225 |
|
|
|
226 |
BOOST_CHECK(!memcmp(data, data_out, sizeof(data)));
|
|
|
227 |
}
|
|
|
228 |
}
|
|
|
229 |
}
|
|
|
230 |
|
|
|
231 |
BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_ReadString ) {
|
|
|
232 |
init_data();
|
|
|
233 |
|
|
|
234 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
235 |
for (int d2 = 0; d2 < 3; d2++) {
|
|
|
236 |
TMemoryBuffer buffer(16);
|
|
|
237 |
string output;
|
|
|
238 |
int offset;
|
|
|
239 |
int index;
|
|
|
240 |
|
|
|
241 |
offset = 0;
|
|
|
242 |
index = 0;
|
|
|
243 |
while (offset < 1<<15) {
|
|
|
244 |
buffer.write(&data[offset], dist[d1][index]);
|
|
|
245 |
offset += dist[d1][index];
|
|
|
246 |
index++;
|
|
|
247 |
}
|
|
|
248 |
|
|
|
249 |
offset = 0;
|
|
|
250 |
index = 0;
|
|
|
251 |
while (offset < 1<<15) {
|
|
|
252 |
unsigned int got = buffer.readAppendToString(output, dist[d2][index]);
|
|
|
253 |
BOOST_CHECK_EQUAL(got, dist[d2][index]);
|
|
|
254 |
offset += dist[d2][index];
|
|
|
255 |
index++;
|
|
|
256 |
}
|
|
|
257 |
|
|
|
258 |
BOOST_CHECK_EQUAL(output, data_str);
|
|
|
259 |
}
|
|
|
260 |
}
|
|
|
261 |
}
|
|
|
262 |
|
|
|
263 |
BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_Read_Multi1 ) {
|
|
|
264 |
init_data();
|
|
|
265 |
|
|
|
266 |
// Do shorter writes and reads so we don't align to power-of-two boundaries.
|
|
|
267 |
|
|
|
268 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
269 |
for (int d2 = 0; d2 < 3; d2++) {
|
|
|
270 |
TMemoryBuffer buffer(16);
|
|
|
271 |
uint8_t data_out[1<<15];
|
|
|
272 |
int offset;
|
|
|
273 |
int index;
|
|
|
274 |
|
|
|
275 |
for (int iter = 0; iter < 6; iter++) {
|
|
|
276 |
offset = 0;
|
|
|
277 |
index = 0;
|
|
|
278 |
while (offset < (1<<15)-42) {
|
|
|
279 |
buffer.write(&data[offset], dist[d1][index]);
|
|
|
280 |
offset += dist[d1][index];
|
|
|
281 |
index++;
|
|
|
282 |
}
|
|
|
283 |
|
|
|
284 |
offset = 0;
|
|
|
285 |
index = 0;
|
|
|
286 |
while (offset < (1<<15)-42) {
|
|
|
287 |
buffer.read(&data_out[offset], dist[d2][index]);
|
|
|
288 |
offset += dist[d2][index];
|
|
|
289 |
index++;
|
|
|
290 |
}
|
|
|
291 |
|
|
|
292 |
BOOST_CHECK(!memcmp(data, data_out, (1<<15)-42));
|
|
|
293 |
|
|
|
294 |
// Pull out the extra data.
|
|
|
295 |
buffer.read(data_out, 42);
|
|
|
296 |
}
|
|
|
297 |
}
|
|
|
298 |
}
|
|
|
299 |
}
|
|
|
300 |
|
|
|
301 |
BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_Read_Multi2 ) {
|
|
|
302 |
init_data();
|
|
|
303 |
|
|
|
304 |
// Do shorter writes and reads so we don't align to power-of-two boundaries.
|
|
|
305 |
// Pull the buffer out of the loop so its state gets worked harder.
|
|
|
306 |
TMemoryBuffer buffer(16);
|
|
|
307 |
|
|
|
308 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
309 |
for (int d2 = 0; d2 < 3; d2++) {
|
|
|
310 |
uint8_t data_out[1<<15];
|
|
|
311 |
int offset;
|
|
|
312 |
int index;
|
|
|
313 |
|
|
|
314 |
for (int iter = 0; iter < 6; iter++) {
|
|
|
315 |
offset = 0;
|
|
|
316 |
index = 0;
|
|
|
317 |
while (offset < (1<<15)-42) {
|
|
|
318 |
buffer.write(&data[offset], dist[d1][index]);
|
|
|
319 |
offset += dist[d1][index];
|
|
|
320 |
index++;
|
|
|
321 |
}
|
|
|
322 |
|
|
|
323 |
offset = 0;
|
|
|
324 |
index = 0;
|
|
|
325 |
while (offset < (1<<15)-42) {
|
|
|
326 |
buffer.read(&data_out[offset], dist[d2][index]);
|
|
|
327 |
offset += dist[d2][index];
|
|
|
328 |
index++;
|
|
|
329 |
}
|
|
|
330 |
|
|
|
331 |
BOOST_CHECK(!memcmp(data, data_out, (1<<15)-42));
|
|
|
332 |
|
|
|
333 |
// Pull out the extra data.
|
|
|
334 |
buffer.read(data_out, 42);
|
|
|
335 |
}
|
|
|
336 |
}
|
|
|
337 |
}
|
|
|
338 |
}
|
|
|
339 |
|
|
|
340 |
BOOST_AUTO_TEST_CASE( test_MemoryBuffer_Write_Read_Incomplete ) {
|
|
|
341 |
init_data();
|
|
|
342 |
|
|
|
343 |
// Do shorter writes and reads so we don't align to power-of-two boundaries.
|
|
|
344 |
// Pull the buffer out of the loop so its state gets worked harder.
|
|
|
345 |
|
|
|
346 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
347 |
for (int d2 = 0; d2 < 3; d2++) {
|
|
|
348 |
TMemoryBuffer buffer(16);
|
|
|
349 |
uint8_t data_out[1<<13];
|
|
|
350 |
|
|
|
351 |
int write_offset = 0;
|
|
|
352 |
int write_index = 0;
|
|
|
353 |
unsigned int to_write = (1<<14)-42;
|
|
|
354 |
while (to_write > 0) {
|
|
|
355 |
int write_amt = std::min(dist[d1][write_index], to_write);
|
|
|
356 |
buffer.write(&data[write_offset], write_amt);
|
|
|
357 |
write_offset += write_amt;
|
|
|
358 |
write_index++;
|
|
|
359 |
to_write -= write_amt;
|
|
|
360 |
}
|
|
|
361 |
|
|
|
362 |
int read_offset = 0;
|
|
|
363 |
int read_index = 0;
|
|
|
364 |
unsigned int to_read = (1<<13)-42;
|
|
|
365 |
while (to_read > 0) {
|
|
|
366 |
int read_amt = std::min(dist[d2][read_index], to_read);
|
|
|
367 |
int got = buffer.read(&data_out[read_offset], read_amt);
|
|
|
368 |
BOOST_CHECK_EQUAL(got, read_amt);
|
|
|
369 |
read_offset += read_amt;
|
|
|
370 |
read_index++;
|
|
|
371 |
to_read -= read_amt;
|
|
|
372 |
}
|
|
|
373 |
|
|
|
374 |
BOOST_CHECK(!memcmp(data, data_out, (1<<13)-42));
|
|
|
375 |
|
|
|
376 |
int second_offset = write_offset;
|
|
|
377 |
int second_index = write_index-1;
|
|
|
378 |
unsigned int to_second = (1<<14)+42;
|
|
|
379 |
while (to_second > 0) {
|
|
|
380 |
int second_amt = std::min(dist[d1][second_index], to_second);
|
|
|
381 |
//printf("%d\n", second_amt);
|
|
|
382 |
buffer.write(&data[second_offset], second_amt);
|
|
|
383 |
second_offset += second_amt;
|
|
|
384 |
second_index++;
|
|
|
385 |
to_second -= second_amt;
|
|
|
386 |
}
|
|
|
387 |
|
|
|
388 |
string output = buffer.getBufferAsString();
|
|
|
389 |
BOOST_CHECK_EQUAL(data_str.substr((1<<13)-42), output);
|
|
|
390 |
}
|
|
|
391 |
}
|
|
|
392 |
}
|
|
|
393 |
|
|
|
394 |
BOOST_AUTO_TEST_CASE( test_BufferedTransport_Write ) {
|
|
|
395 |
init_data();
|
|
|
396 |
|
|
|
397 |
int sizes[] = {
|
|
|
398 |
12, 15, 16, 17, 20,
|
|
|
399 |
501, 512, 523,
|
|
|
400 |
2000, 2048, 2096,
|
|
|
401 |
1<<14, 1<<17,
|
|
|
402 |
};
|
|
|
403 |
|
|
|
404 |
foreach (int size, sizes) {
|
|
|
405 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
406 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(16));
|
|
|
407 |
TBufferedTransport trans(buffer, size);
|
|
|
408 |
|
|
|
409 |
int offset = 0;
|
|
|
410 |
int index = 0;
|
|
|
411 |
while (offset < 1<<15) {
|
|
|
412 |
trans.write(&data[offset], dist[d1][index]);
|
|
|
413 |
offset += dist[d1][index];
|
|
|
414 |
index++;
|
|
|
415 |
}
|
|
|
416 |
trans.flush();
|
|
|
417 |
|
|
|
418 |
string output = buffer->getBufferAsString();
|
|
|
419 |
BOOST_CHECK_EQUAL(data_str, output);
|
|
|
420 |
}
|
|
|
421 |
}
|
|
|
422 |
}
|
|
|
423 |
|
|
|
424 |
BOOST_AUTO_TEST_CASE( test_BufferedTransport_Read_Full ) {
|
|
|
425 |
init_data();
|
|
|
426 |
|
|
|
427 |
int sizes[] = {
|
|
|
428 |
12, 15, 16, 17, 20,
|
|
|
429 |
501, 512, 523,
|
|
|
430 |
2000, 2048, 2096,
|
|
|
431 |
1<<14, 1<<17,
|
|
|
432 |
};
|
|
|
433 |
|
|
|
434 |
foreach (int size, sizes) {
|
|
|
435 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
436 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(data, sizeof(data)));
|
|
|
437 |
TBufferedTransport trans(buffer, size);
|
|
|
438 |
uint8_t data_out[1<<15];
|
|
|
439 |
|
|
|
440 |
int offset = 0;
|
|
|
441 |
int index = 0;
|
|
|
442 |
while (offset < 1<<15) {
|
|
|
443 |
// Note: this doesn't work with "read" because TBufferedTransport
|
|
|
444 |
// doesn't try loop over reads, so we get short reads. We don't
|
|
|
445 |
// check the return value, so that messes us up.
|
|
|
446 |
trans.readAll(&data_out[offset], dist[d1][index]);
|
|
|
447 |
offset += dist[d1][index];
|
|
|
448 |
index++;
|
|
|
449 |
}
|
|
|
450 |
|
|
|
451 |
BOOST_CHECK(!memcmp(data, data_out, sizeof(data)));
|
|
|
452 |
}
|
|
|
453 |
}
|
|
|
454 |
}
|
|
|
455 |
|
|
|
456 |
BOOST_AUTO_TEST_CASE( test_BufferedTransport_Read_Short ) {
|
|
|
457 |
init_data();
|
|
|
458 |
|
|
|
459 |
int sizes[] = {
|
|
|
460 |
12, 15, 16, 17, 20,
|
|
|
461 |
501, 512, 523,
|
|
|
462 |
2000, 2048, 2096,
|
|
|
463 |
1<<14, 1<<17,
|
|
|
464 |
};
|
|
|
465 |
|
|
|
466 |
foreach (int size, sizes) {
|
|
|
467 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
468 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(data, sizeof(data)));
|
|
|
469 |
shared_ptr<TShortReadTransport> tshort(new TShortReadTransport(buffer, 0.125));
|
|
|
470 |
TBufferedTransport trans(buffer, size);
|
|
|
471 |
uint8_t data_out[1<<15];
|
|
|
472 |
|
|
|
473 |
int offset = 0;
|
|
|
474 |
int index = 0;
|
|
|
475 |
while (offset < 1<<15) {
|
|
|
476 |
// Note: this doesn't work with "read" because TBufferedTransport
|
|
|
477 |
// doesn't try loop over reads, so we get short reads. We don't
|
|
|
478 |
// check the return value, so that messes us up.
|
|
|
479 |
trans.readAll(&data_out[offset], dist[d1][index]);
|
|
|
480 |
offset += dist[d1][index];
|
|
|
481 |
index++;
|
|
|
482 |
}
|
|
|
483 |
|
|
|
484 |
BOOST_CHECK(!memcmp(data, data_out, sizeof(data)));
|
|
|
485 |
}
|
|
|
486 |
}
|
|
|
487 |
}
|
|
|
488 |
|
|
|
489 |
BOOST_AUTO_TEST_CASE( test_FramedTransport_Write ) {
|
|
|
490 |
init_data();
|
|
|
491 |
|
|
|
492 |
int sizes[] = {
|
|
|
493 |
12, 15, 16, 17, 20,
|
|
|
494 |
501, 512, 523,
|
|
|
495 |
2000, 2048, 2096,
|
|
|
496 |
1<<14, 1<<17,
|
|
|
497 |
};
|
|
|
498 |
|
|
|
499 |
foreach (int size, sizes) {
|
|
|
500 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
501 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(16));
|
|
|
502 |
TFramedTransport trans(buffer, size);
|
|
|
503 |
|
|
|
504 |
int offset = 0;
|
|
|
505 |
int index = 0;
|
|
|
506 |
while (offset < 1<<15) {
|
|
|
507 |
trans.write(&data[offset], dist[d1][index]);
|
|
|
508 |
offset += dist[d1][index];
|
|
|
509 |
index++;
|
|
|
510 |
}
|
|
|
511 |
trans.flush();
|
|
|
512 |
|
|
|
513 |
int32_t frame_size = -1;
|
|
|
514 |
buffer->read(reinterpret_cast<uint8_t*>(&frame_size), sizeof(frame_size));
|
|
|
515 |
frame_size = (int32_t)ntohl((uint32_t)frame_size);
|
|
|
516 |
BOOST_CHECK_EQUAL(frame_size, 1<<15);
|
|
|
517 |
BOOST_CHECK_EQUAL(data_str.size(), (unsigned int)frame_size);
|
|
|
518 |
string output = buffer->getBufferAsString();
|
|
|
519 |
BOOST_CHECK_EQUAL(data_str, output);
|
|
|
520 |
}
|
|
|
521 |
}
|
|
|
522 |
}
|
|
|
523 |
|
|
|
524 |
BOOST_AUTO_TEST_CASE( test_FramedTransport_Read ) {
|
|
|
525 |
init_data();
|
|
|
526 |
|
|
|
527 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
528 |
uint8_t data_out[1<<15];
|
|
|
529 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer());
|
|
|
530 |
TFramedTransport trans(buffer);
|
|
|
531 |
int32_t length = sizeof(data);
|
|
|
532 |
length = (int32_t)htonl((uint32_t)length);
|
|
|
533 |
buffer->write(reinterpret_cast<uint8_t*>(&length), sizeof(length));
|
|
|
534 |
buffer->write(data, sizeof(data));
|
|
|
535 |
|
|
|
536 |
int offset = 0;
|
|
|
537 |
int index = 0;
|
|
|
538 |
while (offset < 1<<15) {
|
|
|
539 |
// This should work with read because we have one huge frame.
|
|
|
540 |
trans.read(&data_out[offset], dist[d1][index]);
|
|
|
541 |
offset += dist[d1][index];
|
|
|
542 |
index++;
|
|
|
543 |
}
|
|
|
544 |
|
|
|
545 |
BOOST_CHECK(!memcmp(data, data_out, sizeof(data)));
|
|
|
546 |
}
|
|
|
547 |
}
|
|
|
548 |
|
|
|
549 |
BOOST_AUTO_TEST_CASE( test_FramedTransport_Write_Read ) {
|
|
|
550 |
init_data();
|
|
|
551 |
|
|
|
552 |
int sizes[] = {
|
|
|
553 |
12, 15, 16, 17, 20,
|
|
|
554 |
501, 512, 523,
|
|
|
555 |
2000, 2048, 2096,
|
|
|
556 |
1<<14, 1<<17,
|
|
|
557 |
};
|
|
|
558 |
|
|
|
559 |
int probs[] = { 1, 2, 4, 8, 16, 32, };
|
|
|
560 |
|
|
|
561 |
foreach (int size, sizes) {
|
|
|
562 |
foreach (int prob, probs) {
|
|
|
563 |
for (int d1 = 0; d1 < 3; d1++) {
|
|
|
564 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer(16));
|
|
|
565 |
TFramedTransport trans(buffer, size);
|
|
|
566 |
uint8_t data_out[1<<15];
|
|
|
567 |
std::vector<int> flush_sizes;
|
|
|
568 |
|
|
|
569 |
int write_offset = 0;
|
|
|
570 |
int write_index = 0;
|
|
|
571 |
int flush_size = 0;
|
|
|
572 |
while (write_offset < 1<<15) {
|
|
|
573 |
trans.write(&data[write_offset], dist[d1][write_index]);
|
|
|
574 |
write_offset += dist[d1][write_index];
|
|
|
575 |
flush_size += dist[d1][write_index];
|
|
|
576 |
write_index++;
|
|
|
577 |
if (flush_size > 0 && rand()%prob == 0) {
|
|
|
578 |
flush_sizes.push_back(flush_size);
|
|
|
579 |
flush_size = 0;
|
|
|
580 |
trans.flush();
|
|
|
581 |
}
|
|
|
582 |
}
|
|
|
583 |
if (flush_size != 0) {
|
|
|
584 |
flush_sizes.push_back(flush_size);
|
|
|
585 |
flush_size = 0;
|
|
|
586 |
trans.flush();
|
|
|
587 |
}
|
|
|
588 |
|
|
|
589 |
int read_offset = 0;
|
|
|
590 |
int read_index = 0;
|
|
|
591 |
foreach (int fsize, flush_sizes) {
|
|
|
592 |
// We are exploiting an implementation detail of TFramedTransport.
|
|
|
593 |
// The read buffer starts empty and it will never do more than one
|
|
|
594 |
// readFrame per read, so we should always get exactly one frame.
|
|
|
595 |
int got = trans.read(&data_out[read_offset], 1<<15);
|
|
|
596 |
BOOST_CHECK_EQUAL(got, fsize);
|
|
|
597 |
read_offset += got;
|
|
|
598 |
read_index++;
|
|
|
599 |
}
|
|
|
600 |
|
|
|
601 |
BOOST_CHECK_EQUAL((unsigned int)read_offset, sizeof(data));
|
|
|
602 |
BOOST_CHECK(!memcmp(data, data_out, sizeof(data)));
|
|
|
603 |
}
|
|
|
604 |
}
|
|
|
605 |
}
|
|
|
606 |
}
|
|
|
607 |
|
|
|
608 |
BOOST_AUTO_TEST_CASE( test_FramedTransport_Empty_Flush ) {
|
|
|
609 |
init_data();
|
|
|
610 |
|
|
|
611 |
string output1("\x00\x00\x00\x01""a", 5);
|
|
|
612 |
string output2("\x00\x00\x00\x01""a\x00\x00\x00\x02""bc", 11);
|
|
|
613 |
|
|
|
614 |
shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer());
|
|
|
615 |
TFramedTransport trans(buffer);
|
|
|
616 |
|
|
|
617 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), "");
|
|
|
618 |
trans.flush();
|
|
|
619 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), "");
|
|
|
620 |
trans.flush();
|
|
|
621 |
trans.flush();
|
|
|
622 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), "");
|
|
|
623 |
trans.write((const uint8_t*)"a", 1);
|
|
|
624 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), "");
|
|
|
625 |
trans.flush();
|
|
|
626 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), output1);
|
|
|
627 |
trans.flush();
|
|
|
628 |
trans.flush();
|
|
|
629 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), output1);
|
|
|
630 |
trans.write((const uint8_t*)"bc", 2);
|
|
|
631 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), output1);
|
|
|
632 |
trans.flush();
|
|
|
633 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), output2);
|
|
|
634 |
trans.flush();
|
|
|
635 |
trans.flush();
|
|
|
636 |
BOOST_CHECK_EQUAL(buffer->getBufferAsString(), output2);
|
|
|
637 |
}
|
|
|
638 |
|
|
|
639 |
BOOST_AUTO_TEST_SUITE_END()
|