From 138c0e126ffb9aa5d6408b44f82d902b7050a4eb Mon Sep 17 00:00:00 2001 From: Kevin Clark Date: Wed, 18 Jun 2008 01:18:28 +0000 Subject: [PATCH] rb: Implement Thrift::Serializer and Thrift::Deserializer git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@669018 13f79535-47bb-0310-9956-ffa450edef68 --- lib/rb/lib/thrift/serializer.rb | 27 ++++++++++++++++++ lib/rb/spec/serializer_spec.rb | 50 +++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 lib/rb/lib/thrift/serializer.rb create mode 100644 lib/rb/spec/serializer_spec.rb diff --git a/lib/rb/lib/thrift/serializer.rb b/lib/rb/lib/thrift/serializer.rb new file mode 100644 index 00000000..02ce859c --- /dev/null +++ b/lib/rb/lib/thrift/serializer.rb @@ -0,0 +1,27 @@ +module Thrift + class Serializer + def initialize(protocolFactory = BinaryProtocolFactory.new) + @transport = MemoryBuffer.new + @protocol = protocolFactory.get_protocol(@transport) + end + + def serialize(base) + @transport.reset_buffer + base.write(@protocol) + @transport.read(@transport.available) + end + end + + class Deserializer + def initialize(protocolFactory = BinaryProtocolFactory.new) + @transport = MemoryBuffer.new + @protocol = protocolFactory.get_protocol(@transport) + end + + def deserialize(base, buffer) + @transport.reset_buffer(buffer) + base.read(@protocol) + base + end + end +end diff --git a/lib/rb/spec/serializer_spec.rb b/lib/rb/spec/serializer_spec.rb new file mode 100644 index 00000000..57e20aba --- /dev/null +++ b/lib/rb/spec/serializer_spec.rb @@ -0,0 +1,50 @@ +require File.dirname(__FILE__) + '/spec_helper' +require 'thrift/serializer' +require 'ThriftSpec_types' + +class ThriftSerializerSpec < Spec::ExampleGroup + include Thrift + include SpecNamespace + + describe Serializer do + it "should serialize structs to binary by default" do + serializer = Serializer.new + data = serializer.serialize(Hello.new(:greeting => "'Ello guv'nor!")) + data.should == "\x0B\x00\x01\x00\x00\x00\x0E'Ello guv'nor!\x00" + end + + it "should serialize structs to the given protocol" do + protocol = mock("Protocol") + protocol.should_receive(:write_struct_begin).with("SpecNamespace::Hello") + protocol.should_receive(:write_field).with("greeting", Types::STRING, 1, "Good day") + protocol.should_receive(:write_field_stop) + protocol.should_receive(:write_struct_end) + protocolFactory = mock("ProtocolFactory") + protocolFactory.stub!(:get_protocol).and_return(protocol) + serializer = Serializer.new(protocolFactory) + serializer.serialize(Hello.new(:greeting => "Good day")) + end + end + + describe Deserializer do + it "should deserialize structs from binary by default" do + deserializer = Deserializer.new + data = "\x0B\x00\x01\x00\x00\x00\x0E'Ello guv'nor!\x00" + deserializer.deserialize(Hello.new, data).should == Hello.new(:greeting => "'Ello guv'nor!") + end + + it "should deserialize structs from the given protocol" do + protocol = mock("Protocol") + protocol.should_receive(:read_struct_begin).and_return("SpecNamespace::Hello") + protocol.should_receive(:read_field_begin).and_return(["greeting", Types::STRING, 1], + [nil, Types::STOP, 0]) + protocol.should_receive(:read_type).with(Types::STRING).and_return("Good day") + protocol.should_receive(:read_field_end) + protocol.should_receive(:read_struct_end) + protocolFactory = mock("ProtocolFactory") + protocolFactory.stub!(:get_protocol).and_return(protocol) + deserializer = Deserializer.new(protocolFactory) + deserializer.deserialize(Hello.new, "").should == Hello.new(:greeting => "Good day") + end + end +end -- 2.17.1