blob: b9a79810390901aaf3d67fedb368e3f40d096831 [file] [log] [blame]
Gavin McDonald0b75e1a2010-10-28 02:12:01 +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
20require File.dirname(__FILE__) + '/spec_helper'
21
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
38 trans = Thrift::MemoryBufferTransport.new
39 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|
55 trans = Thrift::MemoryBufferTransport.new
56 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
74 trans = Thrift::MemoryBufferTransport.new
75 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.write(proto)
80
81 struct2 = CompactProtoTestStruct.new
82 struct2.read(proto)
83 struct2.should == struct
84 end
85
86 it "should make method calls correctly" do
87 client_out_trans = Thrift::MemoryBufferTransport.new
88 client_out_proto = Thrift::CompactProtocol.new(client_out_trans)
89
90 client_in_trans = Thrift::MemoryBufferTransport.new
91 client_in_proto = Thrift::CompactProtocol.new(client_in_trans)
92
93 processor = Srv::Processor.new(JankyHandler.new)
94
95 client = Srv::Client.new(client_in_proto, client_out_proto)
96 client.send_Janky(1)
97 # puts client_out_trans.inspect_buffer
98 processor.process(client_out_proto, client_in_proto)
99 client.recv_Janky.should == 2
100 end
101
102 class JankyHandler
103 def Janky(i32arg)
104 i32arg * 2
105 end
106 end
107
108 def writer(sym)
109 sym = sym == :binary ? :string : sym
110 "write_#{sym.to_s}"
111 end
112
113 def reader(sym)
114 sym = sym == :binary ? :string : sym
115 "read_#{sym.to_s}"
116 end
117end