Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2002, Uwe Bonnes * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. * Copyright (c) 2007-2016, The Tor Project, Inc. * Copyright (c) 2020, EPAM Systems Inc. * * Unit tests for sscanf() function */ #include <common.h> #include <command.h> #include <log.h> #include <test/lib.h> #include <test/test.h> #include <test/ut.h> #define EOF -1 /** * lib_sscanf() - unit test for sscanf() * @uts: unit test state * * Test sscanf() with varied parameters in different combinations passed * as arguments. * * Return: 0 - success * 1 - failure */ static int lib_sscanf(struct unit_test_state *uts) { char buffer[100], buffer1[100]; int result, ret; static const char pname[] = " Hello World!\n"; int hour = 21, min = 59, sec = 20; int number, number_so_far; unsigned int u1, u2, u3; char s1[20], s2[10], s3[10], ch; int r, int1, int2; long lng1; /* check EOF */ strcpy(buffer, ""); ret = sscanf(buffer, "%d", &result); ut_asserteq(ret, EOF); /* check %x */ strcpy(buffer, "0x519"); ut_asserteq(sscanf(buffer, "%x", &result), 1); ut_asserteq(result, 0x519); strcpy(buffer, "0x51a"); ut_asserteq(sscanf(buffer, "%x", &result), 1); ut_asserteq(result, 0x51a); strcpy(buffer, "0x51g"); ut_asserteq(sscanf(buffer, "%x", &result), 1); ut_asserteq(result, 0x51); /* check strings */ ret = sprintf(buffer, " %s", pname); ret = sscanf(buffer, "%*c%[^\n]", buffer1); ut_asserteq(ret, 1); ut_asserteq(strncmp(pname, buffer1, strlen(buffer1)), 0); /* check digits */ ret = sprintf(buffer, "%d:%d:%d", hour, min, sec); ret = sscanf(buffer, "%d%n", &number, &number_so_far); ut_asserteq(ret, 1); ut_asserteq(number, hour); ut_asserteq(number_so_far, 2); ret = sscanf(buffer + 2, "%*c%n", &number_so_far); ut_asserteq(ret, 0); ut_asserteq(number_so_far, 1); /* Check %i */ strcpy(buffer, "123"); ret = sscanf(buffer, "%i", &result); ut_asserteq(ret, 1); ut_asserteq(result, 123); ret = sscanf(buffer, "%d", &result); ut_asserteq(ret, 1); ut_asserteq(result, 123); ut_asserteq(0, sscanf("hello world", "hello world")); ut_asserteq(0, sscanf("hello world", "good bye")); /* Excess data */ ut_asserteq(0, sscanf("hello 3", "%u", &u1)); /* have to match the start */ ut_asserteq(1, sscanf("3 hello", "%u", &u1)); /* but trailing is alright */ /* Numbers (ie. %u) */ ut_asserteq(0, sscanf("hello world 3", "hello worlb %u", &u1)); /* d vs b */ ut_asserteq(1, sscanf("12345", "%u", &u1)); ut_asserteq(12345u, u1); ut_asserteq(1, sscanf("0", "%u", &u1)); ut_asserteq(0u, u1); ut_asserteq(1, sscanf("0000", "%u", &u2)); ut_asserteq(0u, u2); ut_asserteq(0, sscanf("A", "%u", &u1)); /* bogus number */ /* Numbers with size (eg. %2u) */ ut_asserteq(2, sscanf("123456", "%2u%u", &u1, &u2)); ut_asserteq(12u, u1); ut_asserteq(3456u, u2); ut_asserteq(1, sscanf("123456", "%8u", &u1)); ut_asserteq(123456u, u1); ut_asserteq(1, sscanf("123457 ", "%8u", &u1)); ut_asserteq(123457u, u1); ut_asserteq(3, sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3)); ut_asserteq(12u, u1); ut_asserteq(3u, u2); ut_asserteq(456u, u3); ut_asserteq(3, sscanf("67:8:099", "%2u:%2u:%3u", &u1, &u2, &u3)); /* 0s */ ut_asserteq(67u, u1); ut_asserteq(8u, u2); ut_asserteq(99u, u3); /* Arbitrary amounts of 0-padding are okay */ ut_asserteq(3, sscanf("12:03:000000000000000099", "%2u:%2u:%u", &u1, &u2, &u3)); ut_asserteq(12u, u1); ut_asserteq(3u, u2); ut_asserteq(99u, u3); /* Hex (ie. %x) */ ut_asserteq(3, sscanf("1234 02aBcdEf ff", "%x %x %x", &u1, &u2, &u3)); ut_asserteq(0x1234, u1); ut_asserteq(0x2ABCDEF, u2); ut_asserteq(0xFF, u3); /* Width works on %x */ ut_asserteq(3, sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3)); ut_asserteq(0xf00d, u1); ut_asserteq(0xcafe, u2); ut_asserteq(444, u3); /* Literal '%' (ie. '%%') */ ut_asserteq(1, sscanf("99% fresh", "%3u%% fresh", &u1)); ut_asserteq(99, u1); ut_asserteq(0, sscanf("99 fresh", "%% %3u %s", &u1, s1)); ut_asserteq(1, sscanf("99 fresh", "%3u%% %s", &u1, s1)); ut_asserteq(2, sscanf("99 fresh", "%3u %5s %%", &u1, s1)); ut_asserteq(99, u1); ut_asserteq_str(s1, "fresh"); ut_asserteq(1, sscanf("% boo", "%% %3s", s1)); ut_asserteq_str("boo", s1); /* Strings (ie. %s) */ ut_asserteq(2, sscanf("hello", "%3s%7s", s1, s2)); ut_asserteq_str(s1, "hel"); ut_asserteq_str(s2, "lo"); ut_asserteq(2, sscanf("WD40", "%2s%u", s3, &u1)); /* %s%u */ ut_asserteq_str(s3, "WD"); ut_asserteq(40, u1); ut_asserteq(2, sscanf("WD40", "%3s%u", s3, &u1)); /* %s%u */ ut_asserteq_str(s3, "WD4"); ut_asserteq(0, u1); ut_asserteq(2, sscanf("76trombones", "%6u%9s", &u1, s1)); /* %u%s */ ut_asserteq(76, u1); ut_asserteq_str(s1, "trombones"); ut_asserteq(3, sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch)); ut_asserteq(4, sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch)); ut_asserteq(' ', ch); r = sscanf("12345 -67890 -1", "%d %ld %d", &int1, &lng1, &int2); ut_asserteq(r, 3); ut_asserteq(int1, 12345); ut_asserteq(lng1, -67890); ut_asserteq(int2, -1); return 0; } LIB_TEST(lib_sscanf, 0); |