[Tarantool-patches] [PATCH 1/2] box/console: handle multireturn in lua mode

Cyrill Gorcunov gorcunov at gmail.com
Wed Dec 25 19:08:52 MSK 2019


Currently we handle only first member of multireturn statement.
Fix it processing each element separately.

n.b.: While at this file add vim settings.

 | tarantool> \set output lua
 | true;
 | tarantool> 1,2,3,4
 | 1, 2, 3, 4;

Fixes #4604

Reported-by: Alexander Turenko <alexander.turenko at tarantool.org>
Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
 src/box/lua/console.lua           | 38 ++++++++++++-------
 test/app-tap/console-lua.skipcond |  7 ++++
 test/app-tap/console-lua.test.lua | 62 +++++++++++++++++++++++++++++++
 3 files changed, 94 insertions(+), 13 deletions(-)
 create mode 100644 test/app-tap/console-lua.skipcond
 create mode 100755 test/app-tap/console-lua.test.lua

diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua
index d4d8ec984..a4a36c625 100644
--- a/src/box/lua/console.lua
+++ b/src/box/lua/console.lua
@@ -1,4 +1,6 @@
 -- console.lua -- internal file
+--
+-- vim: ts=4 sw=4 et
 
 local serpent = require('serpent')
 local internal = require('console')
@@ -75,28 +77,38 @@ local serpent_map_symbols = function(tag, head, body, tail, level)
     return tag..head..body..tail
 end
 
-output_handlers["lua"] = function(status, opts, ...)
-    --
-    -- If no data present at least EOS should be put,
-    -- otherwise wire readers won't be able to find
-    -- where the end of string is.
-    if not ... then
-        return output_eos["lua"]
-    end
+--
+-- Format a Lua value.
+local function format_lua_value(value, opts)
     for k,v in pairs(lua_map_direct_symbols) do
-        if k == ... then
-            return v .. output_eos["lua"]
+        if k == value then
+            return v
         end
     end
     local serpent_opts = {
         custom  = serpent_map_symbols,
         comment = false,
-        nocode = true,
+        nocode  = true,
     }
     if opts == "block" then
-        return serpent.block(..., serpent_opts) .. output_eos["lua"]
+        return serpent.block(value, serpent_opts)
+    end
+    return serpent.line(value, serpent_opts)
+end
+
+output_handlers["lua"] = function(status, opts, ...)
+    local collect = {}
+    --
+    -- If no data present at least EOS should be put,
+    -- otherwise wire readers won't be able to find
+    -- where the end of string is.
+    if not ... then
+        return output_eos["lua"]
+    end
+    for i = 1, select('#', ...) do
+        collect[i] = format_lua_value(select(i, ...), opts)
     end
-    return serpent.line(..., serpent_opts) .. output_eos["lua"]
+    return table.concat(collect, ', ') .. output_eos["lua"]
 end
 
 local function output_verify_opts(fmt, opts)
diff --git a/test/app-tap/console-lua.skipcond b/test/app-tap/console-lua.skipcond
new file mode 100644
index 000000000..48e17903e
--- /dev/null
+++ b/test/app-tap/console-lua.skipcond
@@ -0,0 +1,7 @@
+import platform
+
+# Disabled on FreeBSD due to flaky fail #4271.
+if platform.system() == 'FreeBSD':
+    self.skip = 1
+
+# vim: set ft=python:
diff --git a/test/app-tap/console-lua.test.lua b/test/app-tap/console-lua.test.lua
new file mode 100755
index 000000000..d3271a369
--- /dev/null
+++ b/test/app-tap/console-lua.test.lua
@@ -0,0 +1,62 @@
+#!/usr/bin/env tarantool
+--
+-- vim: ts=4 sw=4 et
+
+local tap = require('tap')
+local console = require('console')
+local socket = require('socket')
+local yaml = require('yaml')
+local fiber = require('fiber')
+local ffi = require('ffi')
+local log = require('log')
+local fio = require('fio')
+
+-- Suppress console log messages
+log.level(4)
+local CONSOLE_SOCKET = fio.pathjoin(fio.cwd(), 'tarantool-test-console-lua.sock')
+os.remove(CONSOLE_SOCKET)
+
+local EOL = ";"
+
+test = tap.test("console-lua")
+
+test:plan(7)
+
+--
+-- Start console and connect to it
+local server = console.listen(CONSOLE_SOCKET)
+test:ok(server ~= nil, "console.listen started")
+
+local client = socket.tcp_connect("unix/", CONSOLE_SOCKET)
+local handshake = client:read{chunk = 128}
+test:ok(string.match(handshake, '^Tarantool .*console') ~= nil, 'Handshake')
+test:ok(client ~= nil, "connect to console")
+
+--
+-- Change output mode to Lua
+client:write('\\set output lua\n')
+test:is(client:read(EOL), 'true' .. EOL, "set lua output mode")
+
+--
+-- Write mulireturn statement
+client:write('a={1,2,3}\n')
+test:is(client:read(EOL), EOL, "declare array")
+
+client:write('1,2,nil,a\n')
+test:is(client:read(EOL), '1, 2, box.NULL, {1, 2, 3}' .. EOL, "multireturn numbers")
+
+--
+-- Disconect from console
+client:shutdown()
+client:close()
+
+--
+-- Stop console
+server:shutdown()
+server:close()
+fiber.sleep(0) -- workaround for gh-712: console.test.lua fails in Fedora
+-- Check that admin console has been stopped
+test:isnil(socket.tcp_connect("unix/", CONSOLE_SOCKET), "console.listen stopped")
+
+test:check()
+os.exit(0)
-- 
2.20.1



More information about the Tarantool-patches mailing list