From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f195.google.com (mail-lj1-f195.google.com [209.85.208.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 4AC0F46970E for ; Mon, 20 Jan 2020 21:00:29 +0300 (MSK) Received: by mail-lj1-f195.google.com with SMTP id l2so46194lja.6 for ; Mon, 20 Jan 2020 10:00:29 -0800 (PST) From: Cyrill Gorcunov Date: Mon, 20 Jan 2020 20:59:50 +0300 Message-Id: <20200120175950.28060-4-gorcunov@gmail.com> In-Reply-To: <20200120175950.28060-1-gorcunov@gmail.com> References: <20200120175950.28060-1-gorcunov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v3 3/3] test/app-tap: add console_lua test List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tml Test multireturn and empty output in lua mode. Co-developed-by: Alexander Turenko Signed-off-by: Cyrill Gorcunov --- test/app-tap/console_lua.test.lua | 141 ++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100755 test/app-tap/console_lua.test.lua diff --git a/test/app-tap/console_lua.test.lua b/test/app-tap/console_lua.test.lua new file mode 100755 index 000000000..5848bdf69 --- /dev/null +++ b/test/app-tap/console_lua.test.lua @@ -0,0 +1,141 @@ +#!/usr/bin/env tarantool +-- +-- vim: ts=4 sw=4 et + +local console = require('console') +local socket = require('socket') +local tap = require('tap') +local fio = require('fio') + +local EOL = ';' +local CONSOLE_SOCKET = 'console-lua.sock' + +-- +-- Set Lua output mode. +local function set_lua_output(client, opts) + local opts = opts or {} + local mode = opts.block and 'lua,block' or 'lua' + client:write(('\\set output %s\n'):format(mode)) + assert(client:read(EOL), 'true' .. EOL, 'set lua output mode') +end + +-- +-- Start console and setup a client. +local function start_console() + -- Make sure not stale sockets are + -- left from previous runs. + fio.unlink(CONSOLE_SOCKET) + + local server = console.listen('unix/:./' .. CONSOLE_SOCKET) + assert(server ~= nil, 'console.listen started') + + local client = socket.tcp_connect('unix/', CONSOLE_SOCKET) + assert(client ~= nil, 'connect to console') + local handshake = client:read({chunk = 128}) + assert(string.match(handshake, '^Tarantool .*console') ~= nil, 'handshake') + + -- Switch to Lua output mode. + set_lua_output(client, {block = false}) + return server, client +end + +-- +-- Disconnect from console and stop it. +local function stop_console(server, client) + client:close() + server:close() + + local new_client = socket.tcp_connect('unix/', CONSOLE_SOCKET) + assert(new_client == nil, 'console.listen stopped') +end + +-- +-- Give `{x}` for a scalar `x`, just `x` otherwise. +local function totable(x) + return type(x) == 'table' and x or {x} +end + +-- +-- Execute a list of statements, show requests and responses. +local function execute_statements(test, client, statements, name) + test:test(name, function(test) + test:plan(2 * #statements) + + for _, stmt in ipairs(statements) do + local request = stmt .. '\n' + local res = client:write(request) + test:ok(res ~= nil, ('-> [[%s]]'):format(request:gsub('\n', '\\n'))) + + local response = client:read(EOL) + test:ok(response ~= nil and response:endswith(EOL), + ('<- [[%s]]'):format(response)) + end + end) +end + +-- +-- Execute a statement and verify its response. +local function execute_and_verify(test, client, input, exp_output, name) + test:test(name, function(test) + test:plan(2) + + local res = client:write(input .. '\n') + test:ok(res ~= nil, ('-> [[%s]]'):format(input)) + + local exp = exp_output .. EOL + local res = client:read(EOL) + test:is(res, exp, ('<- [[%s]]'):format(exp:gsub('\n', '\\n'))) + end) +end + +-- +-- Test cases table: +-- @name: Name of the test, mandatory +-- @prepare: Preparation script, optional +-- @opts: Console options, optional +-- @input: Input statement to execute, mandatory +-- @expected: Expected results to compare with, mandatory +-- @cleanup: Cleanup script to run after the test, optional +local cases = { + { + name = 'multireturn line mode', + prepare = 'a = {1, 2, 3}', + opts = {block = false}, + input = '1, 2, nil, a', + expected = '1, 2, box.NULL, {1, 2, 3}', + cleanup = 'a = nil', + }, { + name = 'multireturn block mode', + prepare = 'a = {1, 2, 3}', + opts = {block = true}, + input = '1, 2, nil, a', + expected = '1, 2, box.NULL, {\n 1,\n 2,\n 3\n}', + cleanup = 'a = nil', + }, { + name = 'empty output', + input = '\\set output', + expected = '"Specify output format: lua or yaml."', + } +} + +local test = tap.test('console-lua') +test:plan(#cases) + +local server, client = start_console() + +for _, case in ipairs(cases) do + test:test(case.name, function(test) + test:plan(3) + + execute_statements(test, client, totable(case.prepare), 'prepare') + + set_lua_output(client, case.opts) + execute_and_verify(test, client, case.input, case.expected, 'run') + + execute_statements(test, client, totable(case.cleanup), 'cleanup') + end) +end + +stop_console(server, client) + +os.exit(test:check() and 0 or 1) -- 2.20.1