xref: /aosp_15_r20/bionic/tests/getcwd_test.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*8d67ca89SAndroid Build Coastguard Worker 
19*8d67ca89SAndroid Build Coastguard Worker #include <errno.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <limits.h>
21*8d67ca89SAndroid Build Coastguard Worker #include <unistd.h>
22*8d67ca89SAndroid Build Coastguard Worker 
23*8d67ca89SAndroid Build Coastguard Worker #include <android-base/test_utils.h>
24*8d67ca89SAndroid Build Coastguard Worker 
25*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
26*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,auto_full)27*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, auto_full) {
28*8d67ca89SAndroid Build Coastguard Worker   // If we let the library do all the work, everything's fine.
29*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
30*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(nullptr, 0);
31*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd != nullptr);
32*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(0);
33*8d67ca89SAndroid Build Coastguard Worker   ASSERT_GE(strlen(cwd), 1U);
34*8d67ca89SAndroid Build Coastguard Worker   free(cwd);
35*8d67ca89SAndroid Build Coastguard Worker }
36*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,auto_reasonable)37*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, auto_reasonable) {
38*8d67ca89SAndroid Build Coastguard Worker   // If we ask the library to allocate a reasonable buffer, everything's fine.
39*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
40*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(nullptr, PATH_MAX);
41*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd != nullptr);
42*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(0);
43*8d67ca89SAndroid Build Coastguard Worker   ASSERT_GE(strlen(cwd), 1U);
44*8d67ca89SAndroid Build Coastguard Worker   free(cwd);
45*8d67ca89SAndroid Build Coastguard Worker }
46*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,auto_too_small)47*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, auto_too_small) {
48*8d67ca89SAndroid Build Coastguard Worker   // If we ask the library to allocate a too-small buffer, ERANGE.
49*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
50*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(nullptr, 1);
51*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd == nullptr);
52*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(ERANGE);
53*8d67ca89SAndroid Build Coastguard Worker }
54*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,auto_too_large)55*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, auto_too_large) {
56*8d67ca89SAndroid Build Coastguard Worker   SKIP_WITH_HWASAN << "allocation size too large";
57*8d67ca89SAndroid Build Coastguard Worker   // If we ask the library to allocate an unreasonably large buffer, ERANGE.
58*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
59*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(nullptr, static_cast<size_t>(-1));
60*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd == nullptr);
61*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(ENOMEM);
62*8d67ca89SAndroid Build Coastguard Worker }
63*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,manual_too_small)64*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, manual_too_small) {
65*8d67ca89SAndroid Build Coastguard Worker   // If we allocate a too-small buffer, ERANGE.
66*8d67ca89SAndroid Build Coastguard Worker   char tiny_buf[1];
67*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
68*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(tiny_buf, sizeof(tiny_buf));
69*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd == nullptr);
70*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(ERANGE);
71*8d67ca89SAndroid Build Coastguard Worker }
72*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,manual_zero)73*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, manual_zero) {
74*8d67ca89SAndroid Build Coastguard Worker   // If we allocate a zero-length buffer, EINVAL.
75*8d67ca89SAndroid Build Coastguard Worker   char tiny_buf[1];
76*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
77*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(tiny_buf, 0);
78*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd == nullptr);
79*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(EINVAL);
80*8d67ca89SAndroid Build Coastguard Worker }
81*8d67ca89SAndroid Build Coastguard Worker 
TEST(getcwd,manual_path_max)82*8d67ca89SAndroid Build Coastguard Worker TEST(getcwd, manual_path_max) {
83*8d67ca89SAndroid Build Coastguard Worker   char* buf = new char[PATH_MAX];
84*8d67ca89SAndroid Build Coastguard Worker   errno = 0;
85*8d67ca89SAndroid Build Coastguard Worker   char* cwd = getcwd(buf, PATH_MAX);
86*8d67ca89SAndroid Build Coastguard Worker   ASSERT_TRUE(cwd == buf);
87*8d67ca89SAndroid Build Coastguard Worker   ASSERT_ERRNO(0);
88*8d67ca89SAndroid Build Coastguard Worker   ASSERT_GE(strlen(cwd), 1U);
89*8d67ca89SAndroid Build Coastguard Worker   delete[] cwd;
90*8d67ca89SAndroid Build Coastguard Worker }
91