Browse Source

Write some tests for monitor URL parsing functions + bugfixes

Yann Weber 4 years ago
parent
commit
e3477561ee
3 changed files with 153 additions and 7 deletions
  1. 16
    5
      src/monitor.c
  2. 7
    2
      tests/Makefile.am
  3. 130
    0
      tests/check_monitor.c

+ 16
- 5
src/monitor.c View File

@@ -49,6 +49,12 @@ int pyfcgi_monitor_check_sock(const char* sockurl)
49 49
 	else if(!strncasecmp("unix://", sockurl, 7))
50 50
 	{
51 51
 		sockurl += 7;
52
+		if(!strlen(sockurl))
53
+		{
54
+			dprintf(2, "UNIX socket missing file path : '%s'\n",
55
+				urlorig);
56
+			return -1;
57
+		}
52 58
 		if(strlen(sockurl) > UNIX_SOCKPATH_MAX)
53 59
 		{
54 60
 			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)
69 75
 			tcp?"TCP":"UDP", sockurl);
70 76
 		return -1;
71 77
 	}
78
+	if(!*sockurl)
79
+	{
80
+		dprintf(2, "Port missing in socket URL '%s'\n", urlorig);
81
+		return -1;
82
+	}
72 83
 	sockurl++;
73 84
 	port = sockurl;
74 85
 	while(*sockurl && *sockurl >= '0' && *sockurl <= '9')
75 86
 	{
76 87
 		sockurl++;
77 88
 	}
78
-	if(sockurl)
89
+	if(*sockurl)
79 90
 	{
80 91
 		dprintf(2, "Invalid port '%s' in socket URL '%s'\n",
81 92
 			port, urlorig);
@@ -98,8 +109,7 @@ int pyfcgi_monitor_parse_sock(const char *sockurl, int sockargs[3],
98 109
 
99 110
 	addr_un = &(listen_addr->un);
100 111
 
101
-	sockurl = PyFCGI_conf.mon_socket;
102
-	if(strncasecmp("unix://", sockurl, 7))
112
+	if(!strncasecmp("unix://", sockurl, 7))
103 113
 	{
104 114
 		addr_ptr = sockurl + 7;
105 115
 		*domain = AF_UNIX;
@@ -118,13 +128,13 @@ int pyfcgi_monitor_parse_sock(const char *sockurl, int sockargs[3],
118 128
 		return -1;
119 129
 	}
120 130
 	addr_ptr = sockurl + 6;
131
+	*type = tcp ? SOCK_DGRAM : SOCK_STREAM;
132
+	*protocol = 0;
121 133
 
122 134
 	if(pyfcgi_monitor_parse_inet_addr(addr_ptr, *type, listen_addr, domain))
123 135
 	{
124 136
 		return -1;
125 137
 	}
126
-	*type = tcp ? SOCK_DGRAM : SOCK_STREAM;
127
-	*protocol = 0;
128 138
 	return 0;
129 139
 }
130 140
 
@@ -195,6 +205,7 @@ int pyfcgi_monitor_parse_inet_addr(const char* addr_str, int socktype,
195 205
 		{
196 206
 			continue;
197 207
 		}
208
+		*domain = info->ai_family;
198 209
 		pyfcgi_log(LOG_DEBUG, "Listen addr resolved to %s(%s)",
199 210
 			info->ai_canonname,  ipstr);
200 211
 

+ 7
- 2
tests/Makefile.am View File

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

+ 130
- 0
tests/check_monitor.c View File

@@ -0,0 +1,130 @@
1
+#include <stdlib.h>
2
+#include <check.h>
3
+#include <stdio.h>
4
+
5
+#include "monitor.h"
6
+
7
+static const char *valids[] = {
8
+	"tcp://localhost:8181",
9
+	"tcp://127.0.0.1:81",
10
+	"udp://localhost:8000",
11
+	"udp://192.168.13.37:1234",
12
+	//"tcp://::1:8000",
13
+	"unix:///tmp/test/test.sock",
14
+	"unix://foo.sock",
15
+	NULL};
16
+
17
+static const char *invalids[] = {
18
+	"localhost:8000",
19
+	"ttt://127.0.0.1:81",
20
+	"tcp://","udp://", "unix://",
21
+	"tcp://localhost",
22
+	};
23
+
24
+START_TEST(test_check_sock_valid)
25
+{
26
+	int ret;
27
+	const char **urls;
28
+	char err_msg[256];
29
+
30
+	for(urls=valids; *urls != NULL; urls++)
31
+	{
32
+		ret = pyfcgi_monitor_check_sock(*urls);
33
+		snprintf(err_msg, 256,
34
+			"returns %d != 0 but '%s' given",
35
+			ret, *urls);
36
+		ck_assert_msg(ret == 0, err_msg);
37
+	}
38
+}
39
+END_TEST
40
+
41
+START_TEST(test_check_sock_invalid)
42
+{
43
+	int ret;
44
+	const char **urls;
45
+	char err_msg[256];
46
+
47
+	for(urls=invalids; *urls != NULL; urls++)
48
+	{
49
+		ret = pyfcgi_monitor_check_sock(*urls);
50
+		snprintf(err_msg, 256,
51
+			"returns %d != -1 but '%s' given",
52
+			ret, *urls);
53
+		ck_assert_msg(ret == -1, err_msg);
54
+	}
55
+}
56
+END_TEST
57
+
58
+START_TEST(test_parse_sock_valid_v4)
59
+{
60
+	pyfcgi_monitor_addr_t addr;
61
+	int domain, type, protocol, args[3], ret, i;
62
+	const char **urls;
63
+	char err_msg[256];
64
+
65
+	const int expt_ret[] = {
66
+		AF_INET, SOCK_STREAM, 0,
67
+		AF_INET, SOCK_STREAM, 0,
68
+		AF_INET, SOCK_DGRAM, 0,
69
+		AF_INET, SOCK_DGRAM, 0,
70
+		AF_UNIX, SOCK_STREAM, 0,
71
+		AF_UNIX, SOCK_STREAM, 0,};
72
+	const int *expts = expt_ret;
73
+
74
+	PyFCGI_conf.ipv4 = 1;
75
+	i=0;
76
+
77
+	for(urls=valids; *urls != NULL; urls++)
78
+	{
79
+		ret = pyfcgi_monitor_parse_sock(*urls, args, &addr);
80
+		snprintf(err_msg, 256,
81
+			"returns %d != 0 but '%s' given",
82
+			ret, *urls);
83
+		ck_assert_msg(ret == 0, err_msg);
84
+
85
+		domain = args[0];
86
+		type = args[1];
87
+		protocol = args[2];
88
+
89
+		ck_assert_int_eq(expts[0], domain);
90
+		ck_assert_int_eq(expts[1], type);
91
+		ck_assert_int_eq(expts[2], protocol);
92
+
93
+		/**@todo check returned address */
94
+		expts+=3;
95
+		i+=1;
96
+	}
97
+}
98
+END_TEST
99
+
100
+Suite * logger_suite(void)
101
+{
102
+	Suite *s;
103
+	TCase *tc_sockurl;
104
+
105
+	s = suite_create("Monitoring server");
106
+	tc_sockurl = tcase_create("Socket URL handling functions");
107
+	tcase_add_test(tc_sockurl, test_check_sock_valid);
108
+	tcase_add_test(tc_sockurl, test_check_sock_invalid);
109
+	tcase_add_test(tc_sockurl, test_parse_sock_valid_v4);
110
+
111
+	suite_add_tcase(s, tc_sockurl);
112
+	return s;
113
+}
114
+
115
+int main(void)
116
+{
117
+	int nfailed;
118
+	Suite *s;
119
+	SRunner *sr;
120
+
121
+	s = logger_suite();
122
+	sr = srunner_create(s);
123
+	
124
+	srunner_run_all(sr, CK_VERBOSE);
125
+	nfailed = srunner_ntests_failed(sr);
126
+	srunner_free(sr);
127
+
128
+	return (!nfailed)?EXIT_SUCCESS:EXIT_FAILURE;
129
+}
130
+

Loading…
Cancel
Save