Write some tests for monitor URL parsing functions + bugfixes

This commit is contained in:
Yann Weber 2019-08-09 16:01:57 +02:00
commit e3477561ee
3 changed files with 153 additions and 7 deletions

View file

@ -49,6 +49,12 @@ int pyfcgi_monitor_check_sock(const char* sockurl)
else if(!strncasecmp("unix://", sockurl, 7))
{
sockurl += 7;
if(!strlen(sockurl))
{
dprintf(2, "UNIX socket missing file path : '%s'\n",
urlorig);
return -1;
}
if(strlen(sockurl) > UNIX_SOCKPATH_MAX)
{
dprintf(2, "UNIX socket support only path with length <= %d but given path is %ld bytes long : '%s'",
@ -69,13 +75,18 @@ int pyfcgi_monitor_check_sock(const char* sockurl)
tcp?"TCP":"UDP", sockurl);
return -1;
}
if(!*sockurl)
{
dprintf(2, "Port missing in socket URL '%s'\n", urlorig);
return -1;
}
sockurl++;
port = sockurl;
while(*sockurl && *sockurl >= '0' && *sockurl <= '9')
{
sockurl++;
}
if(sockurl)
if(*sockurl)
{
dprintf(2, "Invalid port '%s' in socket URL '%s'\n",
port, urlorig);
@ -98,8 +109,7 @@ int pyfcgi_monitor_parse_sock(const char *sockurl, int sockargs[3],
addr_un = &(listen_addr->un);
sockurl = PyFCGI_conf.mon_socket;
if(strncasecmp("unix://", sockurl, 7))
if(!strncasecmp("unix://", sockurl, 7))
{
addr_ptr = sockurl + 7;
*domain = AF_UNIX;
@ -118,13 +128,13 @@ int pyfcgi_monitor_parse_sock(const char *sockurl, int sockargs[3],
return -1;
}
addr_ptr = sockurl + 6;
*type = tcp ? SOCK_DGRAM : SOCK_STREAM;
*protocol = 0;
if(pyfcgi_monitor_parse_inet_addr(addr_ptr, *type, listen_addr, domain))
{
return -1;
}
*type = tcp ? SOCK_DGRAM : SOCK_STREAM;
*protocol = 0;
return 0;
}
@ -195,6 +205,7 @@ int pyfcgi_monitor_parse_inet_addr(const char* addr_str, int socktype,
{
continue;
}
*domain = info->ai_family;
pyfcgi_log(LOG_DEBUG, "Listen addr resolved to %s(%s)",
info->ai_canonname, ipstr);

View file

@ -1,8 +1,13 @@
TESTS = check_logger
check_PROGRAMS = check_logger
TESTS = check_logger check_monitor
check_PROGRAMS = check_logger check_monitor
check_logger_SOURCES = check_logger.c $(top_builddir)/include/logger.h
check_logger_CFLAGS = @CHECK_CFLAGS@ $(PYTHON_CFLAGS)
check_logger_LDADD = $(top_builddir)/src/libpyfcgi.a @CHECK_LIBS@ $(PYTHON_LDFLAGS)
check_monitor_SOURCES = check_monitor.c $(top_builddir)/include/monitor.h
check_monitor_CFLAGS = @CHECK_CFLAGS@ $(PYTHON_CFLAGS)
check_monitor_LDADD = $(top_builddir)/src/libpyfcgi.a @CHECK_LIBS@ $(PYTHON_LDFLAGS)
clean-local:
-rm -rf /tmp/tmp_PyFCGI_checks*

130
tests/check_monitor.c Normal file
View file

@ -0,0 +1,130 @@
#include <stdlib.h>
#include <check.h>
#include <stdio.h>
#include "monitor.h"
static const char *valids[] = {
"tcp://localhost:8181",
"tcp://127.0.0.1:81",
"udp://localhost:8000",
"udp://192.168.13.37:1234",
//"tcp://::1:8000",
"unix:///tmp/test/test.sock",
"unix://foo.sock",
NULL};
static const char *invalids[] = {
"localhost:8000",
"ttt://127.0.0.1:81",
"tcp://","udp://", "unix://",
"tcp://localhost",
};
START_TEST(test_check_sock_valid)
{
int ret;
const char **urls;
char err_msg[256];
for(urls=valids; *urls != NULL; urls++)
{
ret = pyfcgi_monitor_check_sock(*urls);
snprintf(err_msg, 256,
"returns %d != 0 but '%s' given",
ret, *urls);
ck_assert_msg(ret == 0, err_msg);
}
}
END_TEST
START_TEST(test_check_sock_invalid)
{
int ret;
const char **urls;
char err_msg[256];
for(urls=invalids; *urls != NULL; urls++)
{
ret = pyfcgi_monitor_check_sock(*urls);
snprintf(err_msg, 256,
"returns %d != -1 but '%s' given",
ret, *urls);
ck_assert_msg(ret == -1, err_msg);
}
}
END_TEST
START_TEST(test_parse_sock_valid_v4)
{
pyfcgi_monitor_addr_t addr;
int domain, type, protocol, args[3], ret, i;
const char **urls;
char err_msg[256];
const int expt_ret[] = {
AF_INET, SOCK_STREAM, 0,
AF_INET, SOCK_STREAM, 0,
AF_INET, SOCK_DGRAM, 0,
AF_INET, SOCK_DGRAM, 0,
AF_UNIX, SOCK_STREAM, 0,
AF_UNIX, SOCK_STREAM, 0,};
const int *expts = expt_ret;
PyFCGI_conf.ipv4 = 1;
i=0;
for(urls=valids; *urls != NULL; urls++)
{
ret = pyfcgi_monitor_parse_sock(*urls, args, &addr);
snprintf(err_msg, 256,
"returns %d != 0 but '%s' given",
ret, *urls);
ck_assert_msg(ret == 0, err_msg);
domain = args[0];
type = args[1];
protocol = args[2];
ck_assert_int_eq(expts[0], domain);
ck_assert_int_eq(expts[1], type);
ck_assert_int_eq(expts[2], protocol);
/**@todo check returned address */
expts+=3;
i+=1;
}
}
END_TEST
Suite * logger_suite(void)
{
Suite *s;
TCase *tc_sockurl;
s = suite_create("Monitoring server");
tc_sockurl = tcase_create("Socket URL handling functions");
tcase_add_test(tc_sockurl, test_check_sock_valid);
tcase_add_test(tc_sockurl, test_check_sock_invalid);
tcase_add_test(tc_sockurl, test_parse_sock_valid_v4);
suite_add_tcase(s, tc_sockurl);
return s;
}
int main(void)
{
int nfailed;
Suite *s;
SRunner *sr;
s = logger_suite();
sr = srunner_create(s);
srunner_run_all(sr, CK_VERBOSE);
nfailed = srunner_ntests_failed(sr);
srunner_free(sr);
return (!nfailed)?EXIT_SUCCESS:EXIT_FAILURE;
}