Author: kclark
Date: Mon Aug 25 15:16:45 2008
New Revision: 688901
URL: http://svn.apache.org/viewvc?rev=688901&view=rev
Log:
rb: Add FramedTransport#borrow/consume! [THRIFT-117]
This addition makes FramedTransport BinaryProtocolAccelerated ready.
Author: Bryan Duxbury
Modified:
incubator/thrift/trunk/lib/rb/lib/thrift/transport.rb
incubator/thrift/trunk/lib/rb/spec/transport_spec.rb
Modified: incubator/thrift/trunk/lib/rb/lib/thrift/transport.rb
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/rb/lib/thrift/transport.rb?rev=688901&r1=688900&r2=688901&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/rb/lib/thrift/transport.rb (original)
+++ incubator/thrift/trunk/lib/rb/lib/thrift/transport.rb Mon Aug 25 15:16:45
2008
@@ -199,6 +199,17 @@
@wbuf = ''
end
+ def borrow(requested_length = 0)
+ read_frame if @rbuf.empty?
+ # there isn't any more coming, so if it's not enough, it's an error.
+ raise EOFError if requested_length > @rbuf.size
+ @rbuf
+ end
+
+ def consume!(size)
+ @rbuf.slice!(0...size)
+ end
+
private
def read_frame
Modified: incubator/thrift/trunk/lib/rb/spec/transport_spec.rb
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/rb/spec/transport_spec.rb?rev=688901&r1=688900&r2=688901&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/rb/spec/transport_spec.rb (original)
+++ incubator/thrift/trunk/lib/rb/spec/transport_spec.rb Mon Aug 25 15:16:45
2008
@@ -221,6 +221,40 @@
@trans.should_receive(:write).with("\000\000\000\000")
ftrans.flush
end
+
+ it "should refill its buffer when borrow is called and it is empty" do
+ ftrans = FramedTransport.new(@trans)
+ @trans.should_receive(:read_all).with(4).and_return([10].pack("N"))
+ @trans.should_receive(:read_all).with(10).and_return("1234567890")
+ ftrans.borrow(10).should == "1234567890"
+ end
+
+ it "should not consume any data when borrow is called" do
+ ftrans = FramedTransport.new(@trans)
+ @trans.should_receive(:read_all).with(4).and_return([10].pack("N"))
+ @trans.should_receive(:read_all).with(10).and_return("1234567890")
+ ftrans.borrow(10).should == "1234567890"
+ ftrans.borrow(10).should == "1234567890"
+ end
+
+ it "should remove data from the buffer when consume! is called" do
+ ftrans = FramedTransport.new(@trans)
+
@trans.should_receive(:read_all).with(4).ordered.and_return([10].pack("N"))
+
@trans.should_receive(:read_all).with(10).ordered.and_return("1234567890")
+ ftrans.borrow(5).should == "1234567890"
+ ftrans.consume!(5).should == "12345"
+ ftrans.borrow(5).should == "67890"
+ end
+
+ it "should raise an EOFError when it is out of data and borrow is called"
do
+ ftrans = FramedTransport.new(@trans)
+
@trans.should_receive(:read_all).with(4).ordered.and_return([10].pack("N"),
[0].pack("N"))
+
@trans.should_receive(:read_all).with(10).ordered.and_return("1234567890")
+ @trans.should_receive(:read_all).with(0).ordered.and_return("")
+ ftrans.borrow(10).should == "1234567890"
+ ftrans.consume!(10).should == "1234567890"
+ lambda {ftrans.borrow(10)}.should raise_error(EOFError)
+ end
end
describe FramedTransportFactory do