diff -r d3e072083ff3 Lib/test/support.py --- a/Lib/test/support.py Thu Sep 15 15:09:23 2011 -0700 +++ b/Lib/test/support.py Sat Sep 17 13:03:09 2011 +0200 @@ -44,8 +44,8 @@ "Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", "get_original_stdout", "unload", "unlink", "rmtree", "forget", - "is_resource_enabled", "requires", "requires_linux_version", - "requires_mac_ver", "find_unused_port", "bind_port", + "is_resource_enabled", "requires", "requires_freebsd_version", + "requires_linux_version", "requires_mac_ver", "find_unused_port", "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD", "temp_cwd", "findfile", "create_empty_file", "sortdict", "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport", "EnvironmentVarGuard", "TransientResource", @@ -300,6 +300,34 @@ msg = "Use of the %r resource not enabled" % resource raise ResourceDenied(msg) +def requires_freebsd_version(*min_version): + """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is + less than min_version. + + For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD + version is less than 7.2. + """ + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kw): + if platform.system() == 'FreeBSD': + version_txt = platform.release().split('-', 1)[0] + try: + version = tuple(map(int, version_txt.split('.'))) + except ValueError: + pass + else: + if version < min_version: + min_version_txt = '.'.join(map(str, min_version)) + raise unittest.SkipTest( + "FreeBSD version %s or higher required, not %s" + % (min_version_txt, version_txt)) + return func(*args, **kw) + wrapper.min_version = min_version + return wrapper + return decorator + + def requires_linux_version(*min_version): """Decorator raising SkipTest if the OS is Linux and the kernel version is less than min_version. diff -r d3e072083ff3 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Thu Sep 15 15:09:23 2011 -0700 +++ b/Lib/test/test_socket.py Sat Sep 17 13:03:09 2011 +0200 @@ -1656,6 +1656,9 @@ def _testRecvmsgShorter(self): self.sendToServer(MSG) + # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated + # datagram is received (issue #XXX). + @support.requires_freebsd_version(8) def testRecvmsgTrunc(self): # Receive part of message, check for truncation indicators. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, @@ -1665,6 +1668,7 @@ self.assertEqual(ancdata, []) self.checkFlags(flags, eor=False) + @support.requires_freebsd_version(8) def _testRecvmsgTrunc(self): self.sendToServer(MSG)