^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <sys/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <sys/stat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <fcntl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <limits.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "tests.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <api/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define TEMPL "/tmp/perf-test-XXXXXX"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define EXPECT_EQUAL(val, expected) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) if (val != expected) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) pr_debug("%s:%d: %d != %d\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) __FILE__, __LINE__, val, expected); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ret = -1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define EXPECT_EQUAL64(val, expected) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if (val != expected) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) pr_debug("%s:%d: %lld != %lld\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) __FILE__, __LINE__, val, expected); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ret = -1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) static int make_test_file(char path[PATH_MAX], const char *contents)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ssize_t contents_len = strlen(contents);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) int fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) strcpy(path, TEMPL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) fd = mkstemp(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if (fd < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) pr_debug("mkstemp failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (write(fd, contents, contents_len) < contents_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) pr_debug("short write");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unlink(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static int setup_test(char path[PATH_MAX], const char *contents,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) size_t buf_size, struct io *io)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (make_test_file(path, contents))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) io->fd = open(path, O_RDONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if (io->fd < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) pr_debug("Failed to open '%s'\n", path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) unlink(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) io->buf = malloc(buf_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) if (io->buf == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) pr_debug("Failed to allocate memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) close(io->fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unlink(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) io__init(io, io->fd, io->buf, buf_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static void cleanup_test(char path[PATH_MAX], struct io *io)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) free(io->buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) close(io->fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) unlink(path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static int do_test_get_char(const char *test_string, size_t buf_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) char path[PATH_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct io io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int ch, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) size_t i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) if (setup_test(path, test_string, buf_size, &io))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) for (i = 0; i < strlen(test_string); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) ch = io__get_char(&io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) EXPECT_EQUAL(ch, test_string[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) EXPECT_EQUAL(io.eof, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ch = io__get_char(&io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) EXPECT_EQUAL(ch, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) EXPECT_EQUAL(io.eof, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) cleanup_test(path, &io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static int test_get_char(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) int i, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) size_t j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static const char *const test_strings[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) "12345678abcdef90",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) "a\nb\nc\nd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) "\a\b\t\v\f\r",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) for (i = 0; i <= 10; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) for (j = 0; j < ARRAY_SIZE(test_strings); j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if (do_test_get_char(test_strings[j], 1 << i))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) static int do_test_get_hex(const char *test_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) __u64 val1, int ch1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) __u64 val2, int ch2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) __u64 val3, int ch3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) bool end_eof)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) char path[PATH_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) struct io io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) int ch, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) __u64 hex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (setup_test(path, test_string, 4, &io))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ch = io__get_hex(&io, &hex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) EXPECT_EQUAL64(hex, val1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) EXPECT_EQUAL(ch, ch1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ch = io__get_hex(&io, &hex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) EXPECT_EQUAL64(hex, val2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) EXPECT_EQUAL(ch, ch2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ch = io__get_hex(&io, &hex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) EXPECT_EQUAL64(hex, val3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) EXPECT_EQUAL(ch, ch3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) EXPECT_EQUAL(io.eof, end_eof);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) cleanup_test(path, &io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static int test_get_hex(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (do_test_get_hex("12345678abcdef90",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 0x12345678abcdef90, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 0, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 0, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (do_test_get_hex("1\n2\n3\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 1, '\n',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 2, '\n',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 3, '\n',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (do_test_get_hex("12345678ABCDEF90;a;b",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 0x12345678abcdef90, ';',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 0xa, ';',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 0xb, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (do_test_get_hex("0x1x2x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 0, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 1, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 2, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (do_test_get_hex("x1x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 0, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 1, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 0, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (do_test_get_hex("10000000000000000000000000000abcdefgh99i",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 0xabcdef, 'g',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 0, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 0x99, 'i',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) static int do_test_get_dec(const char *test_string,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) __u64 val1, int ch1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) __u64 val2, int ch2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) __u64 val3, int ch3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) bool end_eof)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) char path[PATH_MAX];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct io io;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) int ch, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) __u64 dec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) if (setup_test(path, test_string, 4, &io))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ch = io__get_dec(&io, &dec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) EXPECT_EQUAL64(dec, val1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) EXPECT_EQUAL(ch, ch1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) ch = io__get_dec(&io, &dec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) EXPECT_EQUAL64(dec, val2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) EXPECT_EQUAL(ch, ch2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) ch = io__get_dec(&io, &dec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) EXPECT_EQUAL64(dec, val3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) EXPECT_EQUAL(ch, ch3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) EXPECT_EQUAL(io.eof, end_eof);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) cleanup_test(path, &io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static int test_get_dec(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (do_test_get_dec("12345678abcdef90",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 12345678, 'a',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 0, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 0, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (do_test_get_dec("1\n2\n3\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 1, '\n',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 2, '\n',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 3, '\n',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (do_test_get_dec("12345678;1;2",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 12345678, ';',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 1, ';',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 2, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (do_test_get_dec("0x1x2x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 0, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 1, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 2, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) if (do_test_get_dec("x1x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 0, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 1, 'x',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 0, -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) true))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (do_test_get_dec("10000000000000000000000000000000000000000000000000000000000123456789ab99c",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 123456789, 'a',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 0, -2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 99, 'c',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) false))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) int test__api_io(struct test *test __maybe_unused,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (test_get_char())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) ret = TEST_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) if (test_get_hex())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ret = TEST_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (test_get_dec())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) ret = TEST_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) }