1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2018, Google Inc. All rights reserved.
10 #include <test/suites.h>
11 #include <test/test.h>
14 DECLARE_GLOBAL_DATA_PTR;
16 /* Declare a new compression test */
17 #define BLOBLIST_TEST(_name, _flags) \
18 UNIT_TEST(_name, _flags, bloblist_test)
27 TEST_SIZE_LARGE = 0xe0,
29 TEST_ADDR = CONFIG_BLOBLIST_ADDR,
30 TEST_BLOBLIST_SIZE = 0x100,
33 static struct bloblist_hdr *clear_bloblist(void)
35 struct bloblist_hdr *hdr;
37 /* Clear out any existing bloblist so we have a clean slate */
38 hdr = map_sysmem(CONFIG_BLOBLIST_ADDR, TEST_BLOBLIST_SIZE);
39 memset(hdr, '\0', TEST_BLOBLIST_SIZE);
44 static int bloblist_test_init(struct unit_test_state *uts)
46 struct bloblist_hdr *hdr;
48 hdr = clear_bloblist();
49 ut_asserteq(-ENOENT, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
50 ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
52 ut_asserteq(-EPROTONOSUPPORT, bloblist_check(TEST_ADDR,
55 ut_asserteq(-ENOSPC, bloblist_new(TEST_ADDR, 0x10, 0));
56 ut_asserteq(-EFAULT, bloblist_new(1, TEST_BLOBLIST_SIZE, 0));
57 ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
59 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
60 ut_assertok(bloblist_finish());
61 ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
63 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
67 BLOBLIST_TEST(bloblist_test_init, 0);
69 static int bloblist_test_blob(struct unit_test_state *uts)
71 struct bloblist_hdr *hdr;
72 struct bloblist_rec *rec, *rec2;
75 /* At the start there should be no records */
76 hdr = clear_bloblist();
77 ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE));
78 ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
80 /* Add a record and check that we can find it */
81 data = bloblist_add(TEST_TAG, TEST_SIZE);
82 rec = (void *)(hdr + 1);
83 ut_asserteq_ptr(rec + 1, data);
84 data = bloblist_find(TEST_TAG, TEST_SIZE);
85 ut_asserteq_ptr(rec + 1, data);
87 /* Check the 'ensure' method */
88 ut_asserteq_ptr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
89 ut_assertnull(bloblist_ensure(TEST_TAG, TEST_SIZE2));
90 rec2 = (struct bloblist_rec *)(data + ALIGN(TEST_SIZE, BLOBLIST_ALIGN));
92 /* Check for a non-existent record */
93 ut_asserteq_ptr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
94 ut_asserteq_ptr(rec2 + 1, bloblist_ensure(TEST_TAG2, TEST_SIZE2));
95 ut_assertnull(bloblist_find(TEST_TAG_MISSING, 0));
99 BLOBLIST_TEST(bloblist_test_blob, 0);
101 /* Check bloblist_ensure_size_ret() */
102 static int bloblist_test_blob_ensure(struct unit_test_state *uts)
107 /* At the start there should be no records */
109 ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
111 /* Test with an empty bloblist */
113 ut_assertok(bloblist_ensure_size_ret(TEST_TAG, &size, &data));
114 ut_asserteq(TEST_SIZE, size);
116 /* Check that we get the same thing again */
117 ut_assertok(bloblist_ensure_size_ret(TEST_TAG, &size, &data2));
118 ut_asserteq(TEST_SIZE, size);
119 ut_asserteq_ptr(data, data2);
121 /* Check that the size remains the same */
123 ut_assertok(bloblist_ensure_size_ret(TEST_TAG, &size, &data));
124 ut_asserteq(TEST_SIZE, size);
126 /* Check running out of space */
127 size = TEST_SIZE_LARGE;
128 ut_asserteq(-ENOSPC, bloblist_ensure_size_ret(TEST_TAG2, &size, &data));
132 BLOBLIST_TEST(bloblist_test_blob_ensure, 0);
134 static int bloblist_test_bad_blob(struct unit_test_state *uts)
136 struct bloblist_hdr *hdr;
139 hdr = clear_bloblist();
140 ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
142 data += sizeof(struct bloblist_rec);
143 ut_asserteq_ptr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
144 ut_asserteq_ptr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
148 BLOBLIST_TEST(bloblist_test_bad_blob, 0);
150 static int bloblist_test_checksum(struct unit_test_state *uts)
152 struct bloblist_hdr *hdr;
155 hdr = clear_bloblist();
156 ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
157 ut_assertok(bloblist_finish());
158 ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
161 * Now change things amd make sure that the checksum notices. We cannot
162 * change the size or alloced fields, since that will crash the code.
163 * It has to rely on these being correct.
166 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
170 ut_asserteq(-EFBIG, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
174 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
178 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
181 /* Make sure the checksum changes when we add blobs */
182 data = bloblist_add(TEST_TAG, TEST_SIZE);
183 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
185 data2 = bloblist_add(TEST_TAG2, TEST_SIZE2);
186 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
187 ut_assertok(bloblist_finish());
189 /* It should also change if we change the data */
190 ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
192 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
195 ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
197 ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
201 * Changing data outside the range of valid data should not affect
204 ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
207 ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
212 BLOBLIST_TEST(bloblist_test_checksum, 0);
214 int do_ut_bloblist(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
216 struct unit_test *tests = ll_entry_start(struct unit_test,
218 const int n_ents = ll_entry_count(struct unit_test, bloblist_test);
220 return cmd_ut_category("bloblist", "bloblist_test_",
221 tests, n_ents, argc, argv);