From 3ae390839a9d8c6d6a771330df236cacfbbb4744 Mon Sep 17 00:00:00 2001 From: Dominik Loidolt <dominik.loidolt@univie.ac.at> Date: Tue, 16 Nov 2021 14:46:05 +0100 Subject: [PATCH] add test for cmp_guess.c --- test/cmp_tool/Makefile | 7 +- test/cmp_tool/cmp_tool_lib_test.c | 252 +++++++++++++++++++++++++++++- 2 files changed, 247 insertions(+), 12 deletions(-) diff --git a/test/cmp_tool/Makefile b/test/cmp_tool/Makefile index 671acd5..543ea13 100644 --- a/test/cmp_tool/Makefile +++ b/test/cmp_tool/Makefile @@ -3,11 +3,11 @@ SOURCEDIR = INCLUDES = -I../../include PATH += CFLAGS := -O0 -W -Wall -Wextra -std=gnu99 -Werror -pedantic -g3\ - -fprofile-arcs -ftest-coverage\ - -fanalyzer + -fprofile-arcs -ftest-coverage CPPFLAGS := -D__MAIN__ $(INCLUDES) -I$(SOURCEDIR) LDFLAGS := -lcunit -SOURCES := $(wildcard *.c) ../../lib/cmp_tool_lib.c ../../lib/cmp_support.c +SOURCES := $(wildcard *.c) ../../lib/cmp_tool_lib.c ../../lib/cmp_guess.c\ + ../../lib/cmp_support.c ../../lib/cmp_icu.c ../../lib/cmp_data_types.c OBJECTS := $(patsubst %.c, $(BUILDDIR)/%.o, $(subst $(SOURCEDIR)/,, $(SOURCES))) TARGET := test_cmp_tool @@ -21,6 +21,5 @@ coverage: all genhtml --rc lcov_branch_coverage=1 --branch-coverage coverage.info --output-directory out #firefox out/index.html - clean: rm -r $(TARGET) *.gcno *.gcda coverage.info out/ tmp_stderr.log diff --git a/test/cmp_tool/cmp_tool_lib_test.c b/test/cmp_tool/cmp_tool_lib_test.c index bf566e7..d55a715 100644 --- a/test/cmp_tool/cmp_tool_lib_test.c +++ b/test/cmp_tool/cmp_tool_lib_test.c @@ -13,9 +13,7 @@ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * - * @brief command line tool for PLATO ICU/RDCU compression/decompression - * @see README.md - * @see Data Compression User Manual PLATO-UVIE-PL-UM-0001 + * @brief unit tests for cmp_tool_lib.c */ #include <stdio.h> @@ -28,13 +26,14 @@ #include <CUnit/Console.h> #include "../../include/cmp_tool_lib.h" +#include "../../include/cmp_guess.h" #define PROGRAM_NAME "cmp_tool" -/* TODO */ +/* used to redirect stdout to file */ int fd; -/* TODO */ +/* used to redirect stdout to file */ fpos_t pos; /* @brief The init cmp_tool test suite cleanup functionr. Redirect stdout to @@ -172,7 +171,7 @@ void test_read_file8(void) CU_ASSERT_EQUAL(buf[i], 0); } } - CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples parameter.\n"); + CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples or cmp_size parameter.\n"); free(s); /* tests read 0 words in */ @@ -185,7 +184,7 @@ void test_read_file8(void) for (i = 0; i < 33; ++i) { CU_ASSERT_EQUAL(buf[i], 0); } - CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples parameter.\n"); + CU_ASSERT_STRING_EQUAL(s=read_std_err_log(), "cmp_tool: test_read_file8_2.txt: Warning: The file may contain more data than specified by the samples or cmp_size parameter.\n"); free(s); /* TODO; tests read in 0 empty file */ @@ -258,6 +257,240 @@ void test_read_file8(void) } +#define CMP_TEST_SAMPLES 5 +void test_cmp_guess(void) +{ + struct cmp_cfg cfg = {0}; + uint16_t data[CMP_TEST_SAMPLES] = {2,4,6,8,10}; + uint16_t data_exp[CMP_TEST_SAMPLES] = {2,4,6,8,10}; + uint16_t model[CMP_TEST_SAMPLES] = {4,6,8,10,12}; + uint16_t model_exp[CMP_TEST_SAMPLES] = {4,6,8,10,12}; + uint32_t cmp_size; + int level; + + + /* test 1d-diff mode */ + cfg.input_buf = data; + cfg.model_buf = NULL; + cfg.samples = CMP_TEST_SAMPLES; + cfg.cmp_mode = MODE_DIFF_MULTI; + level = 2; + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_TRUE(cmp_size); + + CU_ASSERT_EQUAL(cmp_size, 25); + CU_ASSERT_EQUAL(cfg.cmp_mode, MODE_DIFF_MULTI); + CU_ASSERT_EQUAL(cfg.golomb_par, 1); + CU_ASSERT_EQUAL(cfg.spill, 2); + /* CU_ASSERT_EQUAL(cfg.model_value, ); model_value is not needed */ + CU_ASSERT_EQUAL(cfg.round, 0); + CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 2); + CU_ASSERT_EQUAL(cfg.ap1_spill, 2); + CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3); + CU_ASSERT_EQUAL(cfg.ap2_spill, 2); + CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES); + /* CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES); model is + * not used*/ + CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES); + CU_ASSERT_EQUAL(cfg.buffer_length, 2); + + + /* test model mode */ + memset(&cfg, 0, sizeof(struct cmp_cfg)); + cfg.input_buf = data; + cfg.model_buf = model; + cfg.samples = CMP_TEST_SAMPLES; + cfg.cmp_mode = MODE_MODEL_ZERO; + level =3; + + cmp_guess_set_model_updates(12); + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_TRUE(cmp_size); + + CU_ASSERT_EQUAL(cmp_size, 20); + CU_ASSERT_EQUAL(cfg.cmp_mode, 1); + CU_ASSERT_EQUAL(cfg.golomb_par, 2); + CU_ASSERT_EQUAL(cfg.spill, 22); + CU_ASSERT_EQUAL(cfg.model_value, 12); + CU_ASSERT_EQUAL(cfg.round, 0); + CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 1); + CU_ASSERT_EQUAL(cfg.ap1_spill, 8); + CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3); + CU_ASSERT_EQUAL(cfg.ap2_spill, 35); + CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES); + CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES); + CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES); + CU_ASSERT_EQUAL(cfg.buffer_length, 2); + + + /* test diff mode without model buffer*/ + cmp_guess_set_model_updates(CMP_GUESS_N_MODEL_UPDATE_DEF); + memset(&cfg, 0, sizeof(struct cmp_cfg)); + cfg.input_buf = data; + cfg.model_buf = model; + cfg.samples = CMP_TEST_SAMPLES; + cfg.cmp_mode = MODE_DIFF_MULTI; + level = 3; + + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_TRUE(cmp_size); + + CU_ASSERT_EQUAL(cmp_size, 20); + CU_ASSERT_EQUAL(cfg.cmp_mode, MODE_DIFF_MULTI); + CU_ASSERT_EQUAL(cfg.golomb_par, 2); + CU_ASSERT_EQUAL(cfg.spill, 5); + CU_ASSERT_EQUAL(cfg.model_value, 11); + CU_ASSERT_EQUAL(cfg.round, 0); + CU_ASSERT_EQUAL(cfg.ap1_golomb_par, 1); + CU_ASSERT_EQUAL(cfg.ap1_spill, 2); + CU_ASSERT_EQUAL(cfg.ap2_golomb_par, 3); + CU_ASSERT_EQUAL(cfg.ap2_spill, 2); + CU_ASSERT_NSTRING_EQUAL(cfg.input_buf, data_exp, CMP_TEST_SAMPLES); + CU_ASSERT_NSTRING_EQUAL(cfg.model_buf, model_exp, CMP_TEST_SAMPLES); + CU_ASSERT_EQUAL(cfg.samples, CMP_TEST_SAMPLES); + CU_ASSERT_EQUAL(cfg.buffer_length, 2); + + + /* error test cfg = NULL */ + level = 2; + cmp_size = cmp_guess(NULL, level); + CU_ASSERT_FALSE(cmp_size); + + + /* error test unknown guess_level */ + level = 4; + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_FALSE(cmp_size); + + + /* error test model mode without model buffer*/ + memset(&cfg, 0, sizeof(struct cmp_cfg)); + cfg.input_buf = NULL; + cfg.model_buf = NULL; + cfg.samples = CMP_TEST_SAMPLES; + cfg.cmp_mode = MODE_DIFF_MULTI; + level = 2; + + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_FALSE(cmp_size); + + + /* error test model mode without model buffer*/ + memset(&cfg, 0, sizeof(struct cmp_cfg)); + cfg.input_buf = data; + cfg.model_buf = NULL; + cfg.samples = CMP_TEST_SAMPLES; + cfg.cmp_mode = MODE_MODEL_MULTI; + level = 2; + + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_FALSE(cmp_size); + + + /* error test not supported cmp_mode */ + memset(&cfg, 0, sizeof(struct cmp_cfg)); + cfg.input_buf = data; + cfg.model_buf = model; + cfg.samples = CMP_TEST_SAMPLES; + cfg.cmp_mode = 5; + level = 2; + + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_FALSE(cmp_size); + + + /* error test samples = 0 */ + memset(&cfg, 0, sizeof(struct cmp_cfg)); + cfg.input_buf = data; + cfg.model_buf = model; + cfg.samples = 0; + cfg.cmp_mode = MODE_MODEL_MULTI; + level = 2; + + cmp_size = cmp_guess(&cfg, level); + CU_ASSERT_FALSE(cmp_size); +} + +void test_cmp_guess_model_value(void) +{ + uint16_t model_value; + + model_value = cmp_guess_model_value(0); + CU_ASSERT_EQUAL(model_value, 8); + model_value = cmp_guess_model_value(1); + CU_ASSERT_EQUAL(model_value, 8); + model_value = cmp_guess_model_value(2); + CU_ASSERT_EQUAL(model_value, 8); + model_value = cmp_guess_model_value(3); + CU_ASSERT_EQUAL(model_value, 10); + model_value = cmp_guess_model_value(4); + CU_ASSERT_EQUAL(model_value, 10); + model_value = cmp_guess_model_value(5); + CU_ASSERT_EQUAL(model_value, 10); + model_value = cmp_guess_model_value(6); + CU_ASSERT_EQUAL(model_value, 11); + model_value = cmp_guess_model_value(10); + CU_ASSERT_EQUAL(model_value, 11); + model_value = cmp_guess_model_value(11); + CU_ASSERT_EQUAL(model_value, 11); + model_value = cmp_guess_model_value(12); + CU_ASSERT_EQUAL(model_value, 12); + model_value = cmp_guess_model_value(20); + CU_ASSERT_EQUAL(model_value, 12); + model_value = cmp_guess_model_value(21); + CU_ASSERT_EQUAL(model_value, 12); + model_value = cmp_guess_model_value(22); + CU_ASSERT_EQUAL(model_value, 13); +} + + +void test_cmp_mode_parse(void) +{ + uint32_t cmp_mode = ~0; + int err; + + /* error cases */ + err = cmp_mode_parse(NULL, NULL); + CU_ASSERT_TRUE(err); + + err = cmp_mode_parse(NULL, &cmp_mode); + CU_ASSERT_TRUE(err); + + err = cmp_mode_parse("MODE_RAW", NULL); + CU_ASSERT_TRUE(err); + + err = cmp_mode_parse("UNKNOWN", &cmp_mode); + CU_ASSERT_TRUE(err); + + err = cmp_mode_parse("9999999999999999999", &cmp_mode); + CU_ASSERT_TRUE(err); + + /* mode not defined*/ + err = cmp_mode_parse("424212", &cmp_mode); + CU_ASSERT_TRUE(err); + + /* normal operation */ + err = cmp_mode_parse("MODE_RAW", &cmp_mode); + CU_ASSERT_FALSE(err); + CU_ASSERT_EQUAL(cmp_mode, MODE_RAW); + + err = cmp_mode_parse("0", &cmp_mode); + CU_ASSERT_FALSE(err); + CU_ASSERT_EQUAL(cmp_mode, MODE_RAW); + + err = cmp_mode_parse("0 \n", &cmp_mode); + CU_ASSERT_FALSE(err); + CU_ASSERT_EQUAL(cmp_mode, MODE_RAW); + + err = cmp_mode_parse(" 2 ", &cmp_mode); + CU_ASSERT_FALSE(err); + CU_ASSERT_EQUAL(cmp_mode, 2); + + err = cmp_mode_parse("MODE_DIFF_MULTI", &cmp_mode); + CU_ASSERT_FALSE(err); + CU_ASSERT_EQUAL(cmp_mode, MODE_DIFF_MULTI); +} + CU_ErrorCode cmp_tool_add_tests(CU_pSuite suite) { CU_pTest __attribute__((unused)) test; @@ -270,7 +503,10 @@ CU_ErrorCode cmp_tool_add_tests(CU_pSuite suite) } /* add the tests to the suite */ - if ((NULL == CU_add_test(suite, "test of read_file8()", test_read_file8))) { + if ((NULL == CU_add_test(suite, "test of read_file8()", test_read_file8)) || + (NULL == CU_add_test(suite, "test of cmp_mode_parse()", test_cmp_mode_parse))|| + (NULL == CU_add_test(suite, "test of cmp_guess_model_value()", test_cmp_guess_model_value))|| + (NULL == CU_add_test(suite, "test of cmp_guess()", test_cmp_guess))) { CU_cleanup_registry(); return CU_get_error(); } -- GitLab