From c1e4c5aaa5cbe9b1fa8d16be9b23038bc5fbc9b8 Mon Sep 17 00:00:00 2001 From: Jakub Czapiga Date: Fri, 23 Jul 2021 13:35:14 +0200 Subject: [PATCH] tests: Add lib/lzma-test test case Files used by this test are in: tests/data/lib/lzma-test/ file.bin - files with uncompressed data file.lzma.bin - files with LZMA-compressed data from file.bin How to prepare compressed file: util/cbfs-compression-tool compress file.bin /tmp/file.lzma.bin lzma dd if=/tmp/file.lzma.bin of=file.lzma.bin skip=8 ibs=1 Signed-off-by: Jakub Czapiga Change-Id: Id75e0b41991382d4c391b031862106de58eacdf7 Reviewed-on: https://review.coreboot.org/c/coreboot/+/57555 Tested-by: build bot (Jenkins) Reviewed-by: Paul Fagerburg Reviewed-by: Julius Werner --- tests/Makefile.inc | 3 +- tests/data/lib/lzma-test/data.1.bin | Bin 0 -> 124784 bytes tests/data/lib/lzma-test/data.1.lzma.bin | Bin 0 -> 52133 bytes tests/data/lib/lzma-test/data.2.bin | 104 +++ tests/data/lib/lzma-test/data.2.lzma.bin | Bin 0 -> 1537 bytes tests/data/lib/lzma-test/data.3.bin | 764 +++++++++++++++++++++++ tests/data/lib/lzma-test/data.3.lzma.bin | Bin 0 -> 3865 bytes tests/data/lib/lzma-test/data.4.bin | Bin 0 -> 60912 bytes tests/data/lib/lzma-test/data.4.lzma.bin | Bin 0 -> 17064 bytes tests/lib/Makefile.inc | 6 + tests/lib/lzma-test.c | 190 ++++++ 11 files changed, 1066 insertions(+), 1 deletion(-) create mode 100644 tests/data/lib/lzma-test/data.1.bin create mode 100644 tests/data/lib/lzma-test/data.1.lzma.bin create mode 100644 tests/data/lib/lzma-test/data.2.bin create mode 100644 tests/data/lib/lzma-test/data.2.lzma.bin create mode 100644 tests/data/lib/lzma-test/data.3.bin create mode 100644 tests/data/lib/lzma-test/data.3.lzma.bin create mode 100644 tests/data/lib/lzma-test/data.4.bin create mode 100644 tests/data/lib/lzma-test/data.4.lzma.bin create mode 100644 tests/lib/lzma-test.c diff --git a/tests/Makefile.inc b/tests/Makefile.inc index 982f42baf7..6397e9b670 100644 --- a/tests/Makefile.inc +++ b/tests/Makefile.inc @@ -141,7 +141,8 @@ $$($(1)-config-file): $(TEST_KCONFIG_AUTOHEADER) $($(1)-objs): TEST_CFLAGS += -I$$(dir $$($(1)-config-file)) \ -D__$$(shell echo $$($(1)-stage) | tr '[:lower:]' '[:upper:]')__ \ - -D__TEST_NAME__=\"$(subst /,_,$(1))\" + -D__TEST_NAME__=\"$(subst /,_,$(1))\" \ + -D__TEST_DATA_DIR__=\"$(testsrc)/data\" # Give us a way to distinguish between coreboot source files and test files in code. $($(1)-srcobjs): TEST_CFLAGS += -D__TEST_SRCOBJ__ diff --git a/tests/data/lib/lzma-test/data.1.bin b/tests/data/lib/lzma-test/data.1.bin new file mode 100644 index 0000000000000000000000000000000000000000..2ac7245fd05365e530c92da95affec1b9c2970bb GIT binary patch literal 124784 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 literal 0 HcmV?d00001 diff --git a/tests/data/lib/lzma-test/data.1.lzma.bin b/tests/data/lib/lzma-test/data.1.lzma.bin new file mode 100644 index 0000000000000000000000000000000000000000..c3565b863dc537404acf978a7bd8eac4ab53a43c GIT binary patch literal 52133 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

EmNE6tA3mQFX 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 C_e_@n literal 0 HcmV?d00001 diff --git a/tests/data/lib/lzma-test/data.2.bin b/tests/data/lib/lzma-test/data.2.bin new file mode 100644 index 0000000000..14879c1484 --- /dev/null +++ b/tests/data/lib/lzma-test/data.2.bin @@ -0,0 +1,104 @@ +coreboot README +=============== + +coreboot is a Free Software project aimed at replacing the proprietary BIOS +(firmware) found in most computers. coreboot performs a little bit of +hardware initialization and then executes additional boot logic, called a +payload. + +With the separation of hardware initialization and later boot logic, +coreboot can scale from specialized applications that run directly +firmware, run operating systems in flash, load custom +bootloaders, or implement firmware standards, like PC BIOS services or +UEFI. This allows for systems to only include the features necessary +in the target application, reducing the amount of code and flash space +required. + +coreboot was formerly known as LinuxBIOS. + + +Payloads +-------- + +After the basic initialization of the hardware has been performed, any +desired "payload" can be started by coreboot. + +See for a list of supported payloads. + + +Supported Hardware +------------------ + +coreboot supports a wide range of chipsets, devices, and mainboards. + +For details please consult: + + * + + +Build Requirements +------------------ + + * make + * gcc / g++ + Because Linux distribution compilers tend to use lots of patches. coreboot + does lots of "unusual" things in its build system, some of which break due + to those patches, sometimes by gcc aborting, sometimes - and that's worse - + by generating broken object code. + Two options: use our toolchain (eg. make crosstools-i386) or enable the + `ANY_TOOLCHAIN` Kconfig option if you're feeling lucky (no support in this + case). + * iasl (for targets with ACPI support) + * pkg-config + * libssl-dev (openssl) + +Optional: + + * doxygen (for generating/viewing documentation) + * gdb (for better debugging facilities on some targets) + * ncurses (for `make menuconfig` and `make nconfig`) + * flex and bison (for regenerating parsers) + + +Building coreboot +----------------- + +Please consult for details. + + +Testing coreboot Without Modifying Your Hardware +------------------------------------------------ + +If you want to test coreboot without any risks before you really decide +to use it on your hardware, you can use the QEMU system emulator to run +coreboot virtually in QEMU. + +Please see for details. + + +Website and Mailing List +------------------------ + +Further details on the project, a FAQ, many HOWTOs, news, development +guidelines and more can be found on the coreboot website: + + + +You can contact us directly on the coreboot mailing list: + + + + +Copyright and License +--------------------- + +The copyright on coreboot is owned by quite a large number of individual +developers and companies. Please check the individual source files for details. + +coreboot is licensed under the terms of the GNU General Public License (GPL). +Some files are licensed under the "GPL (version 2, or any later version)", +and some files are licensed under the "GPL, version 2". For some parts, which +were derived from other projects, other (GPL-compatible) licenses may apply. +Please check the individual source files for details. + +This makes the resulting coreboot images licensed under the GPL, version 2. diff --git a/tests/data/lib/lzma-test/data.2.lzma.bin b/tests/data/lib/lzma-test/data.2.lzma.bin new file mode 100644 index 0000000000000000000000000000000000000000..e1dd3f7b047cf28270d5b756fe2a54a3a8fa484c GIT binary patch literal 1537 zcmV+c2LAa001yBG=?nk>0000005P3w%!Jt@4x&w;-;+UUUR4Ryyt%uz2PWHy;0?9N z;D#lG-DaX>je_IBIQ`00~Qjn2FR$sd=`;sC#QO94oGn(}bmE-zN6o^bmWDuO{yXq5C z;O^W2mOQ2}ZTG-`@kCN)`vy}e8(a4587V+KOsWJggV=;I;86-M<=y$ zJziV|``&Osq8UhBdhRSwmoA6eXWxmhxXV5*Bu%*N#X7j{H5+v4YZB zyX;u^)_39HY*u{rou#q??`uT%hZZIN_{t}Zeq2-wj%;ntW8XZzQ7!O@or z4}omS`psRI0CgM_3)wrI9*B#|(Re#T0HID0^H6?v5x>H_cc`!CLL_l?TG#5>zCQQD znU?4?kHzYBtxWx(0Bg4sx8iD+C}Or`Xoh2ynTy0IYbSdgWM}{aashvC1DPeUwAoOR zT{v(b9dROCh4g1&?Ha)_ZH;IREtTFovl!elWwT;yu9L56+OV{MKyc%jI;&R*e`&`2 zU(CB>koS@^#TP&MnPQwibuY2F!fABvS^VK4Kt)l}?6KDZbef?m3+Kh1HH9xApBHqB zQ@7DPU*PJIKPNu2?4^pI1tK*sCU!=O;!Lb*q|?$9i`LFElKpoM`{re^q=@JeYHWdB zHqpBYQy!&_P_o~4ckw{V(0^vt5;05gP7@)wCBQ|e-KcG5B#igR^#{7*p5ql&%0;qZ z7}bjNiGmyXsZHj-aj6!i$-yIMpG3VLo0Fn(ESL4C!cTbdr z^*e>(jl4)d0wWWjylZu+WgGvnbejT2EP=GIpdh*k?&YdN`_4{$Ra`8gSm-K}oOF~R z`~B#{p3e{XQo>%!eKT6&b}x#oeKxBa(<2}LbP z5HI^5nmbYTqx!a;xO$YXg}?%$c1hMKWxJQ}l(`Eg8S|}iD}v!LD>t*~lcPohnUSL) z2H*U8|LuWRIb!UL5(u#JB*+5@^ec~hwEQQmUKx3!2tKft<1GcMD9nPZ7FFAOwg*4( z_3Bf`2O1@Ik&9lihc}!c9#5~1^g8Eq`fZL@)3-sf3?@{ki%Y!&IXCK9+4`*v3*G00 z8ox=NzgrbNMNTEcGGOP^Dc}K0G2bXydUD)3ueMVr(=xgV3#d1JrggbgUlzey6Vgj+ zIsM);v(aHA*vt-L8b*A2h(1td9)v9C-ZPzp*zprb;c8a>36{r7RgK&P;@Vs7mcXt7 nt*))X=wV^j+S_cz_1iC8laU0D@d|J()ga6G*T63laf=ljt4sxm literal 0 HcmV?d00001 diff --git a/tests/data/lib/lzma-test/data.3.bin b/tests/data/lib/lzma-test/data.3.bin new file mode 100644 index 0000000000..6da1ac926c --- /dev/null +++ b/tests/data/lib/lzma-test/data.3.bin @@ -0,0 +1,764 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Auxiliary functions and definitions. */ + +#define LG_ROOT_SIZE align_up_pow2(sizeof(struct imd_root_pointer) +\ + sizeof(struct imd_root) + 3 * sizeof(struct imd_entry)) +#define LG_ENTRY_ALIGN (2 * sizeof(int32_t)) +#define LG_ENTRY_SIZE (2 * sizeof(int32_t)) +#define LG_ENTRY_ID 0xA001 + +#define SM_ROOT_SIZE LG_ROOT_SIZE +#define SM_ENTRY_ALIGN sizeof(uint32_t) +#define SM_ENTRY_SIZE sizeof(uint32_t) +#define SM_ENTRY_ID 0xB001 + +#define INVALID_REGION_ID 0xC001 + +static uint32_t align_up_pow2(uint32_t x) +{ + return (1 << log2_ceil(x)); +} + +static size_t max_entries(size_t root_size) +{ + return (root_size - sizeof(struct imd_root_pointer) - sizeof(struct imd_root)) + / sizeof(struct imd_entry); +} + +/* + * Mainly, we should check that imd_handle_init() aligns upper_limit properly + * for various inputs. Upper limit is the _exclusive_ address, so we expect + * ALIGN_DOWN. + */ +static void test_imd_handle_init(void **state) +{ + int i; + void *base; + struct imd imd; + uintptr_t test_inputs[] = { + 0, /* Lowest possible address */ + 0xA000, /* Fits in 16 bits, should not get rounded down*/ + 0xDEAA, /* Fits in 16 bits */ + 0xB0B0B000, /* Fits in 32 bits, should not get rounded down */ + 0xF0F0F0F0, /* Fits in 32 bits */ + ((1ULL << 32) + 4), /* Just above 32-bit limit */ + 0x6666777788889000, /* Fits in 64 bits, should not get rounded down */ + ((1ULL << 60) - 100) /* Very large address, fitting in 64 bits */ + }; + + for (i = 0; i < ARRAY_SIZE(test_inputs); i++) { + base = (void *)test_inputs[i]; + + imd_handle_init(&imd, (void *)base); + + assert_int_equal(imd.lg.limit % LIMIT_ALIGN, 0); + assert_int_equal(imd.lg.limit, ALIGN_DOWN(test_inputs[i], LIMIT_ALIGN)); + assert_ptr_equal(imd.lg.r, NULL); + + /* Small allocations not initialized */ + assert_ptr_equal(imd.sm.limit, NULL); + assert_ptr_equal(imd.sm.r, NULL); + } +} + +static void test_imd_handle_init_partial_recovery(void **state) +{ + void *base; + struct imd imd = {0}; + const struct imd_entry *entry; + + imd_handle_init_partial_recovery(&imd); + assert_null(imd.lg.limit); + assert_null(imd.sm.limit); + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + imd_handle_init_partial_recovery(&imd); + + assert_non_null(imd.lg.r); + assert_null(imd.sm.limit); + + assert_int_equal(0, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + entry = imd_entry_add(&imd, SMALL_REGION_ID, LG_ENTRY_SIZE); + assert_non_null(entry); + + imd_handle_init_partial_recovery(&imd); + + assert_non_null(imd.lg.r); + assert_non_null(imd.sm.limit); + assert_ptr_equal(imd.lg.r + entry->start_offset + LG_ENTRY_SIZE, imd.sm.limit); + assert_non_null(imd.sm.r); + + free(base); +} + +static void test_imd_create_empty(void **state) +{ + struct imd imd = {0}; + void *base; + struct imd_root *r; + struct imd_entry *e; + + /* Expect imd_create_empty to fail, since imd handle is not initialized */ + assert_int_equal(-1, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + base = malloc(sizeof(struct imd_root_pointer) + sizeof(struct imd_root)); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + /* Try incorrect sizes */ + assert_int_equal(-1, imd_create_empty(&imd, + sizeof(struct imd_root_pointer), + LG_ENTRY_ALIGN)); + assert_int_equal(-1, imd_create_empty(&imd, LG_ROOT_SIZE, 2 * LG_ROOT_SIZE)); + + /* Working case */ + assert_int_equal(0, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + + /* Only large allocation initialized with one entry for the root region */ + r = (struct imd_root *) (imd.lg.r); + assert_non_null(r); + + e = &r->entries[r->num_entries - 1]; + + assert_int_equal(max_entries(LG_ROOT_SIZE), r->max_entries); + assert_int_equal(1, r->num_entries); + assert_int_equal(0, r->flags); + assert_int_equal(LG_ENTRY_ALIGN, r->entry_align); + assert_int_equal(0, r->max_offset); + assert_ptr_equal(e, &r->entries); + + assert_int_equal(IMD_ENTRY_MAGIC, e->magic); + assert_int_equal(0, e->start_offset); + assert_int_equal(LG_ROOT_SIZE, e->size); + assert_int_equal(CBMEM_ID_IMD_ROOT, e->id); + + free(base); +} + +static void test_imd_create_tiered_empty(void **state) +{ + void *base; + size_t sm_region_size, lg_region_wrong_size; + struct imd imd = {0}; + struct imd_root *r; + struct imd_entry *fst_lg_entry, *snd_lg_entry, *sm_entry; + + /* Uninitialized imd handle */ + assert_int_equal(-1, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + LG_ROOT_SIZE, SM_ENTRY_ALIGN)); + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + /* Too small root_size for small region */ + assert_int_equal(-1, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + sizeof(int32_t), 2 * sizeof(int32_t))); + + /* Fail when large region doesn't have capacity for more than 1 entry */ + lg_region_wrong_size = sizeof(struct imd_root_pointer) + sizeof(struct imd_root) + + sizeof(struct imd_entry); + expect_assert_failure( + imd_create_tiered_empty(&imd, lg_region_wrong_size, LG_ENTRY_ALIGN, + SM_ROOT_SIZE, SM_ENTRY_ALIGN) + ); + + assert_int_equal(0, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + SM_ROOT_SIZE, SM_ENTRY_ALIGN)); + + r = imd.lg.r; + + /* One entry for root_region and one for small allocations */ + assert_int_equal(2, r->num_entries); + + fst_lg_entry = &r->entries[0]; + assert_int_equal(IMD_ENTRY_MAGIC, fst_lg_entry->magic); + assert_int_equal(0, fst_lg_entry->start_offset); + assert_int_equal(LG_ROOT_SIZE, fst_lg_entry->size); + assert_int_equal(CBMEM_ID_IMD_ROOT, fst_lg_entry->id); + + /* Calculated like in imd_create_tiered_empty */ + sm_region_size = max_entries(SM_ROOT_SIZE) * SM_ENTRY_ALIGN; + sm_region_size += SM_ROOT_SIZE; + sm_region_size = ALIGN_UP(sm_region_size, LG_ENTRY_ALIGN); + + snd_lg_entry = &r->entries[1]; + assert_int_equal(IMD_ENTRY_MAGIC, snd_lg_entry->magic); + assert_int_equal(-sm_region_size, snd_lg_entry->start_offset); + assert_int_equal(CBMEM_ID_IMD_SMALL, snd_lg_entry->id); + + assert_int_equal(sm_region_size, snd_lg_entry->size); + + r = imd.sm.r; + assert_int_equal(1, r->num_entries); + + sm_entry = &r->entries[0]; + assert_int_equal(IMD_ENTRY_MAGIC, sm_entry->magic); + assert_int_equal(0, sm_entry->start_offset); + assert_int_equal(SM_ROOT_SIZE, sm_entry->size); + assert_int_equal(CBMEM_ID_IMD_ROOT, sm_entry->id); + + free(base); +} + +/* Tests for imdr_recover. */ +static void test_imd_recover(void **state) +{ + int32_t offset_copy, max_offset_copy; + uint32_t rp_magic_copy, num_entries_copy; + uint32_t e_align_copy, e_magic_copy, e_id_copy; + uint32_t size_copy, diff; + void *base; + struct imd imd = {0}; + struct imd_root_pointer *rp; + struct imd_root *r; + struct imd_entry *lg_root_entry, *sm_root_entry, *ptr; + const struct imd_entry *lg_entry; + + /* Fail when the limit for lg was not set. */ + imd.lg.limit = (uintptr_t) NULL; + assert_int_equal(-1, imd_recover(&imd)); + + /* Set the limit for lg. */ + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + /* Fail when the root pointer is not valid. */ + rp = (void *)imd.lg.limit - sizeof(struct imd_root_pointer); + assert_non_null(rp); + assert_int_equal(IMD_ROOT_PTR_MAGIC, rp->magic); + + rp_magic_copy = rp->magic; + rp->magic = 0; + assert_int_equal(-1, imd_recover(&imd)); + rp->magic = rp_magic_copy; + + /* Set the root pointer. */ + assert_int_equal(0, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + SM_ROOT_SIZE, SM_ENTRY_ALIGN)); + assert_int_equal(2, ((struct imd_root *)imd.lg.r)->num_entries); + assert_int_equal(1, ((struct imd_root *)imd.sm.r)->num_entries); + + /* Fail if the number of entries exceeds the maximum number of entries. */ + r = imd.lg.r; + num_entries_copy = r->num_entries; + r->num_entries = r->max_entries + 1; + assert_int_equal(-1, imd_recover(&imd)); + r->num_entries = num_entries_copy; + + /* Fail if entry align is not a power of 2. */ + e_align_copy = r->entry_align; + r->entry_align++; + assert_int_equal(-1, imd_recover(&imd)); + r->entry_align = e_align_copy; + + /* Fail when an entry is not valid. */ + lg_root_entry = &r->entries[0]; + e_magic_copy = lg_root_entry->magic; + lg_root_entry->magic = 0; + assert_int_equal(-1, imd_recover(&imd)); + lg_root_entry->magic = e_magic_copy; + + /* Add new entries: large and small. */ + lg_entry = imd_entry_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE); + assert_non_null(lg_entry); + assert_int_equal(3, r->num_entries); + + assert_non_null(imd_entry_add(&imd, SM_ENTRY_ID, SM_ENTRY_SIZE)); + assert_int_equal(2, ((struct imd_root *)imd.sm.r)->num_entries); + + /* Fail when start_addr is lower than low_limit. */ + r = imd.lg.r; + max_offset_copy = r->max_offset; + r->max_offset = lg_entry->start_offset + sizeof(int32_t); + assert_int_equal(-1, imd_recover(&imd)); + r->max_offset = max_offset_copy; + + /* Fail when start_addr is at least imdr->limit. */ + offset_copy = lg_entry->start_offset; + ptr = (struct imd_entry *)lg_entry; + ptr->start_offset = (void *)imd.lg.limit - (void *)r; + assert_int_equal(-1, imd_recover(&imd)); + ptr->start_offset = offset_copy; + + /* Fail when (start_addr + e->size) is higher than imdr->limit. */ + size_copy = lg_entry->size; + diff = (void *)imd.lg.limit - ((void *)r + lg_entry->start_offset); + ptr->size = diff + 1; + assert_int_equal(-1, imd_recover(&imd)); + ptr->size = size_copy; + + /* Succeed if small region is not present. */ + sm_root_entry = &r->entries[1]; + e_id_copy = sm_root_entry->id; + sm_root_entry->id = 0; + assert_int_equal(0, imd_recover(&imd)); + sm_root_entry->id = e_id_copy; + + assert_int_equal(0, imd_recover(&imd)); + + free(base); +} + +static void test_imd_limit_size(void **state) +{ + void *base; + struct imd imd = {0}; + size_t root_size, max_size; + + max_size = align_up_pow2(sizeof(struct imd_root_pointer) + + sizeof(struct imd_root) + 3 * sizeof(struct imd_entry)); + + assert_int_equal(-1, imd_limit_size(&imd, max_size)); + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + root_size = align_up_pow2(sizeof(struct imd_root_pointer) + + sizeof(struct imd_root) + 2 * sizeof(struct imd_entry)); + imd.lg.r = (void *)imd.lg.limit - root_size; + + imd_create_empty(&imd, root_size, LG_ENTRY_ALIGN); + assert_int_equal(-1, imd_limit_size(&imd, root_size - 1)); + assert_int_equal(0, imd_limit_size(&imd, max_size)); + + /* Cannot create such a big entry */ + assert_null(imd_entry_add(&imd, LG_ENTRY_ID, max_size - root_size + 1)); + + free(base); +} + +static void test_imd_lockdown(void **state) +{ + struct imd imd = {0}; + struct imd_root *r_lg, *r_sm; + + assert_int_equal(-1, imd_lockdown(&imd)); + + imd.lg.r = malloc(sizeof(struct imd_root)); + if (imd.lg.r == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + r_lg = (struct imd_root *) (imd.lg.r); + + assert_int_equal(0, imd_lockdown(&imd)); + assert_true(r_lg->flags & IMD_FLAG_LOCKED); + + imd.sm.r = malloc(sizeof(struct imd_root)); + if (imd.sm.r == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + r_sm = (struct imd_root *) (imd.sm.r); + + assert_int_equal(0, imd_lockdown(&imd)); + assert_true(r_sm->flags & IMD_FLAG_LOCKED); + + free(imd.lg.r); + free(imd.sm.r); +} + +static void test_imd_region_used(void **state) +{ + struct imd imd = {0}; + struct imd_entry *first_entry, *new_entry; + struct imd_root *r; + size_t size; + void *imd_base; + void *base; + + assert_int_equal(-1, imd_region_used(&imd, &base, &size)); + + imd_base = malloc(LIMIT_ALIGN); + if (imd_base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)imd_base)); + + assert_int_equal(-1, imd_region_used(&imd, &base, &size)); + assert_int_equal(0, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + assert_int_equal(0, imd_region_used(&imd, &base, &size)); + + r = (struct imd_root *)imd.lg.r; + first_entry = &r->entries[r->num_entries - 1]; + + assert_int_equal(r + first_entry->start_offset, (uintptr_t)base); + assert_int_equal(first_entry->size, size); + + assert_non_null(imd_entry_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE)); + assert_int_equal(2, r->num_entries); + + assert_int_equal(0, imd_region_used(&imd, &base, &size)); + + new_entry = &r->entries[r->num_entries - 1]; + + assert_true((void *)r + new_entry->start_offset == base); + assert_int_equal(first_entry->size + new_entry->size, size); + + free(imd_base); +} + +static void test_imd_entry_add(void **state) +{ + int i; + struct imd imd = {0}; + size_t entry_size = 0; + size_t used_size; + ssize_t entry_offset; + void *base; + struct imd_root *r, *sm_r, *lg_r; + struct imd_entry *first_entry, *new_entry; + uint32_t num_entries_copy; + int32_t max_offset_copy; + + /* No small region case. */ + assert_null(imd_entry_add(&imd, LG_ENTRY_ID, entry_size)); + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + assert_int_equal(0, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + + r = (struct imd_root *)imd.lg.r; + first_entry = &r->entries[r->num_entries - 1]; + + /* Cannot add an entry when root is locked. */ + r->flags = IMD_FLAG_LOCKED; + assert_null(imd_entry_add(&imd, LG_ENTRY_ID, entry_size)); + r->flags = 0; + + /* Fail when the maximum number of entries has been reached. */ + num_entries_copy = r->num_entries; + r->num_entries = r->max_entries; + assert_null(imd_entry_add(&imd, LG_ENTRY_ID, entry_size)); + r->num_entries = num_entries_copy; + + /* Fail when entry size is 0 */ + assert_null(imd_entry_add(&imd, LG_ENTRY_ID, 0)); + + /* Fail when entry size (after alignment) overflows imd total size. */ + entry_size = 2049; + max_offset_copy = r->max_offset; + r->max_offset = -entry_size; + assert_null(imd_entry_add(&imd, LG_ENTRY_ID, entry_size)); + r->max_offset = max_offset_copy; + + /* Finally succeed. */ + entry_size = 2 * sizeof(int32_t); + assert_non_null(imd_entry_add(&imd, LG_ENTRY_ID, entry_size)); + assert_int_equal(2, r->num_entries); + + new_entry = &r->entries[r->num_entries - 1]; + assert_int_equal(sizeof(struct imd_entry), (void *)new_entry - (void *)first_entry); + + assert_int_equal(IMD_ENTRY_MAGIC, new_entry->magic); + assert_int_equal(LG_ENTRY_ID, new_entry->id); + assert_int_equal(entry_size, new_entry->size); + + used_size = ALIGN_UP(entry_size, r->entry_align); + entry_offset = first_entry->start_offset - used_size; + assert_int_equal(entry_offset, new_entry->start_offset); + + /* Use small region case. */ + imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, SM_ROOT_SIZE, + SM_ENTRY_ALIGN); + + lg_r = imd.lg.r; + sm_r = imd.sm.r; + + /* All five new entries should be added to small allocations */ + for (i = 0; i < 5; i++) { + assert_non_null(imd_entry_add(&imd, SM_ENTRY_ID, SM_ENTRY_SIZE)); + assert_int_equal(i+2, sm_r->num_entries); + assert_int_equal(2, lg_r->num_entries); + } + + /* But next should fall back on large region */ + assert_non_null(imd_entry_add(&imd, SM_ENTRY_ID, SM_ENTRY_SIZE)); + assert_int_equal(6, sm_r->num_entries); + assert_int_equal(3, lg_r->num_entries); + + /* + * Small allocation is created when occupies less than 1/4 of available + * small region. Verify this. + */ + imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, SM_ROOT_SIZE, + SM_ENTRY_ALIGN); + + assert_non_null(imd_entry_add(&imd, SM_ENTRY_ID, -sm_r->max_offset / 4 + 1)); + assert_int_equal(1, sm_r->num_entries); + assert_int_equal(3, lg_r->num_entries); + + /* Next two should go into small region */ + assert_non_null(imd_entry_add(&imd, SM_ENTRY_ID, -sm_r->max_offset / 4)); + assert_int_equal(2, sm_r->num_entries); + assert_int_equal(3, lg_r->num_entries); + + /* (1/4 * 3/4) */ + assert_non_null(imd_entry_add(&imd, SM_ENTRY_ID, -sm_r->max_offset / 16 * 3)); + assert_int_equal(3, sm_r->num_entries); + assert_int_equal(3, lg_r->num_entries); + + free(base); +} + +static void test_imd_entry_find(void **state) +{ + struct imd imd = {0}; + void *base; + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + assert_int_equal(0, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + SM_ROOT_SIZE, SM_ENTRY_ALIGN)); + + assert_non_null(imd_entry_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE)); + + assert_non_null(imd_entry_find(&imd, LG_ENTRY_ID)); + assert_non_null(imd_entry_find(&imd, SMALL_REGION_ID)); + + /* Try invalid id, should fail */ + assert_null(imd_entry_find(&imd, INVALID_REGION_ID)); + + free(base); +} + +static void test_imd_entry_find_or_add(void **state) +{ + struct imd imd = {0}; + const struct imd_entry *entry; + struct imd_root *r; + void *base; + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + assert_null(imd_entry_find_or_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE)); + + assert_int_equal(0, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + entry = imd_entry_find_or_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE); + assert_non_null(entry); + + r = (struct imd_root *)imd.lg.r; + + assert_int_equal(entry->id, LG_ENTRY_ID); + assert_int_equal(2, r->num_entries); + assert_non_null(imd_entry_find_or_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE)); + assert_int_equal(2, r->num_entries); + + free(base); +} + +static void test_imd_entry_size(void **state) +{ + struct imd_entry entry = { .size = LG_ENTRY_SIZE }; + + assert_int_equal(LG_ENTRY_SIZE, imd_entry_size(&entry)); + + entry.size = 0; + assert_int_equal(0, imd_entry_size(&entry)); +} + +static void test_imd_entry_at(void **state) +{ + struct imd imd = {0}; + struct imd_root *r; + struct imd_entry *e = NULL; + const struct imd_entry *entry; + void *base; + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + assert_int_equal(0, imd_create_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN)); + + /* Fail when entry is NULL */ + assert_null(imd_entry_at(&imd, e)); + + entry = imd_entry_add(&imd, LG_ENTRY_ID, LG_ENTRY_SIZE); + assert_non_null(entry); + + r = (struct imd_root *)imd.lg.r; + assert_ptr_equal((void *)r + entry->start_offset, imd_entry_at(&imd, entry)); + + free(base); +} + +static void test_imd_entry_id(void **state) +{ + struct imd_entry entry = { .id = LG_ENTRY_ID }; + + assert_int_equal(LG_ENTRY_ID, imd_entry_id(&entry)); +} + +static void test_imd_entry_remove(void **state) +{ + void *base; + struct imd imd = {0}; + struct imd_root *r; + const struct imd_entry *fst_lg_entry, *snd_lg_entry, *fst_sm_entry; + const struct imd_entry *e = NULL; + + /* Uninitialized handle */ + assert_int_equal(-1, imd_entry_remove(&imd, e)); + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + assert_int_equal(0, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + SM_ROOT_SIZE, SM_ENTRY_ALIGN)); + + r = imd.lg.r; + assert_int_equal(2, r->num_entries); + fst_lg_entry = &r->entries[0]; + snd_lg_entry = &r->entries[1]; + + /* Only last entry can be removed */ + assert_int_equal(-1, imd_entry_remove(&imd, fst_lg_entry)); + r->flags = IMD_FLAG_LOCKED; + assert_int_equal(-1, imd_entry_remove(&imd, snd_lg_entry)); + r->flags = 0; + + r = imd.sm.r; + assert_int_equal(1, r->num_entries); + fst_sm_entry = &r->entries[0]; + + /* Fail trying to remove root entry */ + assert_int_equal(-1, imd_entry_remove(&imd, fst_sm_entry)); + assert_int_equal(1, r->num_entries); + + r = imd.lg.r; + assert_int_equal(0, imd_entry_remove(&imd, snd_lg_entry)); + assert_int_equal(1, r->num_entries); + + /* Fail trying to remove root entry */ + assert_int_equal(-1, imd_entry_remove(&imd, fst_lg_entry)); + assert_int_equal(1, r->num_entries); + + free(base); +} + +static void test_imd_cursor_init(void **state) +{ + struct imd imd = {0}; + struct imd_cursor cursor; + + assert_int_equal(-1, imd_cursor_init(NULL, NULL)); + assert_int_equal(-1, imd_cursor_init(NULL, &cursor)); + assert_int_equal(-1, imd_cursor_init(&imd, NULL)); + assert_int_equal(0, imd_cursor_init(&imd, &cursor)); + + assert_ptr_equal(cursor.imdr[0], &imd.lg); + assert_ptr_equal(cursor.imdr[1], &imd.sm); +} + +static void test_imd_cursor_next(void **state) +{ + void *base; + struct imd imd = {0}; + struct imd_cursor cursor; + struct imd_root *r; + const struct imd_entry *entry; + struct imd_entry *fst_lg_entry, *snd_lg_entry, *fst_sm_entry; + assert_int_equal(0, imd_cursor_init(&imd, &cursor)); + + cursor.current_imdr = 3; + cursor.current_entry = 0; + assert_null(imd_cursor_next(&cursor)); + + cursor.current_imdr = 0; + assert_null(imd_cursor_next(&cursor)); + + base = malloc(LIMIT_ALIGN); + if (base == NULL) + fail_msg("Cannot allocate enough memory - fail test"); + imd_handle_init(&imd, (void *)(LIMIT_ALIGN + (uintptr_t)base)); + + assert_int_equal(0, imd_create_tiered_empty(&imd, LG_ROOT_SIZE, LG_ENTRY_ALIGN, + SM_ROOT_SIZE, SM_ENTRY_ALIGN)); + + r = imd.lg.r; + entry = imd_cursor_next(&cursor); + assert_non_null(entry); + + fst_lg_entry = &r->entries[0]; + assert_int_equal(fst_lg_entry->id, entry->id); + assert_ptr_equal(fst_lg_entry, entry); + + entry = imd_cursor_next(&cursor); + assert_non_null(entry); + + snd_lg_entry = &r->entries[1]; + assert_int_equal(snd_lg_entry->id, entry->id); + assert_ptr_equal(snd_lg_entry, entry); + + entry = imd_cursor_next(&cursor); + assert_non_null(entry); + + r = imd.sm.r; + fst_sm_entry = &r->entries[0]; + assert_int_equal(fst_sm_entry->id, entry->id); + assert_ptr_equal(fst_sm_entry, entry); + + entry = imd_cursor_next(&cursor); + assert_null(entry); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_imd_handle_init), + cmocka_unit_test(test_imd_handle_init_partial_recovery), + cmocka_unit_test(test_imd_create_empty), + cmocka_unit_test(test_imd_create_tiered_empty), + cmocka_unit_test(test_imd_recover), + cmocka_unit_test(test_imd_limit_size), + cmocka_unit_test(test_imd_lockdown), + cmocka_unit_test(test_imd_region_used), + cmocka_unit_test(test_imd_entry_add), + cmocka_unit_test(test_imd_entry_find), + cmocka_unit_test(test_imd_entry_find_or_add), + cmocka_unit_test(test_imd_entry_size), + cmocka_unit_test(test_imd_entry_at), + cmocka_unit_test(test_imd_entry_id), + cmocka_unit_test(test_imd_entry_remove), + cmocka_unit_test(test_imd_cursor_init), + cmocka_unit_test(test_imd_cursor_next), + }; + + return cb_run_group_tests(tests, NULL, NULL); +} + diff --git a/tests/data/lib/lzma-test/data.3.lzma.bin b/tests/data/lib/lzma-test/data.3.lzma.bin new file mode 100644 index 0000000000000000000000000000000000000000..ca20babe82602ccaeccd37c37cd36e40e9b08ddc GIT binary patch literal 3865 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 literal 0 HcmV?d00001 diff --git a/tests/data/lib/lzma-test/data.4.bin b/tests/data/lib/lzma-test/data.4.bin new file mode 100644 index 0000000000000000000000000000000000000000..892c2df4f888fdf52a5fea99a962a819dc9550d0 GIT binary patch literal 60912 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 literal 0 HcmV?d00001 diff --git a/tests/data/lib/lzma-test/data.4.lzma.bin b/tests/data/lib/lzma-test/data.4.lzma.bin new file mode 100644 index 0000000000000000000000000000000000000000..ca8ff3b19629052ffbcf8b27a821b5df11329c1b GIT binary patch literal 17064 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 +#include +#include +#include +#include +#include +#include +#include +#include + + +struct lzma_test_state { + char *raw_filename; + size_t raw_file_sz; + char *comp_filename; + size_t comp_file_sz; +}; + +static int get_file_size(const char *fname) +{ + struct stat st; + if (stat(fname, &st) == -1) + return -1; + return st.st_size; +} + +static int teardown_ulzman_file(void **state) +{ + struct lzma_test_state *s = *state; + + test_free(s->raw_filename); + test_free(s->comp_filename); + test_free(s); + + return 0; +} + +/* Set data file with prestate */ +static int setup_ulzman_file(void **state) +{ + int ret = 0; + const char *fname_base = *state; + const char path_prefix[] = __TEST_DATA_DIR__ "/lib/lzma-test/%s%s"; + const char raw_file_suffix[] = ".bin"; + const char comp_file_suffix[] = ".lzma.bin"; + struct lzma_test_state *s = test_malloc(sizeof(*s)); + memset(s, 0, sizeof(*s)); + + if (!s) + return 1; + + const size_t raw_filename_size = strlen(path_prefix) + strlen(fname_base) + + ARRAY_SIZE(raw_file_suffix); + s->raw_filename = test_malloc(raw_filename_size); + + const size_t comp_filename_size = strlen(path_prefix) + strlen(fname_base) + + ARRAY_SIZE(comp_file_suffix); + s->comp_filename = test_malloc(comp_filename_size); + + if (!s->raw_filename || !s->comp_filename) { + print_error("File path allocation error\n"); + ret = 2; + goto error; + } + + snprintf(s->raw_filename, raw_filename_size, path_prefix, fname_base, raw_file_suffix); + snprintf(s->comp_filename, comp_filename_size, path_prefix, fname_base, + comp_file_suffix); + + s->raw_file_sz = get_file_size(s->raw_filename); + s->comp_file_sz = get_file_size(s->comp_filename); + + if (s->raw_file_sz == -1) { + print_error("Unable to open file: %s\n", s->raw_filename); + ret = 3; + goto error; + } + + if (s->comp_file_sz == -1) { + print_error("Unable to open file: %s\n", s->comp_filename); + ret = 3; + goto error; + } + + *state = s; + return 0; +error: + teardown_ulzman_file((void **)&s); + return ret; +} + +static int read_file(const char *fname, uint8_t *buf, size_t sz) +{ + int f = open(fname, O_RDONLY); + int read_sz = 0; + + if (f == -1) + return -1; + + read_sz = read(f, buf, sz); + + close(f); + return read_sz; +} + +static void test_ulzman_correct_file(void **state) +{ + struct lzma_test_state *s = *state; + uint8_t *raw_buf = test_malloc(s->raw_file_sz); + uint8_t *decomp_buf = test_malloc(s->raw_file_sz); + uint8_t *comp_buf = test_malloc(s->comp_file_sz); + + assert_non_null(raw_buf); + assert_non_null(decomp_buf); + assert_non_null(comp_buf); + assert_int_equal(s->raw_file_sz, read_file(s->raw_filename, raw_buf, s->raw_file_sz)); + assert_int_equal(s->comp_file_sz, + read_file(s->comp_filename, comp_buf, s->comp_file_sz)); + + assert_int_equal(s->raw_file_sz, + ulzman(comp_buf, s->comp_file_sz, decomp_buf, s->raw_file_sz)); + assert_memory_equal(raw_buf, decomp_buf, s->raw_file_sz); + + test_free(raw_buf); + test_free(decomp_buf); + test_free(comp_buf); +} + +static void test_ulzman_input_too_small(void **state) +{ + uint8_t in_buf[32]; + uint8_t out_buf[32]; + + assert_int_equal(0, ulzman(in_buf, LZMA_PROPERTIES_SIZE, out_buf, sizeof(out_buf))); +} + +static void test_ulzman_zero_buffer(void **state) +{ + uint8_t in_buf[LZMA_PROPERTIES_SIZE + 1 * KiB]; + uint8_t out_buf[2 * KiB]; + + memset(in_buf, 0, sizeof(in_buf)); + memset(out_buf, 0, sizeof(out_buf)); + + assert_int_equal(0, ulzman(in_buf, sizeof(in_buf), out_buf, sizeof(out_buf))); +} + +#define ULZMAN_CORRECT_FILE_TEST(_file_prefix) \ +{ \ + .name = "test_ulzman_correct_file(" _file_prefix ")", \ + .test_func = test_ulzman_correct_file, \ + .setup_func = setup_ulzman_file, \ + .teardown_func = teardown_ulzman_file, \ + .initial_state = (_file_prefix) \ +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + /* "data.N" in macros below refers to files: + - __TEST_DATA_DIR__ /lib/lzma-test/data.N.bin + - __TEST_DATA_DIR__ /lib/lzma-test/data.N.bin.lzma + Files data.N.bin suffix are raw data, and data.N.lzma.bin are its + LZMA-compressed form. Both are required to exist. + */ + + /* util/cbfs-compression-tool compressed by itself. + To test compression of executable files like payloads. */ + ULZMAN_CORRECT_FILE_TEST("data.1"), + + /* README.md compressed by util/cbfs-compression-tool. */ + ULZMAN_CORRECT_FILE_TEST("data.2"), + + /* tests/lib/imd-test.c compressed by util/cbfs-compression-tool + Structured text file. */ + ULZMAN_CORRECT_FILE_TEST("data.3"), + + /* libcmocka.so.0.7.0 compressed by util/cbfs-compression-tool + Another binary file, shared object. */ + ULZMAN_CORRECT_FILE_TEST("data.4"), + + cmocka_unit_test(test_ulzman_input_too_small), + + cmocka_unit_test(test_ulzman_zero_buffer), + }; + + return cb_run_group_tests(tests, NULL, NULL); +}