diff --git a/test/lua/test_basic_client.lua b/test/lua/test_basic_client.lua
new file mode 100644
index 0000000..e2e0d48
--- /dev/null
+++ b/test/lua/test_basic_client.lua
@@ -0,0 +1,136 @@
+-- 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('TSocket')
+require('TBinaryProtocol')
+require('ThriftTest_ThriftTest')
+require('liblualongnumber')
+
+local client
+
+function teardown()
+  if client then
+    -- Shuts down the server
+    client:testVoid()
+
+    -- close the connection
+    client:close()
+  end
+end
+
+function assertEqual(val1, val2, msg)
+  assert(val1 == val2, msg)
+end
+
+function testBasicClient()
+  local socket = TSocket:new{
+    port = 9090
+  }
+  assert(socket, 'Failed to create client socket')
+  socket:setTimeout(5000)
+
+  local protocol = TBinaryProtocol:new{
+    trans = socket
+  }
+  assert(protocol, 'Failed to create binary protocol')
+
+  client = ThriftTestClient:new{
+    protocol = protocol
+  }
+  assert(client, 'Failed to create client')
+
+  -- Open the socket
+  local status, _ = pcall(socket.open, socket)
+  assert(status, 'Failed to connect to server')
+
+  -- String
+  assertEqual(client:testString('lala'),  'lala',  'Failed testString')
+  assertEqual(client:testString('wahoo'), 'wahoo', 'Failed testString')
+
+  -- Byte
+  assertEqual(client:testByte(0x01), 1,    'Failed testByte 1')
+  assertEqual(client:testByte(0x40), 64,   'Failed testByte 2')
+  assertEqual(client:testByte(0x7f), 127,  'Failed testByte 3')
+  assertEqual(client:testByte(0x80), -128, 'Failed testByte 4')
+  assertEqual(client:testByte(0xbf), -65,  'Failed testByte 5')
+  assertEqual(client:testByte(0xff), -1,   'Failed testByte 6')
+  assertEqual(client:testByte(128), -128,  'Failed testByte 7')
+  assertEqual(client:testByte(255), -1,    'Failed testByte 8')
+
+  -- I32
+  assertEqual(client:testI32(0x00000001), 1,           'Failed testI32 1')
+  assertEqual(client:testI32(0x40000000), 1073741824,  'Failed testI32 2')
+  assertEqual(client:testI32(0x7fffffff), 2147483647,  'Failed testI32 3')
+  assertEqual(client:testI32(0x80000000), -2147483648, 'Failed testI32 4')
+  assertEqual(client:testI32(0xbfffffff), -1073741825, 'Failed testI32 5')
+  assertEqual(client:testI32(0xffffffff), -1,          'Failed testI32 6')
+  assertEqual(client:testI32(2147483648), -2147483648, 'Failed testI32 7')
+  assertEqual(client:testI32(4294967295), -1,          'Failed testI32 8')
+
+  -- I64 (lua only supports 16 decimal precision so larger numbers are
+  -- initialized by their string value)
+  local long = liblualongnumber.new
+  assertEqual(client:testI64(long(0x0000000000000001)),
+                   long(1),
+                   'Failed testI64 1')
+  assertEqual(client:testI64(long(0x4000000000000000)),
+                   long(4611686018427387904),
+                   'Failed testI64 2')
+  assertEqual(client:testI64(long('0x7fffffffffffffff')),
+                   long('9223372036854775807'),
+                   'Failed testI64 3')
+  assertEqual(client:testI64(long(0x8000000000000000)),
+                   long(-9223372036854775808),
+                   'Failed testI64 4')
+  assertEqual(client:testI64(long('0xbfffffffffffffff')),
+                   long('-4611686018427387905'),
+                   'Failed testI64 5')
+  assertEqual(client:testI64(long('0xffffffffffffffff')),
+                   long(-1),
+                   'Failed testI64 6')
+
+  -- Double
+  assertEqual(
+      client:testDouble(1.23456789), 1.23456789, 'Failed testDouble 1')
+  assertEqual(
+      client:testDouble(0.123456789), 0.123456789, 'Failed testDouble 2')
+  assertEqual(
+      client:testDouble(0.123456789), 0.123456789, 'Failed testDouble 3')
+
+  -- Accuracy of 16 decimal digits (rounds)
+  local a, b = 1.12345678906666663, 1.12345678906666661
+  assertEqual(a, b)
+  assertEqual(client:testDouble(a), b, 'Failed testDouble 5')
+
+  -- Struct
+  local a = {
+    string_thing = 'Zero',
+    byte_thing = 1,
+    i32_thing = -3,
+    i64_thing = long(-5)
+  }
+
+  -- TODO fix client struct equality
+  --assertEqual(client:testStruct(a), a, 'Failed testStruct')
+
+  -- Call the void function and end the test (handler stops server)
+  client:testVoid()
+end
+
+testBasicClient()
+teardown()
\ No newline at end of file
diff --git a/test/lua/test_basic_server.lua b/test/lua/test_basic_server.lua
new file mode 100644
index 0000000..7c175da
--- /dev/null
+++ b/test/lua/test_basic_server.lua
@@ -0,0 +1,104 @@
+-- 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('ThriftTest_ThriftTest')
+require('TSocket')
+require('TFramedTransport')
+require('TBinaryProtocol')
+require('TServer')
+require('liblualongnumber')
+
+--------------------------------------------------------------------------------
+-- Handler
+TestHandler = ThriftTestIface:new{}
+
+-- Stops the server
+function TestHandler:testVoid()
+  self.__server:stop()
+end
+
+function TestHandler:testString(str)
+  return str
+end
+
+function TestHandler:testByte(byte)
+  return byte
+end
+
+function TestHandler:testI32(i32)
+  return i32
+end
+
+function TestHandler:testI64(i64)
+  return i64
+end
+
+function TestHandler:testDouble(d)
+  return d
+end
+
+function TestHandler:testStruct(thing)
+  return thing
+end
+
+--------------------------------------------------------------------------------
+-- Test
+local server
+
+function teardown()
+  if server then
+    server:close()
+  end
+end
+
+function testBasicServer()
+  -- Handler & Processor
+  local handler = TestHandler:new{}
+  assert(handler, 'Failed to create handler')
+  local processor = ThriftTestProcessor:new{
+    handler = handler
+  }
+  assert(processor, 'Failed to create processor')
+
+  -- Server Socket
+  local socket = TServerSocket:new{
+    port = 9090
+  }
+  assert(socket, 'Failed to create server socket')
+
+  -- Transport & Factory
+  local trans_factory = TFramedTransportFactory:new{}
+  assert(trans_factory, 'Failed to create framed transport factory')
+  local prot_factory = TBinaryProtocolFactory:new{}
+  assert(prot_factory, 'Failed to create binary protocol factory')
+
+  -- Simple Server
+  server = TSimpleServer:new{
+    processor = processor,
+    serverTransport = socket,
+    transportFactory = trans_factory,
+    protocolFactory = prot_factory
+  }
+  assert(server, 'Failed to create server')
+
+  -- Serve
+  server:serve()
+  server = nil
+end
+
+testBasicServer()
+teardown()
\ No newline at end of file
