diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 8 | ||||
-rw-r--r-- | tests/socket/socket_test.c | 78 | ||||
-rw-r--r-- | tests/socket/socket_test.err | 1 | ||||
-rw-r--r-- | tests/socket/socket_test.ok | 3 | ||||
-rw-r--r-- | tests/testsuite.at | 8 |
6 files changed, 97 insertions, 2 deletions
@@ -98,6 +98,7 @@ tests/tlv/tlv_test tests/fsm/fsm_test tests/write_queue/wqueue_test tests/oap/oap_test +tests/socket/socket_test utils/osmo-arfcn utils/osmo-auc-gen diff --git a/tests/Makefile.am b/tests/Makefile.am index b9eb8f23..5731bf8d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -14,7 +14,7 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test \ smscb/gsm0341_test stats/stats_test \ bitvec/bitvec_test msgb/msgb_test bits/bitcomp_test \ tlv/tlv_test gsup/gsup_test oap/oap_test fsm/fsm_test \ - write_queue/wqueue_test + write_queue/wqueue_test socket/socket_test if ENABLE_MSGFILE check_PROGRAMS += msgfile/msgfile_test @@ -140,6 +140,9 @@ fsm_fsm_test_LDADD = $(top_builddir)/src/libosmocore.la write_queue_wqueue_test_SOURCES = write_queue/wqueue_test.c write_queue_wqueue_test_LDADD = $(top_builddir)/src/libosmocore.la +socket_socket_test_SOURCES = socket/socket_test.c +socket_socket_test_LDADD = $(top_builddir)/src/libosmocore.la + # The `:;' works around a Bash 3.2 bug when the output is not writeable. $(srcdir)/package.m4: $(top_srcdir)/configure.ac :;{ \ @@ -176,7 +179,8 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \ bitvec/bitvec_test.ok msgb/msgb_test.ok bits/bitcomp_test.ok \ sim/sim_test.ok tlv/tlv_test.ok gsup/gsup_test.ok \ oap/oap_test.ok fsm/fsm_test.ok fsm/fsm_test.err \ - write_queue/wqueue_test.ok + write_queue/wqueue_test.ok socket/socket_test.ok \ + socket/socket_test.err DISTCLEANFILES = atconfig atlocal diff --git a/tests/socket/socket_test.c b/tests/socket/socket_test.c new file mode 100644 index 00000000..75088e5f --- /dev/null +++ b/tests/socket/socket_test.c @@ -0,0 +1,78 @@ +/* + * (C) 2017 by Harald Welte <laforge@gnumonks.org> + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> + +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netinet/in.h> + +#include <osmocom/core/utils.h> +#include <osmocom/core/socket.h> + +#include "../config.h" + +static int test_sockinit(void) +{ + int fd, rc; + char *name; + + printf("Checking osmo_sock_init() with bind to a random local UDP port\n"); + fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP, + "0.0.0.0", 0, OSMO_SOCK_F_BIND); + OSMO_ASSERT(fd >= 0); + name = osmo_sock_get_name(NULL, fd); + /* expect it to be not connected. We cannot match on INADDR_ANY, + * as apparently that won't work on FreeBSD if there's only one + * address (e.g. 127.0.0.1) assigned to the entire system, like + * the Osmocom FreeBSD build slaves */ + OSMO_ASSERT(!strncmp(name, "(NULL<->", 7)); + talloc_free(name); + /* expect it to be blocking */ + rc = fcntl(fd, F_GETFL); + OSMO_ASSERT(!(rc & O_NONBLOCK)); + close(fd); + + printf("Checking for OSMO_SOCK_F_NONBLOCK\n"); + fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP, + "0.0.0.0", 0, OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK); + OSMO_ASSERT(fd >= 0); + /* expect it to be blocking */ + rc = fcntl(fd, F_GETFL); + OSMO_ASSERT(rc & O_NONBLOCK); + close(fd); + + printf("Checking for invalid flags\n"); + fd = osmo_sock_init(AF_INET, SOCK_DGRAM, IPPROTO_UDP, + "0.0.0.0", 0, OSMO_SOCK_F_BIND|OSMO_SOCK_F_CONNECT); + OSMO_ASSERT(fd < 0); + + return 0; +} + +int main(int argc, char *argv[]) +{ + test_sockinit(); + return 0; +} diff --git a/tests/socket/socket_test.err b/tests/socket/socket_test.err new file mode 100644 index 00000000..5367239c --- /dev/null +++ b/tests/socket/socket_test.err @@ -0,0 +1 @@ +invalid: both bind and connect flags set: 0.0.0.0:0 diff --git a/tests/socket/socket_test.ok b/tests/socket/socket_test.ok new file mode 100644 index 00000000..d6ec40ed --- /dev/null +++ b/tests/socket/socket_test.ok @@ -0,0 +1,3 @@ +Checking osmo_sock_init() with bind to a random local UDP port +Checking for OSMO_SOCK_F_NONBLOCK +Checking for invalid flags diff --git a/tests/testsuite.at b/tests/testsuite.at index 426c74cd..d6181c91 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -228,3 +228,11 @@ cat $abs_srcdir/oap/oap_test.ok > expout touch experr AT_CHECK([$abs_top_builddir/tests/oap/oap_test], [0], [expout], [experr]) AT_CLEANUP + +AT_SETUP([socket]) +AT_KEYWORDS([socket]) +cat $abs_srcdir/socket/socket_test.ok > expout +cat $abs_srcdir/socket/socket_test.err > experr +touch experr +AT_CHECK([$abs_top_builddir/tests/socket/socket_test], [0], [expout], [experr]) +AT_CLEANUP |