summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin Pulo <kevin.pulo@mongodb.com>2019-05-08 07:13:13 +0000
committerKevin Pulo <kevin.pulo@mongodb.com>2019-05-29 05:44:11 +0000
commitb6b3e099b3ed0c7e43b133932e021106c59f2249 (patch)
treeb209fb18813b70f09f6472c3a45a0a72b6dc8a7e /src
parent441714bc4c70699950f3ac51a5cac41dcd413eaa (diff)
downloadmongo-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.h12
-rw-r--r--src/mongo/util/SConscript7
-rw-r--r--src/mongo/util/errno_util.cpp3
-rw-r--r--src/mongo/util/errno_util_test.cpp73
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