blob: e4becaa86fe57d55eab304f694b2819c3b443cfb [file] [log] [blame]
Elliott Hughes416d7dd2014-08-18 17:28:32 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Elliott Hughes416d7dd2014-08-18 17:28:32 -070017#include <errno.h>
18#include <gtest/gtest.h>
19
Colin Cross4408b8a2021-07-29 22:45:34 -070020// Defined in string_posix_strerror_r_wrapper.cpp as a wrapper around the posix
21// strerror_r to work around an incompatibility between libc++ (required by
22// gtest) and !_GNU_SOURCE.
23int posix_strerror_r(int errnum, char* buf, size_t buflen);
24
Elliott Hughes416d7dd2014-08-18 17:28:32 -070025TEST(string, posix_strerror_r) {
26 char buf[256];
27
28 // Valid.
Colin Cross4408b8a2021-07-29 22:45:34 -070029 ASSERT_EQ(0, posix_strerror_r(0, buf, sizeof(buf)));
Colin Cross4c5595c2021-08-16 15:51:59 -070030#if defined(ANDROID_HOST_MUSL)
Colin Cross7da20342021-07-28 11:18:11 -070031 ASSERT_STREQ("No error information", buf);
32#else
Elliott Hughes416d7dd2014-08-18 17:28:32 -070033 ASSERT_STREQ("Success", buf);
Colin Cross7da20342021-07-28 11:18:11 -070034#endif
Colin Cross4408b8a2021-07-29 22:45:34 -070035 ASSERT_EQ(0, posix_strerror_r(1, buf, sizeof(buf)));
Steven Moreland4ef83d62021-10-07 00:19:18 +000036 ASSERT_STREQ("Operation not permitted", buf);
Elliott Hughes416d7dd2014-08-18 17:28:32 -070037
Colin Cross4c5595c2021-08-16 15:51:59 -070038#if defined(__BIONIC__) || defined(ANDROID_HOST_MUSL)
Elliott Hughes416d7dd2014-08-18 17:28:32 -070039 // Invalid.
Colin Cross4408b8a2021-07-29 22:45:34 -070040 ASSERT_EQ(0, posix_strerror_r(-1, buf, sizeof(buf)));
Colin Cross7da20342021-07-28 11:18:11 -070041# if defined(__BIONIC__)
Elliott Hughes416d7dd2014-08-18 17:28:32 -070042 ASSERT_STREQ("Unknown error -1", buf);
Colin Cross7da20342021-07-28 11:18:11 -070043# else
44 ASSERT_STREQ("No error information", buf);
45# endif
Colin Cross4408b8a2021-07-29 22:45:34 -070046 ASSERT_EQ(0, posix_strerror_r(1234, buf, sizeof(buf)));
Colin Cross7da20342021-07-28 11:18:11 -070047# if defined(__BIONIC__)
Elliott Hughes416d7dd2014-08-18 17:28:32 -070048 ASSERT_STREQ("Unknown error 1234", buf);
Colin Cross7da20342021-07-28 11:18:11 -070049# else
50 ASSERT_STREQ("No error information", buf);
51# endif
Colin Cross4408b8a2021-07-29 22:45:34 -070052#else
53 // glibc returns EINVAL for unknown errors
54 ASSERT_EQ(EINVAL, posix_strerror_r(-1, buf, sizeof(buf)));
55 ASSERT_EQ(EINVAL, posix_strerror_r(1234, buf, sizeof(buf)));
56#endif
Elliott Hughes416d7dd2014-08-18 17:28:32 -070057
58 // Buffer too small.
59 errno = 0;
60 memset(buf, 0, sizeof(buf));
Colin Cross4408b8a2021-07-29 22:45:34 -070061 ASSERT_EQ(ERANGE, posix_strerror_r(EPERM, buf, 2));
Colin Cross695af0d2021-07-30 09:36:57 -070062 ASSERT_STREQ("O", buf);
63 // POSIX strerror_r returns an error without updating errno.
64 ASSERT_EQ(0, errno);
Elliott Hughes416d7dd2014-08-18 17:28:32 -070065}