Fixed make check for Ruby library
diff --git a/.gitignore b/.gitignore
index 9fc033f..0fd4764 100644
--- a/.gitignore
+++ b/.gitignore
@@ -260,7 +260,7 @@
 /lib/rb/ext/mkmf.log
 /lib/rb/ext/thrift_native.bundle
 /lib/rb/ext/thrift_native.so
-#/lib/rb/test/
+/lib/rb/test/
 /lib/rb/thrift-*.gem
 /lib/php/src/ext/thrift_protocol/Makefile.*
 /lib/php/src/ext/thrift_protocol/build/
diff --git a/lib/rb/Gemfile.lock b/lib/rb/Gemfile.lock
index 796f299..689a01d 100644
--- a/lib/rb/Gemfile.lock
+++ b/lib/rb/Gemfile.lock
@@ -2,6 +2,7 @@
   remote: .
   specs:
     thrift (0.23.0)
+      logger
 
 GEM
   remote: https://rubygems.org/
@@ -14,6 +15,7 @@
     debug_inspector (1.2.0)
     diff-lcs (1.6.2)
     eventmachine (1.2.7)
+    logger (1.7.0)
     method_source (0.9.2)
     pry (0.11.3)
       coderay (~> 1.1.0)
@@ -27,7 +29,7 @@
     rack (2.2.21)
     rack-test (0.8.3)
       rack (>= 1.0, < 3)
-    rake (12.3.3)
+    rake (13.3.1)
     rspec (3.13.2)
       rspec-core (~> 3.13.0)
       rspec-expectations (~> 3.13.0)
@@ -62,7 +64,7 @@
   pry-stack_explorer (~> 0.4.9.2)
   rack (>= 2.2.20)
   rack-test (~> 0.8.3)
-  rake (~> 12.3)
+  rake (~> 13.3)
   rspec (~> 3.7)
   srv (~> 1.0)
   thin (~> 1.7)
diff --git a/lib/rb/Makefile.am b/lib/rb/Makefile.am
index 1088bcb..ab5d903 100644
--- a/lib/rb/Makefile.am
+++ b/lib/rb/Makefile.am
@@ -36,9 +36,6 @@
 check-local: all
 	$(BUNDLER) install
 	$(BUNDLER) exec rake
-	$(RUBY) test/TestBinaryProtocol.rb
-	$(RUBY) test/TestCompactProtocol.rb
-	$(RUBY) test/TestJsonProtocol.rb
 
 endif
 
@@ -58,5 +55,4 @@
 	benchmark \
 	script \
 	spec \
-	test \
 	README.md
diff --git a/lib/rb/lib/thrift/bytes.rb b/lib/rb/lib/thrift/bytes.rb
index efd4f64..169a950 100644
--- a/lib/rb/lib/thrift/bytes.rb
+++ b/lib/rb/lib/thrift/bytes.rb
@@ -26,13 +26,13 @@
       #
       # size - The Integer size of the buffer (default: nil) to create
       #
-      # Returns a String with BINARY encoding, filled with null characters 
+      # Returns a String with BINARY encoding, filled with null characters
       # if size is greater than zero
       def self.empty_byte_buffer(size = nil)
         if (size && size > 0)
-          "\0".force_encoding(Encoding::BINARY) * size
+          "\0".b * size
         else
-          ''.force_encoding(Encoding::BINARY)
+          "".b
         end
       end
 
diff --git a/lib/rb/lib/thrift/protocol/compact_protocol.rb b/lib/rb/lib/thrift/protocol/compact_protocol.rb
index 1f9bd30..1ab9d3d 100644
--- a/lib/rb/lib/thrift/protocol/compact_protocol.rb
+++ b/lib/rb/lib/thrift/protocol/compact_protocol.rb
@@ -27,7 +27,7 @@
     TYPE_BITS = 0x07
     TYPE_SHIFT_AMOUNT = 5
 
-    TSTOP = ["", Types::STOP, 0]
+    TSTOP = [nil, Types::STOP, 0]
 
     # 
     # All of the on-wire type codes.
@@ -276,7 +276,7 @@
 
         # push the new field onto the field stack so we can keep the deltas going.
         @last_field.push(field_id)
-        ["", CompactTypes.get_ttype(type & 0x0f), field_id]
+        [nil, CompactTypes.get_ttype(type & 0x0f), field_id]
       end
     end
 
diff --git a/lib/rb/test/TestBinaryProtocol.rb b/lib/rb/test/TestBinaryProtocol.rb
deleted file mode 100644
index 39f5073..0000000
--- a/lib/rb/test/TestBinaryProtocol.rb
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env ruby
-# 
-# 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 'thrift'
-require 'test/unit'
-
-class TestBinaryProtocol < Test::Unit::TestCase
-  def test_defferent_data_types
-    begin
-      port = ARGV[0] || 9090
-      pid = Process.fork
-      if pid.nil?then
-        buf = String.new('1234567')
-        socket = Thrift::ServerSocket.new(port)
-        socket.listen()
-        client = socket.accept()
-        transport = Thrift::BufferedTransport.new(client)
-        protocol = Thrift::BinaryProtocol.new(transport)
-        
-        acc_bool = protocol.read_bool()     
-        assert_equal(true,acc_bool)
-       
-        acc_boolf = protocol.read_bool()
-        assert_equal(false,acc_boolf)
-      
-        acc_byte = protocol.read_byte()
-        assert_equal(123,acc_byte)
-        
-        acc_i16 = protocol.read_i16()
-        assert_equal(4203,acc_i16)
-       
-        acc_i32 = protocol.read_i32()
-        assert_equal(2000000032,acc_i32)
-       
-        acc_i64 = protocol.read_i64()
-        assert_equal(1844674407370955161,acc_i64)
-       
-        acc_double = protocol.read_double()
-        assert_equal(3.1415926,acc_double)
-        assert_kind_of(Float,acc_double)
-       
-        acc_string = protocol.read_string()
-        assert_equal("hello_world123456789!@#$%&",acc_string)
-       
-        acc_binary = protocol.read_binary()
-        ret = acc_binary.bytes.to_a
-        assert_equal((0...256).reverse_each.to_a,ret)
-       
-        acc_message = protocol.read_message_begin()
-        protocol.read_message_end()
-        assert_equal(["hello_world",123,455536],acc_message)
-       
-        acc_field = protocol.read_field_begin()
-        protocol.read_field_end()
-        assert_equal([nil,123,25536],acc_field)
-       
-        acc_map = protocol.read_map_begin()
-        protocol.read_map_end()
-        assert_equal([56,123,2000000032],acc_map)
-       
-        acc_list = protocol.read_list_begin()
-        protocol.read_list_end()
-        assert_equal([125,2000000032],acc_list)
-       
-        acc_set = protocol.read_set_begin()
-        protocol.read_set_end()
-        assert_equal([-124,2000000022],acc_set)
-       
-        exit(0) 
-      else  
-        sleep(2)
-        socket = Thrift::Socket.new('localhost',port)
-        transport = Thrift::BufferedTransport.new(socket)
-        transport.open()
-        protocol = Thrift::BinaryProtocol.new(transport)
-       
-        protocol.write_bool(true)
-        transport.flush()
-
-        protocol.write_bool(false)
-        transport.flush()
-
-        protocol.write_byte(123)
-        transport.flush()
-
-        protocol.write_i16(4203)
-        transport.flush()
-
-        protocol.write_i32(2000000032)	
-        transport.flush()
-
-        protocol.write_i64(1844674407370955161)
-        transport.flush()
-
-        protocol.write_double(3.1415926)
-        transport.flush()	
-
-        protocol.write_string("hello_world123456789!@#$%&")
-        transport.flush()
-
-        val = (0...256).reverse_each.to_a
-        protocol.write_binary(val.pack('C*'))
-        transport.flush()
-
-        protocol.write_message_begin("hello_world",123,455536)
-        protocol.write_message_end()
-        transport.flush()
-
-        protocol.write_field_begin("hello_world",123,25536)
-        protocol.write_field_end()
-        transport.flush()
-
-        protocol.write_map_begin(56,123,2000000032)
-        protocol.write_map_end()
-        transport.flush()
-
-        protocol.write_list_begin(125,2000000032)
-        protocol.write_list_end()
-        transport.flush()
-
-        protocol.write_set_begin(-124,2000000022)
-        protocol.write_set_end()
-        transport.flush()
-        Process.wait(pid)
-      end
-    end
-  end
-end 
diff --git a/lib/rb/test/TestCompactProtocol.rb b/lib/rb/test/TestCompactProtocol.rb
deleted file mode 100644
index 02711ba..0000000
--- a/lib/rb/test/TestCompactProtocol.rb
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env ruby
-# 
-# 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 'thrift'
-require 'test/unit'
-
-include Thrift
-
-class TestCompactProtocol < Test::Unit::TestCase
-  def test_defferent_data_types
-    begin
-      port = ARGV[0] || 9090
-      pid = Process.fork
-      if pid.nil?then
-        buf = String.new('1234567')
-        socket = Thrift::ServerSocket.new(port)
-        socket.listen()
-        client = socket.accept()
-        transport = Thrift::BufferedTransport.new(client)
-        protocol = Thrift::CompactProtocol.new(transport)
-        acc_bool = protocol.read_bool()     
-        assert_equal(true,acc_bool)
-     
-        acc_boolf = protocol.read_bool()
-        assert_equal(false,acc_boolf)
-     
-        acc_byte = protocol.read_byte()
-        assert_equal(123,acc_byte)
-     
-        acc_i16 = protocol.read_i16()
-        assert_equal(4203,acc_i16)
-     
-        acc_i32 = protocol.read_i32()
-        assert_equal(2000000032,acc_i32)
-     
-        acc_i64 = protocol.read_i64()
-        assert_equal(1844674407370955161,acc_i64)
-     
-        acc_double = protocol.read_double()
-        assert_equal(3.1415926,acc_double)
-     
-        assert_kind_of(Float,acc_double)
-        acc_string = protocol.read_string()
-        assert_equal("hello_world123456789!@#$%&",acc_string)
-     
-        acc_binary = protocol.read_binary()
-        ret = acc_binary.bytes.to_a
-        assert_equal((0...256).reverse_each.to_a,ret)
-     
-        acc_message = protocol.read_message_begin()
-        protocol.read_message_end()
-        assert_equal(["hello_world",4,455536],acc_message)
-     
-        acc_list = protocol.read_list_begin()
-        protocol.read_list_end()
-        assert_equal("[8, 12]", "#{acc_list}")
-     	
-        acc_map1 = protocol.read_map_begin()
-        protocol.read_map_end() 
-        assert_equal("[6, 8, 12]", "#{acc_map1}")
-
-        acc_map2 = protocol.read_map_begin()
-        protocol.read_map_end() 
-        assert_equal("[0, 0, 0]", "#{acc_map2}")
-	
-        acc_set = protocol.read_set_begin()
-        protocol.read_set_end()
-        assert_equal("[8, 5]", "#{acc_set}")
-	
-        acc_field1 = protocol.read_field_begin()
-        protocol.read_field_end()
-        assert_equal("[nil, 6, 5]","#{acc_field1}") 
-
-        acc_field2 = protocol.read_field_begin()
-        protocol.read_field_end()
-        assert_equal("[nil, 0, 0]","#{acc_field2}")
-        
-
-        exit(0) 
-      else  
-        sleep(2)
-        socket = Thrift::Socket.new('localhost',port)
-        transport = Thrift::BufferedTransport.new(socket)
-        transport.open()
-        protocol = Thrift::CompactProtocol.new(transport)
-     
-        protocol.write_bool(true)
-        transport.flush()
-
-        protocol.write_bool(false)
-        transport.flush()
-
-        protocol.write_byte(123)
-        transport.flush()
-
-        protocol.write_i16(4203)
-        transport.flush()
-
-        protocol.write_i32(2000000032)	
-        transport.flush()
-        
-	protocol.write_i64(1844674407370955161)
-        transport.flush()
-
-        protocol.write_double(3.1415926)
-        transport.flush()	
-
-        protocol.write_string("hello_world123456789!@#$%&")
-        transport.flush()
-
-        val = (0...256).reverse_each.to_a
-        protocol.write_binary(val.pack('C*'))
-        transport.flush()
-
-        protocol.write_message_begin("hello_world",140,455536)
-        protocol.write_message_end()       
-        transport.flush()
-       
-        protocol.write_list_begin(Thrift::Types::I32,12)
-        protocol.write_list_end()
-        transport.flush()
-     
-        protocol.write_map_begin(Thrift::Types::I16,Thrift::Types::I32,12)
-        protocol.write_map_end() 
-        transport.flush()
-
-        protocol.write_map_begin(Thrift::Types::I16,Thrift::Types::I32,0)
-        protocol.write_map_end()
-        transport.flush()
-
-        protocol.write_set_begin(Thrift::Types::I32,5)
-        protocol.write_set_end()
-        transport.flush()
-
-        protocol.write_field_begin("hello_world",Thrift::Types::I16,5)
-        protocol.write_field_stop()
-        transport.flush()
-
-        protocol.write_field_begin("hello_world",Thrift::Types::BOOL,5)
-        protocol.write_field_stop()
-        transport.flush()
-
-        Process.wait(pid)
-      end
-    end
-  end
-end 
diff --git a/lib/rb/test/TestJsonProtocol.rb b/lib/rb/test/TestJsonProtocol.rb
deleted file mode 100644
index 562aad5..0000000
--- a/lib/rb/test/TestJsonProtocol.rb
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env ruby
-# 
-# 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 'thrift'
-require 'test/unit'
-
-class TestJsonProtocol < Test::Unit::TestCase
-  def test_defferent_data_types
-    begin
-      port = ARGV[0] || 7070
-      pid = Process.fork
-      if pid.nil?then
-        buf = String.new('1234567')
-        socket = Thrift::ServerSocket.new(port)
-        socket.listen()
-        client = socket.accept()
-        transport = Thrift::BufferedTransport.new(client)
-        protocol = Thrift::JsonProtocol.new(transport)
-
-        acc_json_string = protocol.read_json_string()
-        assert_equal('hello_world123!@#$%',acc_json_string)
-     
-        acc_json_base64 = protocol.read_json_base64()
-        assert_equal('hello_world12233!@#$%',acc_json_base64)
-
-        protocol.read_json_array_start()
-        acc_json_integer = protocol.read_json_integer()
-        protocol.read_json_array_end()
-        assert_equal(2553369689,acc_json_integer)
-	
-	
-        protocol.read_json_array_start()
-        acc_json_double = protocol.read_json_double()
-        protocol.read_json_array_end()	
-        assert_equal(3.1415926,acc_json_double)
-
-        acc_message = protocol.read_message_begin()
-        protocol.read_message_end()
-        assert_equal("[\"hello_world\", 155510, 102020]","#{acc_message}")
-
-        acc_field = protocol.read_field_begin()
-        protocol.read_field_end()
-        assert_equal([nil ,6 ,12],acc_field)
-        
-        acc_map = protocol.read_map_begin()
-        protocol.read_map_end()
-        assert_equal([10, 8, 20],acc_map)
-	
-        acc_list = protocol.read_list_begin()
-        protocol.read_list_end()
-        assert_equal([6, 10],acc_list)	
- 
-        acc_set = protocol.read_set_begin()
-        protocol.read_set_end()
-        assert_equal([8, 20],acc_set)	
-	
-        protocol.read_json_object_start()
-        acc_bool = protocol.read_bool()
-        protocol.read_json_object_end()
-        assert_equal(true,acc_bool)
-	
-        protocol.read_json_object_start()
-        acc_byte = protocol.read_byte()
-        protocol.read_json_object_end()
-        assert_equal(123,acc_byte)
- 
-        protocol.read_json_object_start()
-        acc_i16 = protocol.read_i16()
-        protocol.read_json_object_end()
-        assert_equal(4203,acc_i16)
-
-
-        protocol.read_json_object_start()
-        acc_i32 = protocol.read_i32()
-        protocol.read_json_object_end()
-        assert_equal(2000000032,acc_i32)
-
-        protocol.read_json_object_start()
-        acc_i64 = protocol.read_i64()
-        protocol.read_json_object_end()
-        assert_equal(1844674407370955161,acc_i64)
-
-        protocol.read_json_object_start()
-        acc_double = protocol.read_double()
-        protocol.read_json_object_end()
-        assert_equal(3.1415926,acc_double)
-	 
-        protocol.read_json_object_start()
-        acc_string = protocol.read_string()
-        protocol.read_json_object_end()
-        assert_equal("sello_world123456789!@#$%",acc_string)
-	
-        protocol.read_json_object_start()
-        acc_binary = protocol.read_binary()
-        ret =acc_binary.bytes.to_a
-        protocol.read_json_object_end()
-        assert_equal((0...256).reverse_each.to_a,ret)
-
-	exit(0) 
-      else  
-        sleep(2)
-        socket = Thrift::Socket.new('localhost',port)
-        transport = Thrift::BufferedTransport.new(socket)
-        transport.open()
-        protocol = Thrift::JsonProtocol.new(transport)
-       
-        protocol.write_json_string('hello_world123!@#$%')
-        transport.flush()
-       
-        protocol.write_json_base64('hello_world12233!@#$%')	
-        transport.flush()
-        
-        protocol.write_json_array_start()
-        protocol.write_json_integer(2553369689)
-        protocol.write_json_array_end()
-        transport.flush()
-
-        protocol.write_json_array_start()
-        protocol.write_json_double(3.1415926)
-        protocol.write_json_array_end()
-        transport.flush()
-
-        protocol.write_message_begin('hello_world',155510,102020)
-        protocol.write_message_end()
-        transport.flush()
-
-        protocol.write_field_begin("hello_world",Thrift::Types::I16,12)
-        protocol.write_field_end()
-        transport.flush()
-
-        protocol.write_map_begin(Thrift::Types::I64,Thrift::Types::I32,20)
-        protocol.write_map_end()
-        transport.flush()
-
-        protocol.write_list_begin(Thrift::Types::I16,10)
-        protocol.write_list_end()
-        transport.flush()
-
-        protocol.write_set_begin(Thrift::Types::I32,20)
-        protocol.write_set_end()
-        transport.flush()
-
-        protocol.write_json_object_start()
-        protocol.write_bool(true)
-        protocol.write_json_object_end()
-        transport.flush()
-
-        protocol.write_json_object_start()
-        protocol.write_byte(123)
-        protocol.write_json_object_end()
-        transport.flush()
-
-
-        protocol.write_json_object_start()
-        protocol.write_i16(4203)
-        protocol.write_json_object_end()
-        transport.flush()
-
-        protocol.write_json_object_start()
-        protocol.write_i32(2000000032)
-        protocol.write_json_object_end()
-        transport.flush()
-
-        protocol.write_json_object_start()
-        protocol.write_i64(1844674407370955161)
-        protocol.write_json_object_end()
-        transport.flush()
-	
-        protocol.write_json_object_start()
-        protocol.write_double(3.1415926)
-        protocol.write_json_object_end()
-        transport.flush()
-
-        protocol.write_json_object_start()
-        protocol.write_string("sello_world123456789!@#$%")
-        protocol.write_json_object_end()
-        transport.flush()
-
-        protocol.write_json_object_start()
-        val = (0...256).reverse_each.to_a
-        protocol.write_binary(val.pack('C*'))
-        protocol.write_json_object_end()
-        transport.flush()
-
-
-        transport.close()
-        Process.wait(pid)
-      end
-    end
-  end
-end
diff --git a/test/rb/core/protocol/test_binary_protocol.rb b/test/rb/core/protocol/test_binary_protocol.rb
new file mode 100644
index 0000000..18aa645
--- /dev/null
+++ b/test/rb/core/protocol/test_binary_protocol.rb
@@ -0,0 +1,171 @@
+#!/usr/bin/env ruby
+#
+# 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.expand_path('../../test_helper', __dir__)
+require 'thrift'
+require 'thread'
+
+class TestBinaryProtocol < Test::Unit::TestCase
+  def test_different_data_types
+    port = (ARGV[0] || 9090).to_i
+    server_ready = Queue.new
+
+    server_thread = Thread.new do
+      socket = Thrift::ServerSocket.new(port)
+      transport = nil
+
+      socket.listen
+      server_ready << true
+      client = socket.accept
+      transport = Thrift::BufferedTransport.new(client)
+      protocol = Thrift::BinaryProtocol.new(transport)
+
+      results = {}
+      results[:acc_bool]   = protocol.read_bool
+      results[:acc_boolf]  = protocol.read_bool
+      results[:acc_byte]   = protocol.read_byte
+      results[:acc_i16]    = protocol.read_i16
+      results[:acc_i32]    = protocol.read_i32
+      results[:acc_i64]    = protocol.read_i64
+      results[:acc_double] = protocol.read_double
+      results[:acc_string] = protocol.read_string
+
+      acc_binary = protocol.read_binary
+      results[:acc_binary] = acc_binary.bytes.to_a
+
+      results[:acc_message] = protocol.read_message_begin
+      protocol.read_message_end
+
+      results[:acc_field] = protocol.read_field_begin
+      protocol.read_field_end
+
+      results[:acc_map] = protocol.read_map_begin
+      protocol.read_map_end
+
+      results[:acc_map2] = protocol.read_map_begin
+      protocol.read_map_end
+
+      results[:acc_list] = protocol.read_list_begin
+      protocol.read_list_end
+
+      results[:acc_set] = protocol.read_set_begin
+      protocol.read_set_end
+
+      results
+    ensure
+      transport&.close
+      socket&.close
+    end
+
+    server_ready.pop
+
+    socket = Thrift::Socket.new('localhost', port)
+    transport = Thrift::BufferedTransport.new(socket)
+    transport.open
+    protocol = Thrift::BinaryProtocol.new(transport)
+
+    # acc_bool
+    protocol.write_bool(true)
+    transport.flush
+
+    # acc_boolf
+    protocol.write_bool(false)
+    transport.flush
+
+    # acc_byte
+    protocol.write_byte(123)
+    transport.flush
+
+    # acc_i16
+    protocol.write_i16(4203)
+    transport.flush
+
+    # acc_i32
+    protocol.write_i32(2000000032)
+    transport.flush
+
+    # acc_i64
+    protocol.write_i64(1844674407370955161)
+    transport.flush
+
+    # acc_double
+    protocol.write_double(3.1415926)
+    transport.flush
+
+    # acc_string
+    protocol.write_string("hello_world123456789!@#$%&")
+    transport.flush
+
+    val = (0...256).reverse_each.to_a
+    # acc_binary
+    protocol.write_binary(val.pack('C*'))
+    transport.flush
+
+    # acc_message
+    protocol.write_message_begin("hello_world", 4, 455536)
+    protocol.write_message_end
+    transport.flush
+
+    # acc_field
+    protocol.write_field_begin("hello_world", Thrift::Types::I16, 5)
+    protocol.write_field_end
+    transport.flush
+
+    # acc_map
+    protocol.write_map_begin(Thrift::Types::I16, Thrift::Types::I32, 12)
+    protocol.write_map_end
+    transport.flush
+
+    # acc_map2
+    protocol.write_map_begin(Thrift::Types::I16, Thrift::Types::I32, 0)
+    protocol.write_map_end
+    transport.flush
+
+    # acc_list
+    protocol.write_list_begin(Thrift::Types::I32, 12)
+    protocol.write_list_end
+    transport.flush
+
+    # acc_set
+    protocol.write_set_begin(Thrift::Types::I32, 5)
+    protocol.write_set_end
+    transport.flush
+
+    transport.close
+
+    server_results = server_thread.value
+    assert_equal(true, server_results[:acc_bool])
+    assert_equal(false, server_results[:acc_boolf])
+    assert_equal(123, server_results[:acc_byte])
+    assert_equal(4203, server_results[:acc_i16])
+    assert_equal(2000000032, server_results[:acc_i32])
+    assert_equal(1844674407370955161, server_results[:acc_i64])
+    assert_equal(3.1415926, server_results[:acc_double])
+    assert_kind_of(Float, server_results[:acc_double])
+    assert_equal("hello_world123456789!@#$%&", server_results[:acc_string])
+    assert_equal((0...256).reverse_each.to_a, server_results[:acc_binary])
+    assert_equal(["hello_world", 4, 455536], server_results[:acc_message])
+    assert_equal([nil, 6, 5], server_results[:acc_field])
+    assert_equal("[6, 8, 12]", "#{server_results[:acc_map]}")
+    assert_equal("[6, 8, 0]", "#{server_results[:acc_map2]}")
+    assert_equal("[8, 12]", "#{server_results[:acc_list]}")
+    assert_equal("[8, 5]", "#{server_results[:acc_set]}")
+  end
+end
diff --git a/test/rb/core/protocol/test_compact_protocol.rb b/test/rb/core/protocol/test_compact_protocol.rb
new file mode 100644
index 0000000..5338703
--- /dev/null
+++ b/test/rb/core/protocol/test_compact_protocol.rb
@@ -0,0 +1,180 @@
+#!/usr/bin/env ruby
+#
+# 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.expand_path('../../test_helper', __dir__)
+require 'thrift'
+require 'thread'
+
+class TestCompactProtocol < Test::Unit::TestCase
+  def test_different_data_types
+    port = (ARGV[0] || 9090).to_i
+    server_ready = Queue.new
+
+    server_thread = Thread.new do
+      socket = Thrift::ServerSocket.new(port)
+      transport = nil
+
+      socket.listen
+      server_ready << true
+      client = socket.accept
+      transport = Thrift::BufferedTransport.new(client)
+      protocol = Thrift::CompactProtocol.new(transport)
+
+      results = {}
+      results[:acc_bool]   = protocol.read_bool
+      results[:acc_boolf]  = protocol.read_bool
+      results[:acc_byte]   = protocol.read_byte
+      results[:acc_i16]    = protocol.read_i16
+      results[:acc_i32]    = protocol.read_i32
+      results[:acc_i64]    = protocol.read_i64
+      results[:acc_double] = protocol.read_double
+      results[:acc_string] = protocol.read_string
+
+      acc_binary = protocol.read_binary
+      results[:acc_binary] = acc_binary.bytes.to_a
+
+      results[:acc_message] = protocol.read_message_begin
+      protocol.read_message_end
+
+      results[:acc_list] = protocol.read_list_begin
+      protocol.read_list_end
+
+      results[:acc_map1] = protocol.read_map_begin
+      protocol.read_map_end
+
+      results[:acc_map2] = protocol.read_map_begin
+      protocol.read_map_end
+
+      results[:acc_set] = protocol.read_set_begin
+      protocol.read_set_end
+
+      results[:acc_field1] = protocol.read_field_begin
+      protocol.read_field_end
+
+      results[:acc_field2] = protocol.read_field_begin
+      protocol.read_field_end
+
+      results
+    ensure
+      transport&.close
+      socket&.close
+    end
+
+    server_ready.pop
+
+    socket = Thrift::Socket.new('localhost', port)
+    transport = Thrift::BufferedTransport.new(socket)
+    transport.open
+    protocol = Thrift::CompactProtocol.new(transport)
+
+    # acc_bool
+    protocol.write_bool(true)
+    transport.flush
+
+    # acc_boolf
+    protocol.write_bool(false)
+    transport.flush
+
+    # acc_byte
+    protocol.write_byte(123)
+    transport.flush
+
+    # acc_i16
+    protocol.write_i16(4203)
+    transport.flush
+
+    # acc_i32
+    protocol.write_i32(2000000032)
+    transport.flush
+
+    # acc_i64
+    protocol.write_i64(1844674407370955161)
+    transport.flush
+
+    # acc_double
+    protocol.write_double(3.1415926)
+    transport.flush
+
+    # acc_string
+    protocol.write_string("hello_world123456789!@#$%&")
+    transport.flush
+
+    val = (0...256).reverse_each.to_a
+    # acc_binary
+    protocol.write_binary(val.pack('C*'))
+    transport.flush
+
+    # acc_message
+    protocol.write_message_begin("hello_world", 140, 455536)
+    protocol.write_message_end
+    transport.flush
+
+    # acc_list
+    protocol.write_list_begin(Thrift::Types::I32, 12)
+    protocol.write_list_end
+    transport.flush
+
+    # acc_map1
+    protocol.write_map_begin(Thrift::Types::I16, Thrift::Types::I32, 12)
+    protocol.write_map_end
+    transport.flush
+
+    # acc_map2
+    protocol.write_map_begin(Thrift::Types::I16, Thrift::Types::I32, 0)
+    protocol.write_map_end
+    transport.flush
+
+    # acc_set
+    protocol.write_set_begin(Thrift::Types::I32, 5)
+    protocol.write_set_end
+    transport.flush
+
+    # acc_field1
+    protocol.write_field_begin("hello_world", Thrift::Types::I16, 5)
+    protocol.write_field_stop
+    transport.flush
+
+    # acc_field2
+    protocol.write_field_begin("hello_world", Thrift::Types::BOOL, 5)
+    protocol.write_field_stop
+    transport.flush
+
+    transport.close
+
+    server_results = server_thread.value
+    assert_equal(true, server_results[:acc_bool])
+    assert_equal(false, server_results[:acc_boolf])
+    assert_equal(123, server_results[:acc_byte])
+    assert_equal(4203, server_results[:acc_i16])
+    assert_equal(2000000032, server_results[:acc_i32])
+    assert_equal(1844674407370955161, server_results[:acc_i64])
+    assert_equal(3.1415926, server_results[:acc_double])
+    assert_kind_of(Float, server_results[:acc_double])
+    assert_equal("hello_world123456789!@#$%&", server_results[:acc_string])
+    assert_equal((0...256).reverse_each.to_a, server_results[:acc_binary])
+    assert_equal(["hello_world", 4, 455536], server_results[:acc_message])
+    assert_equal("[8, 12]", "#{server_results[:acc_list]}")
+    assert_equal("[6, 8, 12]", "#{server_results[:acc_map1]}")
+    assert_equal("[0, 0, 0]", "#{server_results[:acc_map2]}")
+    assert_equal("[8, 5]", "#{server_results[:acc_set]}")
+    assert_equal("[nil, 6, 5]", "#{server_results[:acc_field1]}")
+    assert_equal("[nil, 0, 0]", "#{server_results[:acc_field2]}")
+  end
+end
diff --git a/test/rb/core/protocol/test_json_protocol.rb b/test/rb/core/protocol/test_json_protocol.rb
new file mode 100644
index 0000000..af31782
--- /dev/null
+++ b/test/rb/core/protocol/test_json_protocol.rb
@@ -0,0 +1,236 @@
+#!/usr/bin/env ruby
+#
+# 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.expand_path('../../test_helper', __dir__)
+require 'thrift'
+require 'thread'
+
+class TestJsonProtocol < Test::Unit::TestCase
+  def test_different_data_types
+    port = (ARGV[0] || 7070).to_i
+    server_ready = Queue.new
+
+    server_thread = Thread.new do
+      socket = Thrift::ServerSocket.new(port)
+      transport = nil
+
+      socket.listen
+      server_ready << true
+      client = socket.accept
+      transport = Thrift::BufferedTransport.new(client)
+      protocol = Thrift::JsonProtocol.new(transport)
+
+      results = {}
+      results[:acc_json_string]  = protocol.read_json_string
+      results[:acc_json_base64]  = protocol.read_json_base64
+
+      protocol.read_json_array_start
+      results[:acc_json_integer] = protocol.read_json_integer
+      protocol.read_json_array_end
+
+      protocol.read_json_array_start
+      results[:acc_json_double] = protocol.read_json_double
+      protocol.read_json_array_end
+
+      results[:acc_message] = protocol.read_message_begin
+      protocol.read_message_end
+
+      results[:acc_field] = protocol.read_field_begin
+      protocol.read_field_end
+
+      results[:acc_map] = protocol.read_map_begin
+      protocol.read_map_end
+
+      results[:acc_map2] = protocol.read_map_begin
+      protocol.read_map_end
+
+      results[:acc_list] = protocol.read_list_begin
+      protocol.read_list_end
+
+      results[:acc_set] = protocol.read_set_begin
+      protocol.read_set_end
+
+      protocol.read_json_object_start
+      results[:acc_bool] = protocol.read_bool
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      results[:acc_byte] = protocol.read_byte
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      results[:acc_i16] = protocol.read_i16
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      results[:acc_i32] = protocol.read_i32
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      results[:acc_i64] = protocol.read_i64
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      results[:acc_double] = protocol.read_double
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      results[:acc_string] = protocol.read_string
+      protocol.read_json_object_end
+
+      protocol.read_json_object_start
+      acc_binary = protocol.read_binary
+      results[:acc_binary] = acc_binary.bytes.to_a
+      protocol.read_json_object_end
+
+      results
+    ensure
+      transport&.close
+      socket&.close
+    end
+
+    server_ready.pop
+
+    socket = Thrift::Socket.new('localhost', port)
+    transport = Thrift::BufferedTransport.new(socket)
+    transport.open
+    protocol = Thrift::JsonProtocol.new(transport)
+
+    # acc_json_string
+    protocol.write_json_string('hello_world123!@#$%')
+    transport.flush
+
+    # acc_json_base64
+    protocol.write_json_base64('hello_world12233!@#$%')
+    transport.flush
+
+    protocol.write_json_array_start
+    # acc_json_integer
+    protocol.write_json_integer(2553369689)
+    protocol.write_json_array_end
+    transport.flush
+
+    protocol.write_json_array_start
+    # acc_json_double
+    protocol.write_json_double(3.1415926)
+    protocol.write_json_array_end
+    transport.flush
+
+    # acc_message
+    protocol.write_message_begin('hello_world', 4, 455536)
+    protocol.write_message_end
+    transport.flush
+
+    # acc_field
+    protocol.write_field_begin("hello_world", Thrift::Types::I16, 5)
+    protocol.write_field_end
+    transport.flush
+
+    # acc_map
+    protocol.write_map_begin(Thrift::Types::I16, Thrift::Types::I32, 12)
+    protocol.write_map_end
+    transport.flush
+
+    # acc_map2
+    protocol.write_map_begin(Thrift::Types::I16, Thrift::Types::I32, 0)
+    protocol.write_map_end
+    transport.flush
+
+    # acc_list
+    protocol.write_list_begin(Thrift::Types::I32, 12)
+    protocol.write_list_end
+    transport.flush
+
+    # acc_set
+    protocol.write_set_begin(Thrift::Types::I32, 5)
+    protocol.write_set_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_bool
+    protocol.write_bool(true)
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_byte
+    protocol.write_byte(123)
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_i16
+    protocol.write_i16(4203)
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_i32
+    protocol.write_i32(2000000032)
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_i64
+    protocol.write_i64(1844674407370955161)
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_double
+    protocol.write_double(3.1415926)
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    # acc_string
+    protocol.write_string("hello_world123456789!@#$%&")
+    protocol.write_json_object_end
+    transport.flush
+
+    protocol.write_json_object_start
+    val = (0...256).reverse_each.to_a
+    # acc_binary
+    protocol.write_binary(val.pack('C*'))
+    protocol.write_json_object_end
+    transport.flush
+
+    transport.close
+
+    server_results = server_thread.value
+    assert_equal('hello_world123!@#$%', server_results[:acc_json_string])
+    assert_equal('hello_world12233!@#$%', server_results[:acc_json_base64])
+    assert_equal(2553369689, server_results[:acc_json_integer])
+    assert_equal(3.1415926, server_results[:acc_json_double])
+    assert_equal("[\"hello_world\", 4, 455536]", "#{server_results[:acc_message]}")
+    assert_equal([nil, 6, 5], server_results[:acc_field])
+    assert_equal("[6, 8, 12]", "#{server_results[:acc_map]}")
+    assert_equal("[6, 8, 0]", "#{server_results[:acc_map2]}")
+    assert_equal("[8, 12]", "#{server_results[:acc_list]}")
+    assert_equal("[8, 5]", "#{server_results[:acc_set]}")
+    assert_equal(true, server_results[:acc_bool])
+    assert_equal(123, server_results[:acc_byte])
+    assert_equal(4203, server_results[:acc_i16])
+    assert_equal(2000000032, server_results[:acc_i32])
+    assert_equal(1844674407370955161, server_results[:acc_i64])
+    assert_equal(3.1415926, server_results[:acc_double])
+    assert_equal("hello_world123456789!@#$%&", server_results[:acc_string])
+    assert_equal((0...256).reverse_each.to_a, server_results[:acc_binary])
+  end
+end