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


Reply via email to