summaryrefslogtreecommitdiff
path: root/test/utils_str.c
diff options
context:
space:
mode:
authorJes Klinke <jbk@google.com>2019-05-08 10:31:57 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-05-14 20:13:39 -0700
commitac8a13329b0b321daeb87f6afb79c163beb21372 (patch)
tree386987b4a5b057501dc72463333b32a23f8f38aa /test/utils_str.c
parenta823e6d96f28928d5808149c51cd8f4963b4880e (diff)
downloadchrome-ec-ac8a13329b0b321daeb87f6afb79c163beb21372.tar.gz
Align behavior of strtoi() and strtoul() to match Linux manpage description of strtol().
Behavior changes: 1) Initial '+' character is tolerated. 2) Hexadecimal strings prefixed with "0x" are rejected, if given base parameter is anything other than 16 or 0, rather than parsed as hex, diregarding the given base. 3) If given base is 0, strings starting with leading zero will be parsed as octal, rather than decimal. 4) Initial '-' character allowed before "0x" on hexadecimal numbers. (Note: This is my first time using git or gerrit, please let me know if there is some policy or customs that I am not properly adhering to.) BRANCH=none TEST=make run-utils_str V=1 Bug: 940329 Change-Id: I71654471b77f0df071a58ff6bed7028f00cd46b5 Signed-off-by: Jes Bodi Klinke <jbk@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1577750 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Jes Klinke <jbk@chromium.org> Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
Diffstat (limited to 'test/utils_str.c')
-rw-r--r--test/utils_str.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/test/utils_str.c b/test/utils_str.c
index 81c600bc03..6498ef85d5 100644
--- a/test/utils_str.c
+++ b/test/utils_str.c
@@ -33,16 +33,112 @@ static int test_strtoi(void)
TEST_ASSERT(strtoi("10", &e, 0) == 10);
TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("010", &e, 0) == 8);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("+010", &e, 0) == 8);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("-010", &e, 0) == -8);
+ TEST_ASSERT(e && (*e == '\0'));
TEST_ASSERT(strtoi("0x1f z", &e, 0) == 31);
TEST_ASSERT(e && (*e == ' '));
+ TEST_ASSERT(strtoi("0X1f z", &e, 0) == 31);
+ TEST_ASSERT(e && (*e == ' '));
TEST_ASSERT(strtoi("10a", &e, 16) == 266);
TEST_ASSERT(e && (*e == '\0'));
TEST_ASSERT(strtoi("0x02C", &e, 16) == 44);
TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("+0x02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("-0x02C", &e, 16) == -44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("0x02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("+0x02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("-0x02C", &e, 0) == -44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("0X02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("+0X02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("-0X02C", &e, 16) == -44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("0X02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("+0X02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoi("-0X02C", &e, 0) == -44);
+ TEST_ASSERT(e && (*e == '\0'));
TEST_ASSERT(strtoi(" -12", &e, 0) == -12);
TEST_ASSERT(e && (*e == '\0'));
TEST_ASSERT(strtoi("!", &e, 0) == 0);
TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoi("+!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoi("+0!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoi("+0x!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoi("+0X!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+
+ return EC_SUCCESS;
+}
+
+static int test_strtoul(void)
+{
+ char *e;
+
+ TEST_ASSERT(strtoul("10", &e, 0) == 10);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("010", &e, 0) == 8);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("+010", &e, 0) == 8);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("-010", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '-'));
+ TEST_ASSERT(strtoul("0x1f z", &e, 0) == 31);
+ TEST_ASSERT(e && (*e == ' '));
+ TEST_ASSERT(strtoul("0X1f z", &e, 0) == 31);
+ TEST_ASSERT(e && (*e == ' '));
+ TEST_ASSERT(strtoul("10a", &e, 16) == 266);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("0x02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("+0x02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("-0x02C", &e, 16) == 0);
+ TEST_ASSERT(e && (*e == '-'));
+ TEST_ASSERT(strtoul("0x02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("+0x02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("-0x02C", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '-'));
+ TEST_ASSERT(strtoul("0X02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("+0X02C", &e, 16) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("-0X02C", &e, 16) == 0);
+ TEST_ASSERT(e && (*e == '-'));
+ TEST_ASSERT(strtoul("0X02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("+0X02C", &e, 0) == 44);
+ TEST_ASSERT(e && (*e == '\0'));
+ TEST_ASSERT(strtoul("-0X02C", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '-'));
+ TEST_ASSERT(strtoul(" -12", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '-'));
+ TEST_ASSERT(strtoul("!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoul("+!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoul("+0!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoul("+0x!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
+ TEST_ASSERT(strtoul("+0X!", &e, 0) == 0);
+ TEST_ASSERT(e && (*e == '!'));
return EC_SUCCESS;
}
@@ -157,6 +253,7 @@ void run_test(void)
RUN_TEST(test_isalpha);
RUN_TEST(test_isprint);
RUN_TEST(test_strtoi);
+ RUN_TEST(test_strtoul);
RUN_TEST(test_parse_bool);
RUN_TEST(test_strzcpy);
RUN_TEST(test_strncpy);