/* * Software Updater - client side * * Copyright (c) 2019-2025 Intel Corporation. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 2 or later of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "../../src/lib/strings.h" #include "../../src/lib/list.h" #include "../../src/lib/macros.h" #include "test_helper.h" static void test_str_to_int() { char tmp_str[100]; int err; int value = 0; size_t i; // test some standard values char *str_values[] = { "0", "-0", "123", "000123", "-123" }; int values[] = { 0, 0, 123, 123, -123 }; for (i = 0; i < sizeof(values) / sizeof(int); i++) { value = 0xffffff; err = str_to_int(str_values[i], &value); check(err == 0); check(value == values[i]); } // test limits value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MAX - 1); err = str_to_int(tmp_str, &value); check(err == 0); check(value == INT_MAX - 1); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MAX); err = str_to_int(tmp_str, &value); check(err == 0); check(value == INT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MIN + 1); err = str_to_int(tmp_str, &value); check(err == 0); check(value == INT_MIN + 1); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MIN); err = str_to_int(tmp_str, &value); check(err == 0); check(value == INT_MIN); // test errors value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MAX + 1); err = str_to_int(tmp_str, &value); check(err == -ERANGE); check(value == INT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MAX + 1000); err = str_to_int(tmp_str, &value); check(err == -ERANGE); check(value == INT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MIN - 1); err = str_to_int(tmp_str, &value); check(err == -ERANGE); check(value == INT_MIN); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MIN - 1000); err = str_to_int(tmp_str, &value); check(err == -ERANGE); check(value == INT_MIN); // test EINVAL errors char *einval_errors[] = { "string", "123.456", "123a", "a123a", "456b123", "0x12345", "4f"}; for (i = 0; i < sizeof(einval_errors) / sizeof(char *); i++) { err = str_to_int(einval_errors[i], &value); check(err == -EINVAL); } } static void test_str_to_int_endptr() { char tmp_str[100]; char *endptr; int err; int value = 0; size_t i; // test some standard values char *str_values[] = { "0", "-0", "123", "000123", "-123" }; int values[] = { 0, 0, 123, 123, -123 }; for (i = 0; i < sizeof(values) / sizeof(int); i++) { value = 0xffffff; err = str_to_int_endptr(str_values[i], NULL, &value); check(err == 0); check(value == values[i]); } // test limits value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MAX - 1); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == 0); check(value == INT_MAX - 1); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MAX); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == 0); check(value == INT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MIN + 1); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == 0); check(value == INT_MIN + 1); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MIN); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == 0); check(value == INT_MIN); // test errors value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MAX + 1); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == -ERANGE); check(value == INT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MAX + 1000); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == -ERANGE); check(value == INT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MIN - 1); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == -ERANGE); check(value == INT_MIN); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)INT_MIN - 1000); err = str_to_int_endptr(tmp_str, NULL, &value); check(err == -ERANGE); check(value == INT_MIN); // Test endptr trailing chars value = 0xffffff; endptr = NULL; err = str_to_int_endptr("123.456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == '.'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("123a456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == 'a'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("123testing456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == 't'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("123-456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == '-'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("-123.456", &endptr, &value); check(err == 0); check(value == -123); check(endptr != NULL); check(*endptr == '.'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("-123a456", &endptr, &value); check(err == 0); check(value == -123); check(endptr != NULL); check(*endptr == 'a'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("-123testing456", &endptr, &value); check(err == 0); check(value == -123); check(endptr != NULL); check(*endptr == 't'); value = 0xffffff; endptr = NULL; err = str_to_int_endptr("-123-456", &endptr, &value); check(err == 0); check(value == -123); check(endptr != NULL); check(*endptr == '-'); } static void test_str_to_uint() { char tmp_str[100]; int err; unsigned int value = 0; size_t i; // test some standard values char *str_values[] = { "0", "-0", "123", "000123" }; unsigned int values[] = { 0, 0, 123, 123 }; for (i = 0; i < sizeof(values) / sizeof(int); i++) { value = 0xffffff; err = str_to_uint(str_values[i], &value); check(err == 0); check(value == values[i]); } // test limits value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%u", UINT_MAX - 1); err = str_to_uint(tmp_str, &value); check(err == 0); check(value == UINT_MAX - 1); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%u", UINT_MAX); err = str_to_uint(tmp_str, &value); check(err == 0); check(value == UINT_MAX); // test errors value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)UINT_MAX + 1); err = str_to_uint(tmp_str, &value); check(err == -ERANGE); check(value == UINT_MAX); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%ld", (long)UINT_MAX + 1000); err = str_to_uint(tmp_str, &value); check(err == -ERANGE); check(value == UINT_MAX); // Negative value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", -1); err = str_to_uint(tmp_str, &value); check(err == -ERANGE); check(value == 0); value = 0xffffff; snprintf(tmp_str, sizeof(tmp_str), "%d", INT_MIN); err = str_to_uint(tmp_str, &value); check(err == -ERANGE); check(value == 0); // test EINVAL errors char *einval_errors[] = { "string", "123.456", "123a", "a123a", "456b123", "0x12345", "4f"}; for (i = 0; i < sizeof(einval_errors) / sizeof(char *); i++) { err = str_to_uint(einval_errors[i], &value); check(err == -EINVAL); } } static void test_str_to_uint_endptr() { char *endptr; int err; unsigned int value = 0; // Test endptr trailing chars value = 0xffffff; endptr = NULL; err = str_to_uint_endptr("123.456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == '.'); value = 0xffffff; endptr = NULL; err = str_to_uint_endptr("123a456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == 'a'); value = 0xffffff; endptr = NULL; err = str_to_uint_endptr("123testing456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == 't'); value = 0xffffff; endptr = NULL; err = str_to_uint_endptr("123-456", &endptr, &value); check(err == 0); check(value == 123); check(endptr != NULL); check(*endptr == '-'); value = 0xffffff; endptr = NULL; err = str_to_uint_endptr("-123.456", &endptr, &value); check(err == -ERANGE); value = 0xffffff; endptr = NULL; err = str_to_uint_endptr("-123a456", &endptr, &value); check(err == -ERANGE); } void test_str_join() { struct list *str_list = NULL; char *joined; joined = str_join(" long separator ", str_list); check(str_cmp(joined, "") == 0); FREE(joined); str_list = list_prepend_data(str_list, "string3"); joined = str_join(" long separator ", str_list); check(str_cmp(joined, "string3") == 0); FREE(joined); str_list = list_prepend_data(str_list, "string2"); str_list = list_prepend_data(str_list, "string1"); joined = str_join(",", str_list); check(str_cmp(joined, "string1,string2,string3") == 0); FREE(joined); joined = str_join(" long separator ", str_list); check(str_cmp(joined, "string1 long separator string2 long separator string3") == 0); FREE(joined); joined = str_join("", str_list); check(str_cmp(joined, "string1string2string3") == 0); FREE(joined); joined = str_join(NULL, str_list); check(str_cmp(joined, "string1string2string3") == 0); FREE(joined); list_free_list(str_list); } int main() { test_str_to_int(); test_str_to_int_endptr(); test_str_join(); test_str_to_uint(); test_str_to_uint_endptr(); return 0; }