blob: e53fd3ed2505bf5f18869f02629508ff128a1a3f [file] [log] [blame]
Jake Farrellb5a18a12012-10-09 01:10:43 +00001# encoding: UTF-8
Jake Farrell6f0f5272012-01-31 03:39:30 +00002#
3# Licensed to the Apache Software Foundation (ASF) under one
4# or more contributor license agreements. See the NOTICE file
5# distributed with this work for additional information
6# regarding copyright ownership. The ASF licenses this file
7# to you under the Apache License, Version 2.0 (the
8# "License"); you may not use this file except in compliance
9# with the License. You may obtain a copy of the License at
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing,
14# software distributed under the License is distributed on an
15# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16# KIND, either express or implied. See the License for the
17# specific language governing permissions and limitations
18# under the License.
19#
20
Jake Farrella87810f2012-09-28 01:59:04 +000021require 'spec_helper'
Jake Farrell6f0f5272012-01-31 03:39:30 +000022
Jake Farrella87810f2012-09-28 01:59:04 +000023describe 'JsonProtocol' do
Jake Farrell6f0f5272012-01-31 03:39:30 +000024
Jake Farrella87810f2012-09-28 01:59:04 +000025 describe Thrift::JsonProtocol do
26 before(:each) do
27 @trans = Thrift::MemoryBufferTransport.new
28 @prot = Thrift::JsonProtocol.new(@trans)
29 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000030
Jake Farrella87810f2012-09-28 01:59:04 +000031 it "should write json escaped char" do
32 @prot.write_json_escape_char("\n")
James E. King III27247072018-03-22 20:50:23 -040033 expect(@trans.read(@trans.available)).to eq('\u000a')
Jake Farrell6f0f5272012-01-31 03:39:30 +000034
Jake Farrella87810f2012-09-28 01:59:04 +000035 @prot.write_json_escape_char(" ")
James E. King III27247072018-03-22 20:50:23 -040036 expect(@trans.read(@trans.available)).to eq('\u0020')
Jake Farrella87810f2012-09-28 01:59:04 +000037 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000038
Jake Farrella87810f2012-09-28 01:59:04 +000039 it "should write json char" do
40 @prot.write_json_char("\n")
James E. King III27247072018-03-22 20:50:23 -040041 expect(@trans.read(@trans.available)).to eq('\\n')
Jake Farrell6f0f5272012-01-31 03:39:30 +000042
Jake Farrella87810f2012-09-28 01:59:04 +000043 @prot.write_json_char(" ")
James E. King III27247072018-03-22 20:50:23 -040044 expect(@trans.read(@trans.available)).to eq(' ')
Jake Farrell6f0f5272012-01-31 03:39:30 +000045
Jake Farrella87810f2012-09-28 01:59:04 +000046 @prot.write_json_char("\\")
James E. King III27247072018-03-22 20:50:23 -040047 expect(@trans.read(@trans.available)).to eq("\\\\")
Jake Farrell6f0f5272012-01-31 03:39:30 +000048
Jake Farrella87810f2012-09-28 01:59:04 +000049 @prot.write_json_char("@")
James E. King III27247072018-03-22 20:50:23 -040050 expect(@trans.read(@trans.available)).to eq('@')
Jake Farrella87810f2012-09-28 01:59:04 +000051 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000052
Jake Farrella87810f2012-09-28 01:59:04 +000053 it "should write json string" do
54 @prot.write_json_string("this is a \\ json\nstring")
James E. King III27247072018-03-22 20:50:23 -040055 expect(@trans.read(@trans.available)).to eq("\"this is a \\\\ json\\nstring\"")
Jake Farrella87810f2012-09-28 01:59:04 +000056 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000057
Jake Farrella87810f2012-09-28 01:59:04 +000058 it "should write json base64" do
59 @prot.write_json_base64("this is a base64 string")
James E. King III27247072018-03-22 20:50:23 -040060 expect(@trans.read(@trans.available)).to eq("\"dGhpcyBpcyBhIGJhc2U2NCBzdHJpbmc=\"")
Jake Farrella87810f2012-09-28 01:59:04 +000061 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000062
Jake Farrella87810f2012-09-28 01:59:04 +000063 it "should write json integer" do
64 @prot.write_json_integer(45)
James E. King III27247072018-03-22 20:50:23 -040065 expect(@trans.read(@trans.available)).to eq("45")
Jake Farrell6f0f5272012-01-31 03:39:30 +000066
Jake Farrella87810f2012-09-28 01:59:04 +000067 @prot.write_json_integer(33000)
James E. King III27247072018-03-22 20:50:23 -040068 expect(@trans.read(@trans.available)).to eq("33000")
Jake Farrell6f0f5272012-01-31 03:39:30 +000069
Jake Farrella87810f2012-09-28 01:59:04 +000070 @prot.write_json_integer(3000000000)
James E. King III27247072018-03-22 20:50:23 -040071 expect(@trans.read(@trans.available)).to eq("3000000000")
Jake Farrell6f0f5272012-01-31 03:39:30 +000072
Jake Farrella87810f2012-09-28 01:59:04 +000073 @prot.write_json_integer(6000000000)
James E. King III27247072018-03-22 20:50:23 -040074 expect(@trans.read(@trans.available)).to eq("6000000000")
Jake Farrella87810f2012-09-28 01:59:04 +000075 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000076
Jake Farrella87810f2012-09-28 01:59:04 +000077 it "should write json double" do
78 @prot.write_json_double(12.3)
James E. King III27247072018-03-22 20:50:23 -040079 expect(@trans.read(@trans.available)).to eq("12.3")
Jake Farrell6f0f5272012-01-31 03:39:30 +000080
Jake Farrella87810f2012-09-28 01:59:04 +000081 @prot.write_json_double(-3.21)
James E. King III27247072018-03-22 20:50:23 -040082 expect(@trans.read(@trans.available)).to eq("-3.21")
Jake Farrell6f0f5272012-01-31 03:39:30 +000083
Jake Farrella87810f2012-09-28 01:59:04 +000084 @prot.write_json_double(((+1.0/0.0)/(+1.0/0.0)))
James E. King III27247072018-03-22 20:50:23 -040085 expect(@trans.read(@trans.available)).to eq("\"NaN\"")
Jake Farrell6f0f5272012-01-31 03:39:30 +000086
Jake Farrella87810f2012-09-28 01:59:04 +000087 @prot.write_json_double((+1.0/0.0))
James E. King III27247072018-03-22 20:50:23 -040088 expect(@trans.read(@trans.available)).to eq("\"Infinity\"")
Jake Farrell6f0f5272012-01-31 03:39:30 +000089
Jake Farrella87810f2012-09-28 01:59:04 +000090 @prot.write_json_double((-1.0/0.0))
James E. King III27247072018-03-22 20:50:23 -040091 expect(@trans.read(@trans.available)).to eq("\"-Infinity\"")
Jake Farrella87810f2012-09-28 01:59:04 +000092 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000093
Jake Farrella87810f2012-09-28 01:59:04 +000094 it "should write json object start" do
95 @prot.write_json_object_start
James E. King III27247072018-03-22 20:50:23 -040096 expect(@trans.read(@trans.available)).to eq("{")
Jake Farrella87810f2012-09-28 01:59:04 +000097 end
Jake Farrell6f0f5272012-01-31 03:39:30 +000098
Jake Farrella87810f2012-09-28 01:59:04 +000099 it "should write json object end" do
100 @prot.write_json_object_end
James E. King III27247072018-03-22 20:50:23 -0400101 expect(@trans.read(@trans.available)).to eq("}")
Jake Farrella87810f2012-09-28 01:59:04 +0000102 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000103
Jake Farrella87810f2012-09-28 01:59:04 +0000104 it "should write json array start" do
105 @prot.write_json_array_start
James E. King III27247072018-03-22 20:50:23 -0400106 expect(@trans.read(@trans.available)).to eq("[")
Jake Farrella87810f2012-09-28 01:59:04 +0000107 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000108
Jake Farrella87810f2012-09-28 01:59:04 +0000109 it "should write json array end" do
110 @prot.write_json_array_end
James E. King III27247072018-03-22 20:50:23 -0400111 expect(@trans.read(@trans.available)).to eq("]")
Jake Farrella87810f2012-09-28 01:59:04 +0000112 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000113
Jake Farrella87810f2012-09-28 01:59:04 +0000114 it "should write message begin" do
115 @prot.write_message_begin("name", 12, 32)
James E. King III27247072018-03-22 20:50:23 -0400116 expect(@trans.read(@trans.available)).to eq("[1,\"name\",12,32")
Jake Farrella87810f2012-09-28 01:59:04 +0000117 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000118
Jake Farrella87810f2012-09-28 01:59:04 +0000119 it "should write message end" do
120 @prot.write_message_end
James E. King III27247072018-03-22 20:50:23 -0400121 expect(@trans.read(@trans.available)).to eq("]")
Jake Farrella87810f2012-09-28 01:59:04 +0000122 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000123
Jake Farrella87810f2012-09-28 01:59:04 +0000124 it "should write struct begin" do
125 @prot.write_struct_begin("name")
James E. King III27247072018-03-22 20:50:23 -0400126 expect(@trans.read(@trans.available)).to eq("{")
Jake Farrella87810f2012-09-28 01:59:04 +0000127 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000128
Jake Farrella87810f2012-09-28 01:59:04 +0000129 it "should write struct end" do
130 @prot.write_struct_end
James E. King III27247072018-03-22 20:50:23 -0400131 expect(@trans.read(@trans.available)).to eq("}")
Jake Farrella87810f2012-09-28 01:59:04 +0000132 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000133
Jake Farrella87810f2012-09-28 01:59:04 +0000134 it "should write field begin" do
135 @prot.write_field_begin("name", Thrift::Types::STRUCT, 32)
James E. King III27247072018-03-22 20:50:23 -0400136 expect(@trans.read(@trans.available)).to eq("32{\"rec\"")
Jake Farrella87810f2012-09-28 01:59:04 +0000137 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000138
Jake Farrella87810f2012-09-28 01:59:04 +0000139 it "should write field end" do
140 @prot.write_field_end
James E. King III27247072018-03-22 20:50:23 -0400141 expect(@trans.read(@trans.available)).to eq("}")
Jake Farrella87810f2012-09-28 01:59:04 +0000142 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000143
Jake Farrella87810f2012-09-28 01:59:04 +0000144 it "should write field stop" do
145 @prot.write_field_stop
James E. King III27247072018-03-22 20:50:23 -0400146 expect(@trans.read(@trans.available)).to eq("")
Jake Farrella87810f2012-09-28 01:59:04 +0000147 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000148
Jake Farrella87810f2012-09-28 01:59:04 +0000149 it "should write map begin" do
150 @prot.write_map_begin(Thrift::Types::STRUCT, Thrift::Types::LIST, 32)
James E. King III27247072018-03-22 20:50:23 -0400151 expect(@trans.read(@trans.available)).to eq("[\"rec\",\"lst\",32,{")
Jake Farrella87810f2012-09-28 01:59:04 +0000152 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000153
Jake Farrella87810f2012-09-28 01:59:04 +0000154 it "should write map end" do
155 @prot.write_map_end
James E. King III27247072018-03-22 20:50:23 -0400156 expect(@trans.read(@trans.available)).to eq("}]")
Jake Farrella87810f2012-09-28 01:59:04 +0000157 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000158
Jake Farrella87810f2012-09-28 01:59:04 +0000159 it "should write list begin" do
160 @prot.write_list_begin(Thrift::Types::STRUCT, 32)
James E. King III27247072018-03-22 20:50:23 -0400161 expect(@trans.read(@trans.available)).to eq("[\"rec\",32")
Jake Farrella87810f2012-09-28 01:59:04 +0000162 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000163
Jake Farrella87810f2012-09-28 01:59:04 +0000164 it "should write list end" do
165 @prot.write_list_end
James E. King III27247072018-03-22 20:50:23 -0400166 expect(@trans.read(@trans.available)).to eq("]")
Jake Farrella87810f2012-09-28 01:59:04 +0000167 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000168
Jake Farrella87810f2012-09-28 01:59:04 +0000169 it "should write set begin" do
170 @prot.write_set_begin(Thrift::Types::STRUCT, 32)
James E. King III27247072018-03-22 20:50:23 -0400171 expect(@trans.read(@trans.available)).to eq("[\"rec\",32")
Jake Farrella87810f2012-09-28 01:59:04 +0000172 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000173
Jake Farrella87810f2012-09-28 01:59:04 +0000174 it "should write set end" do
175 @prot.write_set_end
James E. King III27247072018-03-22 20:50:23 -0400176 expect(@trans.read(@trans.available)).to eq("]")
Jake Farrella87810f2012-09-28 01:59:04 +0000177 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000178
Jake Farrella87810f2012-09-28 01:59:04 +0000179 it "should write bool" do
180 @prot.write_bool(true)
James E. King III27247072018-03-22 20:50:23 -0400181 expect(@trans.read(@trans.available)).to eq("1")
Jake Farrell6f0f5272012-01-31 03:39:30 +0000182
Jake Farrella87810f2012-09-28 01:59:04 +0000183 @prot.write_bool(false)
James E. King III27247072018-03-22 20:50:23 -0400184 expect(@trans.read(@trans.available)).to eq("0")
Jake Farrella87810f2012-09-28 01:59:04 +0000185 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000186
Jake Farrella87810f2012-09-28 01:59:04 +0000187 it "should write byte" do
188 @prot.write_byte(100)
James E. King III27247072018-03-22 20:50:23 -0400189 expect(@trans.read(@trans.available)).to eq("100")
Jake Farrella87810f2012-09-28 01:59:04 +0000190 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000191
Jake Farrella87810f2012-09-28 01:59:04 +0000192 it "should write i16" do
193 @prot.write_i16(1000)
James E. King III27247072018-03-22 20:50:23 -0400194 expect(@trans.read(@trans.available)).to eq("1000")
Jake Farrella87810f2012-09-28 01:59:04 +0000195 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000196
Jake Farrella87810f2012-09-28 01:59:04 +0000197 it "should write i32" do
198 @prot.write_i32(3000000000)
James E. King III27247072018-03-22 20:50:23 -0400199 expect(@trans.read(@trans.available)).to eq("3000000000")
Jake Farrella87810f2012-09-28 01:59:04 +0000200 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000201
Jake Farrella87810f2012-09-28 01:59:04 +0000202 it "should write i64" do
203 @prot.write_i64(6000000000)
James E. King III27247072018-03-22 20:50:23 -0400204 expect(@trans.read(@trans.available)).to eq("6000000000")
Jake Farrella87810f2012-09-28 01:59:04 +0000205 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000206
Jake Farrella87810f2012-09-28 01:59:04 +0000207 it "should write double" do
208 @prot.write_double(1.23)
James E. King III27247072018-03-22 20:50:23 -0400209 expect(@trans.read(@trans.available)).to eq("1.23")
Jake Farrell6f0f5272012-01-31 03:39:30 +0000210
Jake Farrella87810f2012-09-28 01:59:04 +0000211 @prot.write_double(-32.1)
James E. King III27247072018-03-22 20:50:23 -0400212 expect(@trans.read(@trans.available)).to eq("-32.1")
Jake Farrell6f0f5272012-01-31 03:39:30 +0000213
Jake Farrella87810f2012-09-28 01:59:04 +0000214 @prot.write_double(((+1.0/0.0)/(+1.0/0.0)))
James E. King III27247072018-03-22 20:50:23 -0400215 expect(@trans.read(@trans.available)).to eq("\"NaN\"")
Jake Farrell6f0f5272012-01-31 03:39:30 +0000216
Jake Farrella87810f2012-09-28 01:59:04 +0000217 @prot.write_double((+1.0/0.0))
James E. King III27247072018-03-22 20:50:23 -0400218 expect(@trans.read(@trans.available)).to eq("\"Infinity\"")
Jake Farrell6f0f5272012-01-31 03:39:30 +0000219
Jake Farrella87810f2012-09-28 01:59:04 +0000220 @prot.write_double((-1.0/0.0))
James E. King III27247072018-03-22 20:50:23 -0400221 expect(@trans.read(@trans.available)).to eq("\"-Infinity\"")
Jake Farrella87810f2012-09-28 01:59:04 +0000222 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000223
Dmytro Shteflyukd24b8a02025-12-01 18:41:20 -0500224 it 'should write string' do
225 @prot.write_string('this is a test string')
226 a = @trans.read(@trans.available)
227 expect(a).to eq('"this is a test string"'.force_encoding(Encoding::BINARY))
228 expect(a.encoding).to eq(Encoding::BINARY)
229 end
Jake Farrellb5a18a12012-10-09 01:10:43 +0000230
Dmytro Shteflyukd24b8a02025-12-01 18:41:20 -0500231 it 'should write string with unicode characters' do
232 @prot.write_string("this is a test string with unicode characters: \u20AC \u20AD")
233 a = @trans.read(@trans.available)
234 expect(a).to eq("\"this is a test string with unicode characters: \u20AC \u20AD\"".force_encoding(Encoding::BINARY))
235 expect(a.encoding).to eq(Encoding::BINARY)
Jake Farrella87810f2012-09-28 01:59:04 +0000236 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000237
Jake Farrella87810f2012-09-28 01:59:04 +0000238 it "should write binary" do
239 @prot.write_binary("this is a base64 string")
James E. King III27247072018-03-22 20:50:23 -0400240 expect(@trans.read(@trans.available)).to eq("\"dGhpcyBpcyBhIGJhc2U2NCBzdHJpbmc=\"")
Jens Geyer123258b2015-10-02 00:38:17 +0200241 end
242
243 it "should write long binary" do
244 @prot.write_binary((0...256).to_a.pack('C*'))
James E. King III27247072018-03-22 20:50:23 -0400245 expect(@trans.read(@trans.available)).to eq("\"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==\"")
Jake Farrella87810f2012-09-28 01:59:04 +0000246 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000247
Dmytro Shteflyuke9ac8e32025-11-19 23:33:23 -0500248 it "should write a uuid" do
249 @prot.write_uuid("00112233-4455-6677-8899-aabbccddeeff")
250 expect(@trans.read(@trans.available)).to eq("\"00112233-4455-6677-8899-aabbccddeeff\"")
251 end
252
Jake Farrella87810f2012-09-28 01:59:04 +0000253 it "should get type name for type id" do
254 expect {@prot.get_type_name_for_type_id(Thrift::Types::STOP)}.to raise_error(NotImplementedError)
255 expect {@prot.get_type_name_for_type_id(Thrift::Types::VOID)}.to raise_error(NotImplementedError)
James E. King III27247072018-03-22 20:50:23 -0400256 expect(@prot.get_type_name_for_type_id(Thrift::Types::BOOL)).to eq("tf")
257 expect(@prot.get_type_name_for_type_id(Thrift::Types::BYTE)).to eq("i8")
258 expect(@prot.get_type_name_for_type_id(Thrift::Types::DOUBLE)).to eq("dbl")
259 expect(@prot.get_type_name_for_type_id(Thrift::Types::I16)).to eq("i16")
260 expect(@prot.get_type_name_for_type_id(Thrift::Types::I32)).to eq("i32")
261 expect(@prot.get_type_name_for_type_id(Thrift::Types::I64)).to eq("i64")
262 expect(@prot.get_type_name_for_type_id(Thrift::Types::STRING)).to eq("str")
263 expect(@prot.get_type_name_for_type_id(Thrift::Types::STRUCT)).to eq("rec")
264 expect(@prot.get_type_name_for_type_id(Thrift::Types::MAP)).to eq("map")
265 expect(@prot.get_type_name_for_type_id(Thrift::Types::SET)).to eq("set")
266 expect(@prot.get_type_name_for_type_id(Thrift::Types::LIST)).to eq("lst")
Jake Farrella87810f2012-09-28 01:59:04 +0000267 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000268
Jake Farrella87810f2012-09-28 01:59:04 +0000269 it "should get type id for type name" do
270 expect {@prot.get_type_id_for_type_name("pp")}.to raise_error(NotImplementedError)
James E. King III27247072018-03-22 20:50:23 -0400271 expect(@prot.get_type_id_for_type_name("tf")).to eq(Thrift::Types::BOOL)
272 expect(@prot.get_type_id_for_type_name("i8")).to eq(Thrift::Types::BYTE)
273 expect(@prot.get_type_id_for_type_name("dbl")).to eq(Thrift::Types::DOUBLE)
274 expect(@prot.get_type_id_for_type_name("i16")).to eq(Thrift::Types::I16)
275 expect(@prot.get_type_id_for_type_name("i32")).to eq(Thrift::Types::I32)
276 expect(@prot.get_type_id_for_type_name("i64")).to eq(Thrift::Types::I64)
277 expect(@prot.get_type_id_for_type_name("str")).to eq(Thrift::Types::STRING)
278 expect(@prot.get_type_id_for_type_name("rec")).to eq(Thrift::Types::STRUCT)
279 expect(@prot.get_type_id_for_type_name("map")).to eq(Thrift::Types::MAP)
280 expect(@prot.get_type_id_for_type_name("set")).to eq(Thrift::Types::SET)
281 expect(@prot.get_type_id_for_type_name("lst")).to eq(Thrift::Types::LIST)
Jake Farrella87810f2012-09-28 01:59:04 +0000282 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000283
Jake Farrella87810f2012-09-28 01:59:04 +0000284 it "should read json syntax char" do
285 @trans.write('F')
286 expect {@prot.read_json_syntax_char('G')}.to raise_error(Thrift::ProtocolException)
287 @trans.write('H')
288 @prot.read_json_syntax_char('H')
289 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000290
Jake Farrella87810f2012-09-28 01:59:04 +0000291 it "should read json escape char" do
292 @trans.write('0054')
James E. King III27247072018-03-22 20:50:23 -0400293 expect(@prot.read_json_escape_char).to eq('T')
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900294
295 @trans.write("\"\\\"\"")
James E. King III27247072018-03-22 20:50:23 -0400296 expect(@prot.read_json_string(false)).to eq("\"")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900297
298 @trans.write("\"\\\\\"")
James E. King III27247072018-03-22 20:50:23 -0400299 expect(@prot.read_json_string(false)).to eq("\\")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900300
301 @trans.write("\"\\/\"")
James E. King III27247072018-03-22 20:50:23 -0400302 expect(@prot.read_json_string(false)).to eq("\/")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900303
304 @trans.write("\"\\b\"")
James E. King III27247072018-03-22 20:50:23 -0400305 expect(@prot.read_json_string(false)).to eq("\b")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900306
307 @trans.write("\"\\f\"")
James E. King III27247072018-03-22 20:50:23 -0400308 expect(@prot.read_json_string(false)).to eq("\f")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900309
310 @trans.write("\"\\n\"")
James E. King III27247072018-03-22 20:50:23 -0400311 expect(@prot.read_json_string(false)).to eq("\n")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900312
313 @trans.write("\"\\r\"")
James E. King III27247072018-03-22 20:50:23 -0400314 expect(@prot.read_json_string(false)).to eq("\r")
Nobuaki Sukegawa8cd519f2015-10-10 01:52:13 +0900315
316 @trans.write("\"\\t\"")
James E. King III27247072018-03-22 20:50:23 -0400317 expect(@prot.read_json_string(false)).to eq("\t")
Jake Farrella87810f2012-09-28 01:59:04 +0000318 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000319
Jake Farrella87810f2012-09-28 01:59:04 +0000320 it "should read json string" do
321 @trans.write("\"\\P")
322 expect {@prot.read_json_string(false)}.to raise_error(Thrift::ProtocolException)
Jake Farrell6f0f5272012-01-31 03:39:30 +0000323
Jake Farrella87810f2012-09-28 01:59:04 +0000324 @trans.write("\"this is a test string\"")
James E. King III27247072018-03-22 20:50:23 -0400325 expect(@prot.read_json_string).to eq("this is a test string")
Jake Farrella87810f2012-09-28 01:59:04 +0000326 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000327
Jake Farrella87810f2012-09-28 01:59:04 +0000328 it "should read json base64" do
329 @trans.write("\"dGhpcyBpcyBhIHRlc3Qgc3RyaW5n\"")
James E. King III27247072018-03-22 20:50:23 -0400330 expect(@prot.read_json_base64).to eq("this is a test string")
Jake Farrella87810f2012-09-28 01:59:04 +0000331 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000332
Jake Farrella87810f2012-09-28 01:59:04 +0000333 it "should is json numeric" do
James E. King III27247072018-03-22 20:50:23 -0400334 expect(@prot.is_json_numeric("A")).to eq(false)
335 expect(@prot.is_json_numeric("+")).to eq(true)
336 expect(@prot.is_json_numeric("-")).to eq(true)
337 expect(@prot.is_json_numeric(".")).to eq(true)
338 expect(@prot.is_json_numeric("0")).to eq(true)
339 expect(@prot.is_json_numeric("1")).to eq(true)
340 expect(@prot.is_json_numeric("2")).to eq(true)
341 expect(@prot.is_json_numeric("3")).to eq(true)
342 expect(@prot.is_json_numeric("4")).to eq(true)
343 expect(@prot.is_json_numeric("5")).to eq(true)
344 expect(@prot.is_json_numeric("6")).to eq(true)
345 expect(@prot.is_json_numeric("7")).to eq(true)
346 expect(@prot.is_json_numeric("8")).to eq(true)
347 expect(@prot.is_json_numeric("9")).to eq(true)
348 expect(@prot.is_json_numeric("E")).to eq(true)
349 expect(@prot.is_json_numeric("e")).to eq(true)
Jake Farrella87810f2012-09-28 01:59:04 +0000350 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000351
Jake Farrella87810f2012-09-28 01:59:04 +0000352 it "should read json numeric chars" do
353 @trans.write("1.453E45T")
James E. King III27247072018-03-22 20:50:23 -0400354 expect(@prot.read_json_numeric_chars).to eq("1.453E45")
Jake Farrella87810f2012-09-28 01:59:04 +0000355 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000356
Jake Farrella87810f2012-09-28 01:59:04 +0000357 it "should read json integer" do
358 @trans.write("1.45\"\"")
359 expect {@prot.read_json_integer}.to raise_error(Thrift::ProtocolException)
360 @prot.read_string
Jake Farrell6f0f5272012-01-31 03:39:30 +0000361
Jake Farrella87810f2012-09-28 01:59:04 +0000362 @trans.write("1453T")
James E. King III27247072018-03-22 20:50:23 -0400363 expect(@prot.read_json_integer).to eq(1453)
Jake Farrella87810f2012-09-28 01:59:04 +0000364 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000365
Jake Farrella87810f2012-09-28 01:59:04 +0000366 it "should read json double" do
367 @trans.write("1.45e3e01\"\"")
368 expect {@prot.read_json_double}.to raise_error(Thrift::ProtocolException)
369 @prot.read_string
Jake Farrell6f0f5272012-01-31 03:39:30 +0000370
Jake Farrella87810f2012-09-28 01:59:04 +0000371 @trans.write("\"1.453e01\"")
372 expect {@prot.read_json_double}.to raise_error(Thrift::ProtocolException)
Jake Farrell6f0f5272012-01-31 03:39:30 +0000373
Jake Farrella87810f2012-09-28 01:59:04 +0000374 @trans.write("1.453e01\"\"")
James E. King III27247072018-03-22 20:50:23 -0400375 expect(@prot.read_json_double).to eq(14.53)
Jake Farrella87810f2012-09-28 01:59:04 +0000376 @prot.read_string
Jake Farrell6f0f5272012-01-31 03:39:30 +0000377
Jake Farrella87810f2012-09-28 01:59:04 +0000378 @trans.write("\"NaN\"")
James E. King III27247072018-03-22 20:50:23 -0400379 expect(@prot.read_json_double.nan?).to eq(true)
Jake Farrell6f0f5272012-01-31 03:39:30 +0000380
Jake Farrella87810f2012-09-28 01:59:04 +0000381 @trans.write("\"Infinity\"")
James E. King III27247072018-03-22 20:50:23 -0400382 expect(@prot.read_json_double).to eq(+1.0/0.0)
Jake Farrell6f0f5272012-01-31 03:39:30 +0000383
Jake Farrella87810f2012-09-28 01:59:04 +0000384 @trans.write("\"-Infinity\"")
James E. King III27247072018-03-22 20:50:23 -0400385 expect(@prot.read_json_double).to eq(-1.0/0.0)
Jake Farrella87810f2012-09-28 01:59:04 +0000386 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000387
Jake Farrella87810f2012-09-28 01:59:04 +0000388 it "should read json object start" do
389 @trans.write("{")
James E. King III27247072018-03-22 20:50:23 -0400390 expect(@prot.read_json_object_start).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000391 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000392
Jake Farrella87810f2012-09-28 01:59:04 +0000393 it "should read json object end" do
394 @trans.write("}")
James E. King III27247072018-03-22 20:50:23 -0400395 expect(@prot.read_json_object_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000396 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000397
Jake Farrella87810f2012-09-28 01:59:04 +0000398 it "should read json array start" do
399 @trans.write("[")
James E. King III27247072018-03-22 20:50:23 -0400400 expect(@prot.read_json_array_start).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000401 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000402
Jake Farrella87810f2012-09-28 01:59:04 +0000403 it "should read json array end" do
404 @trans.write("]")
James E. King III27247072018-03-22 20:50:23 -0400405 expect(@prot.read_json_array_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000406 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000407
Jake Farrella87810f2012-09-28 01:59:04 +0000408 it "should read_message_begin" do
409 @trans.write("[2,")
410 expect {@prot.read_message_begin}.to raise_error(Thrift::ProtocolException)
Jake Farrell6f0f5272012-01-31 03:39:30 +0000411
Jake Farrella87810f2012-09-28 01:59:04 +0000412 @trans.write("[1,\"name\",12,32\"\"")
James E. King III27247072018-03-22 20:50:23 -0400413 expect(@prot.read_message_begin).to eq(["name", 12, 32])
Jake Farrella87810f2012-09-28 01:59:04 +0000414 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000415
Jake Farrella87810f2012-09-28 01:59:04 +0000416 it "should read message end" do
417 @trans.write("]")
James E. King III27247072018-03-22 20:50:23 -0400418 expect(@prot.read_message_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000419 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000420
Jake Farrella87810f2012-09-28 01:59:04 +0000421 it "should read struct begin" do
422 @trans.write("{")
James E. King III27247072018-03-22 20:50:23 -0400423 expect(@prot.read_struct_begin).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000424 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000425
Jake Farrella87810f2012-09-28 01:59:04 +0000426 it "should read struct end" do
427 @trans.write("}")
James E. King III27247072018-03-22 20:50:23 -0400428 expect(@prot.read_struct_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000429 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000430
Jake Farrella87810f2012-09-28 01:59:04 +0000431 it "should read field begin" do
432 @trans.write("1{\"rec\"")
James E. King III27247072018-03-22 20:50:23 -0400433 expect(@prot.read_field_begin).to eq([nil, 12, 1])
Jake Farrella87810f2012-09-28 01:59:04 +0000434 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000435
Jake Farrella87810f2012-09-28 01:59:04 +0000436 it "should read field end" do
437 @trans.write("}")
James E. King III27247072018-03-22 20:50:23 -0400438 expect(@prot.read_field_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000439 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000440
Jake Farrella87810f2012-09-28 01:59:04 +0000441 it "should read map begin" do
442 @trans.write("[\"rec\",\"lst\",2,{")
James E. King III27247072018-03-22 20:50:23 -0400443 expect(@prot.read_map_begin).to eq([12, 15, 2])
Jake Farrella87810f2012-09-28 01:59:04 +0000444 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000445
Jake Farrella87810f2012-09-28 01:59:04 +0000446 it "should read map end" do
447 @trans.write("}]")
James E. King III27247072018-03-22 20:50:23 -0400448 expect(@prot.read_map_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000449 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000450
Jake Farrella87810f2012-09-28 01:59:04 +0000451 it "should read list begin" do
452 @trans.write("[\"rec\",2\"\"")
James E. King III27247072018-03-22 20:50:23 -0400453 expect(@prot.read_list_begin).to eq([12, 2])
Jake Farrella87810f2012-09-28 01:59:04 +0000454 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000455
Jake Farrella87810f2012-09-28 01:59:04 +0000456 it "should read list end" do
457 @trans.write("]")
James E. King III27247072018-03-22 20:50:23 -0400458 expect(@prot.read_list_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000459 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000460
Jake Farrella87810f2012-09-28 01:59:04 +0000461 it "should read set begin" do
Roger Meier772b2b12013-01-19 21:04:12 +0100462 @trans.write("[\"rec\",2\"\"")
James E. King III27247072018-03-22 20:50:23 -0400463 expect(@prot.read_set_begin).to eq([12, 2])
Jake Farrella87810f2012-09-28 01:59:04 +0000464 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000465
Jake Farrella87810f2012-09-28 01:59:04 +0000466 it "should read set end" do
467 @trans.write("]")
James E. King III27247072018-03-22 20:50:23 -0400468 expect(@prot.read_set_end).to eq(nil)
Jake Farrella87810f2012-09-28 01:59:04 +0000469 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000470
Jake Farrella87810f2012-09-28 01:59:04 +0000471 it "should read bool" do
472 @trans.write("0\"\"")
James E. King III27247072018-03-22 20:50:23 -0400473 expect(@prot.read_bool).to eq(false)
Jake Farrella87810f2012-09-28 01:59:04 +0000474 @prot.read_string
Jake Farrell6f0f5272012-01-31 03:39:30 +0000475
Jake Farrella87810f2012-09-28 01:59:04 +0000476 @trans.write("1\"\"")
James E. King III27247072018-03-22 20:50:23 -0400477 expect(@prot.read_bool).to eq(true)
Jake Farrella87810f2012-09-28 01:59:04 +0000478 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000479
Jake Farrella87810f2012-09-28 01:59:04 +0000480 it "should read byte" do
481 @trans.write("60\"\"")
James E. King III27247072018-03-22 20:50:23 -0400482 expect(@prot.read_byte).to eq(60)
Jake Farrella87810f2012-09-28 01:59:04 +0000483 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000484
Jake Farrella87810f2012-09-28 01:59:04 +0000485 it "should read i16" do
486 @trans.write("1000\"\"")
James E. King III27247072018-03-22 20:50:23 -0400487 expect(@prot.read_i16).to eq(1000)
Jake Farrella87810f2012-09-28 01:59:04 +0000488 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000489
Jake Farrella87810f2012-09-28 01:59:04 +0000490 it "should read i32" do
491 @trans.write("3000000000\"\"")
James E. King III27247072018-03-22 20:50:23 -0400492 expect(@prot.read_i32).to eq(3000000000)
Jake Farrella87810f2012-09-28 01:59:04 +0000493 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000494
Jake Farrella87810f2012-09-28 01:59:04 +0000495 it "should read i64" do
496 @trans.write("6000000000\"\"")
James E. King III27247072018-03-22 20:50:23 -0400497 expect(@prot.read_i64).to eq(6000000000)
Jake Farrella87810f2012-09-28 01:59:04 +0000498 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000499
Jake Farrella87810f2012-09-28 01:59:04 +0000500 it "should read double" do
501 @trans.write("12.23\"\"")
James E. King III27247072018-03-22 20:50:23 -0400502 expect(@prot.read_double).to eq(12.23)
Jake Farrella87810f2012-09-28 01:59:04 +0000503 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000504
Dmytro Shteflyukd24b8a02025-12-01 18:41:20 -0500505 it 'should read string' do
506 @trans.write('"this is a test string"'.force_encoding(Encoding::BINARY))
507 a = @prot.read_string
508 expect(a).to eq('this is a test string')
509 expect(a.encoding).to eq(Encoding::UTF_8)
510 end
Jake Farrellb5a18a12012-10-09 01:10:43 +0000511
Dmytro Shteflyukd24b8a02025-12-01 18:41:20 -0500512 it 'should read string with unicode characters' do
513 @trans.write('"this is a test string with unicode characters: \u20AC \u20AD"'.force_encoding(Encoding::BINARY))
514 a = @prot.read_string
515 expect(a).to eq("this is a test string with unicode characters: \u20AC \u20AD")
516 expect(a.encoding).to eq(Encoding::UTF_8)
Jake Farrella87810f2012-09-28 01:59:04 +0000517 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000518
Jake Farrella87810f2012-09-28 01:59:04 +0000519 it "should read binary" do
520 @trans.write("\"dGhpcyBpcyBhIHRlc3Qgc3RyaW5n\"")
James E. King III27247072018-03-22 20:50:23 -0400521 expect(@prot.read_binary).to eq("this is a test string")
Jake Farrella87810f2012-09-28 01:59:04 +0000522 end
Jens Geyer123258b2015-10-02 00:38:17 +0200523
524 it "should read long binary" do
525 @trans.write("\"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==\"")
James E. King III27247072018-03-22 20:50:23 -0400526 expect(@prot.read_binary.bytes.to_a).to eq((0...256).to_a)
Jens Geyer123258b2015-10-02 00:38:17 +0200527 end
Dmytro Shteflyuke9ac8e32025-11-19 23:33:23 -0500528
529 it "should read a uuid" do
530 @trans.write("\"00112233-4455-6677-8899-aabbccddeeff\"")
531 expect(@prot.read_uuid).to eq("00112233-4455-6677-8899-aabbccddeeff")
532 end
533
534 it "should normalize uppercase uuid on read" do
535 @trans.write("\"00112233-4455-6677-8899-AABBCCDDEEFF\"")
536 expect(@prot.read_uuid).to eq("00112233-4455-6677-8899-aabbccddeeff")
537 end
538
James E. King III9aaf2952018-03-20 15:06:08 -0400539 it "should provide a reasonable to_s" do
James E. King III27247072018-03-22 20:50:23 -0400540 expect(@prot.to_s).to eq("json(memory)")
James E. King III9aaf2952018-03-20 15:06:08 -0400541 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000542 end
543
Jake Farrella87810f2012-09-28 01:59:04 +0000544 describe Thrift::JsonProtocolFactory do
Jake Farrell6f0f5272012-01-31 03:39:30 +0000545 it "should create a JsonProtocol" do
James E. King III27247072018-03-22 20:50:23 -0400546 expect(Thrift::JsonProtocolFactory.new.get_protocol(double("MockTransport"))).to be_instance_of(Thrift::JsonProtocol)
Jake Farrell6f0f5272012-01-31 03:39:30 +0000547 end
James E. King III9aaf2952018-03-20 15:06:08 -0400548
549 it "should provide a reasonable to_s" do
James E. King III27247072018-03-22 20:50:23 -0400550 expect(Thrift::JsonProtocolFactory.new.to_s).to eq("json")
James E. King III9aaf2952018-03-20 15:06:08 -0400551 end
Jake Farrell6f0f5272012-01-31 03:39:30 +0000552 end
553end