924 lines · 22.0 KB · C
RawDownload
#include <linux/init.h>#include <linux/kernel.h>#include <linux/module.h> #define for_each_test(i, test)	\	for (i = 0; i < ARRAY_SIZE(test); i++) struct test_fail {	const char *str;	unsigned int base;}; #define DEFINE_TEST_FAIL(test)	\	const struct test_fail test[] __initconst #define DECLARE_TEST_OK(type, test_type)	\	test_type {				\		const char *str;		\		unsigned int base;		\		type expected_res;		\	} #define DEFINE_TEST_OK(type, test)	\	const type test[] __initconst #define TEST_FAIL(fn, type, fmt, test)					\{									\	unsigned int i;							\									\	for_each_test(i, test) {					\		const struct test_fail *t = &test[i];			\		type tmp;						\		int rv;							\									\		tmp = 0;						\		rv = fn(t->str, t->base, &tmp);				\		if (rv >= 0) {						\			WARN(1, "str '%s', base %u, expected -E, got %d/" fmt "\n",	\				t->str, t->base, rv, tmp);		\			continue;					\		}							\	}								\} #define TEST_OK(fn, type, fmt, test)					\{									\	unsigned int i;							\									\	for_each_test(i, test) {					\		const typeof(test[0]) *t = &test[i];			\		type res;						\		int rv;							\									\		rv = fn(t->str, t->base, &res);				\		if (rv != 0) {						\			WARN(1, "str '%s', base %u, expected 0/" fmt ", got %d\n",	\				t->str, t->base, t->expected_res, rv);	\			continue;					\		}							\		if (res != t->expected_res) {				\			WARN(1, "str '%s', base %u, expected " fmt ", got " fmt "\n",	\				t->str, t->base, t->expected_res, res);	\			continue;					\		}							\	}								\} static void __init test_kstrtoull_ok(void){	DECLARE_TEST_OK(unsigned long long, struct test_ull);	static DEFINE_TEST_OK(struct test_ull, test_ull_ok) = {		{"0",	10,	0ULL},		{"1",	10,	1ULL},		{"127",	10,	127ULL},		{"128",	10,	128ULL},		{"129",	10,	129ULL},		{"255",	10,	255ULL},		{"256",	10,	256ULL},		{"257",	10,	257ULL},		{"32767",	10,	32767ULL},		{"32768",	10,	32768ULL},		{"32769",	10,	32769ULL},		{"65535",	10,	65535ULL},		{"65536",	10,	65536ULL},		{"65537",	10,	65537ULL},		{"2147483647",	10,	2147483647ULL},		{"2147483648",	10,	2147483648ULL},		{"2147483649",	10,	2147483649ULL},		{"4294967295",	10,	4294967295ULL},		{"4294967296",	10,	4294967296ULL},		{"4294967297",	10,	4294967297ULL},		{"9223372036854775807",	10,	9223372036854775807ULL},		{"9223372036854775808",	10,	9223372036854775808ULL},		{"9223372036854775809",	10,	9223372036854775809ULL},		{"18446744073709551614",	10,	18446744073709551614ULL},		{"18446744073709551615",	10,	18446744073709551615ULL}, 		{"00",		8,	00ULL},		{"01",		8,	01ULL},		{"0177",	8,	0177ULL},		{"0200",	8,	0200ULL},		{"0201",	8,	0201ULL},		{"0377",	8,	0377ULL},		{"0400",	8,	0400ULL},		{"0401",	8,	0401ULL},		{"077777",	8,	077777ULL},		{"0100000",	8,	0100000ULL},		{"0100001",	8,	0100001ULL},		{"0177777",	8,	0177777ULL},		{"0200000",	8,	0200000ULL},		{"0200001",	8,	0200001ULL},		{"017777777777",	8,	017777777777ULL},		{"020000000000",	8,	020000000000ULL},		{"020000000001",	8,	020000000001ULL},		{"037777777777",	8,	037777777777ULL},		{"040000000000",	8,	040000000000ULL},		{"040000000001",	8,	040000000001ULL},		{"0777777777777777777777",	8,	0777777777777777777777ULL},		{"01000000000000000000000",	8,	01000000000000000000000ULL},		{"01000000000000000000001",	8,	01000000000000000000001ULL},		{"01777777777777777777776",	8,	01777777777777777777776ULL},		{"01777777777777777777777",	8,	01777777777777777777777ULL}, 		{"0x0",		16,	0x0ULL},		{"0x1",		16,	0x1ULL},		{"0x7f",	16,	0x7fULL},		{"0x80",	16,	0x80ULL},		{"0x81",	16,	0x81ULL},		{"0xff",	16,	0xffULL},		{"0x100",	16,	0x100ULL},		{"0x101",	16,	0x101ULL},		{"0x7fff",	16,	0x7fffULL},		{"0x8000",	16,	0x8000ULL},		{"0x8001",	16,	0x8001ULL},		{"0xffff",	16,	0xffffULL},		{"0x10000",	16,	0x10000ULL},		{"0x10001",	16,	0x10001ULL},		{"0x7fffffff",	16,	0x7fffffffULL},		{"0x80000000",	16,	0x80000000ULL},		{"0x80000001",	16,	0x80000001ULL},		{"0xffffffff",	16,	0xffffffffULL},		{"0x100000000",	16,	0x100000000ULL},		{"0x100000001",	16,	0x100000001ULL},		{"0x7fffffffffffffff",	16,	0x7fffffffffffffffULL},		{"0x8000000000000000",	16,	0x8000000000000000ULL},		{"0x8000000000000001",	16,	0x8000000000000001ULL},		{"0xfffffffffffffffe",	16,	0xfffffffffffffffeULL},		{"0xffffffffffffffff",	16,	0xffffffffffffffffULL}, 		{"0\n",	0,	0ULL},	};	TEST_OK(kstrtoull, unsigned long long, "%llu", test_ull_ok);} static void __init test_kstrtoull_fail(void){	static DEFINE_TEST_FAIL(test_ull_fail) = {		{"",	0},		{"",	8},		{"",	10},		{"",	16},		{"\n",	0},		{"\n",	8},		{"\n",	10},		{"\n",	16},		{"\n0",	0},		{"\n0",	8},		{"\n0",	10},		{"\n0",	16},		{"+",	0},		{"+",	8},		{"+",	10},		{"+",	16},		{"-",	0},		{"-",	8},		{"-",	10},		{"-",	16},		{"0x",	0},		{"0x",	16},		{"0X",	0},		{"0X",	16},		{"0 ",	0},		{"1+",	0},		{"1-",	0},		{" 2",	0},		/* base autodetection */		{"0x0z",	0},		{"0z",		0},		{"a",		0},		/* digit >= base */		{"2",	2},		{"8",	8},		{"a",	10},		{"A",	10},		{"g",	16},		{"G",	16},		/* overflow */		{"10000000000000000000000000000000000000000000000000000000000000000",	2},		{"2000000000000000000000",	8},		{"18446744073709551616",	10},		{"569202370375329612767",	10},		{"10000000000000000",	16},		/* negative */		{"-0", 0},		{"-0", 8},		{"-0", 10},		{"-0", 16},		{"-1", 0},		{"-1", 8},		{"-1", 10},		{"-1", 16},		/* sign is first character if any */		{"-+1", 0},		{"-+1", 8},		{"-+1", 10},		{"-+1", 16},		/* nothing after \n */		{"0\n0", 0},		{"0\n0", 8},		{"0\n0", 10},		{"0\n0", 16},		{"0\n+", 0},		{"0\n+", 8},		{"0\n+", 10},		{"0\n+", 16},		{"0\n-", 0},		{"0\n-", 8},		{"0\n-", 10},		{"0\n-", 16},		{"0\n ", 0},		{"0\n ", 8},		{"0\n ", 10},		{"0\n ", 16},	};	TEST_FAIL(kstrtoull, unsigned long long, "%llu", test_ull_fail);} static void __init test_kstrtoll_ok(void){	DECLARE_TEST_OK(long long, struct test_ll);	static DEFINE_TEST_OK(struct test_ll, test_ll_ok) = {		{"0",	10,	0LL},		{"1",	10,	1LL},		{"127",	10,	127LL},		{"128",	10,	128LL},		{"129",	10,	129LL},		{"255",	10,	255LL},		{"256",	10,	256LL},		{"257",	10,	257LL},		{"32767",	10,	32767LL},		{"32768",	10,	32768LL},		{"32769",	10,	32769LL},		{"65535",	10,	65535LL},		{"65536",	10,	65536LL},		{"65537",	10,	65537LL},		{"2147483647",	10,	2147483647LL},		{"2147483648",	10,	2147483648LL},		{"2147483649",	10,	2147483649LL},		{"4294967295",	10,	4294967295LL},		{"4294967296",	10,	4294967296LL},		{"4294967297",	10,	4294967297LL},		{"9223372036854775807",	10,	9223372036854775807LL}, 		{"-0",	10,	0LL},		{"-1",	10,	-1LL},		{"-2",	10,	-2LL},		{"-9223372036854775808",	10,	LLONG_MIN},	};	TEST_OK(kstrtoll, long long, "%lld", test_ll_ok);} static void __init test_kstrtoll_fail(void){	static DEFINE_TEST_FAIL(test_ll_fail) = {		{"9223372036854775808",	10},		{"9223372036854775809",	10},		{"18446744073709551614",	10},		{"18446744073709551615",	10},		{"569202370375329612767",	10},		{"-9223372036854775809",	10},		{"-18446744073709551614",	10},		{"-18446744073709551615",	10},		{"-569202370375329612767",	10},		/* sign is first character if any */		{"-+1", 0},		{"-+1", 8},		{"-+1", 10},		{"-+1", 16},	};	TEST_FAIL(kstrtoll, long long, "%lld", test_ll_fail);} static void __init test_kstrtou64_ok(void){	DECLARE_TEST_OK(u64, struct test_u64);	static DEFINE_TEST_OK(struct test_u64, test_u64_ok) = {		{"0",	10,	0},		{"1",	10,	1},		{"126",	10,	126},		{"127",	10,	127},		{"128",	10,	128},		{"129",	10,	129},		{"254",	10,	254},		{"255",	10,	255},		{"256",	10,	256},		{"257",	10,	257},		{"32766",	10,	32766},		{"32767",	10,	32767},		{"32768",	10,	32768},		{"32769",	10,	32769},		{"65534",	10,	65534},		{"65535",	10,	65535},		{"65536",	10,	65536},		{"65537",	10,	65537},		{"2147483646",	10,	2147483646},		{"2147483647",	10,	2147483647},		{"2147483648",	10,	2147483648ULL},		{"2147483649",	10,	2147483649ULL},		{"4294967294",	10,	4294967294ULL},		{"4294967295",	10,	4294967295ULL},		{"4294967296",	10,	4294967296ULL},		{"4294967297",	10,	4294967297ULL},		{"9223372036854775806",	10,	9223372036854775806ULL},		{"9223372036854775807",	10,	9223372036854775807ULL},		{"9223372036854775808",	10,	9223372036854775808ULL},		{"9223372036854775809",	10,	9223372036854775809ULL},		{"18446744073709551614",	10,	18446744073709551614ULL},		{"18446744073709551615",	10,	18446744073709551615ULL},	};	TEST_OK(kstrtou64, u64, "%llu", test_u64_ok);} static void __init test_kstrtou64_fail(void){	static DEFINE_TEST_FAIL(test_u64_fail) = {		{"-2",	10},		{"-1",	10},		{"18446744073709551616",	10},		{"18446744073709551617",	10},		{"569202370375329612767",	10},	};	TEST_FAIL(kstrtou64, u64, "%llu", test_u64_fail);} static void __init test_kstrtos64_ok(void){	DECLARE_TEST_OK(s64, struct test_s64);	static DEFINE_TEST_OK(struct test_s64, test_s64_ok) = {		{"-128",	10,	-128},		{"-127",	10,	-127},		{"-1",	10,	-1},		{"0",	10,	0},		{"1",	10,	1},		{"126",	10,	126},		{"127",	10,	127},		{"128",	10,	128},		{"129",	10,	129},		{"254",	10,	254},		{"255",	10,	255},		{"256",	10,	256},		{"257",	10,	257},		{"32766",	10,	32766},		{"32767",	10,	32767},		{"32768",	10,	32768},		{"32769",	10,	32769},		{"65534",	10,	65534},		{"65535",	10,	65535},		{"65536",	10,	65536},		{"65537",	10,	65537},		{"2147483646",	10,	2147483646},		{"2147483647",	10,	2147483647},		{"2147483648",	10,	2147483648LL},		{"2147483649",	10,	2147483649LL},		{"4294967294",	10,	4294967294LL},		{"4294967295",	10,	4294967295LL},		{"4294967296",	10,	4294967296LL},		{"4294967297",	10,	4294967297LL},		{"9223372036854775806",	10,	9223372036854775806LL},		{"9223372036854775807",	10,	9223372036854775807LL},	};	TEST_OK(kstrtos64, s64, "%lld", test_s64_ok);} static void __init test_kstrtos64_fail(void){	static DEFINE_TEST_FAIL(test_s64_fail) = {		{"9223372036854775808",	10},		{"9223372036854775809",	10},		{"18446744073709551614",	10},		{"18446744073709551615",	10},		{"18446744073709551616",	10},		{"18446744073709551617",	10},		{"569202370375329612767",	10},		{"-569202370375329612767",	10},	};	TEST_FAIL(kstrtos64, s64, "%lld", test_s64_fail);} static void __init test_kstrtou32_ok(void){	DECLARE_TEST_OK(u32, struct test_u32);	static DEFINE_TEST_OK(struct test_u32, test_u32_ok) = {		{"0",	10,	0},		{"1",	10,	1},		{"126",	10,	126},		{"127",	10,	127},		{"128",	10,	128},		{"129",	10,	129},		{"254",	10,	254},		{"255",	10,	255},		{"256",	10,	256},		{"257",	10,	257},		{"32766",	10,	32766},		{"32767",	10,	32767},		{"32768",	10,	32768},		{"32769",	10,	32769},		{"65534",	10,	65534},		{"65535",	10,	65535},		{"65536",	10,	65536},		{"65537",	10,	65537},		{"2147483646",	10,	2147483646},		{"2147483647",	10,	2147483647},		{"2147483648",	10,	2147483648U},		{"2147483649",	10,	2147483649U},		{"4294967294",	10,	4294967294U},		{"4294967295",	10,	4294967295U},	};	TEST_OK(kstrtou32, u32, "%u", test_u32_ok);} static void __init test_kstrtou32_fail(void){	static DEFINE_TEST_FAIL(test_u32_fail) = {		{"-2",	10},		{"-1",	10},		{"4294967296",	10},		{"4294967297",	10},		{"9223372036854775806",	10},		{"9223372036854775807",	10},		{"9223372036854775808",	10},		{"9223372036854775809",	10},		{"18446744073709551614",	10},		{"18446744073709551615",	10},		{"18446744073709551616",	10},		{"18446744073709551617",	10},	};	TEST_FAIL(kstrtou32, u32, "%u", test_u32_fail);} static void __init test_kstrtos32_ok(void){	DECLARE_TEST_OK(s32, struct test_s32);	static DEFINE_TEST_OK(struct test_s32, test_s32_ok) = {		{"-128",	10,	-128},		{"-127",	10,	-127},		{"-1",	10,	-1},		{"0",	10,	0},		{"1",	10,	1},		{"126",	10,	126},		{"127",	10,	127},		{"128",	10,	128},		{"129",	10,	129},		{"254",	10,	254},		{"255",	10,	255},		{"256",	10,	256},		{"257",	10,	257},		{"32766",	10,	32766},		{"32767",	10,	32767},		{"32768",	10,	32768},		{"32769",	10,	32769},		{"65534",	10,	65534},		{"65535",	10,	65535},		{"65536",	10,	65536},		{"65537",	10,	65537},		{"2147483646",	10,	2147483646},		{"2147483647",	10,	2147483647},	};	TEST_OK(kstrtos32, s32, "%d", test_s32_ok);} static void __init test_kstrtos32_fail(void){	static DEFINE_TEST_FAIL(test_s32_fail) = {		{"2147483648",	10},		{"2147483649",	10},		{"4294967294",	10},		{"4294967295",	10},		{"4294967296",	10},		{"4294967297",	10},		{"9223372036854775806",	10},		{"9223372036854775807",	10},		{"9223372036854775808",	10},		{"9223372036854775809",	10},		{"18446744073709551614",	10},		{"18446744073709551615",	10},		{"18446744073709551616",	10},		{"18446744073709551617",	10},	};	TEST_FAIL(kstrtos32, s32, "%d", test_s32_fail);}

Lines 1–500 of 924.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t