THRIFT-1681: Add Lua Support Patch: Dave Watson

Github Pull Request: This closes #92
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