blob: 78b1a2a2a9a2703003e8b7bba72cd15b26e28127 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001#
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
Bryan Duxburyd815c212009-03-19 18:57:43 +000020require File.dirname(__FILE__) + '/spec_helper'
Bryan Duxburyd815c212009-03-19 18:57:43 +000021
22describe Thrift::CompactProtocol do
23 TESTS = {
24 :byte => (-127..127).to_a,
25 :i16 => (0..14).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,
26 :i32 => (0..30).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,
27 :i64 => (0..62).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,
28 :string => ["", "1", "short", "fourteen123456", "fifteen12345678", "1" * 127, "1" * 3000],
29 :binary => ["", "\001", "\001" * 5, "\001" * 14, "\001" * 15, "\001" * 127, "\001" * 3000],
30 :double => [0.0, 1.0, -1.0, 1.1, -1.1, 10000000.1, 1.0/0.0, -1.0/0.0],
31 :bool => [true, false]
32 }
33
34 it "should encode and decode naked primitives correctly" do
35 TESTS.each_pair do |primitive_type, test_values|
36 test_values.each do |value|
37 # puts "testing #{value}" if primitive_type == :i64
Bryan Duxburyd1d15422009-04-04 00:58:03 +000038 trans = Thrift::MemoryBufferTransport.new
Bryan Duxburyd815c212009-03-19 18:57:43 +000039 proto = Thrift::CompactProtocol.new(trans)
40
41 proto.send(writer(primitive_type), value)
42 # puts "buf: #{trans.inspect_buffer}" if primitive_type == :i64
43 read_back = proto.send(reader(primitive_type))
44 read_back.should == value
45 end
46 end
47 end
48
49 it "should encode and decode primitives in fields correctly" do
50 TESTS.each_pair do |primitive_type, test_values|
51 final_primitive_type = primitive_type == :binary ? :string : primitive_type
52 thrift_type = Thrift::Types.const_get(final_primitive_type.to_s.upcase)
53 # puts primitive_type
54 test_values.each do |value|
Bryan Duxburyd1d15422009-04-04 00:58:03 +000055 trans = Thrift::MemoryBufferTransport.new
Bryan Duxburyd815c212009-03-19 18:57:43 +000056 proto = Thrift::CompactProtocol.new(trans)
57
58 proto.write_field_begin(nil, thrift_type, 15)
59 proto.send(writer(primitive_type), value)
60 proto.write_field_end
61
62 proto = Thrift::CompactProtocol.new(trans)
63 name, type, id = proto.read_field_begin
64 type.should == thrift_type
65 id.should == 15
66 read_back = proto.send(reader(primitive_type))
67 read_back.should == value
68 proto.read_field_end
69 end
70 end
71 end
72
73 it "should encode and decode a monster struct correctly" do
Bryan Duxburyd1d15422009-04-04 00:58:03 +000074 trans = Thrift::MemoryBufferTransport.new
Bryan Duxburyd815c212009-03-19 18:57:43 +000075 proto = Thrift::CompactProtocol.new(trans)
76
77 struct = CompactProtoTestStruct.new
78 # sets and maps don't hash well... not sure what to do here.
79 struct.set_byte_map = nil
80 struct.map_byte_map = nil
81 struct.write(proto)
82
83 # puts trans.inspect
84
85 struct2 = CompactProtoTestStruct.new
86 struct2.instance_variables.each do |ivar|
87 struct2.instance_variable_set(ivar, nil)
88 end
89
90 struct2.should_not == struct
91
92 struct2.read(proto)
93
94 struct2.should == struct
95 end
96
97 it "should make method calls correctly" do
Bryan Duxburyd1d15422009-04-04 00:58:03 +000098 client_out_trans = Thrift::MemoryBufferTransport.new
Bryan Duxburyd815c212009-03-19 18:57:43 +000099 client_out_proto = Thrift::CompactProtocol.new(client_out_trans)
100
Bryan Duxburyd1d15422009-04-04 00:58:03 +0000101 client_in_trans = Thrift::MemoryBufferTransport.new
Bryan Duxburyd815c212009-03-19 18:57:43 +0000102 client_in_proto = Thrift::CompactProtocol.new(client_in_trans)
103
104 processor = Srv::Processor.new(JankyHandler.new)
105
106 client = Srv::Client.new(client_in_proto, client_out_proto)
107 client.send_Janky(1)
108 # puts client_out_trans.inspect_buffer
109 processor.process(client_out_proto, client_in_proto)
110 client.recv_Janky.should == 2
111 end
112
113 class JankyHandler
114 def Janky(i32arg)
115 i32arg * 2
116 end
117 end
118
119 def writer(sym)
120 sym = sym == :binary ? :string : sym
121 "write_#{sym.to_s}"
122 end
123
124 def reader(sym)
125 sym = sym == :binary ? :string : sym
126 "read_#{sym.to_s}"
127 end
128end