From df90db7d9d1179a49d562d5abe25ad8fd27b3375 Mon Sep 17 00:00:00 2001
From: bigbes <bigbes@gmail.com>
Date: Fri, 29 Jan 2016 21:25:15 +0300
Subject: [PATCH] Errno module refactoring

* Move test from box suite to app
* Refactor usage of this module
* Use ffi.errno instead of get_errno/set_errno and c module for loading constants
---
 src/box/lua/net_box.lua |  8 ++++----
 src/lua/errno.c         | 16 ----------------
 src/lua/errno.lua       | 31 ++++++++++---------------------
 src/lua/init.c          |  2 ++
 src/lua/socket.lua      |  3 ++-
 test/app/errno.result   | 16 ++++++++++++++++
 test/app/errno.test.lua | 21 +++++++++++++++++++++
 test/box/errno.result   | 32 --------------------------------
 test/box/errno.test.lua |  8 --------
 9 files changed, 55 insertions(+), 82 deletions(-)
 create mode 100644 test/app/errno.result
 create mode 100755 test/app/errno.test.lua
 delete mode 100644 test/box/errno.result
 delete mode 100644 test/box/errno.test.lua

diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua
index e23c4b8a27..48721f9f08 100644
--- a/src/box/lua/net_box.lua
+++ b/src/box/lua/net_box.lua
@@ -646,14 +646,14 @@ local remote_methods = {
 
             self.s = socket.tcp_connect(self.host, self.port)
             if self.s == nil then
-                self:_fatal(errno.strerror(errno()))
+                self:_fatal(errno.strerror())
             else
 
                 -- on_connect
                 self:_switch_state('handshake')
                 local greetingbuf = self.s:read(GREETING_SIZE)
                 if greetingbuf == nil then
-                    self:_fatal(errno.strerror(errno()))
+                    self:_fatal(errno.strerror())
                 elseif #greetingbuf ~= GREETING_SIZE then
                     self:_fatal("Can't read handshake")
                 else
@@ -860,7 +860,7 @@ local remote_methods = {
                         self.rbuf:reserve(advance)
                     end
                 elseif errno_is_transient[errno()] ~= true then
-                    self:_fatal(errno.strerror(errno()))
+                    self:_fatal(errno.strerror())
                 end
             end
         end
@@ -885,7 +885,7 @@ local remote_methods = {
                         while self.s:writable(1) == 0 and self.state ~= 'closed' do
                         end
                     else
-                        self:_fatal(errno.strerror(errno()))
+                        self:_fatal(errno.strerror())
                         break
                     end
                 end
diff --git a/src/lua/errno.c b/src/lua/errno.c
index db1cd74e05..45bc945f43 100644
--- a/src/lua/errno.c
+++ b/src/lua/errno.c
@@ -295,20 +295,4 @@ tarantool_lua_errno_init(struct lua_State *L)
 	}
 	lua_pop(L, -1);
 
-	if (luaL_dostring(L, errno_lua))
-		panic("Error loading Lua source (internal)/errno.lua: %s",
-			      lua_tostring(L, -1));
-}
-
-int
-errno_get(void)
-{
-	return errno;
-}
-
-int
-errno_set(int new_errno)
-{
-	errno = new_errno;
-	return errno;
 }
diff --git a/src/lua/errno.lua b/src/lua/errno.lua
index bda3096052..db800ce302 100644
--- a/src/lua/errno.lua
+++ b/src/lua/errno.lua
@@ -1,32 +1,21 @@
--- errno.lua (internal file)
-
-do
-
-local ffi = require 'ffi'
+local ffi = require('ffi')
+local errno_list = require('errno')
 
 ffi.cdef[[
     char *strerror(int errnum);
-    int errno_get();
-    int errno_set(int new_errno);
 ]]
 
-local exports = require('errno')
-exports.strerror = function(errno)
+local function strerror(errno)
     if errno == nil then
-        errno = ffi.C.errno_get()
+        errno = ffi.errno()
     end
     return ffi.string(ffi.C.strerror(tonumber(errno)))
 end
 
-setmetatable(exports, {
-    __newindex  = function() error("Can't create new errno constants") end,
-    __call = function(self, new_errno)
-        local res
-        if new_errno then
-            return ffi.C.errno_set(new_errno)
-        end
-        return ffi.C.errno_get()
-    end
+return setmetatable({
+    strerror = strerror
+}, {
+    __index = errno_list,
+    __newindex = function() error("Can't create new errno constants") end,
+    __call = function(self, ...) return ffi.errno(...) end
 })
-
-end
diff --git a/src/lua/init.c b/src/lua/init.c
index dc8d5921a6..7ce799b42c 100644
--- a/src/lua/init.c
+++ b/src/lua/init.c
@@ -78,6 +78,7 @@ extern char strict_lua[],
 	digest_lua[],
 	init_lua[],
 	buffer_lua[],
+	errno_lua[],
 	fiber_lua[],
 	log_lua[],
 	uri_lua[],
@@ -105,6 +106,7 @@ static const char *lua_modules[] = {
 	/* Make it first to affect load of all other modules */
 	"strict", strict_lua,
 	"tarantool", init_lua,
+	"errno", errno_lua,
 	"fiber", fiber_lua,
 	"buffer", buffer_lua,
 	"msgpackffi", msgpackffi_lua,
diff --git a/src/lua/socket.lua b/src/lua/socket.lua
index 99452a72b7..d6e354d170 100644
--- a/src/lua/socket.lua
+++ b/src/lua/socket.lua
@@ -454,7 +454,8 @@ socket_methods.getsockopt = function(self, level, name)
         else
             local p = ffi.C.getprotobyname(level)
             if p == nil then
-                self._errno = boxerrno(boxerrno.EINVAL)
+                boxerrno(boxerrno.EINVAL)
+                self._errno = boxerrno.EINVAL
                 return nil
             end
             level = p.p_proto
diff --git a/test/app/errno.result b/test/app/errno.result
new file mode 100644
index 0000000000..3063fc9b55
--- /dev/null
+++ b/test/app/errno.result
@@ -0,0 +1,16 @@
+TAP version 13
+1..1
+    # primary
+    1..10
+    ok - type of table
+    ok - errno.EINVAL is available
+    ok - errno.EBADF is available
+    ok - errno set to 0
+    ok - setting errno.EBADF
+    ok - checking errno.EBADF
+    ok - setting errno.EINVAL
+    ok - checking errno.EINVAL
+    ok - checking strerror without argument
+    ok - checking strerror with argument
+    # primary: end
+ok - primary
diff --git a/test/app/errno.test.lua b/test/app/errno.test.lua
new file mode 100755
index 0000000000..5fd8eaca4a
--- /dev/null
+++ b/test/app/errno.test.lua
@@ -0,0 +1,21 @@
+#!/usr/bin/env tarantool
+
+local tap = require('tap')
+local errno = require('errno')
+
+local test = tap.test("errno")
+
+test:plan(1)
+test:test("primary", function(test)
+    test:plan(10)
+    test:is(type(errno), "table", "type of table")
+    test:ok(errno.EINVAL ~= nil, "errno.EINVAL is available")
+    test:ok(errno.EBADF ~= nil , "errno.EBADF is available" )
+    test:ok(errno(0) ~= nil, "errno set to 0")
+    test:is(errno(errno.EBADF), 0, "setting errno.EBADF")
+    test:is(errno(), errno.EBADF, "checking errno.EBADF")
+    test:is(errno(errno.EINVAL), errno.EBADF, "setting errno.EINVAL")
+    test:is(errno(), errno.EINVAL, "checking errno.EINVAL")
+    test:is(errno.strerror(), "Invalid argument", "checking strerror without argument")
+    test:is(errno.strerror(errno.EBADF), "Bad file descriptor", "checking strerror with argument")
+end)
diff --git a/test/box/errno.result b/test/box/errno.result
deleted file mode 100644
index d869d2797b..0000000000
--- a/test/box/errno.result
+++ /dev/null
@@ -1,32 +0,0 @@
-errno = require('errno')
----
-...
-type(errno)
----
-- table
-...
-errno.EINVAL > 0
----
-- true
-...
-errno.EBADF > 0
----
-- true
-...
-errno(errno.EINVAL) == errno.EINVAL, errno() == errno.EINVAL
----
-- true
-- true
-...
-errno(errno.EBADF) ~= errno.EINVAL, errno() == errno.EBADF
----
-- true
-- true
-...
-errno.strerror(errno.EINVAL)
----
-- Invalid argument
-...
-errno = nil
----
-...
diff --git a/test/box/errno.test.lua b/test/box/errno.test.lua
deleted file mode 100644
index fd01789af9..0000000000
--- a/test/box/errno.test.lua
+++ /dev/null
@@ -1,8 +0,0 @@
-errno = require('errno')
-type(errno)
-errno.EINVAL > 0
-errno.EBADF > 0
-errno(errno.EINVAL) == errno.EINVAL, errno() == errno.EINVAL
-errno(errno.EBADF) ~= errno.EINVAL, errno() == errno.EBADF
-errno.strerror(errno.EINVAL)
-errno = nil
-- 
GitLab