1*8f0ba417SAndroid Build Coastguard Worker /*
2*8f0ba417SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*8f0ba417SAndroid Build Coastguard Worker *
4*8f0ba417SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*8f0ba417SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*8f0ba417SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*8f0ba417SAndroid Build Coastguard Worker *
8*8f0ba417SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*8f0ba417SAndroid Build Coastguard Worker *
10*8f0ba417SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*8f0ba417SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*8f0ba417SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8f0ba417SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*8f0ba417SAndroid Build Coastguard Worker * limitations under the License.
15*8f0ba417SAndroid Build Coastguard Worker */
16*8f0ba417SAndroid Build Coastguard Worker
17*8f0ba417SAndroid Build Coastguard Worker #include "android-base/parseint.h"
18*8f0ba417SAndroid Build Coastguard Worker
19*8f0ba417SAndroid Build Coastguard Worker #include <errno.h>
20*8f0ba417SAndroid Build Coastguard Worker
21*8f0ba417SAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,signed_smoke)23*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, signed_smoke) {
24*8f0ba417SAndroid Build Coastguard Worker errno = 0;
25*8f0ba417SAndroid Build Coastguard Worker int i = 0;
26*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt("x", &i));
27*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
28*8f0ba417SAndroid Build Coastguard Worker errno = 0;
29*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt("123x", &i));
30*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
31*8f0ba417SAndroid Build Coastguard Worker
32*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt("123", &i));
33*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123, i);
34*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(0, errno);
35*8f0ba417SAndroid Build Coastguard Worker i = 0;
36*8f0ba417SAndroid Build Coastguard Worker EXPECT_TRUE(android::base::ParseInt(" 123", &i));
37*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(123, i);
38*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt("-123", &i));
39*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(-123, i);
40*8f0ba417SAndroid Build Coastguard Worker i = 0;
41*8f0ba417SAndroid Build Coastguard Worker EXPECT_TRUE(android::base::ParseInt(" -123", &i));
42*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(-123, i);
43*8f0ba417SAndroid Build Coastguard Worker
44*8f0ba417SAndroid Build Coastguard Worker short s = 0;
45*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt("1234", &s));
46*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1234, s);
47*8f0ba417SAndroid Build Coastguard Worker
48*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt("12", &i, 0, 15));
49*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(12, i);
50*8f0ba417SAndroid Build Coastguard Worker errno = 0;
51*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt("-12", &i, 0, 15));
52*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(ERANGE, errno);
53*8f0ba417SAndroid Build Coastguard Worker errno = 0;
54*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt("16", &i, 0, 15));
55*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(ERANGE, errno);
56*8f0ba417SAndroid Build Coastguard Worker
57*8f0ba417SAndroid Build Coastguard Worker errno = 0;
58*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt<int>("x", nullptr));
59*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
60*8f0ba417SAndroid Build Coastguard Worker errno = 0;
61*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt<int>("123x", nullptr));
62*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
63*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt<int>("1234", nullptr));
64*8f0ba417SAndroid Build Coastguard Worker }
65*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,unsigned_smoke)66*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, unsigned_smoke) {
67*8f0ba417SAndroid Build Coastguard Worker errno = 0;
68*8f0ba417SAndroid Build Coastguard Worker unsigned int i = 0u;
69*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint("x", &i));
70*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
71*8f0ba417SAndroid Build Coastguard Worker errno = 0;
72*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint("123x", &i));
73*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
74*8f0ba417SAndroid Build Coastguard Worker
75*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint("123", &i));
76*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123u, i);
77*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(0, errno);
78*8f0ba417SAndroid Build Coastguard Worker i = 0u;
79*8f0ba417SAndroid Build Coastguard Worker EXPECT_TRUE(android::base::ParseUint(" 123", &i));
80*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(123u, i);
81*8f0ba417SAndroid Build Coastguard Worker errno = 0;
82*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint("-123", &i));
83*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(EINVAL, errno);
84*8f0ba417SAndroid Build Coastguard Worker errno = 0;
85*8f0ba417SAndroid Build Coastguard Worker EXPECT_FALSE(android::base::ParseUint(" -123", &i));
86*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(EINVAL, errno);
87*8f0ba417SAndroid Build Coastguard Worker
88*8f0ba417SAndroid Build Coastguard Worker unsigned short s = 0u;
89*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint("1234", &s));
90*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1234u, s);
91*8f0ba417SAndroid Build Coastguard Worker
92*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint("12", &i, 15u));
93*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(12u, i);
94*8f0ba417SAndroid Build Coastguard Worker errno = 0;
95*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint("-12", &i, 15u));
96*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
97*8f0ba417SAndroid Build Coastguard Worker errno = 0;
98*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint("16", &i, 15u));
99*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(ERANGE, errno);
100*8f0ba417SAndroid Build Coastguard Worker
101*8f0ba417SAndroid Build Coastguard Worker errno = 0;
102*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint<unsigned short>("x", nullptr));
103*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
104*8f0ba417SAndroid Build Coastguard Worker errno = 0;
105*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint<unsigned short>("123x", nullptr));
106*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(EINVAL, errno);
107*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint<unsigned short>("1234", nullptr));
108*8f0ba417SAndroid Build Coastguard Worker
109*8f0ba417SAndroid Build Coastguard Worker errno = 0;
110*8f0ba417SAndroid Build Coastguard Worker unsigned long long int lli;
111*8f0ba417SAndroid Build Coastguard Worker EXPECT_FALSE(android::base::ParseUint("-123", &lli));
112*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(EINVAL, errno);
113*8f0ba417SAndroid Build Coastguard Worker errno = 0;
114*8f0ba417SAndroid Build Coastguard Worker EXPECT_FALSE(android::base::ParseUint(" -123", &lli));
115*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(EINVAL, errno);
116*8f0ba417SAndroid Build Coastguard Worker }
117*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,no_implicit_octal)118*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, no_implicit_octal) {
119*8f0ba417SAndroid Build Coastguard Worker int i = 0;
120*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt("0123", &i));
121*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123, i);
122*8f0ba417SAndroid Build Coastguard Worker
123*8f0ba417SAndroid Build Coastguard Worker unsigned int u = 0u;
124*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint("0123", &u));
125*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123u, u);
126*8f0ba417SAndroid Build Coastguard Worker }
127*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,explicit_hex)128*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, explicit_hex) {
129*8f0ba417SAndroid Build Coastguard Worker int i = 0;
130*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt("0x123", &i));
131*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(0x123, i);
132*8f0ba417SAndroid Build Coastguard Worker i = 0;
133*8f0ba417SAndroid Build Coastguard Worker EXPECT_TRUE(android::base::ParseInt(" 0x123", &i));
134*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(0x123, i);
135*8f0ba417SAndroid Build Coastguard Worker
136*8f0ba417SAndroid Build Coastguard Worker unsigned int u = 0u;
137*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint("0x123", &u));
138*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(0x123u, u);
139*8f0ba417SAndroid Build Coastguard Worker u = 0u;
140*8f0ba417SAndroid Build Coastguard Worker EXPECT_TRUE(android::base::ParseUint(" 0x123", &u));
141*8f0ba417SAndroid Build Coastguard Worker EXPECT_EQ(0x123u, u);
142*8f0ba417SAndroid Build Coastguard Worker }
143*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,string)144*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, string) {
145*8f0ba417SAndroid Build Coastguard Worker int i = 0;
146*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseInt(std::string("123"), &i));
147*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123, i);
148*8f0ba417SAndroid Build Coastguard Worker
149*8f0ba417SAndroid Build Coastguard Worker unsigned int u = 0u;
150*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseUint(std::string("123"), &u));
151*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123u, u);
152*8f0ba417SAndroid Build Coastguard Worker }
153*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,untouched_on_failure)154*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, untouched_on_failure) {
155*8f0ba417SAndroid Build Coastguard Worker int i = 123;
156*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseInt("456x", &i));
157*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123, i);
158*8f0ba417SAndroid Build Coastguard Worker
159*8f0ba417SAndroid Build Coastguard Worker unsigned int u = 123u;
160*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseUint("456x", &u));
161*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123u, u);
162*8f0ba417SAndroid Build Coastguard Worker }
163*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,ParseByteCount)164*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, ParseByteCount) {
165*8f0ba417SAndroid Build Coastguard Worker uint64_t i = 0;
166*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("123b", &i));
167*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(123ULL, i);
168*8f0ba417SAndroid Build Coastguard Worker
169*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("8k", &i));
170*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(8ULL * 1024, i);
171*8f0ba417SAndroid Build Coastguard Worker
172*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("8M", &i));
173*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(8ULL * 1024 * 1024, i);
174*8f0ba417SAndroid Build Coastguard Worker
175*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("6g", &i));
176*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(6ULL * 1024 * 1024 * 1024, i);
177*8f0ba417SAndroid Build Coastguard Worker
178*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("1T", &i));
179*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(1ULL * 1024 * 1024 * 1024 * 1024, i);
180*8f0ba417SAndroid Build Coastguard Worker
181*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("2p", &i));
182*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(2ULL * 1024 * 1024 * 1024 * 1024 * 1024, i);
183*8f0ba417SAndroid Build Coastguard Worker
184*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("4e", &i));
185*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(4ULL * 1024 * 1024 * 1024 * 1024 * 1024 * 1024, i);
186*8f0ba417SAndroid Build Coastguard Worker }
187*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,ParseByteCount_invalid_suffix)188*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, ParseByteCount_invalid_suffix) {
189*8f0ba417SAndroid Build Coastguard Worker unsigned u;
190*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseByteCount("1x", &u));
191*8f0ba417SAndroid Build Coastguard Worker }
192*8f0ba417SAndroid Build Coastguard Worker
TEST(parseint,ParseByteCount_overflow)193*8f0ba417SAndroid Build Coastguard Worker TEST(parseint, ParseByteCount_overflow) {
194*8f0ba417SAndroid Build Coastguard Worker uint64_t u64;
195*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseByteCount("4294967295E", &u64));
196*8f0ba417SAndroid Build Coastguard Worker
197*8f0ba417SAndroid Build Coastguard Worker uint16_t u16;
198*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("63k", &u16));
199*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(63U * 1024, u16);
200*8f0ba417SAndroid Build Coastguard Worker ASSERT_TRUE(android::base::ParseByteCount("65535b", &u16));
201*8f0ba417SAndroid Build Coastguard Worker ASSERT_EQ(65535U, u16);
202*8f0ba417SAndroid Build Coastguard Worker ASSERT_FALSE(android::base::ParseByteCount("65k", &u16));
203*8f0ba417SAndroid Build Coastguard Worker }
204