Write some tests for monitor URL parsing functions + bugfixes
This commit is contained in:
parent
23ca05c04a
commit
e3477561ee
3 changed files with 153 additions and 7 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
130
tests/check_monitor.c
Normal 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;
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue