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