From: Ben Pfaff Date: Wed, 13 Feb 2013 19:21:20 +0000 (-0800) Subject: tests: Add test for Python version of long socket name workaround. X-Git-Tag: sliver-openvswitch-1.10.90-1~11^2~40 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=cd57233c96d437e65c6fb7afb1e117acd4d3c941;p=sliver-openvswitch.git tests: Add test for Python version of long socket name workaround. Signed-off-by: Ben Pfaff Acked-by: Ethan Jackson --- diff --git a/tests/automake.mk b/tests/automake.mk index 11616941b..b11e0a236 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -307,6 +307,7 @@ CHECK_PYFILES = \ tests/test-ovsdb.py \ tests/test-reconnect.py \ tests/MockXenAPI.py \ + tests/test-unix-socket.py \ tests/test-unixctl.py \ tests/test-vlog.py EXTRA_DIST += $(CHECK_PYFILES) diff --git a/tests/library.at b/tests/library.at index 3e84648a1..650fef3f4 100644 --- a/tests/library.at +++ b/tests/library.at @@ -114,7 +114,7 @@ m4_foreach( AT_CHECK([test-util testname], [0], [], []) AT_CLEANUP]) -AT_SETUP([test unix socket -- short pathname]) +AT_SETUP([test unix socket, short pathname - C]) AT_CHECK([test-unix-socket x]) AT_CLEANUP @@ -123,7 +123,7 @@ dnl go in a fixed-length field in struct sockaddr_un. Generally the limit dnl is about 100 bytes. On Linux, we work around this by indirecting through dnl a directory fd using /proc/self/fd/. We do not have a workaround dnl for other platforms, so we skip the test there. -AT_SETUP([test unix socket -- long pathname]) +AT_SETUP([test unix socket, long pathname - C]) AT_SKIP_IF([test ! -d /proc/self/fd]) dnl Linux has a 108 byte limit; this is 150 bytes long. longname=012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 @@ -132,6 +132,26 @@ cd $longname AT_CHECK([test-unix-socket ../$longname/socket socket]) AT_CLEANUP +AT_SETUP([test unix socket, short pathname - Python]) +AT_SKIP_IF([test $HAVE_PYTHON = no]) +AT_CHECK([$PYTHON $srcdir/test-unix-socket.py x]) +AT_CLEANUP + +dnl Unix sockets with long names are problematic because the name has to +dnl go in a fixed-length field in struct sockaddr_un. Generally the limit +dnl is about 100 bytes. On Linux, we work around this by indirecting through +dnl a directory fd using /proc/self/fd/. We do not have a workaround +dnl for other platforms, so we skip the test there. +AT_SETUP([test unix socket, long pathname - Python]) +AT_SKIP_IF([test $HAVE_PYTHON = no]) +AT_SKIP_IF([test ! -d /proc/self/fd]) +dnl Linux has a 108 byte limit; this is 150 bytes long. +longname=012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 +mkdir $longname +cd $longname +AT_CHECK([$PYTHON $abs_srcdir/test-unix-socket.py ../$longname/socket socket]) +AT_CLEANUP + AT_SETUP([ovs_assert]) OVS_LOGDIR=`pwd`; export OVS_LOGDIR AT_CHECK([test-util -voff -vfile:info '-vPATTERN:file:%c|%p|%m' --log-file assert || kill -l $?], diff --git a/tests/test-unix-socket.py b/tests/test-unix-socket.py new file mode 100644 index 000000000..5a3f3c0e3 --- /dev/null +++ b/tests/test-unix-socket.py @@ -0,0 +1,54 @@ +# +# Copyright (c) 2010, 2012, 2013 Nicira, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at: +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import signal +import socket +import sys + +import ovs.socket_util + +def main(argv): + if len(argv) not in (2, 3): + sys.stderr.write("usage: %s SOCKETNAME1 [SOCKETNAME2]", argv[0]) + sys.exit(1) + + sockname1 = argv[1] + if len(argv) > 2: + sockname2 = argv[2] + else: + sockname2 = sockname1 + + signal.signal(signal.SIGALRM, signal.SIG_DFL) + signal.alarm(5) + + # Create a listening socket under name 'sockname1'. + error, sock1 = ovs.socket_util.make_unix_socket(socket.SOCK_STREAM, False, + sockname1, None) + if error: + sys.stderr.write("%s: bind failed (%s)" % (sockname1, + os.strerror(error))) + sock1.listen(1) + + # Connect to 'sockname2' (which should be the same file, perhaps under a + # different name). + error, sock2 = ovs.socket_util.make_unix_socket(socket.SOCK_STREAM, False, + None, sockname2) + if error: + sys.stderr.write("%s: connect failed (%s)" % (sockname2, + os.strerror(error))) + +if __name__ == '__main__': + main(sys.argv)