Rev 30 | Blame | Compare with Previous | Last modification | View Log | RSS feed
## Licensed to the Apache Software Foundation (ASF) under one# or more contributor license agreements. See the NOTICE file# distributed with this work for additional information# regarding copyright ownership. The ASF licenses this file# to you under the Apache License, Version 2.0 (the# "License"); you may not use this file except in compliance# with the License. You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing,# software distributed under the License is distributed on an# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY# KIND, either express or implied. See the License for the# specific language governing permissions and limitations# under the License.#require File.dirname(__FILE__) + '/spec_helper'describe Thrift::CompactProtocol doTESTS = {:byte => (-127..127).to_a,:i16 => (0..14).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,:i32 => (0..30).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,:i64 => (0..62).map {|shift| [1 << shift, -(1 << shift)]}.flatten.sort,:string => ["", "1", "short", "fourteen123456", "fifteen12345678", "1" * 127, "1" * 3000],:binary => ["", "\001", "\001" * 5, "\001" * 14, "\001" * 15, "\001" * 127, "\001" * 3000],:double => [0.0, 1.0, -1.0, 1.1, -1.1, 10000000.1, 1.0/0.0, -1.0/0.0],:bool => [true, false]}it "should encode and decode naked primitives correctly" doTESTS.each_pair do |primitive_type, test_values|test_values.each do |value|# puts "testing #{value}" if primitive_type == :i64trans = Thrift::MemoryBufferTransport.newproto = Thrift::CompactProtocol.new(trans)proto.send(writer(primitive_type), value)# puts "buf: #{trans.inspect_buffer}" if primitive_type == :i64read_back = proto.send(reader(primitive_type))read_back.should == valueendendendit "should encode and decode primitives in fields correctly" doTESTS.each_pair do |primitive_type, test_values|final_primitive_type = primitive_type == :binary ? :string : primitive_typethrift_type = Thrift::Types.const_get(final_primitive_type.to_s.upcase)# puts primitive_typetest_values.each do |value|trans = Thrift::MemoryBufferTransport.newproto = Thrift::CompactProtocol.new(trans)proto.write_field_begin(nil, thrift_type, 15)proto.send(writer(primitive_type), value)proto.write_field_endproto = Thrift::CompactProtocol.new(trans)name, type, id = proto.read_field_begintype.should == thrift_typeid.should == 15read_back = proto.send(reader(primitive_type))read_back.should == valueproto.read_field_endendendendit "should encode and decode a monster struct correctly" dotrans = Thrift::MemoryBufferTransport.newproto = Thrift::CompactProtocol.new(trans)struct = CompactProtoTestStruct.new# sets and maps don't hash well... not sure what to do here.struct.write(proto)struct2 = CompactProtoTestStruct.newstruct2.read(proto)struct2.should == structendit "should make method calls correctly" doclient_out_trans = Thrift::MemoryBufferTransport.newclient_out_proto = Thrift::CompactProtocol.new(client_out_trans)client_in_trans = Thrift::MemoryBufferTransport.newclient_in_proto = Thrift::CompactProtocol.new(client_in_trans)processor = Srv::Processor.new(JankyHandler.new)client = Srv::Client.new(client_in_proto, client_out_proto)client.send_Janky(1)# puts client_out_trans.inspect_bufferprocessor.process(client_out_proto, client_in_proto)client.recv_Janky.should == 2endclass JankyHandlerdef Janky(i32arg)i32arg * 2endenddef writer(sym)sym = sym == :binary ? :string : sym"write_#{sym.to_s}"enddef reader(sym)sym = sym == :binary ? :string : sym"read_#{sym.to_s}"endend