[PATCH] Fix OSX tests and add compile-time check

Vladimir Davydov vdavydov.dev at gmail.com
Wed Feb 7 13:53:34 MSK 2018


On Tue, Feb 06, 2018 at 08:11:31PM +0300, Konstantin Belyavskiy wrote:
> Add compile-time libcurl version check to make sure it supports
> Unix socket (by using CURL_VERSION_UNIX_SOCKETS macro)
> 
> Closes #3040
> ---
> branch: gh-3040-http-over-unix-request-opts
>  src/httpc.c                       | 10 +++++++++-
>  src/httpc.h                       |  3 ++-
>  src/lua/httpc.c                   |  4 +++-
>  test/app-tap/http_client.test.lua | 26 +++++++++++++++++++++++---
>  4 files changed, 37 insertions(+), 6 deletions(-)
> 
> diff --git a/src/httpc.c b/src/httpc.c
> index 5eb79f00e..f3c6a1c0e 100644
> --- a/src/httpc.c
> +++ b/src/httpc.c
> @@ -263,10 +263,18 @@ httpc_set_ca_file(struct httpc_request *req, const char *ca_file)
>  	curl_easy_setopt(req->curl_request.easy, CURLOPT_CAINFO, ca_file);
>  }
>  
> -void
> +int
>  httpc_set_unix_socket(struct httpc_request *req, const char *unix_socket)
>  {
> +#ifdef CURL_VERSION_UNIX_SOCKETS
>  	curl_easy_setopt(req->curl_request.easy, CURLOPT_UNIX_SOCKET_PATH, unix_socket);
> +	return 0;
> +#else
> +#pragma message "UNIX_SOCKETS are not supported, please upgrade curl to 7.40.0"
> +	(void) req;
> +	(void) unix_socket;
> +	return -1;
> +#endif
>  }

This is minor, but we usually set diag on error. What about
IllegalParams? Another option - silently ignore the option if
it is not supported, as we do in case of httpc_set_keepalive -
let httpc_execute fail if unix connections are not supported.

>  
>  void

> diff --git a/src/lua/httpc.c b/src/lua/httpc.c
> index 937d15fc8..577e614df 100644
> --- a/src/lua/httpc.c
> +++ b/src/lua/httpc.c
> @@ -124,7 +124,9 @@ luaT_httpc_request(lua_State *L)
>  
>  	lua_getfield(L, 5, "unix_socket");
>  	if (!lua_isnil(L, -1))
> -		httpc_set_unix_socket(req, lua_tostring(L, -1));
> +		if(httpc_set_unix_socket(req, lua_tostring(L, -1)))
> +			return luaL_error(L, "please upgrade libcurl to 7.40"
> +					     " to support unix socket");

AFAICS httpc_request_delete must be called in case of error.

>  	lua_pop(L, 1);
>  
>  	lua_getfield(L, 5, "verify_host");
> diff --git a/test/app-tap/http_client.test.lua b/test/app-tap/http_client.test.lua
> index 274ac4d1f..6289b5b92 100755
> --- a/test/app-tap/http_client.test.lua
> +++ b/test/app-tap/http_client.test.lua
> @@ -391,7 +391,20 @@ test:test('http over AF_INET', function(test)
>  end)
>  
>  test:test('http over AF_UNIX', function(test)
> -    test:plan(8)
> +    local url = "http://localhost/"
> +    local tmpname = os.tmpname()
> +    local sock = tmpname .. '.sock'
> +    local check = pcall(client.get, url, {unix_socket=sock, timeout = 0.01})
> +    if check == false then
> +        os.remove(tmpname)
> +        return
> +    end
> +
> +    local extra = 1
> +    if jit.os == "OSX" then
> +        extra = 0
> +    end
> +    test:plan(extra + 7)
>  
>      local tmpname = os.tmpname()
>      local sock = tmpname .. '.sock'
> @@ -400,9 +413,14 @@ test:test('http over AF_UNIX', function(test)
>      local cmd = string.format("%s/test/app-tap/httpd.py --unix %s",
>              TARANTOOL_SRC_DIR, sock)
>      local server = io.popen(cmd)
> +    if server == nil then
> +        test:diag("create server failes")
> +        os.remove(tmpname)
> +        os.remove(sock)
> +        return
> +    end
>      test:is(server:read("*l"), "heartbeat", "server started")
>  
> -    local url = "http://localhost/"
>      test:diag("trying to connect to %s", url)
>      local r
>      for i=1,10 do
> @@ -428,7 +446,9 @@ test:test('http over AF_UNIX', function(test)
>      test:test("basic http post/get", post_and_get_test, url, opts)
>      test:test("headers", headers_test, url, opts)
>      test:test("special methods", special_methods_test, url, opts)
> -    test:test("concurrent", concurrent_test, url, opts)
> +    if jit.os ~= "OSX" then
> +        test:test("concurrent", concurrent_test, url, opts)
> +    end

Why is that? At least, it deserves a comment.

Anyway, I think the series is split in patches incorrectly.
Currently, we have on the branch:

19e911d3 Fix OSX tests and add compile-time check
9c607ad4 Refactor http.client autotests
e766c6b3 Allow http client connection to use unix socket

Patch #1 (the last one on the list above) introduces the http-over-unix
feature, but doesn't add a test. Besides, it doesn't even work if curl
is older than a certain version. That is, the patch is incomplete.

Patch #2 not just refactors the test, as the comment claims, but also
partially adds a test for patch #1, which is confusing.

Patch #3 is a fix for patch #1 plus the remnants of the test.

How I see the series: patch #1 prepares the http client test for testing
http-over-unix without adding any new cases; patch #2 introduces the
feature with a test and without any bugs.



More information about the Tarantool-patches mailing list