File: unaligned.c

package info (click to toggle)
multipath-tools 0.13.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,992 kB
  • sloc: ansic: 63,788; perl: 1,622; makefile: 729; sh: 647; pascal: 150
file content (97 lines) | stat: -rw-r--r-- 2,095 bytes parent folder | download | duplicates (3)
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
#include <inttypes.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdlib.h>
#include <cmocka.h>
#include "unaligned.h"

#define SIZE 16
static const char memory[8] = {
	0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
};

static const uint64_t intval64 = 0x0123456789abcdef;
static const uint32_t intval32 = 0x01234567;
static const uint16_t intval16 = 0x0123;

#include "globals.c"

static int setup(void **state)
{
	return posix_memalign(state, 16, 2 * SIZE);
}

static int teardown(void **state)
{
	free(*state);
	return 0;
}


#define make_test(bits, offset) \
	static void test_ ## bits ## _ ## offset(void **state)	\
{								\
	int len = bits/8;					\
	uint8_t *c = *state;					\
	uint8_t *p = *state + SIZE;				\
	uint64_t u;						\
								\
	assert_in_range(len, 1, SIZE);				\
	assert_in_range(offset + len, 1, SIZE);			\
	memset(c, 0, 2 * SIZE);					\
	memcpy(c + offset, memory, len);			\
								\
	u = get_unaligned_be##bits(c + offset);			\
	assert_int_equal(u, intval##bits);			\
	put_unaligned_be##bits(u, p + offset);			\
	assert_memory_equal(c + offset, p  + offset, len);	\
}

make_test(16, 0);
make_test(16, 1);
make_test(32, 0);
make_test(32, 1);
make_test(32, 2);
make_test(32, 3);
make_test(64, 0);
make_test(64, 1);
make_test(64, 2);
make_test(64, 3);
make_test(64, 4);
make_test(64, 5);
make_test(64, 6);
make_test(64, 7);

int test_unaligned(void)
{
	const struct CMUnitTest tests[] = {
		cmocka_unit_test(test_16_0),
		cmocka_unit_test(test_16_1),
		cmocka_unit_test(test_32_0),
		cmocka_unit_test(test_32_1),
		cmocka_unit_test(test_32_2),
		cmocka_unit_test(test_32_3),
		cmocka_unit_test(test_64_0),
		cmocka_unit_test(test_64_1),
		cmocka_unit_test(test_64_2),
		cmocka_unit_test(test_64_3),
		cmocka_unit_test(test_64_4),
		cmocka_unit_test(test_64_5),
		cmocka_unit_test(test_64_6),
		cmocka_unit_test(test_64_7),
	};
	return cmocka_run_group_tests(tests, setup, teardown);
}

int main(void)
{
	int ret = 0;

	init_test_verbosity(-1);
	ret += test_unaligned();
	return ret;
}