blob: 808f963f8554849b88580ec45fbeb9ed392f8594 [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>
Steven Morelandc3060de2021-09-22 11:06:57 -070018
19#include <android-base/test_utils.h>
Elliott Hughes416d7dd2014-08-18 17:28:32 -070020#include <gtest/gtest.h>
21
Colin Cross4408b8a2021-07-29 22:45:34 -070022// Defined in string_posix_strerror_r_wrapper.cpp as a wrapper around the posix
23// strerror_r to work around an incompatibility between libc++ (required by
24// gtest) and !_GNU_SOURCE.
25int posix_strerror_r(int errnum, char* buf, size_t buflen);
26
Elliott Hughes416d7dd2014-08-18 17:28:32 -070027TEST(string, posix_strerror_r) {
28 char buf[256];
29
30 // Valid.
Colin Cross4408b8a2021-07-29 22:45:34 -070031 ASSERT_EQ(0, posix_strerror_r(0, buf, sizeof(buf)));
Colin Cross4c5595c2021-08-16 15:51:59 -070032#if defined(ANDROID_HOST_MUSL)
Colin Cross7da20342021-07-28 11:18:11 -070033 ASSERT_STREQ("No error information", buf);
34#else
Elliott Hughes416d7dd2014-08-18 17:28:32 -070035 ASSERT_STREQ("Success", buf);
Colin Cross7da20342021-07-28 11:18:11 -070036#endif
Colin Cross4408b8a2021-07-29 22:45:34 -070037 ASSERT_EQ(0, posix_strerror_r(1, buf, sizeof(buf)));
Steven Morelandc3060de2021-09-22 11:06:57 -070038 ASSERT_MATCH(buf, "Operation not permitted.*");
Elliott Hughes416d7dd2014-08-18 17:28:32 -070039
Colin Cross4c5595c2021-08-16 15:51:59 -070040#if defined(__BIONIC__) || defined(ANDROID_HOST_MUSL)
Elliott Hughes416d7dd2014-08-18 17:28:32 -070041 // Invalid.
Colin Cross4408b8a2021-07-29 22:45:34 -070042 ASSERT_EQ(0, posix_strerror_r(-1, buf, sizeof(buf)));
Colin Cross7da20342021-07-28 11:18:11 -070043# if defined(__BIONIC__)
Elliott Hughes416d7dd2014-08-18 17:28:32 -070044 ASSERT_STREQ("Unknown error -1", buf);
Colin Cross7da20342021-07-28 11:18:11 -070045# else
46 ASSERT_STREQ("No error information", buf);
47# endif
Colin Cross4408b8a2021-07-29 22:45:34 -070048 ASSERT_EQ(0, posix_strerror_r(1234, buf, sizeof(buf)));
Colin Cross7da20342021-07-28 11:18:11 -070049# if defined(__BIONIC__)
Elliott Hughes416d7dd2014-08-18 17:28:32 -070050 ASSERT_STREQ("Unknown error 1234", buf);
Colin Cross7da20342021-07-28 11:18:11 -070051# else
52 ASSERT_STREQ("No error information", buf);
53# endif
Colin Cross4408b8a2021-07-29 22:45:34 -070054#else
55 // glibc returns EINVAL for unknown errors
56 ASSERT_EQ(EINVAL, posix_strerror_r(-1, buf, sizeof(buf)));
57 ASSERT_EQ(EINVAL, posix_strerror_r(1234, buf, sizeof(buf)));
58#endif
Elliott Hughes416d7dd2014-08-18 17:28:32 -070059
60 // Buffer too small.
61 errno = 0;
62 memset(buf, 0, sizeof(buf));
Colin Cross4408b8a2021-07-29 22:45:34 -070063 ASSERT_EQ(ERANGE, posix_strerror_r(EPERM, buf, 2));
Colin Cross695af0d2021-07-30 09:36:57 -070064 ASSERT_STREQ("O", buf);
65 // POSIX strerror_r returns an error without updating errno.
66 ASSERT_EQ(0, errno);
Elliott Hughes416d7dd2014-08-18 17:28:32 -070067}