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