| -- 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('TBufferedTransport') |
| require('TFramedTransport') |
| require('THttpTransport') |
| require('TCompactProtocol') |
| require('TJsonProtocol') |
| require('TBinaryProtocol') |
| require('TServer') |
| local liblualongnumber = require('liblualongnumber') |
| |
| -------------------------------------------------------------------------------- |
| -- Handler |
| TestHandler = ThriftTestIface:new{} |
| |
| -- Stops the server |
| function TestHandler:testVoid() |
| end |
| |
| function TestHandler:testString(str) |
| return str |
| end |
| |
| function TestHandler:testBool(bool) |
| return bool |
| 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:testBinary(by) |
| return by |
| end |
| |
| function TestHandler:testUuid(uuid) |
| return uuid |
| end |
| |
| function TestHandler:testNest(thing) |
| return thing |
| end |
| |
| function TestHandler:testStruct(thing) |
| return thing |
| end |
| |
| function TestHandler:testMap(thing) |
| return thing |
| end |
| |
| function TestHandler:testStringMap(thing) |
| return thing |
| end |
| |
| function TestHandler:testSet(thing) |
| return thing |
| end |
| |
| function TestHandler:testList(thing) |
| return thing |
| end |
| |
| function TestHandler:testEnum(thing) |
| return thing |
| end |
| |
| function TestHandler:testTypedef(thing) |
| return thing |
| end |
| |
| function TestHandler:testMapMap(hello) |
| return { |
| ["-4"] = { |
| ["-4"] = -4, |
| ["-3"] = -3, |
| ["-2"] = -2, |
| ["-1"] = -1 |
| }, |
| ["4"] = { |
| ["1"] = 1, |
| ["2"] = 2, |
| ["3"] = 3, |
| ["4"] = 4 |
| } |
| } |
| end |
| |
| function TestHandler:testInsanity(argument) |
| local first_map = { |
| [Numberz.TWO] = argument, |
| [Numberz.THREE] = argument |
| }; |
| local second_map = { |
| [Numberz.SIX] = Insanity:new { |
| userMap = {}, |
| xtructs = {} |
| } |
| } |
| |
| return { |
| ["1"] = first_map, |
| ["2"] = second_map |
| }; |
| end |
| |
| function TestHandler:testMulti(arg0, arg1, arg2, arg3, arg4, arg5) |
| return Xtruct:new {} |
| end |
| |
| function TestHandler:testException(arg) |
| if arg == "Xception" then |
| return Xception:new { |
| errorCode = 1001, |
| message = arg |
| } |
| elseif arg == "TException" then |
| error("") |
| end |
| end |
| |
| function TestHandler:testMultiException(arg0, arg1) |
| if arg0 == "Xception" then |
| return Xception:new { |
| errorCode = 1001, |
| message = "This is an Xception" |
| } |
| elseif arg0 == "Xception2" then |
| return Xception2:new { |
| errorCode = 2002, |
| struct_thing = Xtruct:new { |
| string_thing = "This is an Xception2" |
| } |
| } |
| elseif arg0 == "TException" then |
| error("") |
| end |
| return Xtruct:new { |
| string_thing = arg1 |
| } |
| end |
| |
| function TestHandler:testOneway(secondsToSleep) |
| print("testOneway secondsToSleep:", secondsToSleep) |
| end |
| |
| -------------------------------------------------------------------------------- |
| -- Test |
| local server |
| |
| function teardown() |
| if server then |
| server:close() |
| end |
| end |
| |
| function parseArgs(rawArgs) |
| local opt = { |
| protocol='binary', |
| transport='buffered', |
| port='9090', |
| } |
| for i, str in pairs(rawArgs) do |
| if i > 0 then |
| k, v = string.match(str, '--(%w+)=(%w+)') |
| assert(opt[k] ~= nil, 'Unknown argument') |
| opt[k] = v |
| end |
| end |
| return opt |
| end |
| |
| function testBasicServer(rawArgs) |
| local opt = parseArgs(rawArgs) |
| -- 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 = opt.port |
| } |
| assert(socket, 'Failed to create server socket') |
| |
| -- Transport & Factory |
| local transports = { |
| buffered = TBufferedTransportFactory, |
| framed = TFramedTransportFactory, |
| http = THttpTransportFactory, |
| } |
| assert(transports[opt.transport], 'Failed to create framed transport factory') |
| local trans_factory = transports[opt.transport]:new{} |
| local protocols = { |
| binary = TBinaryProtocolFactory, |
| compact = TCompactProtocolFactory, |
| json = TJSONProtocolFactory, |
| } |
| local prot_factory = protocols[opt.protocol]: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') |
| server:setExceptionHandler(function (err) error(err) end) |
| |
| -- Serve |
| server:serve() |
| server = nil |
| end |
| |
| testBasicServer(arg) |
| teardown() |