Compare commits

..

16 Commits

Author SHA1 Message Date
Peter Dimov
9b8cb7f1f6 Fix wrong null character stripping for FormatMessage (Nikita Kniazev) 2019-03-24 01:59:23 +02:00
Peter Dimov
90b2356015 system_error_test: Increase tested messages range (Nikita Kniazev) 2019-03-24 00:24:05 +02:00
Peter Dimov
1c36a72b79 Merge pull request #40 from Kojoley/system_error_test-mingw-non-en
system_error_test: Enable locale query on MinGW-w64
2019-03-17 11:28:45 +02:00
Nikita Kniazev
7947d0ed0d system_error_test: Reenable locale query on MinGW and Cygwin 2019-03-17 01:53:37 +03:00
Peter Dimov
72d3e96c73 Disable English-dependent test; fixes #39. 2019-03-16 19:51:21 +02:00
Peter Dimov
ca882f286c Skip system_category_test_utf8; comparing against FormatMessageA isn't going to work. Fixes #38. 2019-03-16 19:44:43 +02:00
Peter Dimov
df78f08bd2 Merge pull request #37 from Kojoley/patch-1
system_category_test: Increase buffer size
2019-03-16 19:02:47 +02:00
Nikita Kniazev
f878f41fe7 system_category_test: Increase buffer size
The message for 5810 error does not fit into buffer on non-English locales.
2019-03-16 01:55:18 +03:00
Peter Dimov
0134441a6e Add warnings_test.cpp; disable -Wnon-virtual-dtor on g++ < 4.6 2019-03-04 19:23:32 +02:00
Peter Dimov
c705bab504 #pragma GCC diagnostic push/pop requires gcc 4.6 2019-03-04 17:38:52 +02:00
Peter Dimov
af1dc84160 Disable -Wnon-virtual-dtor 2019-03-04 16:35:35 +02:00
Peter Dimov
2d37749d00 Enable -Wnon-virtual-dtor in warnings_test 2019-03-04 15:40:03 +02:00
Peter Dimov
3164b387a5 Revert operator bool() to its pre-failed value() != 0 meaning 2019-02-27 21:10:57 +02:00
Peter Dimov
9753cf7668 Update test/Jamfile 2019-02-27 06:23:16 +02:00
Peter Dimov
ef7c34fc30 Remove use of _alloca 2019-02-26 17:22:58 +02:00
Peter Dimov
f726c068c3 Add UTF-8 tests 2019-02-26 16:42:47 +02:00
9 changed files with 140 additions and 140 deletions

View File

@@ -626,7 +626,7 @@ constexpr explicit operator bool() const noexcept;
[none]
* {blank}
+
Returns: :: `failed()`.
Returns: :: `val_ != 0`.
```
operator std::error_code() const;
@@ -789,7 +789,7 @@ constexpr explicit operator bool() const noexcept;
[none]
* {blank}
+
Returns: :: `failed()`.
Returns: :: `val_ != 0`.
```
operator std::error_condition() const;

View File

@@ -81,44 +81,60 @@ inline char const * system_category_message_win32( int ev, char * buffer, std::s
return buffer;
}
#if defined(__GNUC__)
# define BOOST_SYSTEM_ALLOCA __builtin_alloca
#else
# define BOOST_SYSTEM_ALLOCA _alloca
boost::winapi::UINT_ const code_page = message_cp_win32();
int r = 0;
#if !defined(BOOST_NO_ANSI_APIS)
if( code_page == boost::winapi::CP_ACP_ )
{
using namespace boost::winapi;
DWORD_ retval = boost::winapi::FormatMessageA(
FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL,
ev,
MAKELANGID_( LANG_NEUTRAL_, SUBLANG_DEFAULT_ ), // Default language
buffer,
static_cast<DWORD_>( len ),
NULL
);
r = static_cast<int>( retval );
}
else
#endif
wchar_t * wbuffer = static_cast<wchar_t*>( BOOST_SYSTEM_ALLOCA( len * sizeof( wchar_t ) ) );
#undef BOOST_SYSTEM_ALLOCA
using namespace boost::winapi;
DWORD_ retval = boost::winapi::FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL,
ev,
MAKELANGID_( LANG_NEUTRAL_, SUBLANG_DEFAULT_ ), // Default language
wbuffer,
static_cast<DWORD_>( len ),
NULL
);
if( retval == 0 )
{
return unknown_message_win32( ev, buffer, len );
using namespace boost::winapi;
wchar_t * lpMsgBuf = 0;
DWORD_ retval = boost::winapi::FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER_ | FORMAT_MESSAGE_FROM_SYSTEM_ | FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL,
ev,
MAKELANGID_( LANG_NEUTRAL_, SUBLANG_DEFAULT_ ), // Default language
(LPWSTR_) &lpMsgBuf,
0,
NULL
);
if( retval != 0 )
{
r = boost::winapi::WideCharToMultiByte( code_page, 0, lpMsgBuf, -1, buffer, static_cast<int>( len ), NULL, NULL );
boost::winapi::LocalFree( lpMsgBuf );
if ( r != 0 ) --r; // exclude null terminator
}
}
UINT_ const code_page = message_cp_win32();
int r = boost::winapi::WideCharToMultiByte( code_page, 0, wbuffer, -1, buffer, static_cast<int>( len ), NULL, NULL );
if( r == 0 )
{
return unknown_message_win32( ev, buffer, len );
}
--r; // exclude null terminator
while( r > 0 && ( buffer[ r-1 ] == '\n' || buffer[ r-1 ] == '\r' ) )
{
buffer[ --r ] = 0;

View File

@@ -155,6 +155,10 @@ template<> struct is_error_condition_enum<errc::errc_t>
};
// class error_category
#if ( defined( BOOST_GCC ) && BOOST_GCC >= 40600 ) || defined( BOOST_CLANG )
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif
#ifdef BOOST_MSVC
#pragma warning( push )
@@ -314,6 +318,10 @@ public:
} // namespace detail
#if ( defined( BOOST_GCC ) && BOOST_GCC >= 40600 ) || defined( BOOST_CLANG )
#pragma GCC diagnostic pop
#endif
// generic_category(), system_category()
#if defined(BOOST_SYSTEM_HAS_CONSTEXPR)
@@ -499,7 +507,7 @@ public:
BOOST_SYSTEM_CONSTEXPR explicit operator bool() const BOOST_NOEXCEPT // true if error
{
return failed_;
return val_ != 0;
}
#else
@@ -509,12 +517,12 @@ public:
BOOST_SYSTEM_CONSTEXPR operator unspecified_bool_type() const BOOST_NOEXCEPT // true if error
{
return failed_? unspecified_bool_true: 0;
return val_ != 0? unspecified_bool_true: 0;
}
BOOST_SYSTEM_CONSTEXPR bool operator!() const BOOST_NOEXCEPT // true if no error
{
return !failed_;
return val_ == 0;
}
#endif
@@ -640,7 +648,7 @@ public:
BOOST_SYSTEM_CONSTEXPR explicit operator bool() const BOOST_NOEXCEPT // true if error
{
return failed_;
return val_ != 0;
}
#else
@@ -650,12 +658,12 @@ public:
BOOST_SYSTEM_CONSTEXPR operator unspecified_bool_type() const BOOST_NOEXCEPT // true if error
{
return failed_? unspecified_bool_true: 0;
return val_ != 0? unspecified_bool_true: 0;
}
BOOST_SYSTEM_CONSTEXPR bool operator!() const BOOST_NOEXCEPT // true if no error
{
return !failed_;
return val_ == 0;
}
#endif

View File

@@ -1,7 +1,7 @@
# Boost System Library test Jamfile
# Copyright Beman Dawes 2003, 2006
# Copyright 2017, 2018 Peter Dimov
# Copyright 2017-2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt
@@ -9,109 +9,37 @@
# See library home page at http://www.boost.org/libs/system
import testing ;
import os ;
project
: requirements
<library>/boost/system//boost_system
;
lib throw_test : throw_test.cpp : <link>shared:<define>THROW_DYN_LINK=1 ;
lib throw_test : throw_test.cpp : <link>shared:<define>THROW_DYN_LINK=1 ;
lib single_instance_lib1 : single_instance_1.cpp : <link>shared:<define>SINGLE_INSTANCE_DYN_LINK ;
lib single_instance_lib2 : single_instance_2.cpp : <link>shared:<define>SINGLE_INSTANCE_DYN_LINK ;
lib single_instance_lib1 : single_instance_1.cpp : <link>shared:<define>SINGLE_INSTANCE_DYN_LINK ;
lib single_instance_lib2 : single_instance_2.cpp : <link>shared:<define>SINGLE_INSTANCE_DYN_LINK ;
rule cxx03 ( properties * )
{
local result ;
if <toolset>gcc in $(properties)
{
result = <cxxflags>-std=c++98 ; # 4.4 has no 03
}
else if <toolset>clang in $(properties)
{
result = <cxxflags>-std=c++03 ;
}
else
{
result = <build>no ;
}
return $(result) ;
}
rule cxx11 ( properties * )
{
local result ;
if <toolset>gcc in $(properties)
{
result = <cxxflags>-std=c++0x ; # 4.6 has no 11
}
else if <toolset>clang in $(properties)
{
result = <cxxflags>-std=c++11 ;
}
else
{
result = <build>no ;
}
return $(result) ;
}
rule system-run- ( sources + )
{
local result ;
result += [ run $(sources) : : : <link>static : $(sources[1]:B)_static ] ;
result += [ run $(sources) : : : <link>shared : $(sources[1]:B)_shared ] ;
result += [ run $(sources) : : : -<library>/boost/system//boost_system <define>BOOST_ERROR_CODE_HEADER_ONLY : $(sources[1]:B)_header ] ;
return $(result) ;
}
if [ os.environ UBSAN ]
rule system-run ( sources + )
{
rule system-run ( sources + )
{
# The 03/11 tests are ODR violations, no point running them under -fsanitize=undefined
return [ system-run- $(sources) ] ;
}
}
else
{
rule system-run ( sources + )
{
local result = [ system-run- $(sources) ] ;
local result ;
# Test a source file built with -std=c++03 linked with a System library built without -std=c++03
result += [ run $(sources) : : : <link>static <conditional>@cxx03 : $(sources[1]:B)_static_03 ] ;
result += [ run $(sources) : : : <link>shared <conditional>@cxx03 : $(sources[1]:B)_shared_03 ] ;
result += [ run $(sources) ] ;
result += [ run $(sources) : : : <library>/boost/system//boost_system <link>static : $(sources[1]:B)_static ] ;
result += [ run $(sources) : : : <library>/boost/system//boost_system <link>shared : $(sources[1]:B)_shared ] ;
result += [ run $(sources) : : : <define>BOOST_NO_ANSI_APIS : $(sources[1]:B)_no_ansi ] ;
result += [ run $(sources) : : : <define>BOOST_SYSTEM_USE_UTF8 : $(sources[1]:B)_utf8 ] ;
# Test a source file built with -std=c++11 linked with a System library built without -std=c++11
result += [ run $(sources) : : : <link>static <conditional>@cxx11 : $(sources[1]:B)_static_11 ] ;
result += [ run $(sources) : : : <link>shared <conditional>@cxx11 : $(sources[1]:B)_shared_11 ] ;
return $(result) ;
}
return $(result) ;
}
system-run error_code_test.cpp ;
system-run error_code_user_test.cpp ;
system-run system_error_test.cpp ;
run dynamic_link_test.cpp throw_test : : : <link>shared : throw_test_shared ;
run dynamic_link_test.cpp throw_test : : : <link>shared : throw_test_shared ;
system-run initialization_test.cpp ;
run header_only_test.cpp : : : -<library>/boost/system//boost_system ;
run header_only_test.cpp : : : -<library>/boost/system//boost_system <define>BOOST_NO_ANSI_APIS : header_only_test_no_ansi ;
system-run header_only_test.cpp ;
run config_test.cpp : : : <test-info>always_show_run_output ;
system-run- std_interop_test.cpp ;
system-run std_interop_test.cpp ;
system-run std_mismatch_test.cpp ;
system-run single_instance_test.cpp single_instance_1.cpp single_instance_2.cpp ;
@@ -120,7 +48,7 @@ run single_instance_test.cpp single_instance_lib1 single_instance_lib2 : : : <li
system-run before_main_test.cpp ;
run-fail throws_assign_fail.cpp ;
system-run- constexpr_test.cpp ;
system-run constexpr_test.cpp ;
system-run win32_hresult_test.cpp ;
system-run error_category_test.cpp ;
@@ -128,9 +56,9 @@ system-run generic_category_test.cpp ;
system-run system_category_test.cpp ;
system-run after_main_test.cpp ;
system-run failed_test.cpp ;
system-run- failed_constexpr_test.cpp ;
system-run failed_constexpr_test.cpp ;
# Quick (CI) test
run quick.cpp ;
run quick.cpp : : : <warnings>all <warnings-as-errors>on : warnings_test ;
run warnings_test.cpp : : : <warnings>all <warnings-as-errors>on <toolset>gcc:<cxxflags>-Wnon-virtual-dtor <toolset>clang:<cxxflags>-Wnon-virtual-dtor ;

View File

@@ -197,7 +197,8 @@ int main( int, char ** )
#if defined(BOOST_WINDOWS_API)
// Borland appends newline, so just check text
BOOST_TEST( ec.message().substr(0,13) == "Unknown error" );
BOOST_TEST( ec_0_system.message().substr(0,36) == "The operation completed successfully" );
// Fails when the language isn't US English
// BOOST_TEST( ec_0_system.message().substr(0,36) == "The operation completed successfully" );
#elif defined(linux) || defined(__linux) || defined(__linux__)
// Linux appends value to message as unsigned, so it varies with # of bits
BOOST_TEST( ec.message().substr(0,13) == "Unknown error" );

View File

@@ -123,13 +123,13 @@ template<class Ec> void test()
{
Ec ec( 0, http_category() );
TEST_FAILED( ec );
BOOST_TEST( ec.failed() );
ec.assign( 200, http_category() );
TEST_NOT_FAILED( ec );
BOOST_TEST( !ec.failed() );
ec = Ec( 404, http_category() );
TEST_FAILED( ec );
BOOST_TEST( ec.failed() );
}
}

View File

@@ -18,6 +18,16 @@
//
#if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8)
#include <boost/config/pragma_message.hpp>
BOOST_PRAGMA_MESSAGE( "Skipping test due to BOOST_WINDOWS_API && BOOST_SYSTEM_USE_UTF8" )
int main() {}
#else
#if defined(BOOST_WINDOWS_API)
#include <windows.h>
@@ -90,7 +100,7 @@ static void test_message( sys::error_category const & cat, int ev )
{
BOOST_TEST_EQ( cat.message( ev ), sys_strerror( ev ) );
char buffer[ 2048 ]; // yes, really
char buffer[ 4096 ]; // yes, really
BOOST_TEST_CSTR_EQ( cat.message( ev, buffer, sizeof( buffer ) ), sys_strerror( ev ).c_str() );
}
@@ -100,17 +110,12 @@ int main()
// message
for( int i = -2; i < 1024; ++i )
{
test_message( cat, i );
}
test_message( cat, 5810 );
for( int i = 10000; i < 11032; ++i )
for( int i = -2; i < 16000; ++i )
{
test_message( cat, i );
}
return boost::report_errors();
}
#endif // #if defined(BOOST_WINDOWS_API) && defined(BOOST_SYSTEM_USE_UTF8)

View File

@@ -37,7 +37,7 @@ namespace
BOOST_TEST( ex.code().category() == system_category() );
# ifdef BOOST_WINDOWS_API
LANGID language_id;
# if !defined(__MINGW32__) && !defined(__CYGWIN__) && !BOOST_PLAT_WINDOWS_RUNTIME
# if !BOOST_PLAT_WINDOWS_RUNTIME
language_id = ::GetUserDefaultUILanguage();
# else
language_id = 0x0409; // Assume US English

42
test/warnings_test.cpp Normal file
View File

@@ -0,0 +1,42 @@
// Copyright 2017, 2019 Peter Dimov.
//
// Distributed under the Boost Software License, Version 1.0.
//
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
// See library home page at http://www.boost.org/libs/system
#include <boost/config.hpp>
#if defined( BOOST_GCC ) && BOOST_GCC < 40600
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
#endif
#include <boost/system/error_code.hpp>
#include <boost/core/lightweight_test.hpp>
#include <cerrno>
int main()
{
boost::system::error_category const & bt = boost::system::generic_category();
int ev = ENOENT;
boost::system::error_code bc( ev, bt );
BOOST_TEST_EQ( bc.value(), ev );
BOOST_TEST_EQ( &bc.category(), &bt );
boost::system::error_condition bn = bt.default_error_condition( ev );
BOOST_TEST_EQ( bn.value(), ev );
BOOST_TEST_EQ( &bn.category(), &bt );
BOOST_TEST( bt.equivalent( ev, bn ) );
BOOST_TEST( bc == bn );
return boost::report_errors();
}