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 <errno.h>
18*8d67ca89SAndroid Build Coastguard Worker #include <fcntl.h>
19*8d67ca89SAndroid Build Coastguard Worker #include <libgen.h>
20*8d67ca89SAndroid Build Coastguard Worker #include <limits.h>
21*8d67ca89SAndroid Build Coastguard Worker #include <math.h>
22*8d67ca89SAndroid Build Coastguard Worker #include <pthread.h>
23*8d67ca89SAndroid Build Coastguard Worker #include <stdint.h>
24*8d67ca89SAndroid Build Coastguard Worker #include <stdlib.h>
25*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
26*8d67ca89SAndroid Build Coastguard Worker #include <sys/types.h>
27*8d67ca89SAndroid Build Coastguard Worker #include <sys/wait.h>
28*8d67ca89SAndroid Build Coastguard Worker #include <unistd.h>
29*8d67ca89SAndroid Build Coastguard Worker
30*8d67ca89SAndroid Build Coastguard Worker #include <limits>
31*8d67ca89SAndroid Build Coastguard Worker #include <string>
32*8d67ca89SAndroid Build Coastguard Worker #include <thread>
33*8d67ca89SAndroid Build Coastguard Worker
34*8d67ca89SAndroid Build Coastguard Worker #include <android-base/file.h>
35*8d67ca89SAndroid Build Coastguard Worker #include <android-base/macros.h>
36*8d67ca89SAndroid Build Coastguard Worker #include <android-base/silent_death_test.h>
37*8d67ca89SAndroid Build Coastguard Worker #include <android-base/test_utils.h>
38*8d67ca89SAndroid Build Coastguard Worker #include <gtest/gtest.h>
39*8d67ca89SAndroid Build Coastguard Worker
40*8d67ca89SAndroid Build Coastguard Worker #include "math_data_test.h"
41*8d67ca89SAndroid Build Coastguard Worker #include "utils.h"
42*8d67ca89SAndroid Build Coastguard Worker
43*8d67ca89SAndroid Build Coastguard Worker using namespace std::string_literals;
44*8d67ca89SAndroid Build Coastguard Worker
45*8d67ca89SAndroid Build Coastguard Worker template <typename T = int (*)(char*)>
46*8d67ca89SAndroid Build Coastguard Worker class GenericTemporaryFile {
47*8d67ca89SAndroid Build Coastguard Worker public:
GenericTemporaryFile(T mk_fn=mkstemp)48*8d67ca89SAndroid Build Coastguard Worker explicit GenericTemporaryFile(T mk_fn = mkstemp) : mk_fn_(mk_fn) {
49*8d67ca89SAndroid Build Coastguard Worker // Since we might be running on the host or the target, and if we're
50*8d67ca89SAndroid Build Coastguard Worker // running on the host we might be running under bionic or glibc,
51*8d67ca89SAndroid Build Coastguard Worker // let's just try both possible temporary directories and take the
52*8d67ca89SAndroid Build Coastguard Worker // first one that works.
53*8d67ca89SAndroid Build Coastguard Worker init("/data/local/tmp");
54*8d67ca89SAndroid Build Coastguard Worker if (fd == -1) {
55*8d67ca89SAndroid Build Coastguard Worker init("/tmp");
56*8d67ca89SAndroid Build Coastguard Worker }
57*8d67ca89SAndroid Build Coastguard Worker }
58*8d67ca89SAndroid Build Coastguard Worker
~GenericTemporaryFile()59*8d67ca89SAndroid Build Coastguard Worker ~GenericTemporaryFile() {
60*8d67ca89SAndroid Build Coastguard Worker close(fd);
61*8d67ca89SAndroid Build Coastguard Worker unlink(path);
62*8d67ca89SAndroid Build Coastguard Worker }
63*8d67ca89SAndroid Build Coastguard Worker
64*8d67ca89SAndroid Build Coastguard Worker int fd;
65*8d67ca89SAndroid Build Coastguard Worker char path[1024];
66*8d67ca89SAndroid Build Coastguard Worker
67*8d67ca89SAndroid Build Coastguard Worker private:
68*8d67ca89SAndroid Build Coastguard Worker T mk_fn_;
69*8d67ca89SAndroid Build Coastguard Worker
init(const char * tmp_dir)70*8d67ca89SAndroid Build Coastguard Worker void init(const char* tmp_dir) {
71*8d67ca89SAndroid Build Coastguard Worker snprintf(path, sizeof(path), "%s/TemporaryFile-XXXXXX", tmp_dir);
72*8d67ca89SAndroid Build Coastguard Worker fd = mk_fn_(path);
73*8d67ca89SAndroid Build Coastguard Worker }
74*8d67ca89SAndroid Build Coastguard Worker
75*8d67ca89SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(GenericTemporaryFile);
76*8d67ca89SAndroid Build Coastguard Worker };
77*8d67ca89SAndroid Build Coastguard Worker
78*8d67ca89SAndroid Build Coastguard Worker typedef GenericTemporaryFile<> MyTemporaryFile;
79*8d67ca89SAndroid Build Coastguard Worker
80*8d67ca89SAndroid Build Coastguard Worker // The random number generator tests all set the seed, get four values, reset the seed and check
81*8d67ca89SAndroid Build Coastguard Worker // that they get the first two values repeated, and then reset the seed and check two more values
82*8d67ca89SAndroid Build Coastguard Worker // to rule out the possibility that we're just going round a cycle of four values.
83*8d67ca89SAndroid Build Coastguard Worker // TODO: factor this out.
84*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,drand48)85*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, drand48) {
86*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
87*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.65619299195623526, drand48());
88*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.18522597229772941, drand48());
89*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.42015087072844537, drand48());
90*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.061637783047395089, drand48());
91*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
92*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.65619299195623526, drand48());
93*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.18522597229772941, drand48());
94*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
95*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.65619299195623526, drand48());
96*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.18522597229772941, drand48());
97*8d67ca89SAndroid Build Coastguard Worker }
98*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,erand48)99*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, erand48) {
100*8d67ca89SAndroid Build Coastguard Worker const unsigned short seed[3] = { 0x330e, 0xabcd, 0x1234 };
101*8d67ca89SAndroid Build Coastguard Worker unsigned short xsubi[3];
102*8d67ca89SAndroid Build Coastguard Worker memcpy(xsubi, seed, sizeof(seed));
103*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.39646477376027534, erand48(xsubi));
104*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.84048536941142515, erand48(xsubi));
105*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.35333609724524351, erand48(xsubi));
106*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.44658343479654405, erand48(xsubi));
107*8d67ca89SAndroid Build Coastguard Worker memcpy(xsubi, seed, sizeof(seed));
108*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.39646477376027534, erand48(xsubi));
109*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.84048536941142515, erand48(xsubi));
110*8d67ca89SAndroid Build Coastguard Worker memcpy(xsubi, seed, sizeof(seed));
111*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.39646477376027534, erand48(xsubi));
112*8d67ca89SAndroid Build Coastguard Worker EXPECT_DOUBLE_EQ(0.84048536941142515, erand48(xsubi));
113*8d67ca89SAndroid Build Coastguard Worker }
114*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,lcong48)115*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, lcong48) {
116*8d67ca89SAndroid Build Coastguard Worker unsigned short p[7] = { 0x0102, 0x0304, 0x0506, 0x0708, 0x090a, 0x0b0c, 0x0d0e };
117*8d67ca89SAndroid Build Coastguard Worker lcong48(p);
118*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1531389981, lrand48());
119*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1598801533, lrand48());
120*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(2080534853, lrand48());
121*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1102488897, lrand48());
122*8d67ca89SAndroid Build Coastguard Worker lcong48(p);
123*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1531389981, lrand48());
124*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1598801533, lrand48());
125*8d67ca89SAndroid Build Coastguard Worker lcong48(p);
126*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1531389981, lrand48());
127*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1598801533, lrand48());
128*8d67ca89SAndroid Build Coastguard Worker }
129*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,lrand48)130*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, lrand48) {
131*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
132*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1409163720, lrand48());
133*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(397769746, lrand48());
134*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(902267124, lrand48());
135*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(132366131, lrand48());
136*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
137*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1409163720, lrand48());
138*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(397769746, lrand48());
139*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
140*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1409163720, lrand48());
141*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(397769746, lrand48());
142*8d67ca89SAndroid Build Coastguard Worker }
143*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,random)144*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, random) {
145*8d67ca89SAndroid Build Coastguard Worker srandom(0x01020304);
146*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(55436735, random());
147*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1399865117, random());
148*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(2032643283, random());
149*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(571329216, random());
150*8d67ca89SAndroid Build Coastguard Worker srandom(0x01020304);
151*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(55436735, random());
152*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1399865117, random());
153*8d67ca89SAndroid Build Coastguard Worker srandom(0x01020304);
154*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(55436735, random());
155*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1399865117, random());
156*8d67ca89SAndroid Build Coastguard Worker }
157*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,rand)158*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, rand) {
159*8d67ca89SAndroid Build Coastguard Worker srand(0x01020304);
160*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(55436735, rand());
161*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1399865117, rand());
162*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(2032643283, rand());
163*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(571329216, rand());
164*8d67ca89SAndroid Build Coastguard Worker srand(0x01020304);
165*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(55436735, rand());
166*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1399865117, rand());
167*8d67ca89SAndroid Build Coastguard Worker srand(0x01020304);
168*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(55436735, rand());
169*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1399865117, rand());
170*8d67ca89SAndroid Build Coastguard Worker }
171*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mrand48)172*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mrand48) {
173*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
174*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(-1476639856, mrand48());
175*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(795539493, mrand48());
176*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1804534249, mrand48());
177*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(264732262, mrand48());
178*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
179*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(-1476639856, mrand48());
180*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(795539493, mrand48());
181*8d67ca89SAndroid Build Coastguard Worker srand48(0x01020304);
182*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(-1476639856, mrand48());
183*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(795539493, mrand48());
184*8d67ca89SAndroid Build Coastguard Worker }
185*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,jrand48_distribution)186*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, jrand48_distribution) {
187*8d67ca89SAndroid Build Coastguard Worker const int iterations = 4096;
188*8d67ca89SAndroid Build Coastguard Worker const int pivot_low = 1536;
189*8d67ca89SAndroid Build Coastguard Worker const int pivot_high = 2560;
190*8d67ca89SAndroid Build Coastguard Worker
191*8d67ca89SAndroid Build Coastguard Worker unsigned short xsubi[3];
192*8d67ca89SAndroid Build Coastguard Worker int bits[32] = {};
193*8d67ca89SAndroid Build Coastguard Worker
194*8d67ca89SAndroid Build Coastguard Worker for (int iter = 0; iter < iterations; ++iter) {
195*8d67ca89SAndroid Build Coastguard Worker long rand_val = jrand48(xsubi);
196*8d67ca89SAndroid Build Coastguard Worker for (int bit = 0; bit < 32; ++bit) {
197*8d67ca89SAndroid Build Coastguard Worker bits[bit] += (static_cast<unsigned long>(rand_val) >> bit) & 0x01;
198*8d67ca89SAndroid Build Coastguard Worker }
199*8d67ca89SAndroid Build Coastguard Worker }
200*8d67ca89SAndroid Build Coastguard Worker
201*8d67ca89SAndroid Build Coastguard Worker // Check that bit probability is uniform
202*8d67ca89SAndroid Build Coastguard Worker for (int bit = 0; bit < 32; ++bit) {
203*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE((pivot_low <= bits[bit]) && (bits[bit] <= pivot_high));
204*8d67ca89SAndroid Build Coastguard Worker }
205*8d67ca89SAndroid Build Coastguard Worker }
206*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mrand48_distribution)207*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mrand48_distribution) {
208*8d67ca89SAndroid Build Coastguard Worker const int iterations = 4096;
209*8d67ca89SAndroid Build Coastguard Worker const int pivot_low = 1536;
210*8d67ca89SAndroid Build Coastguard Worker const int pivot_high = 2560;
211*8d67ca89SAndroid Build Coastguard Worker
212*8d67ca89SAndroid Build Coastguard Worker int bits[32] = {};
213*8d67ca89SAndroid Build Coastguard Worker
214*8d67ca89SAndroid Build Coastguard Worker for (int iter = 0; iter < iterations; ++iter) {
215*8d67ca89SAndroid Build Coastguard Worker long rand_val = mrand48();
216*8d67ca89SAndroid Build Coastguard Worker for (int bit = 0; bit < 32; ++bit) {
217*8d67ca89SAndroid Build Coastguard Worker bits[bit] += (static_cast<unsigned long>(rand_val) >> bit) & 0x01;
218*8d67ca89SAndroid Build Coastguard Worker }
219*8d67ca89SAndroid Build Coastguard Worker }
220*8d67ca89SAndroid Build Coastguard Worker
221*8d67ca89SAndroid Build Coastguard Worker // Check that bit probability is uniform
222*8d67ca89SAndroid Build Coastguard Worker for (int bit = 0; bit < 32; ++bit) {
223*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE((pivot_low <= bits[bit]) && (bits[bit] <= pivot_high));
224*8d67ca89SAndroid Build Coastguard Worker }
225*8d67ca89SAndroid Build Coastguard Worker }
226*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,posix_memalign_sweep)227*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, posix_memalign_sweep) {
228*8d67ca89SAndroid Build Coastguard Worker SKIP_WITH_HWASAN;
229*8d67ca89SAndroid Build Coastguard Worker void* ptr;
230*8d67ca89SAndroid Build Coastguard Worker
231*8d67ca89SAndroid Build Coastguard Worker // These should all fail.
232*8d67ca89SAndroid Build Coastguard Worker for (size_t align = 0; align < sizeof(long); align++) {
233*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, posix_memalign(&ptr, align, 256))
234*8d67ca89SAndroid Build Coastguard Worker << "Unexpected value at align " << align;
235*8d67ca89SAndroid Build Coastguard Worker }
236*8d67ca89SAndroid Build Coastguard Worker
237*8d67ca89SAndroid Build Coastguard Worker // Verify powers of 2 up to 2048 allocate, and verify that all other
238*8d67ca89SAndroid Build Coastguard Worker // alignment values between the powers of 2 fail.
239*8d67ca89SAndroid Build Coastguard Worker size_t last_align = sizeof(long);
240*8d67ca89SAndroid Build Coastguard Worker for (size_t align = sizeof(long); align <= 2048; align <<= 1) {
241*8d67ca89SAndroid Build Coastguard Worker // Try all of the non power of 2 values from the last until this value.
242*8d67ca89SAndroid Build Coastguard Worker for (size_t fail_align = last_align + 1; fail_align < align; fail_align++) {
243*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, posix_memalign(&ptr, fail_align, 256))
244*8d67ca89SAndroid Build Coastguard Worker << "Unexpected success at align " << fail_align;
245*8d67ca89SAndroid Build Coastguard Worker }
246*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, posix_memalign(&ptr, align, 256))
247*8d67ca89SAndroid Build Coastguard Worker << "Unexpected failure at align " << align;
248*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) & (align - 1))
249*8d67ca89SAndroid Build Coastguard Worker << "Did not return a valid aligned ptr " << ptr << " expected alignment " << align;
250*8d67ca89SAndroid Build Coastguard Worker free(ptr);
251*8d67ca89SAndroid Build Coastguard Worker last_align = align;
252*8d67ca89SAndroid Build Coastguard Worker }
253*8d67ca89SAndroid Build Coastguard Worker }
254*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,posix_memalign_various_sizes)255*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, posix_memalign_various_sizes) {
256*8d67ca89SAndroid Build Coastguard Worker std::vector<size_t> sizes{1, 4, 8, 256, 1024, 65000, 128000, 256000, 1000000};
257*8d67ca89SAndroid Build Coastguard Worker for (auto size : sizes) {
258*8d67ca89SAndroid Build Coastguard Worker void* ptr;
259*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, posix_memalign(&ptr, 16, 1))
260*8d67ca89SAndroid Build Coastguard Worker << "posix_memalign failed at size " << size;
261*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) & 0xf)
262*8d67ca89SAndroid Build Coastguard Worker << "Pointer not aligned at size " << size << " ptr " << ptr;
263*8d67ca89SAndroid Build Coastguard Worker free(ptr);
264*8d67ca89SAndroid Build Coastguard Worker }
265*8d67ca89SAndroid Build Coastguard Worker }
266*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,posix_memalign_overflow)267*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, posix_memalign_overflow) {
268*8d67ca89SAndroid Build Coastguard Worker SKIP_WITH_HWASAN;
269*8d67ca89SAndroid Build Coastguard Worker void* ptr;
270*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(0, posix_memalign(&ptr, 16, SIZE_MAX));
271*8d67ca89SAndroid Build Coastguard Worker }
272*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,aligned_alloc_sweep)273*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, aligned_alloc_sweep) {
274*8d67ca89SAndroid Build Coastguard Worker SKIP_WITH_HWASAN;
275*8d67ca89SAndroid Build Coastguard Worker // Verify powers of 2 up to 2048 allocate, and verify that all other
276*8d67ca89SAndroid Build Coastguard Worker // alignment values between the powers of 2 fail.
277*8d67ca89SAndroid Build Coastguard Worker size_t last_align = 1;
278*8d67ca89SAndroid Build Coastguard Worker for (size_t align = 1; align <= 2048; align <<= 1) {
279*8d67ca89SAndroid Build Coastguard Worker // Try all of the non power of 2 values from the last until this value.
280*8d67ca89SAndroid Build Coastguard Worker for (size_t fail_align = last_align + 1; fail_align < align; fail_align++) {
281*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(aligned_alloc(fail_align, fail_align) == nullptr)
282*8d67ca89SAndroid Build Coastguard Worker << "Unexpected success at align " << fail_align;
283*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL) << "Unexpected errno at align " << fail_align;
284*8d67ca89SAndroid Build Coastguard Worker }
285*8d67ca89SAndroid Build Coastguard Worker void* ptr = aligned_alloc(align, 2 * align);
286*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(ptr != nullptr) << "Unexpected failure at align " << align;
287*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr) & (align - 1))
288*8d67ca89SAndroid Build Coastguard Worker << "Did not return a valid aligned ptr " << ptr << " expected alignment " << align;
289*8d67ca89SAndroid Build Coastguard Worker free(ptr);
290*8d67ca89SAndroid Build Coastguard Worker last_align = align;
291*8d67ca89SAndroid Build Coastguard Worker }
292*8d67ca89SAndroid Build Coastguard Worker }
293*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,aligned_alloc_overflow)294*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, aligned_alloc_overflow) {
295*8d67ca89SAndroid Build Coastguard Worker SKIP_WITH_HWASAN;
296*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(aligned_alloc(16, SIZE_MAX) == nullptr);
297*8d67ca89SAndroid Build Coastguard Worker }
298*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,aligned_alloc_size_not_multiple_of_alignment)299*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, aligned_alloc_size_not_multiple_of_alignment) {
300*8d67ca89SAndroid Build Coastguard Worker SKIP_WITH_HWASAN;
301*8d67ca89SAndroid Build Coastguard Worker
302*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(aligned_alloc(2048, 1) == nullptr);
303*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(aligned_alloc(4, 3) == nullptr);
304*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(aligned_alloc(4, 7) == nullptr);
305*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(aligned_alloc(16, 8) == nullptr);
306*8d67ca89SAndroid Build Coastguard Worker }
307*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__NULL_filename)308*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__NULL_filename) {
309*8d67ca89SAndroid Build Coastguard Worker errno = 0;
310*8d67ca89SAndroid Build Coastguard Worker // Work around the compile-time error generated by FORTIFY here.
311*8d67ca89SAndroid Build Coastguard Worker const char* path = nullptr;
312*8d67ca89SAndroid Build Coastguard Worker char* p = realpath(path, nullptr);
313*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(p == nullptr);
314*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
315*8d67ca89SAndroid Build Coastguard Worker }
316*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__empty_filename)317*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__empty_filename) {
318*8d67ca89SAndroid Build Coastguard Worker errno = 0;
319*8d67ca89SAndroid Build Coastguard Worker char* p = realpath("", nullptr);
320*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(p == nullptr);
321*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOENT);
322*8d67ca89SAndroid Build Coastguard Worker }
323*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__ENOENT)324*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__ENOENT) {
325*8d67ca89SAndroid Build Coastguard Worker errno = 0;
326*8d67ca89SAndroid Build Coastguard Worker char* p = realpath("/this/directory/path/almost/certainly/does/not/exist", nullptr);
327*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(p == nullptr);
328*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOENT);
329*8d67ca89SAndroid Build Coastguard Worker }
330*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__ELOOP)331*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__ELOOP) {
332*8d67ca89SAndroid Build Coastguard Worker TemporaryDir td;
333*8d67ca89SAndroid Build Coastguard Worker std::string link = std::string(td.path) + "/loop";
334*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, symlink(link.c_str(), link.c_str()));
335*8d67ca89SAndroid Build Coastguard Worker
336*8d67ca89SAndroid Build Coastguard Worker errno = 0;
337*8d67ca89SAndroid Build Coastguard Worker char* p = realpath(link.c_str(), nullptr);
338*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(p == nullptr);
339*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ELOOP);
340*8d67ca89SAndroid Build Coastguard Worker }
341*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__component_after_non_directory)342*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__component_after_non_directory) {
343*8d67ca89SAndroid Build Coastguard Worker errno = 0;
344*8d67ca89SAndroid Build Coastguard Worker char* p = realpath("/dev/null/.", nullptr);
345*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(p == nullptr);
346*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOTDIR);
347*8d67ca89SAndroid Build Coastguard Worker
348*8d67ca89SAndroid Build Coastguard Worker errno = 0;
349*8d67ca89SAndroid Build Coastguard Worker p = realpath("/dev/null/..", nullptr);
350*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(p == nullptr);
351*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOTDIR);
352*8d67ca89SAndroid Build Coastguard Worker }
353*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath)354*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath) {
355*8d67ca89SAndroid Build Coastguard Worker // Get the name of this executable.
356*8d67ca89SAndroid Build Coastguard Worker char executable_path[PATH_MAX];
357*8d67ca89SAndroid Build Coastguard Worker int rc = readlink("/proc/self/exe", executable_path, sizeof(executable_path));
358*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(rc, -1);
359*8d67ca89SAndroid Build Coastguard Worker executable_path[rc] = '\0';
360*8d67ca89SAndroid Build Coastguard Worker
361*8d67ca89SAndroid Build Coastguard Worker char buf[PATH_MAX + 1];
362*8d67ca89SAndroid Build Coastguard Worker char* p = realpath("/proc/self/exe", buf);
363*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ(executable_path, p);
364*8d67ca89SAndroid Build Coastguard Worker
365*8d67ca89SAndroid Build Coastguard Worker p = realpath("/proc/self/exe", nullptr);
366*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ(executable_path, p);
367*8d67ca89SAndroid Build Coastguard Worker free(p);
368*8d67ca89SAndroid Build Coastguard Worker }
369*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__dot)370*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__dot) {
371*8d67ca89SAndroid Build Coastguard Worker char* p = realpath("/proc/./version", nullptr);
372*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("/proc/version", p);
373*8d67ca89SAndroid Build Coastguard Worker free(p);
374*8d67ca89SAndroid Build Coastguard Worker }
375*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__dot_dot)376*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__dot_dot) {
377*8d67ca89SAndroid Build Coastguard Worker char* p = realpath("/dev/../proc/version", nullptr);
378*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("/proc/version", p);
379*8d67ca89SAndroid Build Coastguard Worker free(p);
380*8d67ca89SAndroid Build Coastguard Worker }
381*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,realpath__deleted)382*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, realpath__deleted) {
383*8d67ca89SAndroid Build Coastguard Worker TemporaryDir td;
384*8d67ca89SAndroid Build Coastguard Worker
385*8d67ca89SAndroid Build Coastguard Worker // Create a file "A".
386*8d67ca89SAndroid Build Coastguard Worker std::string A_path = td.path + "/A"s;
387*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::WriteStringToFile("test\n", A_path));
388*8d67ca89SAndroid Build Coastguard Worker
389*8d67ca89SAndroid Build Coastguard Worker // Get an O_PATH fd for it.
390*8d67ca89SAndroid Build Coastguard Worker android::base::unique_fd fd(open(A_path.c_str(), O_PATH));
391*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(fd, -1);
392*8d67ca89SAndroid Build Coastguard Worker
393*8d67ca89SAndroid Build Coastguard Worker // Create a file "A (deleted)".
394*8d67ca89SAndroid Build Coastguard Worker android::base::unique_fd fd2(open((td.path + "/A (deleted)"s).c_str(),
395*8d67ca89SAndroid Build Coastguard Worker O_CREAT | O_TRUNC | O_WRONLY, 0644));
396*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(fd2, -1);
397*8d67ca89SAndroid Build Coastguard Worker
398*8d67ca89SAndroid Build Coastguard Worker // Delete "A".
399*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, unlink(A_path.c_str()));
400*8d67ca89SAndroid Build Coastguard Worker
401*8d67ca89SAndroid Build Coastguard Worker // Now realpath() on the O_PATH fd, and check we *don't* get "A (deleted)".
402*8d67ca89SAndroid Build Coastguard Worker std::string path = android::base::StringPrintf("/proc/%d/fd/%d", static_cast<int>(getpid()),
403*8d67ca89SAndroid Build Coastguard Worker fd.get());
404*8d67ca89SAndroid Build Coastguard Worker errno = 0;
405*8d67ca89SAndroid Build Coastguard Worker char* result = realpath(path.c_str(), nullptr);
406*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, result) << result;
407*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOENT);
408*8d67ca89SAndroid Build Coastguard Worker free(result);
409*8d67ca89SAndroid Build Coastguard Worker }
410*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,qsort)411*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, qsort) {
412*8d67ca89SAndroid Build Coastguard Worker struct s {
413*8d67ca89SAndroid Build Coastguard Worker char name[16];
414*8d67ca89SAndroid Build Coastguard Worker static int comparator(const void* lhs, const void* rhs) {
415*8d67ca89SAndroid Build Coastguard Worker return strcmp(reinterpret_cast<const s*>(lhs)->name, reinterpret_cast<const s*>(rhs)->name);
416*8d67ca89SAndroid Build Coastguard Worker }
417*8d67ca89SAndroid Build Coastguard Worker };
418*8d67ca89SAndroid Build Coastguard Worker s entries[3];
419*8d67ca89SAndroid Build Coastguard Worker strcpy(entries[0].name, "charlie");
420*8d67ca89SAndroid Build Coastguard Worker strcpy(entries[1].name, "bravo");
421*8d67ca89SAndroid Build Coastguard Worker strcpy(entries[2].name, "alpha");
422*8d67ca89SAndroid Build Coastguard Worker
423*8d67ca89SAndroid Build Coastguard Worker qsort(entries, 3, sizeof(s), s::comparator);
424*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("alpha", entries[0].name);
425*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("bravo", entries[1].name);
426*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("charlie", entries[2].name);
427*8d67ca89SAndroid Build Coastguard Worker
428*8d67ca89SAndroid Build Coastguard Worker qsort(entries, 3, sizeof(s), s::comparator);
429*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("alpha", entries[0].name);
430*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("bravo", entries[1].name);
431*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("charlie", entries[2].name);
432*8d67ca89SAndroid Build Coastguard Worker }
433*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,qsort_r)434*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, qsort_r) {
435*8d67ca89SAndroid Build Coastguard Worker struct s {
436*8d67ca89SAndroid Build Coastguard Worker char name[16];
437*8d67ca89SAndroid Build Coastguard Worker static int comparator(const void* lhs, const void* rhs, void* context) {
438*8d67ca89SAndroid Build Coastguard Worker int* count_p = reinterpret_cast<int*>(context);
439*8d67ca89SAndroid Build Coastguard Worker *count_p += 1;
440*8d67ca89SAndroid Build Coastguard Worker return strcmp(reinterpret_cast<const s*>(lhs)->name, reinterpret_cast<const s*>(rhs)->name);
441*8d67ca89SAndroid Build Coastguard Worker }
442*8d67ca89SAndroid Build Coastguard Worker };
443*8d67ca89SAndroid Build Coastguard Worker s entries[3];
444*8d67ca89SAndroid Build Coastguard Worker strcpy(entries[0].name, "charlie");
445*8d67ca89SAndroid Build Coastguard Worker strcpy(entries[1].name, "bravo");
446*8d67ca89SAndroid Build Coastguard Worker strcpy(entries[2].name, "alpha");
447*8d67ca89SAndroid Build Coastguard Worker
448*8d67ca89SAndroid Build Coastguard Worker int count;
449*8d67ca89SAndroid Build Coastguard Worker void* context = &count;
450*8d67ca89SAndroid Build Coastguard Worker
451*8d67ca89SAndroid Build Coastguard Worker count = 0;
452*8d67ca89SAndroid Build Coastguard Worker qsort_r(entries, 3, sizeof(s), s::comparator, context);
453*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("alpha", entries[0].name);
454*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("bravo", entries[1].name);
455*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("charlie", entries[2].name);
456*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(count, 3);
457*8d67ca89SAndroid Build Coastguard Worker }
458*8d67ca89SAndroid Build Coastguard Worker
TestBug57421_child(void * arg)459*8d67ca89SAndroid Build Coastguard Worker static void* TestBug57421_child(void* arg) {
460*8d67ca89SAndroid Build Coastguard Worker pthread_t main_thread = reinterpret_cast<pthread_t>(arg);
461*8d67ca89SAndroid Build Coastguard Worker pthread_join(main_thread, nullptr);
462*8d67ca89SAndroid Build Coastguard Worker char* value = getenv("ENVIRONMENT_VARIABLE");
463*8d67ca89SAndroid Build Coastguard Worker if (value == nullptr) {
464*8d67ca89SAndroid Build Coastguard Worker setenv("ENVIRONMENT_VARIABLE", "value", 1);
465*8d67ca89SAndroid Build Coastguard Worker }
466*8d67ca89SAndroid Build Coastguard Worker return nullptr;
467*8d67ca89SAndroid Build Coastguard Worker }
468*8d67ca89SAndroid Build Coastguard Worker
TestBug57421_main()469*8d67ca89SAndroid Build Coastguard Worker static void TestBug57421_main() {
470*8d67ca89SAndroid Build Coastguard Worker pthread_t t;
471*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, pthread_create(&t, nullptr, TestBug57421_child, reinterpret_cast<void*>(pthread_self())));
472*8d67ca89SAndroid Build Coastguard Worker pthread_exit(nullptr);
473*8d67ca89SAndroid Build Coastguard Worker }
474*8d67ca89SAndroid Build Coastguard Worker
475*8d67ca89SAndroid Build Coastguard Worker // Even though this isn't really a death test, we have to say "DeathTest" here so gtest knows to
476*8d67ca89SAndroid Build Coastguard Worker // run this test (which exits normally) in its own process.
477*8d67ca89SAndroid Build Coastguard Worker
478*8d67ca89SAndroid Build Coastguard Worker using stdlib_DeathTest = SilentDeathTest;
479*8d67ca89SAndroid Build Coastguard Worker
TEST_F(stdlib_DeathTest,getenv_after_main_thread_exits)480*8d67ca89SAndroid Build Coastguard Worker TEST_F(stdlib_DeathTest, getenv_after_main_thread_exits) {
481*8d67ca89SAndroid Build Coastguard Worker // https://code.google.com/p/android/issues/detail?id=57421
482*8d67ca89SAndroid Build Coastguard Worker ASSERT_EXIT(TestBug57421_main(), ::testing::ExitedWithCode(0), "");
483*8d67ca89SAndroid Build Coastguard Worker }
484*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mkostemp64_smoke)485*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mkostemp64_smoke) {
486*8d67ca89SAndroid Build Coastguard Worker MyTemporaryFile tf([](char* path) { return mkostemp64(path, O_CLOEXEC); });
487*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(CloseOnExec(tf.fd));
488*8d67ca89SAndroid Build Coastguard Worker }
489*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mkostemp)490*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mkostemp) {
491*8d67ca89SAndroid Build Coastguard Worker MyTemporaryFile tf([](char* path) { return mkostemp(path, O_CLOEXEC); });
492*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(CloseOnExec(tf.fd));
493*8d67ca89SAndroid Build Coastguard Worker }
494*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mkstemp64_smoke)495*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mkstemp64_smoke) {
496*8d67ca89SAndroid Build Coastguard Worker MyTemporaryFile tf(mkstemp64);
497*8d67ca89SAndroid Build Coastguard Worker struct stat64 sb;
498*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, fstat64(tf.fd, &sb));
499*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(O_LARGEFILE, fcntl(tf.fd, F_GETFL) & O_LARGEFILE);
500*8d67ca89SAndroid Build Coastguard Worker }
501*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mkstemp)502*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mkstemp) {
503*8d67ca89SAndroid Build Coastguard Worker MyTemporaryFile tf(mkstemp);
504*8d67ca89SAndroid Build Coastguard Worker struct stat sb;
505*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, fstat(tf.fd, &sb));
506*8d67ca89SAndroid Build Coastguard Worker }
507*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,system)508*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, system) {
509*8d67ca89SAndroid Build Coastguard Worker int status;
510*8d67ca89SAndroid Build Coastguard Worker
511*8d67ca89SAndroid Build Coastguard Worker status = system("exit 0");
512*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(WIFEXITED(status));
513*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, WEXITSTATUS(status));
514*8d67ca89SAndroid Build Coastguard Worker
515*8d67ca89SAndroid Build Coastguard Worker status = system("exit 1");
516*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(WIFEXITED(status));
517*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(1, WEXITSTATUS(status));
518*8d67ca89SAndroid Build Coastguard Worker }
519*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,system_NULL)520*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, system_NULL) {
521*8d67ca89SAndroid Build Coastguard Worker // "The system() function shall always return non-zero when command is NULL."
522*8d67ca89SAndroid Build Coastguard Worker // https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/functions/system.html
523*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic push
524*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wnonnull"
525*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(0, system(nullptr));
526*8d67ca89SAndroid Build Coastguard Worker #pragma clang diagnostic pop
527*8d67ca89SAndroid Build Coastguard Worker }
528*8d67ca89SAndroid Build Coastguard Worker
529*8d67ca89SAndroid Build Coastguard Worker // https://austingroupbugs.net/view.php?id=1440
TEST(stdlib,system_minus)530*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, system_minus) {
531*8d67ca89SAndroid Build Coastguard Worker // Create a script with a name that starts with a '-'.
532*8d67ca89SAndroid Build Coastguard Worker TemporaryDir td;
533*8d67ca89SAndroid Build Coastguard Worker std::string script = std::string(td.path) + "/-minus";
534*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::WriteStringToFile("#!" BIN_DIR "sh\nexit 66\n", script));
535*8d67ca89SAndroid Build Coastguard Worker
536*8d67ca89SAndroid Build Coastguard Worker // Set $PATH so we can find it.
537*8d67ca89SAndroid Build Coastguard Worker setenv("PATH", td.path, 1);
538*8d67ca89SAndroid Build Coastguard Worker // Make it executable so we can run it.
539*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, chmod(script.c_str(), 0555));
540*8d67ca89SAndroid Build Coastguard Worker
541*8d67ca89SAndroid Build Coastguard Worker int status = system("-minus");
542*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(WIFEXITED(status));
543*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(66, WEXITSTATUS(status));
544*8d67ca89SAndroid Build Coastguard Worker
545*8d67ca89SAndroid Build Coastguard Worker // While we're here and have all the setup, let's test popen(3) too...
546*8d67ca89SAndroid Build Coastguard Worker FILE* fp = popen("-minus", "r");
547*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(fp != nullptr);
548*8d67ca89SAndroid Build Coastguard Worker status = pclose(fp);
549*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(WIFEXITED(status));
550*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(66, WEXITSTATUS(status));
551*8d67ca89SAndroid Build Coastguard Worker }
552*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,atof)553*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, atof) {
554*8d67ca89SAndroid Build Coastguard Worker ASSERT_DOUBLE_EQ(1.23, atof("1.23"));
555*8d67ca89SAndroid Build Coastguard Worker }
556*8d67ca89SAndroid Build Coastguard Worker
557*8d67ca89SAndroid Build Coastguard Worker template <typename T>
CheckStrToFloat(T fn (const char * s,char ** end))558*8d67ca89SAndroid Build Coastguard Worker static void CheckStrToFloat(T fn(const char* s, char** end)) {
559*8d67ca89SAndroid Build Coastguard Worker FpUlpEq<0, T> pred;
560*8d67ca89SAndroid Build Coastguard Worker
561*8d67ca89SAndroid Build Coastguard Worker EXPECT_PRED_FORMAT2(pred, 9.0, fn("9.0", nullptr));
562*8d67ca89SAndroid Build Coastguard Worker EXPECT_PRED_FORMAT2(pred, 9.0, fn("0.9e1", nullptr));
563*8d67ca89SAndroid Build Coastguard Worker EXPECT_PRED_FORMAT2(pred, 9.0, fn("0x1.2p3", nullptr));
564*8d67ca89SAndroid Build Coastguard Worker
565*8d67ca89SAndroid Build Coastguard Worker const char* s = " \t\v\f\r\n9.0";
566*8d67ca89SAndroid Build Coastguard Worker char* p;
567*8d67ca89SAndroid Build Coastguard Worker EXPECT_PRED_FORMAT2(pred, 9.0, fn(s, &p));
568*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(s + strlen(s), p);
569*8d67ca89SAndroid Build Coastguard Worker
570*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("+nan", nullptr)));
571*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("nan", nullptr)));
572*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("-nan", nullptr)));
573*8d67ca89SAndroid Build Coastguard Worker
574*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("+nan(0xff)", nullptr)));
575*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("nan(0xff)", nullptr)));
576*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("-nan(0xff)", nullptr)));
577*8d67ca89SAndroid Build Coastguard Worker
578*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("+nanny", &p)));
579*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("ny", p);
580*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("nanny", &p)));
581*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("ny", p);
582*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("-nanny", &p)));
583*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("ny", p);
584*8d67ca89SAndroid Build Coastguard Worker
585*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(0, fn("muppet", &p));
586*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("muppet", p);
587*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(0, fn(" muppet", &p));
588*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ(" muppet", p);
589*8d67ca89SAndroid Build Coastguard Worker
590*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("+inf", nullptr));
591*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("inf", nullptr));
592*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(-std::numeric_limits<T>::infinity(), fn("-inf", nullptr));
593*8d67ca89SAndroid Build Coastguard Worker
594*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("+infinity", nullptr));
595*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("infinity", nullptr));
596*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(-std::numeric_limits<T>::infinity(), fn("-infinity", nullptr));
597*8d67ca89SAndroid Build Coastguard Worker
598*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("+infinitude", &p));
599*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("initude", p);
600*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("infinitude", &p));
601*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("initude", p);
602*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(-std::numeric_limits<T>::infinity(), fn("-infinitude", &p));
603*8d67ca89SAndroid Build Coastguard Worker EXPECT_STREQ("initude", p);
604*8d67ca89SAndroid Build Coastguard Worker
605*8d67ca89SAndroid Build Coastguard Worker // Check case-insensitivity.
606*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<T>::infinity(), fn("InFiNiTy", nullptr));
607*8d67ca89SAndroid Build Coastguard Worker EXPECT_TRUE(isnan(fn("NaN", nullptr)));
608*8d67ca89SAndroid Build Coastguard Worker }
609*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtod)610*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtod) {
611*8d67ca89SAndroid Build Coastguard Worker CheckStrToFloat(strtod);
612*8d67ca89SAndroid Build Coastguard Worker }
613*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtof)614*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtof) {
615*8d67ca89SAndroid Build Coastguard Worker CheckStrToFloat(strtof);
616*8d67ca89SAndroid Build Coastguard Worker }
617*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtold)618*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtold) {
619*8d67ca89SAndroid Build Coastguard Worker CheckStrToFloat(strtold);
620*8d67ca89SAndroid Build Coastguard Worker }
621*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtof_2206701)622*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtof_2206701) {
623*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0.0f, strtof("7.0064923216240853546186479164495e-46", nullptr));
624*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(1.4e-45f, strtof("7.0064923216240853546186479164496e-46", nullptr));
625*8d67ca89SAndroid Build Coastguard Worker }
626*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtod_largest_subnormal)627*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtod_largest_subnormal) {
628*8d67ca89SAndroid Build Coastguard Worker // This value has been known to cause javac and java to infinite loop.
629*8d67ca89SAndroid Build Coastguard Worker // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
630*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2.2250738585072014e-308, strtod("2.2250738585072012e-308", nullptr));
631*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2.2250738585072014e-308, strtod("0.00022250738585072012e-304", nullptr));
632*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2.2250738585072014e-308, strtod("00000002.2250738585072012e-308", nullptr));
633*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2.2250738585072014e-308, strtod("2.225073858507201200000e-308", nullptr));
634*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2.2250738585072014e-308, strtod("2.2250738585072012e-00308", nullptr));
635*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2.2250738585072014e-308, strtod("2.22507385850720129978001e-308", nullptr));
636*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-2.2250738585072014e-308, strtod("-2.2250738585072012e-308", nullptr));
637*8d67ca89SAndroid Build Coastguard Worker }
638*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,quick_exit)639*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, quick_exit) {
640*8d67ca89SAndroid Build Coastguard Worker pid_t pid = fork();
641*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, pid) << strerror(errno);
642*8d67ca89SAndroid Build Coastguard Worker
643*8d67ca89SAndroid Build Coastguard Worker if (pid == 0) {
644*8d67ca89SAndroid Build Coastguard Worker quick_exit(99);
645*8d67ca89SAndroid Build Coastguard Worker }
646*8d67ca89SAndroid Build Coastguard Worker
647*8d67ca89SAndroid Build Coastguard Worker AssertChildExited(pid, 99);
648*8d67ca89SAndroid Build Coastguard Worker }
649*8d67ca89SAndroid Build Coastguard Worker
650*8d67ca89SAndroid Build Coastguard Worker static int quick_exit_status = 0;
651*8d67ca89SAndroid Build Coastguard Worker
quick_exit_1(void)652*8d67ca89SAndroid Build Coastguard Worker static void quick_exit_1(void) {
653*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(quick_exit_status, 0);
654*8d67ca89SAndroid Build Coastguard Worker quick_exit_status = 1;
655*8d67ca89SAndroid Build Coastguard Worker }
656*8d67ca89SAndroid Build Coastguard Worker
quick_exit_2(void)657*8d67ca89SAndroid Build Coastguard Worker static void quick_exit_2(void) {
658*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(quick_exit_status, 1);
659*8d67ca89SAndroid Build Coastguard Worker }
660*8d67ca89SAndroid Build Coastguard Worker
not_run(void)661*8d67ca89SAndroid Build Coastguard Worker static void not_run(void) {
662*8d67ca89SAndroid Build Coastguard Worker FAIL();
663*8d67ca89SAndroid Build Coastguard Worker }
664*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,at_quick_exit)665*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, at_quick_exit) {
666*8d67ca89SAndroid Build Coastguard Worker pid_t pid = fork();
667*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, pid) << strerror(errno);
668*8d67ca89SAndroid Build Coastguard Worker
669*8d67ca89SAndroid Build Coastguard Worker if (pid == 0) {
670*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(at_quick_exit(quick_exit_2), 0);
671*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(at_quick_exit(quick_exit_1), 0);
672*8d67ca89SAndroid Build Coastguard Worker atexit(not_run);
673*8d67ca89SAndroid Build Coastguard Worker quick_exit(99);
674*8d67ca89SAndroid Build Coastguard Worker }
675*8d67ca89SAndroid Build Coastguard Worker
676*8d67ca89SAndroid Build Coastguard Worker AssertChildExited(pid, 99);
677*8d67ca89SAndroid Build Coastguard Worker }
678*8d67ca89SAndroid Build Coastguard Worker
exit_from_atexit_func4()679*8d67ca89SAndroid Build Coastguard Worker static void exit_from_atexit_func4() {
680*8d67ca89SAndroid Build Coastguard Worker std::thread([] { exit(4); }).detach();
681*8d67ca89SAndroid Build Coastguard Worker usleep(1000);
682*8d67ca89SAndroid Build Coastguard Worker fprintf(stderr, "4");
683*8d67ca89SAndroid Build Coastguard Worker }
684*8d67ca89SAndroid Build Coastguard Worker
exit_from_atexit_func3()685*8d67ca89SAndroid Build Coastguard Worker static void exit_from_atexit_func3() {
686*8d67ca89SAndroid Build Coastguard Worker std::thread([] { exit(3); }).detach();
687*8d67ca89SAndroid Build Coastguard Worker fprintf(stderr, "3");
688*8d67ca89SAndroid Build Coastguard Worker usleep(1000);
689*8d67ca89SAndroid Build Coastguard Worker // This should cause us to exit with status 99,
690*8d67ca89SAndroid Build Coastguard Worker // but not before printing "4",
691*8d67ca89SAndroid Build Coastguard Worker // and without re-running the previous atexit handlers.
692*8d67ca89SAndroid Build Coastguard Worker exit(99);
693*8d67ca89SAndroid Build Coastguard Worker }
694*8d67ca89SAndroid Build Coastguard Worker
exit_from_atexit_func2()695*8d67ca89SAndroid Build Coastguard Worker static void exit_from_atexit_func2() {
696*8d67ca89SAndroid Build Coastguard Worker std::thread([] { exit(2); }).detach();
697*8d67ca89SAndroid Build Coastguard Worker fprintf(stderr, "2");
698*8d67ca89SAndroid Build Coastguard Worker usleep(1000);
699*8d67ca89SAndroid Build Coastguard Worker // Register another atexit handler from within an atexit handler.
700*8d67ca89SAndroid Build Coastguard Worker atexit(exit_from_atexit_func3);
701*8d67ca89SAndroid Build Coastguard Worker }
702*8d67ca89SAndroid Build Coastguard Worker
exit_from_atexit_func1()703*8d67ca89SAndroid Build Coastguard Worker static void exit_from_atexit_func1() {
704*8d67ca89SAndroid Build Coastguard Worker // These atexit handlers all spawn another thread that tries to exit,
705*8d67ca89SAndroid Build Coastguard Worker // and sleep to try to lose the race.
706*8d67ca89SAndroid Build Coastguard Worker // The lock in exit() should ensure that only the first thread to call
707*8d67ca89SAndroid Build Coastguard Worker // exit() can ever win (but see exit_from_atexit_func3() for a subtelty).
708*8d67ca89SAndroid Build Coastguard Worker std::thread([] { exit(1); }).detach();
709*8d67ca89SAndroid Build Coastguard Worker usleep(1000);
710*8d67ca89SAndroid Build Coastguard Worker fprintf(stderr, "1");
711*8d67ca89SAndroid Build Coastguard Worker }
712*8d67ca89SAndroid Build Coastguard Worker
exit_torturer()713*8d67ca89SAndroid Build Coastguard Worker static void exit_torturer() {
714*8d67ca89SAndroid Build Coastguard Worker atexit(exit_from_atexit_func4);
715*8d67ca89SAndroid Build Coastguard Worker // We deliberately don't register exit_from_atexit_func3() here;
716*8d67ca89SAndroid Build Coastguard Worker // see exit_from_atexit_func2().
717*8d67ca89SAndroid Build Coastguard Worker atexit(exit_from_atexit_func2);
718*8d67ca89SAndroid Build Coastguard Worker atexit(exit_from_atexit_func1);
719*8d67ca89SAndroid Build Coastguard Worker exit(0);
720*8d67ca89SAndroid Build Coastguard Worker }
721*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,exit_torture)722*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, exit_torture) {
723*8d67ca89SAndroid Build Coastguard Worker // Test that the atexit() handlers are run in the defined order (reverse
724*8d67ca89SAndroid Build Coastguard Worker // order of registration), even though one of them is registered by another
725*8d67ca89SAndroid Build Coastguard Worker // when it runs, and that we get the exit code from the last call to exit()
726*8d67ca89SAndroid Build Coastguard Worker // on the first thread to call exit() (rather than one of the other threads
727*8d67ca89SAndroid Build Coastguard Worker // or a deadlock from the second call on the same thread).
728*8d67ca89SAndroid Build Coastguard Worker ASSERT_EXIT(exit_torturer(), testing::ExitedWithCode(99), "1234");
729*8d67ca89SAndroid Build Coastguard Worker }
730*8d67ca89SAndroid Build Coastguard Worker
TEST(unistd,_Exit)731*8d67ca89SAndroid Build Coastguard Worker TEST(unistd, _Exit) {
732*8d67ca89SAndroid Build Coastguard Worker pid_t pid = fork();
733*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, pid) << strerror(errno);
734*8d67ca89SAndroid Build Coastguard Worker
735*8d67ca89SAndroid Build Coastguard Worker if (pid == 0) {
736*8d67ca89SAndroid Build Coastguard Worker _Exit(99);
737*8d67ca89SAndroid Build Coastguard Worker }
738*8d67ca89SAndroid Build Coastguard Worker
739*8d67ca89SAndroid Build Coastguard Worker AssertChildExited(pid, 99);
740*8d67ca89SAndroid Build Coastguard Worker }
741*8d67ca89SAndroid Build Coastguard Worker
742*8d67ca89SAndroid Build Coastguard Worker #if defined(ANDROID_HOST_MUSL)
743*8d67ca89SAndroid Build Coastguard Worker // musl doesn't have getpt
getpt()744*8d67ca89SAndroid Build Coastguard Worker int getpt() {
745*8d67ca89SAndroid Build Coastguard Worker return posix_openpt(O_RDWR|O_NOCTTY);
746*8d67ca89SAndroid Build Coastguard Worker }
747*8d67ca89SAndroid Build Coastguard Worker #endif
748*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,pty_smoke)749*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, pty_smoke) {
750*8d67ca89SAndroid Build Coastguard Worker // getpt returns a pty with O_RDWR|O_NOCTTY.
751*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
752*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
753*8d67ca89SAndroid Build Coastguard Worker
754*8d67ca89SAndroid Build Coastguard Worker // grantpt is a no-op.
755*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, grantpt(fd));
756*8d67ca89SAndroid Build Coastguard Worker
757*8d67ca89SAndroid Build Coastguard Worker // ptsname_r should start "/dev/pts/".
758*8d67ca89SAndroid Build Coastguard Worker char name_r[128];
759*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, ptsname_r(fd, name_r, sizeof(name_r)));
760*8d67ca89SAndroid Build Coastguard Worker name_r[9] = 0;
761*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("/dev/pts/", name_r);
762*8d67ca89SAndroid Build Coastguard Worker
763*8d67ca89SAndroid Build Coastguard Worker close(fd);
764*8d67ca89SAndroid Build Coastguard Worker }
765*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,posix_openpt)766*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, posix_openpt) {
767*8d67ca89SAndroid Build Coastguard Worker int fd = posix_openpt(O_RDWR|O_NOCTTY|O_CLOEXEC);
768*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
769*8d67ca89SAndroid Build Coastguard Worker close(fd);
770*8d67ca89SAndroid Build Coastguard Worker }
771*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ptsname_r_ENOTTY)772*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ptsname_r_ENOTTY) {
773*8d67ca89SAndroid Build Coastguard Worker errno = 0;
774*8d67ca89SAndroid Build Coastguard Worker char buf[128];
775*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(ENOTTY, ptsname_r(STDOUT_FILENO, buf, sizeof(buf)));
776*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOTTY);
777*8d67ca89SAndroid Build Coastguard Worker }
778*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ptsname_r_EINVAL)779*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ptsname_r_EINVAL) {
780*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
781*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
782*8d67ca89SAndroid Build Coastguard Worker errno = 0;
783*8d67ca89SAndroid Build Coastguard Worker char* buf = nullptr;
784*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, ptsname_r(fd, buf, 128));
785*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
786*8d67ca89SAndroid Build Coastguard Worker close(fd);
787*8d67ca89SAndroid Build Coastguard Worker }
788*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ptsname_r_ERANGE)789*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ptsname_r_ERANGE) {
790*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
791*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
792*8d67ca89SAndroid Build Coastguard Worker errno = 0;
793*8d67ca89SAndroid Build Coastguard Worker char buf[1];
794*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(ERANGE, ptsname_r(fd, buf, sizeof(buf)));
795*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ERANGE);
796*8d67ca89SAndroid Build Coastguard Worker close(fd);
797*8d67ca89SAndroid Build Coastguard Worker }
798*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ttyname)799*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ttyname) {
800*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
801*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
802*8d67ca89SAndroid Build Coastguard Worker
803*8d67ca89SAndroid Build Coastguard Worker // ttyname returns "/dev/ptmx" for a pty.
804*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("/dev/ptmx", ttyname(fd));
805*8d67ca89SAndroid Build Coastguard Worker
806*8d67ca89SAndroid Build Coastguard Worker close(fd);
807*8d67ca89SAndroid Build Coastguard Worker }
808*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ttyname_r)809*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ttyname_r) {
810*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
811*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
812*8d67ca89SAndroid Build Coastguard Worker
813*8d67ca89SAndroid Build Coastguard Worker // ttyname_r returns "/dev/ptmx" for a pty.
814*8d67ca89SAndroid Build Coastguard Worker char name_r[128];
815*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, ttyname_r(fd, name_r, sizeof(name_r)));
816*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("/dev/ptmx", name_r);
817*8d67ca89SAndroid Build Coastguard Worker
818*8d67ca89SAndroid Build Coastguard Worker close(fd);
819*8d67ca89SAndroid Build Coastguard Worker }
820*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ttyname_r_ENOTTY)821*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ttyname_r_ENOTTY) {
822*8d67ca89SAndroid Build Coastguard Worker int fd = open("/dev/null", O_WRONLY);
823*8d67ca89SAndroid Build Coastguard Worker errno = 0;
824*8d67ca89SAndroid Build Coastguard Worker char buf[128];
825*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(ENOTTY, ttyname_r(fd, buf, sizeof(buf)));
826*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOTTY);
827*8d67ca89SAndroid Build Coastguard Worker close(fd);
828*8d67ca89SAndroid Build Coastguard Worker }
829*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ttyname_r_EINVAL)830*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ttyname_r_EINVAL) {
831*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
832*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
833*8d67ca89SAndroid Build Coastguard Worker errno = 0;
834*8d67ca89SAndroid Build Coastguard Worker char* buf = nullptr;
835*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, ttyname_r(fd, buf, 128));
836*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
837*8d67ca89SAndroid Build Coastguard Worker close(fd);
838*8d67ca89SAndroid Build Coastguard Worker }
839*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,ttyname_r_ERANGE)840*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, ttyname_r_ERANGE) {
841*8d67ca89SAndroid Build Coastguard Worker int fd = getpt();
842*8d67ca89SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
843*8d67ca89SAndroid Build Coastguard Worker errno = 0;
844*8d67ca89SAndroid Build Coastguard Worker char buf[1];
845*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(ERANGE, ttyname_r(fd, buf, sizeof(buf)));
846*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ERANGE);
847*8d67ca89SAndroid Build Coastguard Worker close(fd);
848*8d67ca89SAndroid Build Coastguard Worker }
849*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,unlockpt_ENOTTY)850*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, unlockpt_ENOTTY) {
851*8d67ca89SAndroid Build Coastguard Worker int fd = open("/dev/null", O_WRONLY);
852*8d67ca89SAndroid Build Coastguard Worker errno = 0;
853*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, unlockpt(fd));
854*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ENOTTY);
855*8d67ca89SAndroid Build Coastguard Worker close(fd);
856*8d67ca89SAndroid Build Coastguard Worker }
857*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,getsubopt)858*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, getsubopt) {
859*8d67ca89SAndroid Build Coastguard Worker char* const tokens[] = {
860*8d67ca89SAndroid Build Coastguard Worker const_cast<char*>("a"),
861*8d67ca89SAndroid Build Coastguard Worker const_cast<char*>("b"),
862*8d67ca89SAndroid Build Coastguard Worker const_cast<char*>("foo"),
863*8d67ca89SAndroid Build Coastguard Worker nullptr
864*8d67ca89SAndroid Build Coastguard Worker };
865*8d67ca89SAndroid Build Coastguard Worker std::string input = "a,b,foo=bar,a,unknown";
866*8d67ca89SAndroid Build Coastguard Worker char* subopts = &input[0];
867*8d67ca89SAndroid Build Coastguard Worker char* value = nullptr;
868*8d67ca89SAndroid Build Coastguard Worker
869*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, getsubopt(&subopts, tokens, &value));
870*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, value);
871*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(1, getsubopt(&subopts, tokens, &value));
872*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, value);
873*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2, getsubopt(&subopts, tokens, &value));
874*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("bar", value);
875*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, getsubopt(&subopts, tokens, &value));
876*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(nullptr, value);
877*8d67ca89SAndroid Build Coastguard Worker
878*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getsubopt(&subopts, tokens, &value));
879*8d67ca89SAndroid Build Coastguard Worker }
880*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,mblen)881*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, mblen) {
882*8d67ca89SAndroid Build Coastguard Worker // "If s is a null pointer, mblen() shall return a non-zero or 0 value, if character encodings,
883*8d67ca89SAndroid Build Coastguard Worker // respectively, do or do not have state-dependent encodings." We're always UTF-8.
884*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(0, mblen(nullptr, 1));
885*8d67ca89SAndroid Build Coastguard Worker
886*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("C.UTF-8", setlocale(LC_ALL, "C.UTF-8"));
887*8d67ca89SAndroid Build Coastguard Worker
888*8d67ca89SAndroid Build Coastguard Worker // 1-byte UTF-8.
889*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(1, mblen("abcdef", 6));
890*8d67ca89SAndroid Build Coastguard Worker // 2-byte UTF-8.
891*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(2, mblen("\xc2\xa2" "cdef", 6));
892*8d67ca89SAndroid Build Coastguard Worker // 3-byte UTF-8.
893*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(3, mblen("\xe2\x82\xac" "def", 6));
894*8d67ca89SAndroid Build Coastguard Worker // 4-byte UTF-8.
895*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(4, mblen("\xf0\xa4\xad\xa2" "ef", 6));
896*8d67ca89SAndroid Build Coastguard Worker
897*8d67ca89SAndroid Build Coastguard Worker // Illegal over-long sequence.
898*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, mblen("\xf0\x82\x82\xac" "ef", 6));
899*8d67ca89SAndroid Build Coastguard Worker
900*8d67ca89SAndroid Build Coastguard Worker // "mblen() shall ... return 0 (if s points to the null byte)".
901*8d67ca89SAndroid Build Coastguard Worker EXPECT_EQ(0, mblen("", 1));
902*8d67ca89SAndroid Build Coastguard Worker }
903*8d67ca89SAndroid Build Coastguard Worker
904*8d67ca89SAndroid Build Coastguard Worker template <typename T>
CheckStrToInt(T fn (const char * s,char ** end,int base))905*8d67ca89SAndroid Build Coastguard Worker static void CheckStrToInt(T fn(const char* s, char** end, int base)) {
906*8d67ca89SAndroid Build Coastguard Worker char* end_p;
907*8d67ca89SAndroid Build Coastguard Worker
908*8d67ca89SAndroid Build Coastguard Worker // Negative base => invalid.
909*8d67ca89SAndroid Build Coastguard Worker errno = 0;
910*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0), fn("123", &end_p, -1));
911*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
912*8d67ca89SAndroid Build Coastguard Worker
913*8d67ca89SAndroid Build Coastguard Worker // Base 1 => invalid (base 0 means "please guess").
914*8d67ca89SAndroid Build Coastguard Worker errno = 0;
915*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0), fn("123", &end_p, 1));
916*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
917*8d67ca89SAndroid Build Coastguard Worker
918*8d67ca89SAndroid Build Coastguard Worker // Base > 36 => invalid.
919*8d67ca89SAndroid Build Coastguard Worker errno = 0;
920*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0), fn("123", &end_p, 37));
921*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(EINVAL);
922*8d67ca89SAndroid Build Coastguard Worker
923*8d67ca89SAndroid Build Coastguard Worker // Both leading + or - are always allowed (even for the strtou* family).
924*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(-123), fn("-123", &end_p, 10));
925*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(123), fn("+123", &end_p, 10));
926*8d67ca89SAndroid Build Coastguard Worker
927*8d67ca89SAndroid Build Coastguard Worker // If we see "0b" *not* followed by a binary digit, we shouldn't swallow the 'b'.
928*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0), fn("0b", &end_p, 2));
929*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ('b', *end_p);
930*8d67ca89SAndroid Build Coastguard Worker
931*8d67ca89SAndroid Build Coastguard Worker // Binary (the "0b" prefix) is case-insensitive.
932*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0b101), fn("0b101", &end_p, 0));
933*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0b101), fn("0B101", &end_p, 0));
934*8d67ca89SAndroid Build Coastguard Worker
935*8d67ca89SAndroid Build Coastguard Worker // If we see "0x" *not* followed by a hex digit, we shouldn't swallow the 'x'.
936*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0), fn("0xy", &end_p, 16));
937*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ('x', *end_p);
938*8d67ca89SAndroid Build Coastguard Worker
939*8d67ca89SAndroid Build Coastguard Worker // Hexadecimal (both the "0x" prefix and the digits) is case-insensitive.
940*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0xab), fn("0xab", &end_p, 0));
941*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0xab), fn("0Xab", &end_p, 0));
942*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0xab), fn("0xAB", &end_p, 0));
943*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0xab), fn("0XAB", &end_p, 0));
944*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0xab), fn("0xAb", &end_p, 0));
945*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0xab), fn("0XAb", &end_p, 0));
946*8d67ca89SAndroid Build Coastguard Worker
947*8d67ca89SAndroid Build Coastguard Worker // Octal lives! (Sadly.)
948*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(T(0666), fn("0666", &end_p, 0));
949*8d67ca89SAndroid Build Coastguard Worker
950*8d67ca89SAndroid Build Coastguard Worker if (std::numeric_limits<T>::is_signed) {
951*8d67ca89SAndroid Build Coastguard Worker // Minimum (such as -128).
952*8d67ca89SAndroid Build Coastguard Worker std::string min{std::to_string(std::numeric_limits<T>::min())};
953*8d67ca89SAndroid Build Coastguard Worker end_p = nullptr;
954*8d67ca89SAndroid Build Coastguard Worker errno = 0;
955*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(std::numeric_limits<T>::min(), fn(min.c_str(), &end_p, 0));
956*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(0);
957*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ('\0', *end_p);
958*8d67ca89SAndroid Build Coastguard Worker // Too negative (such as -129).
959*8d67ca89SAndroid Build Coastguard Worker min.back() = (min.back() + 1);
960*8d67ca89SAndroid Build Coastguard Worker end_p = nullptr;
961*8d67ca89SAndroid Build Coastguard Worker errno = 0;
962*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(std::numeric_limits<T>::min(), fn(min.c_str(), &end_p, 0));
963*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ERANGE);
964*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ('\0', *end_p);
965*8d67ca89SAndroid Build Coastguard Worker }
966*8d67ca89SAndroid Build Coastguard Worker
967*8d67ca89SAndroid Build Coastguard Worker // Maximum (such as 127).
968*8d67ca89SAndroid Build Coastguard Worker std::string max{std::to_string(std::numeric_limits<T>::max())};
969*8d67ca89SAndroid Build Coastguard Worker end_p = nullptr;
970*8d67ca89SAndroid Build Coastguard Worker errno = 0;
971*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(std::numeric_limits<T>::max(), fn(max.c_str(), &end_p, 0));
972*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(0);
973*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ('\0', *end_p);
974*8d67ca89SAndroid Build Coastguard Worker // Too positive (such as 128).
975*8d67ca89SAndroid Build Coastguard Worker max.back() = (max.back() + 1);
976*8d67ca89SAndroid Build Coastguard Worker end_p = nullptr;
977*8d67ca89SAndroid Build Coastguard Worker errno = 0;
978*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(std::numeric_limits<T>::max(), fn(max.c_str(), &end_p, 0));
979*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ERANGE);
980*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ('\0', *end_p);
981*8d67ca89SAndroid Build Coastguard Worker
982*8d67ca89SAndroid Build Coastguard Worker // Junk at the end of a valid conversion.
983*8d67ca89SAndroid Build Coastguard Worker errno = 0;
984*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<T>(123), fn("123abc", &end_p, 0));
985*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(0);
986*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("abc", end_p);
987*8d67ca89SAndroid Build Coastguard Worker
988*8d67ca89SAndroid Build Coastguard Worker // In case of overflow, strto* leaves us pointing past the end of the number,
989*8d67ca89SAndroid Build Coastguard Worker // not at the digit that overflowed.
990*8d67ca89SAndroid Build Coastguard Worker end_p = nullptr;
991*8d67ca89SAndroid Build Coastguard Worker errno = 0;
992*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(std::numeric_limits<T>::max(),
993*8d67ca89SAndroid Build Coastguard Worker fn("99999999999999999999999999999999999999999999999999999abc", &end_p, 0));
994*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ERANGE);
995*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("abc", end_p);
996*8d67ca89SAndroid Build Coastguard Worker if (std::numeric_limits<T>::is_signed) {
997*8d67ca89SAndroid Build Coastguard Worker end_p = nullptr;
998*8d67ca89SAndroid Build Coastguard Worker errno = 0;
999*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(std::numeric_limits<T>::min(),
1000*8d67ca89SAndroid Build Coastguard Worker fn("-99999999999999999999999999999999999999999999999999999abc", &end_p, 0));
1001*8d67ca89SAndroid Build Coastguard Worker ASSERT_ERRNO(ERANGE);
1002*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("abc", end_p);
1003*8d67ca89SAndroid Build Coastguard Worker }
1004*8d67ca89SAndroid Build Coastguard Worker }
1005*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtol_smoke)1006*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtol_smoke) {
1007*8d67ca89SAndroid Build Coastguard Worker CheckStrToInt(strtol);
1008*8d67ca89SAndroid Build Coastguard Worker }
1009*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtoll_smoke)1010*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtoll_smoke) {
1011*8d67ca89SAndroid Build Coastguard Worker CheckStrToInt(strtoll);
1012*8d67ca89SAndroid Build Coastguard Worker }
1013*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtoul_smoke)1014*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtoul_smoke) {
1015*8d67ca89SAndroid Build Coastguard Worker CheckStrToInt(strtoul);
1016*8d67ca89SAndroid Build Coastguard Worker }
1017*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtoull_smoke)1018*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtoull_smoke) {
1019*8d67ca89SAndroid Build Coastguard Worker CheckStrToInt(strtoull);
1020*8d67ca89SAndroid Build Coastguard Worker }
1021*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtoimax_smoke)1022*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtoimax_smoke) {
1023*8d67ca89SAndroid Build Coastguard Worker CheckStrToInt(strtoimax);
1024*8d67ca89SAndroid Build Coastguard Worker }
1025*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,strtoumax_smoke)1026*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, strtoumax_smoke) {
1027*8d67ca89SAndroid Build Coastguard Worker CheckStrToInt(strtoumax);
1028*8d67ca89SAndroid Build Coastguard Worker }
1029*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,atoi)1030*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, atoi) {
1031*8d67ca89SAndroid Build Coastguard Worker // Implemented using strtol in bionic, so extensive testing unnecessary.
1032*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(123, atoi("123four"));
1033*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, atoi("hello"));
1034*8d67ca89SAndroid Build Coastguard Worker }
1035*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,atol)1036*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, atol) {
1037*8d67ca89SAndroid Build Coastguard Worker // Implemented using strtol in bionic, so extensive testing unnecessary.
1038*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(123L, atol("123four"));
1039*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0L, atol("hello"));
1040*8d67ca89SAndroid Build Coastguard Worker }
1041*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,abs)1042*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, abs) {
1043*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(INT_MAX, abs(-INT_MAX));
1044*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(INT_MAX, abs(INT_MAX));
1045*8d67ca89SAndroid Build Coastguard Worker }
1046*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,labs)1047*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, labs) {
1048*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(LONG_MAX, labs(-LONG_MAX));
1049*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(LONG_MAX, labs(LONG_MAX));
1050*8d67ca89SAndroid Build Coastguard Worker }
1051*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,llabs)1052*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, llabs) {
1053*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(LLONG_MAX, llabs(-LLONG_MAX));
1054*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(LLONG_MAX, llabs(LLONG_MAX));
1055*8d67ca89SAndroid Build Coastguard Worker }
1056*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,getloadavg)1057*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, getloadavg) {
1058*8d67ca89SAndroid Build Coastguard Worker double load[3];
1059*8d67ca89SAndroid Build Coastguard Worker
1060*8d67ca89SAndroid Build Coastguard Worker // The second argument should have been size_t.
1061*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getloadavg(load, -1));
1062*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(-1, getloadavg(load, INT_MIN));
1063*8d67ca89SAndroid Build Coastguard Worker
1064*8d67ca89SAndroid Build Coastguard Worker // Zero is a no-op.
1065*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(0, getloadavg(load, 0));
1066*8d67ca89SAndroid Build Coastguard Worker
1067*8d67ca89SAndroid Build Coastguard Worker // The Linux kernel doesn't support more than 3 (but you can ask for fewer).
1068*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(1, getloadavg(load, 1));
1069*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(2, getloadavg(load, 2));
1070*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(3, getloadavg(load, 3));
1071*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(3, getloadavg(load, 4));
1072*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(3, getloadavg(load, INT_MAX));
1073*8d67ca89SAndroid Build Coastguard Worker
1074*8d67ca89SAndroid Build Coastguard Worker // Read /proc/loadavg and check that it's "close enough".
1075*8d67ca89SAndroid Build Coastguard Worker double expected[3];
1076*8d67ca89SAndroid Build Coastguard Worker std::unique_ptr<FILE, decltype(&fclose)> fp{fopen("/proc/loadavg", "re"), fclose};
1077*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(3, fscanf(fp.get(), "%lf %lf %lf", &expected[0], &expected[1], &expected[2]));
1078*8d67ca89SAndroid Build Coastguard Worker load[0] = load[1] = load[2] = nan("");
1079*8d67ca89SAndroid Build Coastguard Worker ASSERT_EQ(3, getloadavg(load, 3));
1080*8d67ca89SAndroid Build Coastguard Worker
1081*8d67ca89SAndroid Build Coastguard Worker // Check that getloadavg(3) at least overwrote the NaNs.
1082*8d67ca89SAndroid Build Coastguard Worker ASSERT_FALSE(isnan(load[0]));
1083*8d67ca89SAndroid Build Coastguard Worker ASSERT_FALSE(isnan(load[1]));
1084*8d67ca89SAndroid Build Coastguard Worker ASSERT_FALSE(isnan(load[2]));
1085*8d67ca89SAndroid Build Coastguard Worker // And that the difference between /proc/loadavg and getloadavg(3) is "small".
1086*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(fabs(expected[0] - load[0]) < 0.5) << expected[0] << ' ' << load[0];
1087*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(fabs(expected[1] - load[1]) < 0.5) << expected[1] << ' ' << load[1];
1088*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(fabs(expected[2] - load[2]) < 0.5) << expected[2] << ' ' << load[2];
1089*8d67ca89SAndroid Build Coastguard Worker }
1090*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,getprogname)1091*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, getprogname) {
1092*8d67ca89SAndroid Build Coastguard Worker #if defined(__GLIBC__) || defined(ANDROID_HOST_MUSL)
1093*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "glibc and musl don't have getprogname()";
1094*8d67ca89SAndroid Build Coastguard Worker #else
1095*8d67ca89SAndroid Build Coastguard Worker // You should always have a name.
1096*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(getprogname() != nullptr);
1097*8d67ca89SAndroid Build Coastguard Worker // The name should never have a slash in it.
1098*8d67ca89SAndroid Build Coastguard Worker ASSERT_TRUE(strchr(getprogname(), '/') == nullptr);
1099*8d67ca89SAndroid Build Coastguard Worker #endif
1100*8d67ca89SAndroid Build Coastguard Worker }
1101*8d67ca89SAndroid Build Coastguard Worker
TEST(stdlib,setprogname)1102*8d67ca89SAndroid Build Coastguard Worker TEST(stdlib, setprogname) {
1103*8d67ca89SAndroid Build Coastguard Worker #if defined(__GLIBC__) || defined(ANDROID_HOST_MUSL)
1104*8d67ca89SAndroid Build Coastguard Worker GTEST_SKIP() << "glibc and musl don't have setprogname()";
1105*8d67ca89SAndroid Build Coastguard Worker #else
1106*8d67ca89SAndroid Build Coastguard Worker // setprogname() only takes the basename of what you give it.
1107*8d67ca89SAndroid Build Coastguard Worker setprogname("/usr/bin/muppet");
1108*8d67ca89SAndroid Build Coastguard Worker ASSERT_STREQ("muppet", getprogname());
1109*8d67ca89SAndroid Build Coastguard Worker #endif
1110*8d67ca89SAndroid Build Coastguard Worker }
1111