1 /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 *
5 * Tests for firmware 2common.c
6 */
7
8 #include "2sysincludes.h"
9 #include "2common.h"
10 #include "test_common.h"
11
12 /**
13 * Test memory compare functions
14 */
test_memcmp(void)15 static void test_memcmp(void)
16 {
17 TEST_EQ(vb2_safe_memcmp("foo", "foo", 3), 0, "memcmp equal");
18 TEST_NEQ(vb2_safe_memcmp("foo1", "foo2", 4), 0, "memcmp different");
19 TEST_EQ(vb2_safe_memcmp("foo1", "foo2", 0), 0, "memcmp 0-size");
20 }
21
22 /**
23 * Test alignment functions
24 */
test_align(void)25 static void test_align(void)
26 {
27 uint64_t buf[4];
28 uint8_t *p0, *ptr;
29 uint32_t size;
30
31 /* Already aligned */
32 p0 = (uint8_t *)buf;
33 ptr = p0;
34 size = 16;
35 TEST_SUCC(vb2_align(&ptr, &size, 4, 16), "vb2_align() aligned");
36 TEST_EQ(vb2_offset_of(p0, ptr), 0, "ptr");
37 TEST_EQ(size, 16, " size");
38 TEST_EQ(vb2_align(&ptr, &size, 4, 17),
39 VB2_ERROR_ALIGN_SIZE, "vb2_align() small");
40
41 /* Offset */
42 ptr = p0 + 1;
43 size = 15;
44 TEST_SUCC(vb2_align(&ptr, &size, 4, 12), "vb2_align() offset");
45 TEST_EQ(vb2_offset_of(p0, ptr), 4, "ptr");
46 TEST_EQ(size, 12, " size");
47
48 /* Offset, now too small */
49 ptr = p0 + 1;
50 size = 15;
51 TEST_EQ(vb2_align(&ptr, &size, 4, 15),
52 VB2_ERROR_ALIGN_SIZE, "vb2_align() offset small");
53
54 /* Offset, too small even to align */
55 ptr = p0 + 1;
56 size = 1;
57 TEST_EQ(vb2_align(&ptr, &size, 4, 1),
58 VB2_ERROR_ALIGN_BIGGER_THAN_SIZE, "vb2_align() offset tiny");
59 }
60
61 /**
62 * Test work buffer functions
63 */
test_workbuf(void)64 static void test_workbuf(void)
65 {
66 uint64_t buf[8] __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
67 uint8_t *p0 = (uint8_t *)buf, *ptr;
68 struct vb2_workbuf wb;
69
70 /* NOTE: There are several magic numbers below which assume that
71 * VB2_WORKBUF_ALIGN == 16 */
72
73 /* Init */
74 vb2_workbuf_init(&wb, p0, 64);
75 TEST_EQ(vb2_offset_of(p0, wb.buf), 0, "Workbuf init aligned");
76 TEST_EQ(wb.size, 64, " size");
77
78 vb2_workbuf_init(&wb, p0 + 4, 64);
79 TEST_EQ(vb2_offset_of(p0, wb.buf), VB2_WORKBUF_ALIGN,
80 "Workbuf init unaligned");
81 TEST_EQ(wb.size, 64 - VB2_WORKBUF_ALIGN + 4, " size");
82
83 vb2_workbuf_init(&wb, p0 + 2, 5);
84 TEST_EQ(wb.size, 0, "Workbuf init tiny unaligned size");
85
86 /* Alloc rounds up */
87 vb2_workbuf_init(&wb, p0, 64);
88 ptr = vb2_workbuf_alloc(&wb, 22);
89 TEST_EQ(vb2_offset_of(p0, ptr), 0, "Workbuf alloc");
90 TEST_EQ(vb2_offset_of(p0, wb.buf), 32, " buf");
91 TEST_EQ(wb.size, 32, " size");
92
93 vb2_workbuf_init(&wb, p0, 32);
94 TEST_PTR_EQ(vb2_workbuf_alloc(&wb, 33), NULL, "Workbuf alloc too big");
95
96 /* Free reverses alloc */
97 vb2_workbuf_init(&wb, p0, 32);
98 vb2_workbuf_alloc(&wb, 22);
99 vb2_workbuf_free(&wb, 22);
100 TEST_EQ(vb2_offset_of(p0, wb.buf), 0, "Workbuf free buf");
101 TEST_EQ(wb.size, 32, " size");
102
103 /* Realloc keeps same pointer as alloc */
104 vb2_workbuf_init(&wb, p0, 64);
105 vb2_workbuf_alloc(&wb, 6);
106 ptr = vb2_workbuf_realloc(&wb, 6, 21);
107 TEST_EQ(vb2_offset_of(p0, ptr), 0, "Workbuf realloc");
108 TEST_EQ(vb2_offset_of(p0, wb.buf), 32, " buf");
109 TEST_EQ(wb.size, 32, " size");
110 }
111
main(int argc,char * argv[])112 int main(int argc, char* argv[])
113 {
114 test_memcmp();
115 test_align();
116 test_workbuf();
117
118 return gTestSuccess ? 0 : 255;
119 }
120