blob: 9547ee07a67fc2fbc2d122b2fb824f222bc24927 [file] [log] [blame]
Jakub Czapiga5d884832021-04-06 09:42:02 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <tests/test.h>
4#include <boardid.h>
5#include <boot/coreboot_tables.h>
6#include <boot/tables.h>
7#include <cbfs.h>
8#include <cbmem.h>
9#include <commonlib/helpers.h>
10#include <commonlib/region.h>
11#include <fmap_config.h>
12#include <fw_config.h>
13#include <stdbool.h>
14#include <version.h>
15
16
17/* Copy of lb_table_init() implementation for testing purposes */
18static struct lb_header *lb_table_init(unsigned long addr)
19{
20 struct lb_header *header;
21
22 /* 16 byte align the address */
Elyes Haouasf25c1122022-09-11 12:18:46 +020023 addr = ALIGN_UP(addr, 16);
Jakub Czapiga5d884832021-04-06 09:42:02 +020024
25 header = (void *)addr;
26 header->signature[0] = 'L';
27 header->signature[1] = 'B';
28 header->signature[2] = 'I';
29 header->signature[3] = 'O';
30 header->header_bytes = sizeof(*header);
31 header->header_checksum = 0;
32 header->table_bytes = 0;
33 header->table_checksum = 0;
34 header->table_entries = 0;
35 return header;
36}
37
38static struct lb_record *lb_first_record(struct lb_header *header)
39{
40 struct lb_record *rec;
41 rec = (void *)(((char *)header) + sizeof(*header));
42 return rec;
43}
44
Jakub Czapigac08b6a72022-01-10 13:36:47 +000045#define LB_RECORD_FOR_EACH(record_ptr, index, header) \
46 for (index = 0, record_ptr = lb_first_record(header); index < header->table_entries; \
47 record_ptr = (struct lb_record *)((uintptr_t)record_ptr + record_ptr->size), \
48 index++)
Jakub Czapiga5d884832021-04-06 09:42:02 +020049
50static void test_lb_add_gpios(void **state)
51{
52 struct lb_gpio gpios[] = {
53 {-1, ACTIVE_HIGH, 1, "lid"},
54 {-1, ACTIVE_HIGH, 0, "power"},
55 {-1, ACTIVE_HIGH, 1, "oprom"},
56 {-1, ACTIVE_HIGH, 0, "EC in RW"},
57 };
58 const size_t gpios_buf_size = sizeof(struct lb_gpios) + sizeof(struct lb_gpio) * 32;
59 uint8_t gpios_buf[gpios_buf_size];
60 struct lb_gpios *gpios_table = (struct lb_gpios *)gpios_buf;
61 gpios_table->count = 0;
62 gpios_table->size = 0;
63 gpios_table->tag = LB_TAG_GPIO;
64
65 /* Add GPIOs an check if they have been added to the table.
66 GPIOs are added in the same order to the end of the table. */
67 lb_add_gpios(gpios_table, gpios, ARRAY_SIZE(gpios));
68 assert_int_equal(ARRAY_SIZE(gpios), gpios_table->count);
69 assert_int_equal(sizeof(gpios), gpios_table->size);
70 assert_memory_equal(&gpios_table->gpios[0], gpios, sizeof(gpios));
71
72 /* Add subset of gpios and check if they have been added correctly. */
73 lb_add_gpios(gpios_table, &gpios[1], 2);
74 assert_int_equal(ARRAY_SIZE(gpios) + 2, gpios_table->count);
75 assert_int_equal(sizeof(gpios) + 2 * sizeof(gpios[0]), gpios_table->size);
76 assert_memory_equal(&gpios_table->gpios[0], gpios, sizeof(gpios));
77 assert_memory_equal(&gpios_table->gpios[ARRAY_SIZE(gpios)], &gpios[1],
Jakub Czapigac08b6a72022-01-10 13:36:47 +000078 2 * sizeof(gpios[0]));
Jakub Czapiga5d884832021-04-06 09:42:02 +020079}
80
81uint8_t tables_buffer[sizeof(struct lb_header) + 10 * KiB];
82static int setup_test_header(void **state)
83{
84 *state = lb_table_init((uintptr_t)tables_buffer);
85
86 return 0;
87}
88
89static void test_lb_new_record(void **state)
90{
91 struct lb_header *header = *state;
92 const size_t entries = 10;
93 int i;
94 size_t entries_offset;
95 size_t accumulated_size = 0;
96 struct lb_record *curr;
97
98
99 assert_int_equal(0, header->table_entries);
100 assert_int_equal(0, header->table_bytes);
101
102 lb_new_record(header);
103 assert_int_equal(1, header->table_entries);
104 assert_int_equal(0, header->table_bytes);
105
106 /* Create few entries with varying sizes (but at least of sizeof(struct lb_record))
107 Accumulate and check size of table after each lb_new_record() call. */
108 entries_offset = header->table_entries;
109 accumulated_size = sizeof(struct lb_record);
110 for (i = 0; i < entries; ++i) {
111 curr = lb_new_record(header);
Julius Werner9a9b2772022-11-30 16:18:01 -0800112 curr->size = sizeof(struct lb_record) +
113 ALIGN_UP(((i + 2) * 7) % 32, LB_ENTRY_ALIGN);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200114
115 assert_int_equal(entries_offset + (i + 1), header->table_entries);
116 assert_int_equal(accumulated_size, header->table_bytes);
117 accumulated_size += curr->size;
118 }
119}
120
Jakub Czapiga5d884832021-04-06 09:42:02 +0200121static void test_lb_add_console(void **state)
122{
123 struct lb_header *header = *state;
124
125 lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, header);
126 assert_int_equal(1, header->table_entries);
127 /* Table bytes and checksum should be zero, because it is updated with size of previous
128 record or when table is closed. No previous record is present. */
129 assert_int_equal(0, header->table_bytes);
130 assert_int_equal(0, header->table_checksum);
131}
132
133static void test_multiple_entries(void **state)
134{
135 struct lb_header *header = *state;
136
137 /* Add two entries */
138 lb_add_console(LB_TAG_CONSOLE_SERIAL8250, header);
139 lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, header);
140
141 assert_int_equal(2, header->table_entries);
142 assert_int_equal(sizeof(struct lb_console), header->table_bytes);
143}
144
145static void test_write_coreboot_forwarding_table(void **state)
146{
147 struct lb_header *header = *state;
148 uint8_t forwarding_table_buffer[sizeof(struct lb_header)
149 + 2 * sizeof(struct lb_forward)];
150 struct lb_header *forward_header =
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000151 (struct lb_header *)ALIGN_UP((uintptr_t)forwarding_table_buffer, 16);
152 size_t forwarding_table_size = write_coreboot_forwarding_table(
153 (uintptr_t)forwarding_table_buffer, (uintptr_t)header);
154 size_t expected_forwarding_table_size =
155 ALIGN_UP((uintptr_t)forwarding_table_buffer, 16) + sizeof(struct lb_header)
156 + sizeof(struct lb_forward) - (uintptr_t)forwarding_table_buffer;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200157 assert_int_equal(expected_forwarding_table_size, forwarding_table_size);
158
159 assert_int_equal(1, forward_header->table_entries);
160 assert_int_equal(sizeof(struct lb_forward), forward_header->table_bytes);
161 assert_ptr_equal(header,
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000162 ((struct lb_forward *)lb_first_record(forward_header))->forward);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200163}
164
165/* Mocks for write_tables() */
166const char mainboard_vendor[] = CONFIG_MAINBOARD_VENDOR;
167const char mainboard_part_number[] = CONFIG_MAINBOARD_PART_NUMBER;
168
169const char coreboot_version[] = "4.13";
170const char coreboot_extra_version[] = "abcdef";
171const char coreboot_build[] = "Coreboot build info";
172const unsigned int coreboot_version_timestamp = 1617191902U;
173const unsigned int coreboot_major_revision = 4;
174const unsigned int coreboot_minor_revision = 13;
175
176const char coreboot_compile_time[] = "13:58:22";
177const char coreboot_dmi_date[] = "03/31/2021";
178
179const struct bcd_date coreboot_build_date = {
180 .century = 0x20,
181 .year = 0x20,
182 .month = 0x03,
183 .day = 0x31,
184 .weekday = 0x2,
185};
186
187const unsigned int asl_revision = 0x20200925;
188
189void arch_write_tables(uintptr_t coreboot_table)
190{
191}
192
Arthur Heymans2e7e2d92022-03-03 22:28:27 +0100193static const uintptr_t ebda_base = 0xf0000;
194uintptr_t get_coreboot_rsdp(void)
195{
196 return ebda_base;
197}
198
Jakub Czapiga5d884832021-04-06 09:42:02 +0200199struct resource mock_bootmem_ranges[] = {
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000200 {.base = 0x1000, .size = 0x2000, .flags = LB_MEM_RAM},
201 {.base = 0x0000, .size = 0x4000, .flags = LB_MEM_RAM},
Jakub Czapiga5d884832021-04-06 09:42:02 +0200202};
203
204void bootmem_write_memory_table(struct lb_memory *mem)
205{
206 struct lb_memory_range *lb_r = &mem->map[0];
207 int i;
208
209 /* Insert entries for testing */
210 for (i = 0; i < ARRAY_SIZE(mock_bootmem_ranges); ++i) {
211 struct resource *res = &mock_bootmem_ranges[i];
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800212 lb_r->start = res->base;
213 lb_r->size = res->size;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200214 lb_r->type = res->flags;
215 lb_r++;
216 mem->size += sizeof(struct lb_memory_range);
217 }
218}
219
Arthur Heymans9948c522022-10-24 14:37:40 +0200220enum cb_err fill_lb_serial(struct lb_serial *serial)
Jakub Czapiga5d884832021-04-06 09:42:02 +0200221{
Arthur Heymans9948c522022-10-24 14:37:40 +0200222 serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
223 serial->baseaddr = 0xFEDC6000;
224 serial->baud = 115200;
225 serial->regwidth = 1;
226 serial->input_hertz = 115200 * 16;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200227
Arthur Heymans9948c522022-10-24 14:37:40 +0200228 return CB_SUCCESS;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200229}
230
231struct cbfs_boot_device cbfs_boot_dev = {
232 .rdev = REGION_DEV_INIT(NULL, 0, 0x1000),
233 .mcache = (void *)0x1000,
234 .mcache_size = 0x1000,
235};
236
237const struct cbfs_boot_device *cbfs_get_boot_device(bool force_ro)
238{
239 return &cbfs_boot_dev;
240}
241
242void cbmem_run_init_hooks(int is_recovery)
243{
244}
245
246extern uintptr_t _cbmem_top_ptr;
Elyes Haouas799c3212022-11-09 14:00:44 +0100247uintptr_t cbmem_top_chipset(void)
Jakub Czapiga5d884832021-04-06 09:42:02 +0200248{
Elyes Haouas799c3212022-11-09 14:00:44 +0100249 return _cbmem_top_ptr;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200250}
251
252#define CBMEM_SIZE (64 * KiB)
253
254static int teardown_write_tables_test(void **state)
255{
256 free(*state);
257 _cbmem_top_ptr = 0;
258 return 0;
259}
260
261static int setup_write_tables_test(void **state)
262{
263 /* Allocate more data to have space for alignment */
264 void *top_ptr = malloc(CBMEM_SIZE + DYN_CBMEM_ALIGN_SIZE);
265 int32_t *mmc_status = NULL;
266
267 if (!top_ptr)
268 return -1;
269
270 *state = top_ptr;
271
272 _cbmem_top_ptr = ALIGN_UP((uintptr_t)top_ptr + CBMEM_SIZE, DYN_CBMEM_ALIGN_SIZE);
273
274 cbmem_initialize_empty();
275
276 mmc_status = cbmem_add(CBMEM_ID_MMC_STATUS, sizeof(int32_t));
277
278 if (mmc_status == NULL) {
279 teardown_write_tables_test(state);
280 return -1;
281 }
282
283 *mmc_status = 0x4433AADD;
284
285 return 0;
286}
287
288const struct region_device *boot_device_ro(void)
289{
290 return &cbfs_boot_dev.rdev;
291}
292
293uint64_t get_fmap_flash_offset(void)
294{
295 return FMAP_OFFSET;
296}
297
298uint32_t freq_khz = 5000 * 1000;
299void lb_arch_add_records(struct lb_header *header)
300{
301 struct lb_tsc_info *tsc_info;
302
303 tsc_info = (void *)lb_new_record(header);
304 tsc_info->tag = LB_TAG_TSC_INFO;
305 tsc_info->size = sizeof(*tsc_info);
306 tsc_info->freq_khz = freq_khz;
307}
308
309static void test_write_tables(void **state)
310{
311 void *cbtable_start;
312 struct lb_header *header;
313 struct lb_record *record;
314 int32_t *mmc_status = cbmem_find(CBMEM_ID_MMC_STATUS);
315 size_t i = 0;
316
317 /* Expect function to store cbtable entry in cbmem */
318 cbtable_start = write_tables();
319 assert_ptr_equal(cbtable_start, cbmem_find(CBMEM_ID_CBTABLE));
320
321 /* Expect correct lb_header at cbtable_start address */
322 header = (struct lb_header *)cbtable_start;
323 assert_non_null(header);
324 assert_memory_equal("LBIO", header, 4);
325 assert_int_equal(sizeof(*header), header->header_bytes);
326 /* At least one entry should be present. */
327 assert_int_not_equal(0, header->table_entries);
328
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000329 LB_RECORD_FOR_EACH(record, i, header)
330 {
Jakub Czapiga5d884832021-04-06 09:42:02 +0200331 switch (record->tag) {
332 case LB_TAG_MEMORY:
333 /* Should be the same as in bootmem_write_memory_table() */
334 assert_int_equal(sizeof(struct lb_memory)
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000335 + ARRAY_SIZE(mock_bootmem_ranges)
336 * sizeof(struct lb_memory_range),
337 record->size);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200338
339 const struct lb_memory *memory = (struct lb_memory *)record;
340 const struct lb_memory_range *range;
341 const struct resource *res;
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800342 lb_uint64_t value;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200343
344 for (int i = 0; i < ARRAY_SIZE(mock_bootmem_ranges); ++i) {
345 res = &mock_bootmem_ranges[i];
346 range = &memory->map[i];
347
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800348 value = res->base;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200349 assert_memory_equal(&value, &range->start,
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800350 sizeof(lb_uint64_t));
351 value = res->size;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200352 assert_memory_equal(&value, &range->size,
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800353 sizeof(lb_uint64_t));
Jakub Czapiga5d884832021-04-06 09:42:02 +0200354 assert_int_equal(range->type, res->flags);
355 }
356 break;
357 case LB_TAG_MAINBOARD:
358 /* Mainboard record contains its header followed
359 by two null-terminated strings */
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000360 assert_int_equal(ALIGN_UP(sizeof(struct lb_mainboard)
361 + ARRAY_SIZE(mainboard_vendor)
362 + ARRAY_SIZE(mainboard_part_number),
Julius Werner9a9b2772022-11-30 16:18:01 -0800363 LB_ENTRY_ALIGN),
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000364 record->size);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200365 break;
366 case LB_TAG_VERSION:
367 assert_int_equal(ALIGN_UP(sizeof(struct lb_string)
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000368 + ARRAY_SIZE(coreboot_version),
Julius Werner9a9b2772022-11-30 16:18:01 -0800369 LB_ENTRY_ALIGN),
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000370 record->size);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200371 break;
372 case LB_TAG_EXTRA_VERSION:
373 assert_int_equal(ALIGN_UP(sizeof(struct lb_string)
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000374 + ARRAY_SIZE(coreboot_extra_version),
Julius Werner9a9b2772022-11-30 16:18:01 -0800375 LB_ENTRY_ALIGN),
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000376 record->size);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200377 break;
378 case LB_TAG_BUILD:
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000379 assert_int_equal(
380 ALIGN_UP(sizeof(struct lb_string) + ARRAY_SIZE(coreboot_build),
Julius Werner9a9b2772022-11-30 16:18:01 -0800381 LB_ENTRY_ALIGN),
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000382 record->size);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200383 break;
384 case LB_TAG_COMPILE_TIME:
385 assert_int_equal(ALIGN_UP(sizeof(struct lb_string)
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000386 + ARRAY_SIZE(coreboot_compile_time),
Julius Werner9a9b2772022-11-30 16:18:01 -0800387 LB_ENTRY_ALIGN),
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000388 record->size);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200389 break;
390 case LB_TAG_SERIAL:
391 assert_int_equal(sizeof(struct lb_serial), record->size);
392
393 /* This struct have the same values as created in uart_fill_lb() */
394 const struct lb_serial *serial = (struct lb_serial *)record;
395 assert_int_equal(LB_SERIAL_TYPE_MEMORY_MAPPED, serial->type);
396 assert_int_equal(0xFEDC6000, serial->baseaddr);
397 assert_int_equal(115200, serial->baud);
398 assert_int_equal(1, serial->regwidth);
399 assert_int_equal(115200 * 16, serial->input_hertz);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200400 break;
401 case LB_TAG_CONSOLE:
402 assert_int_equal(sizeof(struct lb_console), record->size);
403
404 /* This struct have the same values as created in uart_fill_lb() */
405 const struct lb_console *console = (struct lb_console *)record;
406 assert_int_equal(LB_TAG_CONSOLE_SERIAL8250MEM, console->type);
407 break;
408 case LB_TAG_VERSION_TIMESTAMP:
409 assert_int_equal(sizeof(struct lb_timestamp), record->size);
410
411 const struct lb_timestamp *timestamp = (struct lb_timestamp *)record;
412 assert_int_equal(coreboot_version_timestamp, timestamp->timestamp);
413 break;
414 case LB_TAG_BOOT_MEDIA_PARAMS:
415 assert_int_equal(sizeof(struct lb_boot_media_params), record->size);
416
417 const struct lb_boot_media_params *bmp =
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000418 (struct lb_boot_media_params *)record;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200419 const struct cbfs_boot_device *cbd = cbfs_get_boot_device(false);
420 const struct region_device *boot_dev = boot_device_ro();
421 assert_int_equal(region_device_offset(&cbd->rdev), bmp->cbfs_offset);
422 assert_int_equal(region_device_sz(&cbd->rdev), bmp->cbfs_size);
423 assert_int_equal(region_device_sz(boot_dev), bmp->boot_media_size);
424 assert_int_equal(get_fmap_flash_offset(), bmp->fmap_offset);
425
426 break;
427 case LB_TAG_CBMEM_ENTRY:
428 assert_int_equal(sizeof(struct lb_cbmem_entry), record->size);
429
430 const struct lb_cbmem_entry *cbmem_entry =
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000431 (struct lb_cbmem_entry *)record;
432 const LargestIntegralType expected_tags[] = {CBMEM_ID_CBTABLE,
433 CBMEM_ID_MMC_STATUS};
434 assert_in_set(cbmem_entry->id, expected_tags,
435 ARRAY_SIZE(expected_tags));
Jakub Czapiga5d884832021-04-06 09:42:02 +0200436 break;
437 case LB_TAG_TSC_INFO:
438 assert_int_equal(sizeof(struct lb_tsc_info), record->size);
439
440 const struct lb_tsc_info *tsc_info = (struct lb_tsc_info *)record;
441 assert_int_equal(freq_khz, tsc_info->freq_khz);
442 break;
443 case LB_TAG_MMC_INFO:
444 assert_int_equal(sizeof(struct lb_mmc_info), record->size);
445
446 const struct lb_mmc_info *mmc_info = (struct lb_mmc_info *)record;
447 assert_int_equal(*mmc_status, mmc_info->early_cmd1_status);
448 break;
449 case LB_TAG_BOARD_CONFIG:
450 assert_int_equal(sizeof(struct lb_board_config), record->size);
451
452 const struct lb_board_config *board_config =
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000453 (struct lb_board_config *)record;
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800454 const lb_uint64_t expected_fw_version = fw_config_get();
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000455 assert_memory_equal(&expected_fw_version, &board_config->fw_config,
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800456 sizeof(lb_uint64_t));
Jakub Czapiga5d884832021-04-06 09:42:02 +0200457 assert_int_equal(board_id(), board_config->board_id);
458 assert_int_equal(ram_code(), board_config->ram_code);
459 assert_int_equal(sku_id(), board_config->sku_id);
460 break;
Arthur Heymans2e7e2d92022-03-03 22:28:27 +0100461 case LB_TAG_ACPI_RSDP:
462 assert_int_equal(sizeof(struct lb_acpi_rsdp), record->size);
463
464 const struct lb_acpi_rsdp *acpi_rsdp = (struct lb_acpi_rsdp *)record;
Jianjun Wangb2537bd2022-04-08 16:57:28 +0800465 assert_int_equal(ebda_base, acpi_rsdp->rsdp_pointer);
Arthur Heymans2e7e2d92022-03-03 22:28:27 +0100466 break;
Jakub Czapiga5d884832021-04-06 09:42:02 +0200467 default:
468 fail_msg("Unexpected tag found in record. Tag ID: 0x%x", record->tag);
469 }
470 }
471}
472
473int main(void)
474{
475 const struct CMUnitTest tests[] = {
476 cmocka_unit_test(test_lb_add_gpios),
477 cmocka_unit_test_setup(test_lb_new_record, setup_test_header),
Jakub Czapiga5d884832021-04-06 09:42:02 +0200478 cmocka_unit_test_setup(test_lb_add_console, setup_test_header),
479 cmocka_unit_test_setup(test_multiple_entries, setup_test_header),
480 cmocka_unit_test_setup(test_write_coreboot_forwarding_table, setup_test_header),
Jakub Czapigac08b6a72022-01-10 13:36:47 +0000481 cmocka_unit_test_setup_teardown(test_write_tables, setup_write_tables_test,
Jakub Czapiga5d884832021-04-06 09:42:02 +0200482 teardown_write_tables_test),
483 };
484
Jakub Czapiga7c6081e2021-08-25 16:27:35 +0200485 return cb_run_group_tests(tests, NULL, NULL);
Jakub Czapiga5d884832021-04-06 09:42:02 +0200486}