diff options
author | Kevin Pulo <kevin.pulo@mongodb.com> | 2019-05-08 07:13:13 +0000 |
---|---|---|
committer | Kevin Pulo <kevin.pulo@mongodb.com> | 2019-05-29 05:44:11 +0000 |
commit | b6b3e099b3ed0c7e43b133932e021106c59f2249 (patch) | |
tree | b209fb18813b70f09f6472c3a45a0a72b6dc8a7e /src | |
parent | 441714bc4c70699950f3ac51a5cac41dcd413eaa (diff) | |
download | mongo-b6b3e099b3ed0c7e43b133932e021106c59f2249.tar.gz |
SERVER-41047 errnoWithDescription only check __ANDROID_API__ if it's defined
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/unittest/unittest.h | 12 | ||||
-rw-r--r-- | src/mongo/util/SConscript | 7 | ||||
-rw-r--r-- | src/mongo/util/errno_util.cpp | 3 | ||||
-rw-r--r-- | src/mongo/util/errno_util_test.cpp | 73 |
4 files changed, 94 insertions, 1 deletions
diff --git a/src/mongo/unittest/unittest.h b/src/mongo/unittest/unittest.h index 415a0e697fd..15be3f3587a 100644 --- a/src/mongo/unittest/unittest.h +++ b/src/mongo/unittest/unittest.h @@ -248,6 +248,18 @@ } \ } while (false) +#define ASSERT_STRING_OMITS(BIG_STRING, OMITS) \ + do { \ + std::string myString(BIG_STRING); \ + std::string myOmits(OMITS); \ + if (myString.find(myOmits) != std::string::npos) { \ + ::mongo::str::stream err; \ + err << "Did not expect to find " #OMITS " (" << myOmits << ") in " #BIG_STRING " (" \ + << myString << ")"; \ + ::mongo::unittest::TestAssertionFailure(__FILE__, __LINE__, err).stream(); \ + } \ + } while (false) + /** * Construct a single test, named "TEST_NAME" within the test case "CASE_NAME". * diff --git a/src/mongo/util/SConscript b/src/mongo/util/SConscript index 6c9c2b5bc2b..59007e2c9f4 100644 --- a/src/mongo/util/SConscript +++ b/src/mongo/util/SConscript @@ -765,6 +765,13 @@ env.CppUnitTest( ], ) +env.CppUnitTest( + target='errno_util_test', + source=[ + 'errno_util_test.cpp', + ], +) + env.Benchmark( target='decimal_counter_bm', source=[ diff --git a/src/mongo/util/errno_util.cpp b/src/mongo/util/errno_util.cpp index eb9359c0e15..564c0071ead 100644 --- a/src/mongo/util/errno_util.cpp +++ b/src/mongo/util/errno_util.cpp @@ -61,7 +61,8 @@ std::string errnoWithDescription(int errNumber) { char buf[kBuflen]; char* msg{nullptr}; -#if defined(__GNUC__) && defined(_GNU_SOURCE) && !(__ANDROID_API__ <= 22) && !defined(EMSCRIPTEN) +#if defined(__GNUC__) && defined(_GNU_SOURCE) && \ + (!defined(__ANDROID_API__) || !(__ANDROID_API__ <= 22)) && !defined(EMSCRIPTEN) msg = strerror_r(errNumber, buf, kBuflen); #elif defined(_WIN32) diff --git a/src/mongo/util/errno_util_test.cpp b/src/mongo/util/errno_util_test.cpp new file mode 100644 index 00000000000..e39a8b66175 --- /dev/null +++ b/src/mongo/util/errno_util_test.cpp @@ -0,0 +1,73 @@ +/** + * Copyright (C) 2019-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * 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 + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#include "mongo/platform/basic.h" + +#if !defined(_WIN32) +#include <errno.h> // For the E* error codes +#include <locale.h> // For setlocale() +#endif + +#include "mongo/unittest/unittest.h" +#include "mongo/util/errno_util.h" + +namespace { +using namespace mongo; + +const std::string kUnknownError = "Unknown error"; + +TEST(ErrnoWithDescription, CommonErrors) { +#if defined(_WIN32) + // Force error messages to be returned in en-US. + LANGID lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); + ASSERT_EQ(SetThreadUILanguage(lang), lang); + + ASSERT_STRING_OMITS(errnoWithDescription(ERROR_SUCCESS), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ERROR_FILE_NOT_FOUND), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ERROR_PATH_NOT_FOUND), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ERROR_TOO_MANY_OPEN_FILES), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ERROR_ACCESS_DENIED), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ERROR_PRIVILEGE_NOT_HELD), kUnknownError); +#else + // Force the minimal locale to ensure the standard error message localization text. + ASSERT(setlocale(LC_MESSAGES, "C")); + + ASSERT_STRING_OMITS(errnoWithDescription(EPERM), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ENOENT), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(EIO), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(EBADF), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(ENOMEM), kUnknownError); + ASSERT_STRING_OMITS(errnoWithDescription(EACCES), kUnknownError); +#endif + + // INT_MAX is currently invalid. In the unlikely event that it becomes valid, then this check + // will have to be removed or adjusted. + ASSERT_STRING_CONTAINS(errnoWithDescription(INT_MAX), kUnknownError); +} +} // namespace |