Systemd/src/test/test-util.c

528 lines
16 KiB
C
Raw Normal View History

/* SPDX-License-Identifier: LGPL-2.1+ */
#include <errno.h>
#include <sys/wait.h>
#include <unistd.h>
#include "fileio.h"
#include "fs-util.h"
#include "limits-util.h"
#include "memory-util.h"
2018-12-04 08:26:09 +01:00
#include "missing_syscall.h"
#include "parse-util.h"
#include "process-util.h"
#include "raw-clone.h"
#include "rm-rf.h"
#include "string-util.h"
2018-11-18 10:46:30 +01:00
#include "tests.h"
#include "util.h"
static void test_align_power2(void) {
unsigned long i, p2;
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
assert_se(ALIGN_POWER2(0) == 0);
assert_se(ALIGN_POWER2(1) == 1);
assert_se(ALIGN_POWER2(2) == 2);
assert_se(ALIGN_POWER2(3) == 4);
assert_se(ALIGN_POWER2(4) == 4);
assert_se(ALIGN_POWER2(5) == 8);
assert_se(ALIGN_POWER2(6) == 8);
assert_se(ALIGN_POWER2(7) == 8);
assert_se(ALIGN_POWER2(9) == 16);
assert_se(ALIGN_POWER2(10) == 16);
assert_se(ALIGN_POWER2(11) == 16);
assert_se(ALIGN_POWER2(12) == 16);
assert_se(ALIGN_POWER2(13) == 16);
assert_se(ALIGN_POWER2(14) == 16);
assert_se(ALIGN_POWER2(15) == 16);
assert_se(ALIGN_POWER2(16) == 16);
assert_se(ALIGN_POWER2(17) == 32);
assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
for (i = 1; i < 131071; ++i) {
for (p2 = 1; p2 < i; p2 <<= 1)
/* empty */ ;
assert_se(ALIGN_POWER2(i) == p2);
}
for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
for (p2 = 1; p2 && p2 < i; p2 <<= 1)
/* empty */ ;
assert_se(ALIGN_POWER2(i) == p2);
}
}
static void test_max(void) {
static const struct {
int a;
int b[CONST_MAX(10, 100)];
} val1 = {
.a = CONST_MAX(10, 100),
};
int d = 0;
unsigned long x = 12345;
unsigned long y = 54321;
const char str[] = "a_string_constant";
const unsigned long long arr[] = {9999ULL, 10ULL, 0ULL, 3000ULL, 2000ULL, 1000ULL, 100ULL, 9999999ULL};
void *p = (void *)str;
void *q = (void *)&str[16];
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
assert_cc(sizeof(val1.b) == sizeof(int) * 100);
/* CONST_MAX returns (void) instead of a value if the passed arguments
* are not of the same type or not constant expressions. */
assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
assert_se(val1.a == 100);
assert_se(MAX(++d, 0) == 1);
assert_se(d == 1);
assert_cc(MAXSIZE(char[3], uint16_t) == 3);
assert_cc(MAXSIZE(char[3], uint32_t) == 4);
assert_cc(MAXSIZE(char, long) == sizeof(long));
assert_se(MAX(-5, 5) == 5);
assert_se(MAX(5, 5) == 5);
assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
assert_se(LESS_BY(8, 4) == 4);
assert_se(LESS_BY(8, 8) == 0);
assert_se(LESS_BY(4, 8) == 0);
assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
assert_se(CMP(3, 5) == -1);
assert_se(CMP(5, 3) == 1);
assert_se(CMP(5, 5) == 0);
assert_se(CMP(x, y) == -1);
assert_se(CMP(y, x) == 1);
assert_se(CMP(x, x) == 0);
assert_se(CMP(y, y) == 0);
assert_se(CMP(UINT64_MAX, (uint64_t) 0) == 1);
assert_se(CMP((uint64_t) 0, UINT64_MAX) == -1);
assert_se(CMP(UINT64_MAX, UINT64_MAX) == 0);
assert_se(CMP(INT64_MIN, INT64_MAX) == -1);
assert_se(CMP(INT64_MAX, INT64_MIN) == 1);
assert_se(CMP(INT64_MAX, INT64_MAX) == 0);
assert_se(CMP(INT64_MIN, INT64_MIN) == 0);
assert_se(CMP(INT64_MAX, (int64_t) 0) == 1);
assert_se(CMP((int64_t) 0, INT64_MIN) == 1);
assert_se(CMP(INT64_MIN, (int64_t) 0) == -1);
assert_se(CMP((int64_t) 0, INT64_MAX) == -1);
assert_se(CMP(&str[2], &str[7]) == -1);
assert_se(CMP(&str[2], &str[2]) == 0);
assert_se(CMP(&str[7], (const char *)str) == 1);
assert_se(CMP(str[2], str[7]) == 1);
assert_se(CMP(str[7], *str) == 1);
assert_se(CMP((const unsigned long long *)arr, &arr[3]) == -1);
assert_se(CMP(*arr, arr[3]) == 1);
assert_se(CMP(p, q) == -1);
assert_se(CMP(q, p) == 1);
assert_se(CMP(p, p) == 0);
assert_se(CMP(q, q) == 0);
assert_se(CLAMP(-5, 0, 1) == 0);
assert_se(CLAMP(5, 0, 1) == 1);
assert_se(CLAMP(5, -10, 1) == 1);
assert_se(CLAMP(5, -10, 10) == 5);
assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
}
#pragma GCC diagnostic push
#ifdef __clang__
# pragma GCC diagnostic ignored "-Waddress-of-packed-member"
#endif
shared: make container_of() use unique variable names If you stack container_of() macros, you will get warnings due to shadowing variables of the parent context. To avoid this, use unique names for variables. Two new helpers are added: UNIQ: This evaluates to a truly unique value never returned by any evaluation of this macro. It's a shortcut for __COUNTER__. UNIQ_T: Takes two arguments and concatenates them. It is a shortcut for CONCATENATE, but meant to defined typed local variables. As you usually want to use variables that you just defined, you need to reference the same unique value at least two times. However, UNIQ returns a new value on each evaluation, therefore, you have to pass the unique values into the macro like this: #define my_macro(a, b) __max_macro(UNIQ, UNIQ, (a), (b)) #define __my_macro(uniqa, uniqb, a, b) ({ typeof(a) UNIQ_T(A, uniqa) = (a); typeof(b) UNIQ_T(B, uniqb) = (b); MY_UNSAFE_MACRO(UNIQ_T(A, uniqa), UNIQ_T(B, uniqb)); }) This way, MY_UNSAFE_MACRO() can safely evaluate it's arguments multiple times as they are local variables. But you can also stack invocations to the macro my_macro() without clashing names. This is the same as if you did: #define my_macro(a, b) __max_macro(__COUNTER__, __COUNTER__, (a), (b)) #define __my_macro(prefixa, prefixb, a, b) ({ typeof(a) CONCATENATE(A, prefixa) = (a); typeof(b) CONCATENATE(B, prefixb) = (b); MY_UNSAFE_MACRO(CONCATENATE(A, prefixa), CONCATENATE(B, prefixb)); }) ...but in my opinion, the first macro is easier to write and read. This patch starts by converting container_of() to use this new helper. Other macros may follow (like MIN, MAX, CLAMP, ...).
2014-08-22 14:41:37 +02:00
static void test_container_of(void) {
struct mytype {
uint8_t pad1[3];
uint64_t v1;
uint8_t pad2[2];
uint32_t v2;
} myval = { };
shared: make container_of() use unique variable names If you stack container_of() macros, you will get warnings due to shadowing variables of the parent context. To avoid this, use unique names for variables. Two new helpers are added: UNIQ: This evaluates to a truly unique value never returned by any evaluation of this macro. It's a shortcut for __COUNTER__. UNIQ_T: Takes two arguments and concatenates them. It is a shortcut for CONCATENATE, but meant to defined typed local variables. As you usually want to use variables that you just defined, you need to reference the same unique value at least two times. However, UNIQ returns a new value on each evaluation, therefore, you have to pass the unique values into the macro like this: #define my_macro(a, b) __max_macro(UNIQ, UNIQ, (a), (b)) #define __my_macro(uniqa, uniqb, a, b) ({ typeof(a) UNIQ_T(A, uniqa) = (a); typeof(b) UNIQ_T(B, uniqb) = (b); MY_UNSAFE_MACRO(UNIQ_T(A, uniqa), UNIQ_T(B, uniqb)); }) This way, MY_UNSAFE_MACRO() can safely evaluate it's arguments multiple times as they are local variables. But you can also stack invocations to the macro my_macro() without clashing names. This is the same as if you did: #define my_macro(a, b) __max_macro(__COUNTER__, __COUNTER__, (a), (b)) #define __my_macro(prefixa, prefixb, a, b) ({ typeof(a) CONCATENATE(A, prefixa) = (a); typeof(b) CONCATENATE(B, prefixb) = (b); MY_UNSAFE_MACRO(CONCATENATE(A, prefixa), CONCATENATE(B, prefixb)); }) ...but in my opinion, the first macro is easier to write and read. This patch starts by converting container_of() to use this new helper. Other macros may follow (like MIN, MAX, CLAMP, ...).
2014-08-22 14:41:37 +02:00
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
assert_cc(sizeof(myval) >= 17);
shared: make container_of() use unique variable names If you stack container_of() macros, you will get warnings due to shadowing variables of the parent context. To avoid this, use unique names for variables. Two new helpers are added: UNIQ: This evaluates to a truly unique value never returned by any evaluation of this macro. It's a shortcut for __COUNTER__. UNIQ_T: Takes two arguments and concatenates them. It is a shortcut for CONCATENATE, but meant to defined typed local variables. As you usually want to use variables that you just defined, you need to reference the same unique value at least two times. However, UNIQ returns a new value on each evaluation, therefore, you have to pass the unique values into the macro like this: #define my_macro(a, b) __max_macro(UNIQ, UNIQ, (a), (b)) #define __my_macro(uniqa, uniqb, a, b) ({ typeof(a) UNIQ_T(A, uniqa) = (a); typeof(b) UNIQ_T(B, uniqb) = (b); MY_UNSAFE_MACRO(UNIQ_T(A, uniqa), UNIQ_T(B, uniqb)); }) This way, MY_UNSAFE_MACRO() can safely evaluate it's arguments multiple times as they are local variables. But you can also stack invocations to the macro my_macro() without clashing names. This is the same as if you did: #define my_macro(a, b) __max_macro(__COUNTER__, __COUNTER__, (a), (b)) #define __my_macro(prefixa, prefixb, a, b) ({ typeof(a) CONCATENATE(A, prefixa) = (a); typeof(b) CONCATENATE(B, prefixb) = (b); MY_UNSAFE_MACRO(CONCATENATE(A, prefixa), CONCATENATE(B, prefixb)); }) ...but in my opinion, the first macro is easier to write and read. This patch starts by converting container_of() to use this new helper. Other macros may follow (like MIN, MAX, CLAMP, ...).
2014-08-22 14:41:37 +02:00
assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
assert_se(container_of(&container_of(&myval.v2,
struct mytype,
v2)->v1,
struct mytype,
v1) == &myval);
}
#pragma GCC diagnostic pop
static void test_div_round_up(void) {
int div;
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
/* basic tests */
assert_se(DIV_ROUND_UP(0, 8) == 0);
assert_se(DIV_ROUND_UP(1, 8) == 1);
assert_se(DIV_ROUND_UP(8, 8) == 1);
assert_se(DIV_ROUND_UP(12, 8) == 2);
assert_se(DIV_ROUND_UP(16, 8) == 2);
/* test multiple evaluation */
div = 0;
assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
/* overflow test with exact division */
assert_se(sizeof(0U) == 4);
assert_se(0xfffffffaU % 10U == 0U);
assert_se(0xfffffffaU / 10U == 429496729U);
assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
/* overflow test with rounded division */
assert_se(0xfffffffdU % 10U == 3U);
assert_se(0xfffffffdU / 10U == 429496729U);
assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
}
static void test_u64log2(void) {
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
assert_se(u64log2(0) == 0);
assert_se(u64log2(8) == 3);
assert_se(u64log2(9) == 3);
assert_se(u64log2(15) == 3);
assert_se(u64log2(16) == 4);
assert_se(u64log2(1024*1024) == 20);
assert_se(u64log2(1024*1024+5) == 20);
}
static void test_protect_errno(void) {
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
errno = 12;
{
PROTECT_ERRNO;
errno = 11;
}
assert_se(errno == 12);
}
static void test_unprotect_errno_inner_function(void) {
PROTECT_ERRNO;
errno = 2222;
}
static void test_unprotect_errno(void) {
log_info("/* %s */", __func__);
errno = 4711;
PROTECT_ERRNO;
errno = 815;
UNPROTECT_ERRNO;
assert_se(errno == 4711);
test_unprotect_errno_inner_function();
assert_se(errno == 4711);
}
static void test_in_set(void) {
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
assert_se(IN_SET(1, 1));
assert_se(IN_SET(1, 1, 2, 3, 4));
assert_se(IN_SET(2, 1, 2, 3, 4));
assert_se(IN_SET(3, 1, 2, 3, 4));
assert_se(IN_SET(4, 1, 2, 3, 4));
assert_se(!IN_SET(0, 1));
assert_se(!IN_SET(0, 1, 2, 3, 4));
}
static void test_log2i(void) {
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
assert_se(log2i(1) == 0);
assert_se(log2i(2) == 1);
assert_se(log2i(3) == 1);
assert_se(log2i(4) == 2);
assert_se(log2i(32) == 5);
assert_se(log2i(33) == 5);
assert_se(log2i(63) == 5);
assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
}
static void test_eqzero(void) {
const uint32_t zeros[] = {0, 0, 0};
const uint32_t ones[] = {1, 1};
const uint32_t mixed[] = {0, 1, 0, 0, 0};
const uint8_t longer[] = {[55] = 255};
log_info("/* %s */", __func__);
assert_se(eqzero(zeros));
assert_se(!eqzero(ones));
assert_se(!eqzero(mixed));
assert_se(!eqzero(longer));
}
static void test_raw_clone(void) {
pid_t parent, pid, pid2;
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
parent = getpid();
log_info("before clone: getpid()→"PID_FMT, parent);
assert_se(raw_getpid() == parent);
pid = raw_clone(0);
assert_se(pid >= 0);
pid2 = raw_getpid();
log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
pid, getpid(), pid2);
if (pid == 0) {
assert_se(pid2 != parent);
_exit(EXIT_SUCCESS);
} else {
int status;
assert_se(pid2 == parent);
waitpid(pid, &status, __WCLONE);
assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
}
errno = 0;
assert_se(raw_clone(CLONE_FS|CLONE_NEWNS) == -1);
assert_se(errno == EINVAL);
}
static void test_physical_memory(void) {
uint64_t p;
char buf[FORMAT_BYTES_MAX];
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
p = physical_memory();
assert_se(p > 0);
assert_se(p < UINT64_MAX);
assert_se(p % page_size() == 0);
log_info("Memory: %s (%" PRIu64 ")", format_bytes(buf, sizeof(buf), p), p);
}
static void test_physical_memory_scale(void) {
uint64_t p;
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
p = physical_memory();
assert_se(physical_memory_scale(0, 100) == 0);
assert_se(physical_memory_scale(100, 100) == p);
log_info("Memory original: %" PRIu64, physical_memory());
log_info("Memory scaled by 50%%: %" PRIu64, physical_memory_scale(50, 100));
log_info("Memory divided by 2: %" PRIu64, physical_memory() / 2);
log_info("Page size: %zu", page_size());
/* There might be an uneven number of pages, hence permit these calculations to be half a page off... */
assert_se(page_size()/2 + physical_memory_scale(50, 100) - p/2 <= page_size());
assert_se(physical_memory_scale(200, 100) == p*2);
assert_se(physical_memory_scale(0, 1) == 0);
assert_se(physical_memory_scale(1, 1) == p);
assert_se(physical_memory_scale(2, 1) == p*2);
assert_se(physical_memory_scale(0, 2) == 0);
assert_se(page_size()/2 + physical_memory_scale(1, 2) - p/2 <= page_size());
assert_se(physical_memory_scale(2, 2) == p);
assert_se(physical_memory_scale(4, 2) == p*2);
assert_se(physical_memory_scale(0, UINT32_MAX) == 0);
assert_se(physical_memory_scale(UINT32_MAX, UINT32_MAX) == p);
/* overflow */
assert_se(physical_memory_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX);
}
static void test_system_tasks_max(void) {
uint64_t t;
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
t = system_tasks_max();
assert_se(t > 0);
assert_se(t < UINT64_MAX);
log_info("Max tasks: %" PRIu64, t);
}
static void test_system_tasks_max_scale(void) {
uint64_t t;
2018-11-18 10:46:30 +01:00
log_info("/* %s */", __func__);
t = system_tasks_max();
assert_se(system_tasks_max_scale(0, 100) == 0);
assert_se(system_tasks_max_scale(100, 100) == t);
assert_se(system_tasks_max_scale(0, 1) == 0);
assert_se(system_tasks_max_scale(1, 1) == t);
assert_se(system_tasks_max_scale(2, 1) == 2*t);
assert_se(system_tasks_max_scale(0, 2) == 0);
assert_se(system_tasks_max_scale(1, 2) == t/2);
assert_se(system_tasks_max_scale(2, 2) == t);
assert_se(system_tasks_max_scale(3, 2) == (3*t)/2);
assert_se(system_tasks_max_scale(4, 2) == t*2);
assert_se(system_tasks_max_scale(0, UINT32_MAX) == 0);
assert_se(system_tasks_max_scale((UINT32_MAX-1)/2, UINT32_MAX-1) == t/2);
assert_se(system_tasks_max_scale(UINT32_MAX, UINT32_MAX) == t);
/* overflow */
assert_se(system_tasks_max_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX);
}
static void test_foreach_pointer(void) {
int a, b, c, *i;
size_t k = 0;
log_info("/* %s */", __func__);
FOREACH_POINTER(i, &a, &b, &c) {
switch (k) {
case 0:
assert_se(i == &a);
break;
case 1:
assert_se(i == &b);
break;
case 2:
assert_se(i == &c);
break;
default:
assert_not_reached("unexpected index");
break;
}
k++;
}
assert(k == 3);
FOREACH_POINTER(i, &b) {
assert(k == 3);
assert(i == &b);
k = 4;
}
assert(k == 4);
FOREACH_POINTER(i, NULL, &c, NULL, &b, NULL, &a, NULL) {
switch (k) {
case 4:
assert_se(i == NULL);
break;
case 5:
assert_se(i == &c);
break;
case 6:
assert_se(i == NULL);
break;
case 7:
assert_se(i == &b);
break;
case 8:
assert_se(i == NULL);
break;
case 9:
assert_se(i == &a);
break;
case 10:
assert_se(i == NULL);
break;
default:
assert_not_reached("unexpected index");
break;
}
k++;
}
assert(k == 11);
}
static void test_ptr_to_int(void) {
log_info("/* %s */", __func__);
/* Primary reason to have this test is to validate that pointers are large enough to hold entire int range */
assert_se(PTR_TO_INT(INT_TO_PTR(0)) == 0);
assert_se(PTR_TO_INT(INT_TO_PTR(1)) == 1);
assert_se(PTR_TO_INT(INT_TO_PTR(-1)) == -1);
assert_se(PTR_TO_INT(INT_TO_PTR(INT_MAX)) == INT_MAX);
assert_se(PTR_TO_INT(INT_TO_PTR(INT_MIN)) == INT_MIN);
}
int main(int argc, char *argv[]) {
2018-11-18 10:46:30 +01:00
test_setup_logging(LOG_INFO);
test_align_power2();
test_max();
shared: make container_of() use unique variable names If you stack container_of() macros, you will get warnings due to shadowing variables of the parent context. To avoid this, use unique names for variables. Two new helpers are added: UNIQ: This evaluates to a truly unique value never returned by any evaluation of this macro. It's a shortcut for __COUNTER__. UNIQ_T: Takes two arguments and concatenates them. It is a shortcut for CONCATENATE, but meant to defined typed local variables. As you usually want to use variables that you just defined, you need to reference the same unique value at least two times. However, UNIQ returns a new value on each evaluation, therefore, you have to pass the unique values into the macro like this: #define my_macro(a, b) __max_macro(UNIQ, UNIQ, (a), (b)) #define __my_macro(uniqa, uniqb, a, b) ({ typeof(a) UNIQ_T(A, uniqa) = (a); typeof(b) UNIQ_T(B, uniqb) = (b); MY_UNSAFE_MACRO(UNIQ_T(A, uniqa), UNIQ_T(B, uniqb)); }) This way, MY_UNSAFE_MACRO() can safely evaluate it's arguments multiple times as they are local variables. But you can also stack invocations to the macro my_macro() without clashing names. This is the same as if you did: #define my_macro(a, b) __max_macro(__COUNTER__, __COUNTER__, (a), (b)) #define __my_macro(prefixa, prefixb, a, b) ({ typeof(a) CONCATENATE(A, prefixa) = (a); typeof(b) CONCATENATE(B, prefixb) = (b); MY_UNSAFE_MACRO(CONCATENATE(A, prefixa), CONCATENATE(B, prefixb)); }) ...but in my opinion, the first macro is easier to write and read. This patch starts by converting container_of() to use this new helper. Other macros may follow (like MIN, MAX, CLAMP, ...).
2014-08-22 14:41:37 +02:00
test_container_of();
test_div_round_up();
test_u64log2();
test_protect_errno();
test_unprotect_errno();
test_in_set();
test_log2i();
test_eqzero();
test_raw_clone();
test_physical_memory();
test_physical_memory_scale();
test_system_tasks_max();
test_system_tasks_max_scale();
test_foreach_pointer();
test_ptr_to_int();
return 0;
}