From: Neil Horman Date: Fri, 12 Jul 2024 15:01:02 +0000 (-0400) Subject: Add a stroul test X-Git-Tag: openssl-3.4.0-alpha1~314 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=863e44c1e0841b7c46f3fa1ddf75870c60105303;p=thirdparty%2Fopenssl.git Add a stroul test Reviewed-by: Tom Cosgrove Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/24861) --- diff --git a/test/build.info b/test/build.info index 80394085b96..692b474e883 100644 --- a/test/build.info +++ b/test/build.info @@ -64,7 +64,7 @@ IF[{- !$disabled{tests} -}] ca_internals_test bio_tfo_test membio_test bio_dgram_test list_test \ fips_version_test x509_test hpke_test pairwise_fail_test \ nodefltctxtest evp_xof_test x509_load_cert_file_test bio_meth_test \ - x509_acert_test x509_req_test + x509_acert_test x509_req_test strtoultest IF[{- !$disabled{'rpk'} -}] PROGRAMS{noinst}=rpktest @@ -1215,6 +1215,10 @@ ENDIF INCLUDE[x509_req_test]=../include ../apps/include DEPEND[x509_req_test]=../libcrypto libtestutil.a + SOURCE[strtoultest]=strtoultest.c + INCLUDE[strtoultest]=../include ../apps/include + DEPEND[strtoultest]=../libcrypto libtestutil.a + {- use File::Spec::Functions; use File::Basename; diff --git a/test/recipes/02-test_strtoul.t b/test/recipes/02-test_strtoul.t new file mode 100644 index 00000000000..bbebf02d254 --- /dev/null +++ b/test/recipes/02-test_strtoul.t @@ -0,0 +1,20 @@ +#! /usr/bin/env perl +# Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + + +use OpenSSL::Test::Simple; +use OpenSSL::Test; +use OpenSSL::Test::Utils; + +BEGIN { + setup("strotoultest"); +} + +plan tests => 1; + +ok(run(test(["strtoultest"])), "running strtoul test"); diff --git a/test/strtoultest.c b/test/strtoultest.c new file mode 100644 index 00000000000..267cdf114c3 --- /dev/null +++ b/test/strtoultest.c @@ -0,0 +1,105 @@ +/* + * Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "testutil.h" + +struct strtoul_test_entry { + char *input; /* the input string */ + int base; /* the base we are converting in */ + unsigned long expect_val; /* the expected value we should get */ + int expect_err; /* the expected error we expect to recieve */ + size_t expect_endptr_offset; /* the expected endptr offset, +1 for NULL */ +}; + +static struct strtoul_test_entry strtoul_tests[] = { + /* pass on conv "0" to 0 */ + { + "0", 0, 0, 1, 1 + }, + /* pass on conv "12345" to 12345 */ + { + "12345", 0, 12345, 1, 5 + }, + /* pass on conv "0x12345" to 0x12345, base 16 */ + { + "0x12345", 0, 0x12345, 1, 7 + }, + /* pass on base 10 translation, endptr points to 'x' */ + { + "0x12345", 10, 0, 1, 1 + }, +#if defined(__WORDSIZE) && __WORDSIZE == 64 + /* pass on ULONG_MAX translation */ + { + "18446744073709551615", 0, ULONG_MAX, 1, 20 + }, +#else + { + "4294967295", 0, ULONG_MAX, 1, 10 + }, +#endif + /* fail on negative input */ + { + "-1", 0, 0, 0, 0 + }, + /* fail on non-numerical input */ + { + "abcd", 0, 0, 0, 0 + }, + /* pass on decimal input */ + { + "1.0", 0, 1, 1, 1 + }, + /* Fail on decimal input without leading number */ + { + ".1", 0, 0, 0, 0 + } +}; + +static int test_strtoul(int idx) +{ + unsigned long val; + char *endptr = NULL; + int err; + struct strtoul_test_entry *test = &strtoul_tests[idx]; + + /* + * For each test, convert the string to an unsigned long + */ + err = OPENSSL_strtoul(test->input, &endptr, test->base, &val); + + /* + * Check to ensure the error returned is expected + */ + if (!TEST_int_eq(err, test->expect_err)) + return 0; + /* + * Confirm that the endptr points to where we expect + */ + if (!TEST_ptr_eq(endptr, &test->input[test->expect_endptr_offset])) + return 0; + /* + * And check that we received the proper translated value + * Note, we only check the value if the conversion passed + */ + if (test->expect_err == 1) { + if (!TEST_ulong_eq(val, test->expect_val)) + return 0; + } + return 1; + +} + +int setup_tests(void) +{ + ADD_ALL_TESTS(test_strtoul, OSSL_NELEM(strtoul_tests)); + return 1; +}