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 #define  MAX_MESSAGE_SIZE  2
21 
22 #include <boost/test/auto_unit_test.hpp>
23 #include <boost/test/unit_test.hpp>
24 #include <iostream>
25 #include <climits>
26 #include <vector>
27 #include <thrift/TConfiguration.h>
28 #include <thrift/protocol/TBinaryProtocol.h>
29 #include <thrift/protocol/TCompactProtocol.h>
30 #include <thrift/protocol/TJSONProtocol.h>
31 #include <thrift/Thrift.h>
32 #include <memory>
33 #include <thrift/transport/TTransportUtils.h>
34 #include <thrift/transport/TBufferTransports.h>
35 #include <thrift/transport/TSimpleFileTransport.h>
36 #include <thrift/transport/TFileTransport.h>
37 #include <thrift/protocol/TEnum.h>
38 #include <thrift/protocol/TList.h>
39 #include <thrift/protocol/TSet.h>
40 #include <thrift/protocol/TMap.h>
41 
42 BOOST_AUTO_TEST_SUITE(ThriftReadCheckExceptionTest)
43 
44 using apache::thrift::TConfiguration;
45 using apache::thrift::protocol::TBinaryProtocol;
46 using apache::thrift::protocol::TCompactProtocol;
47 using apache::thrift::protocol::TJSONProtocol;
48 using apache::thrift::protocol::TType;
49 using apache::thrift::transport::TPipedTransport;
50 using apache::thrift::transport::TMemoryBuffer;
51 using apache::thrift::transport::TSimpleFileTransport;
52 using apache::thrift::transport::TFileTransport;
53 using apache::thrift::transport::TFDTransport;
54 using apache::thrift::transport::TTransportException;
55 using apache::thrift::transport::TBufferedTransport;
56 using apache::thrift::transport::TFramedTransport;
57 using std::shared_ptr;
58 using std::cout;
59 using std::endl;
60 using std::string;
61 using std::memset;
62 using namespace apache::thrift;
63 using namespace apache::thrift::protocol;
64 
65 
BOOST_AUTO_TEST_CASE(test_tmemorybuffer_read_check_exception)66 BOOST_AUTO_TEST_CASE(test_tmemorybuffer_read_check_exception) {
67   std::shared_ptr<TConfiguration> config(new TConfiguration(MAX_MESSAGE_SIZE));
68   TMemoryBuffer trans_out(config);
69   uint8_t buffer[6] = {1, 2, 3, 4, 5, 6};
70   trans_out.write((const uint8_t*)buffer, sizeof(buffer));
71   trans_out.close();
72 
73   TMemoryBuffer trans_in(config);
74   memset(buffer, 0, sizeof(buffer));
75   BOOST_CHECK_THROW(trans_in.read(buffer, sizeof(buffer)), TTransportException);
76   trans_in.close();
77 }
78 
BOOST_AUTO_TEST_CASE(test_tpipedtransport_read_check_exception)79 BOOST_AUTO_TEST_CASE(test_tpipedtransport_read_check_exception) {
80   std::shared_ptr<TConfiguration> config(new TConfiguration(MAX_MESSAGE_SIZE));
81   std::shared_ptr<TMemoryBuffer> pipe(new TMemoryBuffer);
82   std::shared_ptr<TMemoryBuffer> underlying(new TMemoryBuffer);
83   std::shared_ptr<TPipedTransport> trans(new TPipedTransport(underlying, pipe, config));
84 
85   uint8_t buffer[4];
86 
87   underlying->write((uint8_t*)"abcd", 4);
88   BOOST_CHECK_THROW(trans->read(buffer, sizeof(buffer)), TTransportException);
89   BOOST_CHECK_THROW(trans->readAll(buffer, sizeof(buffer)), TTransportException);
90   trans->readEnd();
91   pipe->resetBuffer();
92   underlying->write((uint8_t*)"ef", 2);
93   BOOST_CHECK_THROW(trans->read(buffer, sizeof(buffer)), TTransportException);
94   BOOST_CHECK_THROW(trans->readAll(buffer, sizeof(buffer)), TTransportException);
95   trans->readEnd();
96 }
97 
BOOST_AUTO_TEST_CASE(test_tsimplefiletransport_read_check_exception)98 BOOST_AUTO_TEST_CASE(test_tsimplefiletransport_read_check_exception) {
99   std::shared_ptr<TConfiguration> config(new TConfiguration(MAX_MESSAGE_SIZE));
100   TSimpleFileTransport trans_out("data", false, true, config);
101   uint8_t buffer[6] = {1, 2, 3, 4, 5, 6};
102   trans_out.write((const uint8_t*)buffer, sizeof(buffer));
103   trans_out.close();
104 
105   TSimpleFileTransport trans_in("data",true, false, config);
106   memset(buffer, 0, sizeof(buffer));
107   BOOST_CHECK_THROW(trans_in.read(buffer, sizeof(buffer)), TTransportException);
108   trans_in.close();
109 
110   remove("./data");
111 }
112 
BOOST_AUTO_TEST_CASE(test_tfiletransport_read_check_exception)113 BOOST_AUTO_TEST_CASE(test_tfiletransport_read_check_exception) {
114   std::shared_ptr<TConfiguration> config(new TConfiguration(MAX_MESSAGE_SIZE));
115   TFileTransport trans_out("data", false, config);
116   uint8_t buffer[6] = {1, 2, 3, 4, 5, 6};
117   trans_out.write((const uint8_t*)buffer, sizeof(buffer));
118 
119   TFileTransport trans_in("data", false, config);
120   memset(buffer, 0, sizeof(buffer));
121   BOOST_CHECK_THROW(trans_in.read(buffer, sizeof(buffer)), TTransportException);
122 
123   remove("./data");
124 }
125 
BOOST_AUTO_TEST_CASE(test_tbufferedtransport_read_check_exception)126 BOOST_AUTO_TEST_CASE(test_tbufferedtransport_read_check_exception) {
127   uint8_t arr[4] = {1, 2, 3, 4};
128   std::shared_ptr<TMemoryBuffer> buffer (new TMemoryBuffer(arr, sizeof(arr)));
129   std::shared_ptr<TConfiguration> config (new TConfiguration(MAX_MESSAGE_SIZE));
130   std::shared_ptr<TBufferedTransport> trans (new TBufferedTransport(buffer, config));
131 
132   trans->write((const uint8_t*)arr, sizeof(arr));
133   BOOST_CHECK_THROW(trans->read(arr, sizeof(arr)), TTransportException);
134 }
135 
BOOST_AUTO_TEST_CASE(test_tframedtransport_read_check_exception)136 BOOST_AUTO_TEST_CASE(test_tframedtransport_read_check_exception) {
137   uint8_t arr[4] = {1, 2, 3, 4};
138   std::shared_ptr<TMemoryBuffer> buffer (new TMemoryBuffer(arr, sizeof(arr)));
139   std::shared_ptr<TConfiguration> config (new TConfiguration(MAX_MESSAGE_SIZE));
140   std::shared_ptr<TFramedTransport> trans (new TFramedTransport(buffer, config));
141 
142   trans->write((const uint8_t*)arr, sizeof(arr));
143   BOOST_CHECK_THROW(trans->read(arr, sizeof(arr)), TTransportException);
144 }
145 
BOOST_AUTO_TEST_CASE(test_tthriftbinaryprotocol_read_check_exception)146 BOOST_AUTO_TEST_CASE(test_tthriftbinaryprotocol_read_check_exception) {
147   std::shared_ptr<TConfiguration> config (new TConfiguration(MAX_MESSAGE_SIZE));
148   std::shared_ptr<TMemoryBuffer> transport(new TMemoryBuffer(config));
149   std::shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport));
150 
151   uint32_t val = 0;
152   TType elemType = apache::thrift::protocol::T_STOP;
153   TType elemType1 = apache::thrift::protocol::T_STOP;
154   TList list(T_I32, 8);
155   protocol->writeListBegin(list.elemType_, list.size_);
156   protocol->writeListEnd();
157   BOOST_CHECK_THROW(protocol->readListBegin(elemType, val), TTransportException);
158   protocol->readListEnd();
159 
160   TSet set(T_I32, 8);
161   protocol->writeSetBegin(set.elemType_, set.size_);
162   protocol->writeSetEnd();
163   BOOST_CHECK_THROW(protocol->readSetBegin(elemType, val), TTransportException);
164   protocol->readSetEnd();
165 
166   TMap map(T_I32, T_I32, 8);
167   protocol->writeMapBegin(map.keyType_, map.valueType_, map.size_);
168   protocol->writeMapEnd();
169   BOOST_CHECK_THROW(protocol->readMapBegin(elemType, elemType1, val), TTransportException);
170   protocol->readMapEnd();
171 }
172 
BOOST_AUTO_TEST_CASE(test_tthriftcompactprotocol_read_check_exception)173 BOOST_AUTO_TEST_CASE(test_tthriftcompactprotocol_read_check_exception) {
174   std::shared_ptr<TConfiguration> config (new TConfiguration(MAX_MESSAGE_SIZE));
175   std::shared_ptr<TMemoryBuffer> transport(new TMemoryBuffer(config));
176   std::shared_ptr<TCompactProtocol> protocol(new TCompactProtocol(transport));
177 
178   uint32_t val = 0;
179   TType elemType = apache::thrift::protocol::T_STOP;
180   TType elemType1 = apache::thrift::protocol::T_STOP;
181   TList list(T_I32, 8);
182   protocol->writeListBegin(list.elemType_, list.size_);
183   protocol->writeListEnd();
184   BOOST_CHECK_THROW(protocol->readListBegin(elemType, val), TTransportException);
185   protocol->readListEnd();
186 
187   TSet set(T_I32, 8);
188   protocol->writeSetBegin(set.elemType_, set.size_);
189   protocol->writeSetEnd();
190   BOOST_CHECK_THROW(protocol->readSetBegin(elemType, val), TTransportException);
191   protocol->readSetEnd();
192 
193   TMap map(T_I32, T_I32, 8);
194   protocol->writeMapBegin(map.keyType_, map.valueType_, map.size_);
195   protocol->writeMapEnd();
196   BOOST_CHECK_THROW(protocol->readMapBegin(elemType, elemType1, val), TTransportException);
197   protocol->readMapEnd();
198 }
199 
BOOST_AUTO_TEST_CASE(test_tthriftjsonprotocol_read_check_exception)200 BOOST_AUTO_TEST_CASE(test_tthriftjsonprotocol_read_check_exception) {
201   std::shared_ptr<TConfiguration> config (new TConfiguration(MAX_MESSAGE_SIZE));
202   std::shared_ptr<TMemoryBuffer> transport(new TMemoryBuffer(config));
203   std::shared_ptr<TJSONProtocol> protocol(new TJSONProtocol(transport));
204 
205   uint32_t val = 0;
206   TType elemType = apache::thrift::protocol::T_STOP;
207   TType elemType1 = apache::thrift::protocol::T_STOP;
208   TList list(T_I32, 8);
209   protocol->writeListBegin(list.elemType_, list.size_);
210   protocol->writeListEnd();
211   BOOST_CHECK_THROW(protocol->readListBegin(elemType, val), TTransportException);
212   protocol->readListEnd();
213 
214   TSet set(T_I32, 8);
215   protocol->writeSetBegin(set.elemType_, set.size_);
216   protocol->writeSetEnd();
217   BOOST_CHECK_THROW(protocol->readSetBegin(elemType, val), TTransportException);
218   protocol->readSetEnd();
219 
220   TMap map(T_I32, T_I32, 8);
221   protocol->writeMapBegin(map.keyType_, map.valueType_, map.size_);
222   protocol->writeMapEnd();
223   BOOST_CHECK_THROW(protocol->readMapBegin(elemType, elemType1, val), TTransportException);
224   protocol->readMapEnd();
225 }
226 
227 BOOST_AUTO_TEST_SUITE_END()
228