#
# 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.join(File.dirname(__FILE__), '../../test_helper')

require 'thrift'

class DummyTransport < Thrift::BaseTransport
  def initialize(data)
    @data = data
  end
  
  def read(size)
    @data.slice!(0, size)
  end
end

# TTransport is basically an abstract class, but isn't raising NotImplementedError
class TestThriftTransport < Test::Unit::TestCase
  def setup
    @trans = Thrift::BaseTransport.new
  end
  
  def test_open?
    assert_nil @trans.open?
  end
  
  def test_open
    assert_nil @trans.open
  end
  
  def test_close
    assert_nil @trans.close
  end
  
  # TODO:
  # This doesn't necessarily test he right thing.
  # It _looks_ like read isn't guarenteed to return the length
  # you ask for and read_all is. This means our test needs to check
  # for blocking. -- Kevin Clark 3/27/08
  def test_read_all
    # Implements read
    t = DummyTransport.new("hello")
    assert_equal "hello", t.read_all(5)
  end
  
  def test_write
    assert_nil @trans.write(5) # arbitrary value
  end
  
  def test_flush
    assert_nil @trans.flush
  end
end
