| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Base unit test (KUnit) API.
- *
- * Copyright (C) 2019, Google LLC.
- * Author: Brendan Higgins <brendanhiggins@google.com>
- */
- #ifndef _KUNIT_TEST_H
- #define _KUNIT_TEST_H
- #include <kunit/assert.h>
- #include <kunit/try-catch.h>
- #include <linux/args.h>
- #include <linux/compiler.h>
- #include <linux/container_of.h>
- #include <linux/err.h>
- #include <linux/init.h>
- #include <linux/jump_label.h>
- #include <linux/kconfig.h>
- #include <linux/kref.h>
- #include <linux/list.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/spinlock.h>
- #include <linux/string.h>
- #include <linux/types.h>
- #include <asm/rwonce.h>
- #include <asm/sections.h>
- /* Static key: true if any KUnit tests are currently running */
- DECLARE_STATIC_KEY_FALSE(kunit_running);
- struct kunit;
- struct string_stream;
- /* Maximum size of parameter description string. */
- #define KUNIT_PARAM_DESC_SIZE 128
- /* Maximum size of a status comment. */
- #define KUNIT_STATUS_COMMENT_SIZE 256
- /*
- * TAP specifies subtest stream indentation of 4 spaces, 8 spaces for a
- * sub-subtest. See the "Subtests" section in
- * https://node-tap.org/tap-protocol/
- */
- #define KUNIT_INDENT_LEN 4
- #define KUNIT_SUBTEST_INDENT " "
- #define KUNIT_SUBSUBTEST_INDENT " "
- /**
- * enum kunit_status - Type of result for a test or test suite
- * @KUNIT_SUCCESS: Denotes the test suite has not failed nor been skipped
- * @KUNIT_FAILURE: Denotes the test has failed.
- * @KUNIT_SKIPPED: Denotes the test has been skipped.
- */
- enum kunit_status {
- KUNIT_SUCCESS,
- KUNIT_FAILURE,
- KUNIT_SKIPPED,
- };
- /* Attribute struct/enum definitions */
- /*
- * Speed Attribute is stored as an enum and separated into categories of
- * speed: very_slow, slow, and normal. These speeds are relative to
- * other KUnit tests.
- *
- * Note: unset speed attribute acts as default of KUNIT_SPEED_NORMAL.
- */
- enum kunit_speed {
- KUNIT_SPEED_UNSET,
- KUNIT_SPEED_VERY_SLOW,
- KUNIT_SPEED_SLOW,
- KUNIT_SPEED_NORMAL,
- KUNIT_SPEED_MAX = KUNIT_SPEED_NORMAL,
- };
- /* Holds attributes for each test case and suite */
- struct kunit_attributes {
- enum kunit_speed speed;
- };
- /**
- * struct kunit_case - represents an individual test case.
- *
- * @run_case: the function representing the actual test case.
- * @name: the name of the test case.
- * @generate_params: the generator function for parameterized tests.
- * @attr: the attributes associated with the test
- * @param_init: The init function to run before a parameterized test.
- * @param_exit: The exit function to run after a parameterized test.
- *
- * A test case is a function with the signature,
- * ``void (*)(struct kunit *)``
- * that makes expectations and assertions (see KUNIT_EXPECT_TRUE() and
- * KUNIT_ASSERT_TRUE()) about code under test. Each test case is associated
- * with a &struct kunit_suite and will be run after the suite's init
- * function and followed by the suite's exit function.
- *
- * A test case should be static and should only be created with the
- * KUNIT_CASE() macro; additionally, every array of test cases should be
- * terminated with an empty test case.
- *
- * Example:
- *
- * .. code-block:: c
- *
- * void add_test_basic(struct kunit *test)
- * {
- * KUNIT_EXPECT_EQ(test, 1, add(1, 0));
- * KUNIT_EXPECT_EQ(test, 2, add(1, 1));
- * KUNIT_EXPECT_EQ(test, 0, add(-1, 1));
- * KUNIT_EXPECT_EQ(test, INT_MAX, add(0, INT_MAX));
- * KUNIT_EXPECT_EQ(test, -1, add(INT_MAX, INT_MIN));
- * }
- *
- * static struct kunit_case example_test_cases[] = {
- * KUNIT_CASE(add_test_basic),
- * {}
- * };
- *
- */
- struct kunit_case {
- void (*run_case)(struct kunit *test);
- const char *name;
- const void* (*generate_params)(struct kunit *test,
- const void *prev, char *desc);
- struct kunit_attributes attr;
- int (*param_init)(struct kunit *test);
- void (*param_exit)(struct kunit *test);
- /* private: internal use only. */
- enum kunit_status status;
- char *module_name;
- struct string_stream *log;
- };
- static inline char *kunit_status_to_ok_not_ok(enum kunit_status status)
- {
- switch (status) {
- case KUNIT_SKIPPED:
- case KUNIT_SUCCESS:
- return "ok";
- case KUNIT_FAILURE:
- return "not ok";
- }
- return "invalid";
- }
- /**
- * KUNIT_CASE - A helper for creating a &struct kunit_case
- *
- * @test_name: a reference to a test case function.
- *
- * Takes a symbol for a function representing a test case and creates a
- * &struct kunit_case object from it. See the documentation for
- * &struct kunit_case for an example on how to use it.
- */
- #define KUNIT_CASE(test_name) \
- { .run_case = test_name, .name = #test_name, \
- .module_name = KBUILD_MODNAME}
- /**
- * KUNIT_CASE_ATTR - A helper for creating a &struct kunit_case
- * with attributes
- *
- * @test_name: a reference to a test case function.
- * @attributes: a reference to a struct kunit_attributes object containing
- * test attributes
- */
- #define KUNIT_CASE_ATTR(test_name, attributes) \
- { .run_case = test_name, .name = #test_name, \
- .attr = attributes, .module_name = KBUILD_MODNAME}
- /**
- * KUNIT_CASE_SLOW - A helper for creating a &struct kunit_case
- * with the slow attribute
- *
- * @test_name: a reference to a test case function.
- */
- #define KUNIT_CASE_SLOW(test_name) \
- { .run_case = test_name, .name = #test_name, \
- .attr.speed = KUNIT_SPEED_SLOW, .module_name = KBUILD_MODNAME}
- /**
- * KUNIT_CASE_PARAM - A helper for creation a parameterized &struct kunit_case
- *
- * @test_name: a reference to a test case function.
- * @gen_params: a reference to a parameter generator function.
- *
- * The generator function::
- *
- * const void* gen_params(const void *prev, char *desc)
- *
- * is used to lazily generate a series of arbitrarily typed values that fit into
- * a void*. The argument @prev is the previously returned value, which should be
- * used to derive the next value; @prev is set to NULL on the initial generator
- * call. When no more values are available, the generator must return NULL.
- * Optionally write a string into @desc (size of KUNIT_PARAM_DESC_SIZE)
- * describing the parameter.
- */
- #define KUNIT_CASE_PARAM(test_name, gen_params) \
- { .run_case = test_name, .name = #test_name, \
- .generate_params = gen_params, .module_name = KBUILD_MODNAME}
- /**
- * KUNIT_CASE_PARAM_ATTR - A helper for creating a parameterized &struct
- * kunit_case with attributes
- *
- * @test_name: a reference to a test case function.
- * @gen_params: a reference to a parameter generator function.
- * @attributes: a reference to a struct kunit_attributes object containing
- * test attributes
- */
- #define KUNIT_CASE_PARAM_ATTR(test_name, gen_params, attributes) \
- { .run_case = test_name, .name = #test_name, \
- .generate_params = gen_params, \
- .attr = attributes, .module_name = KBUILD_MODNAME}
- /**
- * KUNIT_CASE_PARAM_WITH_INIT - Define a parameterized KUnit test case with custom
- * param_init() and param_exit() functions.
- * @test_name: The function implementing the test case.
- * @gen_params: The function to generate parameters for the test case.
- * @init: A reference to the param_init() function to run before a parameterized test.
- * @exit: A reference to the param_exit() function to run after a parameterized test.
- *
- * Provides the option to register param_init() and param_exit() functions.
- * param_init/exit will be passed the parameterized test context and run once
- * before and once after the parameterized test. The init function can be used
- * to add resources to share between parameter runs, pass parameter arrays,
- * and any other setup logic. The exit function can be used to clean up resources
- * that were not managed by the parameterized test, and any other teardown logic.
- *
- * Note: If you are registering a parameter array in param_init() with
- * kunit_register_param_array() then you need to pass kunit_array_gen_params()
- * to this as the generator function.
- */
- #define KUNIT_CASE_PARAM_WITH_INIT(test_name, gen_params, init, exit) \
- { .run_case = test_name, .name = #test_name, \
- .generate_params = gen_params, \
- .param_init = init, .param_exit = exit, \
- .module_name = KBUILD_MODNAME}
- /**
- * struct kunit_suite - describes a related collection of &struct kunit_case
- *
- * @name: the name of the test. Purely informational.
- * @suite_init: called once per test suite before the test cases.
- * @suite_exit: called once per test suite after all test cases.
- * @init: called before every test case.
- * @exit: called after every test case.
- * @test_cases: a null terminated array of test cases.
- * @attr: the attributes associated with the test suite
- *
- * A kunit_suite is a collection of related &struct kunit_case s, such that
- * @init is called before every test case and @exit is called after every
- * test case, similar to the notion of a *test fixture* or a *test class*
- * in other unit testing frameworks like JUnit or Googletest.
- *
- * Note that @exit and @suite_exit will run even if @init or @suite_init
- * fail: make sure they can handle any inconsistent state which may result.
- *
- * Every &struct kunit_case must be associated with a kunit_suite for KUnit
- * to run it.
- */
- struct kunit_suite {
- const char name[256];
- int (*suite_init)(struct kunit_suite *suite);
- void (*suite_exit)(struct kunit_suite *suite);
- int (*init)(struct kunit *test);
- void (*exit)(struct kunit *test);
- struct kunit_case *test_cases;
- struct kunit_attributes attr;
- /* private: internal use only */
- char status_comment[KUNIT_STATUS_COMMENT_SIZE];
- struct dentry *debugfs;
- struct string_stream *log;
- int suite_init_err;
- bool is_init;
- };
- /* Stores an array of suites, end points one past the end */
- struct kunit_suite_set {
- struct kunit_suite * const *start;
- struct kunit_suite * const *end;
- };
- /* Stores the pointer to the parameter array and its metadata. */
- struct kunit_params {
- /*
- * Reference to the parameter array for a parameterized test. This
- * is NULL if a parameter array wasn't directly passed to the
- * parameterized test context struct kunit via kunit_register_params_array().
- */
- const void *params;
- /* Reference to a function that gets the description of a parameter. */
- void (*get_description)(struct kunit *test, const void *param, char *desc);
- size_t num_params;
- size_t elem_size;
- };
- /**
- * struct kunit - represents a running instance of a test.
- *
- * @priv: for user to store arbitrary data. Commonly used to pass data
- * created in the init function (see &struct kunit_suite).
- * @parent: reference to the parent context of type struct kunit that can
- * be used for storing shared resources.
- * @params_array: for storing the parameter array.
- *
- * Used to store information about the current context under which the test
- * is running. Most of this data is private and should only be accessed
- * indirectly via public functions; the exceptions are @priv, @parent and
- * @params_array which can be used by the test writer to store arbitrary data,
- * access the parent context, and to store the parameter array, respectively.
- */
- struct kunit {
- void *priv;
- struct kunit *parent;
- struct kunit_params params_array;
- /* private: internal use only. */
- const char *name; /* Read only after initialization! */
- struct string_stream *log; /* Points at case log after initialization */
- struct kunit_try_catch try_catch;
- /* param_value is the current parameter value for a test case. */
- const void *param_value;
- /* param_index stores the index of the parameter in parameterized tests. */
- int param_index;
- /*
- * success starts as true, and may only be set to false during a
- * test case; thus, it is safe to update this across multiple
- * threads using WRITE_ONCE; however, as a consequence, it may only
- * be read after the test case finishes once all threads associated
- * with the test case have terminated.
- */
- spinlock_t lock; /* Guards all mutable test state. */
- enum kunit_status status; /* Read only after test_case finishes! */
- /*
- * Because resources is a list that may be updated multiple times (with
- * new resources) from any thread associated with a test case, we must
- * protect it with some type of lock.
- */
- struct list_head resources; /* Protected by lock. */
- char status_comment[KUNIT_STATUS_COMMENT_SIZE];
- /* Saves the last seen test. Useful to help with faults. */
- struct kunit_loc last_seen;
- };
- static inline void kunit_set_failure(struct kunit *test)
- {
- WRITE_ONCE(test->status, KUNIT_FAILURE);
- }
- bool kunit_enabled(void);
- bool kunit_autorun(void);
- const char *kunit_action(void);
- const char *kunit_filter_glob(void);
- char *kunit_filter(void);
- char *kunit_filter_action(void);
- void kunit_init_test(struct kunit *test, const char *name, struct string_stream *log);
- int kunit_run_tests(struct kunit_suite *suite);
- size_t kunit_suite_num_test_cases(struct kunit_suite *suite);
- unsigned int kunit_test_case_num(struct kunit_suite *suite,
- struct kunit_case *test_case);
- struct kunit_suite_set
- kunit_filter_suites(const struct kunit_suite_set *suite_set,
- const char *filter_glob,
- char *filters,
- char *filter_action,
- int *err);
- void kunit_free_suite_set(struct kunit_suite_set suite_set);
- int __kunit_test_suites_init(struct kunit_suite * const * const suites, int num_suites,
- bool run_tests);
- void __kunit_test_suites_exit(struct kunit_suite **suites, int num_suites);
- void kunit_exec_run_tests(struct kunit_suite_set *suite_set, bool builtin);
- void kunit_exec_list_tests(struct kunit_suite_set *suite_set, bool include_attr);
- struct kunit_suite_set kunit_merge_suite_sets(struct kunit_suite_set init_suite_set,
- struct kunit_suite_set suite_set);
- const void *kunit_array_gen_params(struct kunit *test, const void *prev, char *desc);
- #if IS_BUILTIN(CONFIG_KUNIT)
- int kunit_run_all_tests(void);
- #else
- static inline int kunit_run_all_tests(void)
- {
- return 0;
- }
- #endif /* IS_BUILTIN(CONFIG_KUNIT) */
- #define __kunit_test_suites(unique_array, ...) \
- static struct kunit_suite *unique_array[] \
- __aligned(sizeof(struct kunit_suite *)) \
- __used __section(".kunit_test_suites") = { __VA_ARGS__ }
- /**
- * kunit_test_suites() - used to register one or more &struct kunit_suite
- * with KUnit.
- *
- * @__suites: a statically allocated list of &struct kunit_suite.
- *
- * Registers @suites with the test framework.
- * This is done by placing the array of struct kunit_suite * in the
- * .kunit_test_suites ELF section.
- *
- * When builtin, KUnit tests are all run via the executor at boot, and when
- * built as a module, they run on module load.
- *
- */
- #define kunit_test_suites(__suites...) \
- __kunit_test_suites(__UNIQUE_ID(array), \
- ##__suites)
- #define kunit_test_suite(suite) kunit_test_suites(&suite)
- #define __kunit_init_test_suites(unique_array, ...) \
- static struct kunit_suite *unique_array[] \
- __aligned(sizeof(struct kunit_suite *)) \
- __used __section(".kunit_init_test_suites") = { __VA_ARGS__ }
- /**
- * kunit_test_init_section_suites() - used to register one or more &struct
- * kunit_suite containing init functions or
- * init data.
- *
- * @__suites: a statically allocated list of &struct kunit_suite.
- *
- * This functions similar to kunit_test_suites() except that it compiles the
- * list of suites during init phase.
- *
- * This macro also suffixes the array and suite declarations it makes with
- * _probe; so that modpost suppresses warnings about referencing init data
- * for symbols named in this manner.
- *
- * Note: these init tests are not able to be run after boot so there is no
- * "run" debugfs file generated for these tests.
- *
- * Also, do not mark the suite or test case structs with __initdata because
- * they will be used after the init phase with debugfs.
- */
- #define kunit_test_init_section_suites(__suites...) \
- __kunit_init_test_suites(CONCATENATE(__UNIQUE_ID(array), _probe), \
- ##__suites)
- #define kunit_test_init_section_suite(suite) \
- kunit_test_init_section_suites(&suite)
- #define kunit_suite_for_each_test_case(suite, test_case) \
- for (test_case = suite->test_cases; test_case->run_case; test_case++)
- enum kunit_status kunit_suite_has_succeeded(struct kunit_suite *suite);
- /**
- * kunit_kmalloc_array() - Like kmalloc_array() except the allocation is *test managed*.
- * @test: The test context object.
- * @n: number of elements.
- * @size: The size in bytes of the desired memory.
- * @gfp: flags passed to underlying kmalloc().
- *
- * Just like `kmalloc_array(...)`, except the allocation is managed by the test case
- * and is automatically cleaned up after the test case concludes. See kunit_add_action()
- * for more information.
- *
- * Note that some internal context data is also allocated with GFP_KERNEL,
- * regardless of the gfp passed in.
- */
- void *kunit_kmalloc_array(struct kunit *test, size_t n, size_t size, gfp_t gfp);
- /**
- * kunit_kmalloc() - Like kmalloc() except the allocation is *test managed*.
- * @test: The test context object.
- * @size: The size in bytes of the desired memory.
- * @gfp: flags passed to underlying kmalloc().
- *
- * See kmalloc() and kunit_kmalloc_array() for more information.
- *
- * Note that some internal context data is also allocated with GFP_KERNEL,
- * regardless of the gfp passed in.
- */
- static inline void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp)
- {
- return kunit_kmalloc_array(test, 1, size, gfp);
- }
- /**
- * kunit_kfree() - Like kfree except for allocations managed by KUnit.
- * @test: The test case to which the resource belongs.
- * @ptr: The memory allocation to free.
- */
- void kunit_kfree(struct kunit *test, const void *ptr);
- /**
- * kunit_kzalloc() - Just like kunit_kmalloc(), but zeroes the allocation.
- * @test: The test context object.
- * @size: The size in bytes of the desired memory.
- * @gfp: flags passed to underlying kmalloc().
- *
- * See kzalloc() and kunit_kmalloc_array() for more information.
- */
- static inline void *kunit_kzalloc(struct kunit *test, size_t size, gfp_t gfp)
- {
- return kunit_kmalloc(test, size, gfp | __GFP_ZERO);
- }
- /**
- * kunit_kcalloc() - Just like kunit_kmalloc_array(), but zeroes the allocation.
- * @test: The test context object.
- * @n: number of elements.
- * @size: The size in bytes of the desired memory.
- * @gfp: flags passed to underlying kmalloc().
- *
- * See kcalloc() and kunit_kmalloc_array() for more information.
- */
- static inline void *kunit_kcalloc(struct kunit *test, size_t n, size_t size, gfp_t gfp)
- {
- return kunit_kmalloc_array(test, n, size, gfp | __GFP_ZERO);
- }
- /**
- * kunit_kfree_const() - conditionally free test managed memory
- * @test: The test context object.
- * @x: pointer to the memory
- *
- * Calls kunit_kfree() only if @x is not in .rodata section.
- * See kunit_kstrdup_const() for more information.
- */
- void kunit_kfree_const(struct kunit *test, const void *x);
- /**
- * kunit_kstrdup() - Duplicates a string into a test managed allocation.
- *
- * @test: The test context object.
- * @str: The NULL-terminated string to duplicate.
- * @gfp: flags passed to underlying kmalloc().
- *
- * See kstrdup() and kunit_kmalloc_array() for more information.
- */
- static inline char *kunit_kstrdup(struct kunit *test, const char *str, gfp_t gfp)
- {
- size_t len;
- char *buf;
- if (!str)
- return NULL;
- len = strlen(str) + 1;
- buf = kunit_kmalloc(test, len, gfp);
- if (buf)
- memcpy(buf, str, len);
- return buf;
- }
- /**
- * kunit_kstrdup_const() - Conditionally duplicates a string into a test managed allocation.
- *
- * @test: The test context object.
- * @str: The NULL-terminated string to duplicate.
- * @gfp: flags passed to underlying kmalloc().
- *
- * Calls kunit_kstrdup() only if @str is not in the rodata section. Must be freed with
- * kunit_kfree_const() -- not kunit_kfree().
- * See kstrdup_const() and kunit_kmalloc_array() for more information.
- */
- const char *kunit_kstrdup_const(struct kunit *test, const char *str, gfp_t gfp);
- /**
- * kunit_attach_mm() - Create and attach a new mm if it doesn't already exist.
- *
- * Allocates a &struct mm_struct and attaches it to @current. In most cases, call
- * kunit_vm_mmap() without calling kunit_attach_mm() directly. Only necessary when
- * code under test accesses the mm before executing the mmap (e.g., to perform
- * additional initialization beforehand).
- *
- * Return: 0 on success, -errno on failure.
- */
- int kunit_attach_mm(void);
- /**
- * kunit_vm_mmap() - Allocate KUnit-tracked vm_mmap() area
- * @test: The test context object.
- * @file: struct file pointer to map from, if any
- * @addr: desired address, if any
- * @len: how many bytes to allocate
- * @prot: mmap PROT_* bits
- * @flag: mmap flags
- * @offset: offset into @file to start mapping from.
- *
- * See vm_mmap() for more information.
- */
- unsigned long kunit_vm_mmap(struct kunit *test, struct file *file,
- unsigned long addr, unsigned long len,
- unsigned long prot, unsigned long flag,
- unsigned long offset);
- void kunit_cleanup(struct kunit *test);
- void __printf(2, 3) kunit_log_append(struct string_stream *log, const char *fmt, ...);
- /**
- * kunit_mark_skipped() - Marks @test as skipped
- *
- * @test: The test context object.
- * @fmt: A printk() style format string.
- *
- * Marks the test as skipped. @fmt is given output as the test status
- * comment, typically the reason the test was skipped.
- *
- * Test execution continues after kunit_mark_skipped() is called.
- */
- #define kunit_mark_skipped(test, fmt, ...) \
- do { \
- WRITE_ONCE((test)->status, KUNIT_SKIPPED); \
- scnprintf((test)->status_comment, \
- KUNIT_STATUS_COMMENT_SIZE, \
- fmt, ##__VA_ARGS__); \
- } while (0)
- /**
- * kunit_skip() - Marks @test as skipped
- *
- * @test: The test context object.
- * @fmt: A printk() style format string.
- *
- * Skips the test. @fmt is given output as the test status
- * comment, typically the reason the test was skipped.
- *
- * Test execution is halted after kunit_skip() is called.
- */
- #define kunit_skip(test, fmt, ...) \
- do { \
- kunit_mark_skipped((test), fmt, ##__VA_ARGS__); \
- kunit_try_catch_throw(&((test)->try_catch)); \
- } while (0)
- /*
- * printk and log to per-test or per-suite log buffer. Logging only done
- * if CONFIG_KUNIT_DEBUGFS is 'y'; if it is 'n', no log is allocated/used.
- */
- #define kunit_log(lvl, test_or_suite, fmt, ...) \
- do { \
- printk(lvl fmt, ##__VA_ARGS__); \
- kunit_log_append((test_or_suite)->log, fmt, \
- ##__VA_ARGS__); \
- } while (0)
- #define kunit_printk(lvl, test, fmt, ...) \
- kunit_log(lvl, test, KUNIT_SUBTEST_INDENT "# %s: " fmt, \
- (test)->name, ##__VA_ARGS__)
- /**
- * kunit_info() - Prints an INFO level message associated with @test.
- *
- * @test: The test context object.
- * @fmt: A printk() style format string.
- *
- * Prints an info level message associated with the test suite being run.
- * Takes a variable number of format parameters just like printk().
- */
- #define kunit_info(test, fmt, ...) \
- kunit_printk(KERN_INFO, test, fmt, ##__VA_ARGS__)
- /**
- * kunit_warn() - Prints a WARN level message associated with @test.
- *
- * @test: The test context object.
- * @fmt: A printk() style format string.
- *
- * Prints a warning level message.
- */
- #define kunit_warn(test, fmt, ...) \
- kunit_printk(KERN_WARNING, test, fmt, ##__VA_ARGS__)
- /**
- * kunit_err() - Prints an ERROR level message associated with @test.
- *
- * @test: The test context object.
- * @fmt: A printk() style format string.
- *
- * Prints an error level message.
- */
- #define kunit_err(test, fmt, ...) \
- kunit_printk(KERN_ERR, test, fmt, ##__VA_ARGS__)
- /*
- * Must be called at the beginning of each KUNIT_*_ASSERTION().
- * Cf. KUNIT_CURRENT_LOC.
- */
- #define _KUNIT_SAVE_LOC(test) do { \
- WRITE_ONCE(test->last_seen.file, __FILE__); \
- WRITE_ONCE(test->last_seen.line, __LINE__); \
- } while (0)
- /**
- * KUNIT_SUCCEED() - A no-op expectation. Only exists for code clarity.
- * @test: The test context object.
- *
- * The opposite of KUNIT_FAIL(), it is an expectation that cannot fail. In other
- * words, it does nothing and only exists for code clarity. See
- * KUNIT_EXPECT_TRUE() for more information.
- */
- #define KUNIT_SUCCEED(test) _KUNIT_SAVE_LOC(test)
- void __noreturn __kunit_abort(struct kunit *test);
- void __printf(6, 7) __kunit_do_failed_assertion(struct kunit *test,
- const struct kunit_loc *loc,
- enum kunit_assert_type type,
- const struct kunit_assert *assert,
- assert_format_t assert_format,
- const char *fmt, ...);
- #define _KUNIT_FAILED(test, assert_type, assert_class, assert_format, INITIALIZER, fmt, ...) do { \
- static const struct kunit_loc __loc = KUNIT_CURRENT_LOC; \
- const struct assert_class __assertion = INITIALIZER; \
- __kunit_do_failed_assertion(test, \
- &__loc, \
- assert_type, \
- &__assertion.assert, \
- assert_format, \
- fmt, \
- ##__VA_ARGS__); \
- if (assert_type == KUNIT_ASSERTION) \
- __kunit_abort(test); \
- } while (0)
- #define KUNIT_FAIL_ASSERTION(test, assert_type, fmt, ...) do { \
- _KUNIT_SAVE_LOC(test); \
- _KUNIT_FAILED(test, \
- assert_type, \
- kunit_fail_assert, \
- kunit_fail_assert_format, \
- {}, \
- fmt, \
- ##__VA_ARGS__); \
- } while (0)
- /**
- * KUNIT_FAIL() - Always causes a test to fail when evaluated.
- * @test: The test context object.
- * @fmt: an informational message to be printed when the assertion is made.
- * @...: string format arguments.
- *
- * The opposite of KUNIT_SUCCEED(), it is an expectation that always fails. In
- * other words, it always results in a failed expectation, and consequently
- * always causes the test case to fail when evaluated. See KUNIT_EXPECT_TRUE()
- * for more information.
- */
- #define KUNIT_FAIL(test, fmt, ...) \
- KUNIT_FAIL_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- fmt, \
- ##__VA_ARGS__)
- /* Helper to safely pass around an initializer list to other macros. */
- #define KUNIT_INIT_ASSERT(initializers...) { initializers }
- #define KUNIT_UNARY_ASSERTION(test, \
- assert_type, \
- condition_, \
- expected_true_, \
- fmt, \
- ...) \
- do { \
- _KUNIT_SAVE_LOC(test); \
- if (likely(!!(condition_) == !!expected_true_)) \
- break; \
- \
- _KUNIT_FAILED(test, \
- assert_type, \
- kunit_unary_assert, \
- kunit_unary_assert_format, \
- KUNIT_INIT_ASSERT(.condition = #condition_, \
- .expected_true = expected_true_), \
- fmt, \
- ##__VA_ARGS__); \
- } while (0)
- #define KUNIT_TRUE_MSG_ASSERTION(test, assert_type, condition, fmt, ...) \
- KUNIT_UNARY_ASSERTION(test, \
- assert_type, \
- condition, \
- true, \
- fmt, \
- ##__VA_ARGS__)
- #define KUNIT_FALSE_MSG_ASSERTION(test, assert_type, condition, fmt, ...) \
- KUNIT_UNARY_ASSERTION(test, \
- assert_type, \
- condition, \
- false, \
- fmt, \
- ##__VA_ARGS__)
- /*
- * A factory macro for defining the assertions and expectations for the basic
- * comparisons defined for the built in types.
- *
- * Unfortunately, there is no common type that all types can be promoted to for
- * which all the binary operators behave the same way as for the actual types
- * (for example, there is no type that long long and unsigned long long can
- * both be cast to where the comparison result is preserved for all values). So
- * the best we can do is do the comparison in the original types and then coerce
- * everything to long long for printing; this way, the comparison behaves
- * correctly and the printed out value usually makes sense without
- * interpretation, but can always be interpreted to figure out the actual
- * value.
- */
- #define KUNIT_BASE_BINARY_ASSERTION(test, \
- assert_class, \
- format_func, \
- assert_type, \
- left, \
- op, \
- right, \
- fmt, \
- ...) \
- do { \
- const typeof(left) __left = (left); \
- const typeof(right) __right = (right); \
- static const struct kunit_binary_assert_text __text = { \
- .operation = #op, \
- .left_text = #left, \
- .right_text = #right, \
- }; \
- \
- _KUNIT_SAVE_LOC(test); \
- if (likely(__left op __right)) \
- break; \
- \
- _KUNIT_FAILED(test, \
- assert_type, \
- assert_class, \
- format_func, \
- KUNIT_INIT_ASSERT(.text = &__text, \
- .left_value = __left, \
- .right_value = __right), \
- fmt, \
- ##__VA_ARGS__); \
- } while (0)
- #define KUNIT_BINARY_INT_ASSERTION(test, \
- assert_type, \
- left, \
- op, \
- right, \
- fmt, \
- ...) \
- KUNIT_BASE_BINARY_ASSERTION(test, \
- kunit_binary_assert, \
- kunit_binary_assert_format, \
- assert_type, \
- left, op, right, \
- fmt, \
- ##__VA_ARGS__)
- #define KUNIT_BINARY_PTR_ASSERTION(test, \
- assert_type, \
- left, \
- op, \
- right, \
- fmt, \
- ...) \
- KUNIT_BASE_BINARY_ASSERTION(test, \
- kunit_binary_ptr_assert, \
- kunit_binary_ptr_assert_format, \
- assert_type, \
- left, op, right, \
- fmt, \
- ##__VA_ARGS__)
- #define KUNIT_BINARY_STR_ASSERTION(test, \
- assert_type, \
- left, \
- op, \
- right, \
- fmt, \
- ...) \
- do { \
- const char *__left = (left); \
- const char *__right = (right); \
- static const struct kunit_binary_assert_text __text = { \
- .operation = #op, \
- .left_text = #left, \
- .right_text = #right, \
- }; \
- \
- _KUNIT_SAVE_LOC(test); \
- if (likely(!IS_ERR_OR_NULL(__left) && !IS_ERR_OR_NULL(__right) && \
- (strcmp(__left, __right) op 0))) \
- break; \
- \
- \
- _KUNIT_FAILED(test, \
- assert_type, \
- kunit_binary_str_assert, \
- kunit_binary_str_assert_format, \
- KUNIT_INIT_ASSERT(.text = &__text, \
- .left_value = __left, \
- .right_value = __right), \
- fmt, \
- ##__VA_ARGS__); \
- } while (0)
- #define KUNIT_MEM_ASSERTION(test, \
- assert_type, \
- left, \
- op, \
- right, \
- size_, \
- fmt, \
- ...) \
- do { \
- const void *__left = (left); \
- const void *__right = (right); \
- const size_t __size = (size_); \
- static const struct kunit_binary_assert_text __text = { \
- .operation = #op, \
- .left_text = #left, \
- .right_text = #right, \
- }; \
- \
- _KUNIT_SAVE_LOC(test); \
- if (likely(__left && __right)) \
- if (likely(memcmp(__left, __right, __size) op 0)) \
- break; \
- \
- _KUNIT_FAILED(test, \
- assert_type, \
- kunit_mem_assert, \
- kunit_mem_assert_format, \
- KUNIT_INIT_ASSERT(.text = &__text, \
- .left_value = __left, \
- .right_value = __right, \
- .size = __size), \
- fmt, \
- ##__VA_ARGS__); \
- } while (0)
- #define KUNIT_PTR_NOT_ERR_OR_NULL_MSG_ASSERTION(test, \
- assert_type, \
- ptr, \
- fmt, \
- ...) \
- do { \
- const typeof(ptr) __ptr = (ptr); \
- \
- _KUNIT_SAVE_LOC(test); \
- if (!IS_ERR_OR_NULL(__ptr)) \
- break; \
- \
- _KUNIT_FAILED(test, \
- assert_type, \
- kunit_ptr_not_err_assert, \
- kunit_ptr_not_err_assert_format, \
- KUNIT_INIT_ASSERT(.text = #ptr, .value = __ptr), \
- fmt, \
- ##__VA_ARGS__); \
- } while (0)
- /**
- * KUNIT_EXPECT_TRUE() - Causes a test failure when the expression is not true.
- * @test: The test context object.
- * @condition: an arbitrary boolean expression. The test fails when this does
- * not evaluate to true.
- *
- * This and expectations of the form `KUNIT_EXPECT_*` will cause the test case
- * to fail when the specified condition is not met; however, it will not prevent
- * the test case from continuing to run; this is otherwise known as an
- * *expectation failure*.
- */
- #define KUNIT_EXPECT_TRUE(test, condition) \
- KUNIT_EXPECT_TRUE_MSG(test, condition, NULL)
- #define KUNIT_EXPECT_TRUE_MSG(test, condition, fmt, ...) \
- KUNIT_TRUE_MSG_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- condition, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_FALSE() - Makes a test failure when the expression is not false.
- * @test: The test context object.
- * @condition: an arbitrary boolean expression. The test fails when this does
- * not evaluate to false.
- *
- * Sets an expectation that @condition evaluates to false. See
- * KUNIT_EXPECT_TRUE() for more information.
- */
- #define KUNIT_EXPECT_FALSE(test, condition) \
- KUNIT_EXPECT_FALSE_MSG(test, condition, NULL)
- #define KUNIT_EXPECT_FALSE_MSG(test, condition, fmt, ...) \
- KUNIT_FALSE_MSG_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- condition, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_EQ() - Sets an expectation that @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an expectation that the values that @left and @right evaluate to are
- * equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) == (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_EQ(test, left, right) \
- KUNIT_EXPECT_EQ_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_EQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, ==, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_PTR_EQ() - Expects that pointers @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a pointer.
- * @right: an arbitrary expression that evaluates to a pointer.
- *
- * Sets an expectation that the values that @left and @right evaluate to are
- * equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) == (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_PTR_EQ(test, left, right) \
- KUNIT_EXPECT_PTR_EQ_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_PTR_EQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, ==, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_NE() - An expectation that @left and @right are not equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an expectation that the values that @left and @right evaluate to are not
- * equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) != (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_NE(test, left, right) \
- KUNIT_EXPECT_NE_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_NE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, !=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_PTR_NE() - Expects that pointers @left and @right are not equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a pointer.
- * @right: an arbitrary expression that evaluates to a pointer.
- *
- * Sets an expectation that the values that @left and @right evaluate to are not
- * equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) != (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_PTR_NE(test, left, right) \
- KUNIT_EXPECT_PTR_NE_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_PTR_NE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, !=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_LT() - An expectation that @left is less than @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an expectation that the value that @left evaluates to is less than the
- * value that @right evaluates to. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) < (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_LT(test, left, right) \
- KUNIT_EXPECT_LT_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_LT_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, <, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_LE() - Expects that @left is less than or equal to @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an expectation that the value that @left evaluates to is less than or
- * equal to the value that @right evaluates to. Semantically this is equivalent
- * to KUNIT_EXPECT_TRUE(@test, (@left) <= (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_LE(test, left, right) \
- KUNIT_EXPECT_LE_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_LE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, <=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_GT() - An expectation that @left is greater than @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an expectation that the value that @left evaluates to is greater than
- * the value that @right evaluates to. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) > (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_GT(test, left, right) \
- KUNIT_EXPECT_GT_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_GT_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, >, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_GE() - Expects that @left is greater than or equal to @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an expectation that the value that @left evaluates to is greater than
- * the value that @right evaluates to. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, (@left) >= (@right)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_GE(test, left, right) \
- KUNIT_EXPECT_GE_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_GE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, >=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_STREQ() - Expects that strings @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a null terminated string.
- * @right: an arbitrary expression that evaluates to a null terminated string.
- *
- * Sets an expectation that the values that @left and @right evaluate to are
- * equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, !strcmp((@left), (@right))). See KUNIT_EXPECT_TRUE()
- * for more information.
- */
- #define KUNIT_EXPECT_STREQ(test, left, right) \
- KUNIT_EXPECT_STREQ_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_STREQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_STR_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, ==, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_STRNEQ() - Expects that strings @left and @right are not equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a null terminated string.
- * @right: an arbitrary expression that evaluates to a null terminated string.
- *
- * Sets an expectation that the values that @left and @right evaluate to are
- * not equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, strcmp((@left), (@right))). See KUNIT_EXPECT_TRUE()
- * for more information.
- */
- #define KUNIT_EXPECT_STRNEQ(test, left, right) \
- KUNIT_EXPECT_STRNEQ_MSG(test, left, right, NULL)
- #define KUNIT_EXPECT_STRNEQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_STR_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, !=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_MEMEQ() - Expects that the first @size bytes of @left and @right are equal.
- * @test: The test context object.
- * @left: An arbitrary expression that evaluates to the specified size.
- * @right: An arbitrary expression that evaluates to the specified size.
- * @size: Number of bytes compared.
- *
- * Sets an expectation that the values that @left and @right evaluate to are
- * equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, !memcmp((@left), (@right), (@size))). See
- * KUNIT_EXPECT_TRUE() for more information.
- *
- * Although this expectation works for any memory block, it is not recommended
- * for comparing more structured data, such as structs. This expectation is
- * recommended for comparing, for example, data arrays.
- */
- #define KUNIT_EXPECT_MEMEQ(test, left, right, size) \
- KUNIT_EXPECT_MEMEQ_MSG(test, left, right, size, NULL)
- #define KUNIT_EXPECT_MEMEQ_MSG(test, left, right, size, fmt, ...) \
- KUNIT_MEM_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, ==, right, \
- size, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_MEMNEQ() - Expects that the first @size bytes of @left and @right are not equal.
- * @test: The test context object.
- * @left: An arbitrary expression that evaluates to the specified size.
- * @right: An arbitrary expression that evaluates to the specified size.
- * @size: Number of bytes compared.
- *
- * Sets an expectation that the values that @left and @right evaluate to are
- * not equal. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, memcmp((@left), (@right), (@size))). See
- * KUNIT_EXPECT_TRUE() for more information.
- *
- * Although this expectation works for any memory block, it is not recommended
- * for comparing more structured data, such as structs. This expectation is
- * recommended for comparing, for example, data arrays.
- */
- #define KUNIT_EXPECT_MEMNEQ(test, left, right, size) \
- KUNIT_EXPECT_MEMNEQ_MSG(test, left, right, size, NULL)
- #define KUNIT_EXPECT_MEMNEQ_MSG(test, left, right, size, fmt, ...) \
- KUNIT_MEM_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- left, !=, right, \
- size, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_NULL() - Expects that @ptr is null.
- * @test: The test context object.
- * @ptr: an arbitrary pointer.
- *
- * Sets an expectation that the value that @ptr evaluates to is null. This is
- * semantically equivalent to KUNIT_EXPECT_PTR_EQ(@test, ptr, NULL).
- * See KUNIT_EXPECT_TRUE() for more information.
- */
- #define KUNIT_EXPECT_NULL(test, ptr) \
- KUNIT_EXPECT_NULL_MSG(test, \
- ptr, \
- NULL)
- #define KUNIT_EXPECT_NULL_MSG(test, ptr, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- ptr, ==, NULL, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_NOT_NULL() - Expects that @ptr is not null.
- * @test: The test context object.
- * @ptr: an arbitrary pointer.
- *
- * Sets an expectation that the value that @ptr evaluates to is not null. This
- * is semantically equivalent to KUNIT_EXPECT_PTR_NE(@test, ptr, NULL).
- * See KUNIT_EXPECT_TRUE() for more information.
- */
- #define KUNIT_EXPECT_NOT_NULL(test, ptr) \
- KUNIT_EXPECT_NOT_NULL_MSG(test, \
- ptr, \
- NULL)
- #define KUNIT_EXPECT_NOT_NULL_MSG(test, ptr, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- ptr, !=, NULL, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_EXPECT_NOT_ERR_OR_NULL() - Expects that @ptr is not null and not err.
- * @test: The test context object.
- * @ptr: an arbitrary pointer.
- *
- * Sets an expectation that the value that @ptr evaluates to is not null and not
- * an errno stored in a pointer. This is semantically equivalent to
- * KUNIT_EXPECT_TRUE(@test, !IS_ERR_OR_NULL(@ptr)). See KUNIT_EXPECT_TRUE() for
- * more information.
- */
- #define KUNIT_EXPECT_NOT_ERR_OR_NULL(test, ptr) \
- KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG(test, ptr, NULL)
- #define KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG(test, ptr, fmt, ...) \
- KUNIT_PTR_NOT_ERR_OR_NULL_MSG_ASSERTION(test, \
- KUNIT_EXPECTATION, \
- ptr, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_FAIL_AND_ABORT() - Always causes a test to fail and abort when evaluated.
- * @test: The test context object.
- * @fmt: an informational message to be printed when the assertion is made.
- * @...: string format arguments.
- *
- * The opposite of KUNIT_SUCCEED(), it is an assertion that always fails. In
- * other words, it always results in a failed assertion, and consequently
- * always causes the test case to fail and abort when evaluated.
- * See KUNIT_ASSERT_TRUE() for more information.
- */
- #define KUNIT_FAIL_AND_ABORT(test, fmt, ...) \
- KUNIT_FAIL_ASSERTION(test, KUNIT_ASSERTION, fmt, ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_TRUE() - Sets an assertion that @condition is true.
- * @test: The test context object.
- * @condition: an arbitrary boolean expression. The test fails and aborts when
- * this does not evaluate to true.
- *
- * This and assertions of the form `KUNIT_ASSERT_*` will cause the test case to
- * fail *and immediately abort* when the specified condition is not met. Unlike
- * an expectation failure, it will prevent the test case from continuing to run;
- * this is otherwise known as an *assertion failure*.
- */
- #define KUNIT_ASSERT_TRUE(test, condition) \
- KUNIT_ASSERT_TRUE_MSG(test, condition, NULL)
- #define KUNIT_ASSERT_TRUE_MSG(test, condition, fmt, ...) \
- KUNIT_TRUE_MSG_ASSERTION(test, \
- KUNIT_ASSERTION, \
- condition, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_FALSE() - Sets an assertion that @condition is false.
- * @test: The test context object.
- * @condition: an arbitrary boolean expression.
- *
- * Sets an assertion that the value that @condition evaluates to is false. This
- * is the same as KUNIT_EXPECT_FALSE(), except it causes an assertion failure
- * (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_FALSE(test, condition) \
- KUNIT_ASSERT_FALSE_MSG(test, condition, NULL)
- #define KUNIT_ASSERT_FALSE_MSG(test, condition, fmt, ...) \
- KUNIT_FALSE_MSG_ASSERTION(test, \
- KUNIT_ASSERTION, \
- condition, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_EQ() - Sets an assertion that @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an assertion that the values that @left and @right evaluate to are
- * equal. This is the same as KUNIT_EXPECT_EQ(), except it causes an assertion
- * failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_EQ(test, left, right) \
- KUNIT_ASSERT_EQ_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_EQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, ==, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_PTR_EQ() - Asserts that pointers @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a pointer.
- * @right: an arbitrary expression that evaluates to a pointer.
- *
- * Sets an assertion that the values that @left and @right evaluate to are
- * equal. This is the same as KUNIT_EXPECT_EQ(), except it causes an assertion
- * failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_PTR_EQ(test, left, right) \
- KUNIT_ASSERT_PTR_EQ_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_PTR_EQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, ==, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_NE() - An assertion that @left and @right are not equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an assertion that the values that @left and @right evaluate to are not
- * equal. This is the same as KUNIT_EXPECT_NE(), except it causes an assertion
- * failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_NE(test, left, right) \
- KUNIT_ASSERT_NE_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_NE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, !=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_PTR_NE() - Asserts that pointers @left and @right are not equal.
- * KUNIT_ASSERT_PTR_EQ() - Asserts that pointers @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a pointer.
- * @right: an arbitrary expression that evaluates to a pointer.
- *
- * Sets an assertion that the values that @left and @right evaluate to are not
- * equal. This is the same as KUNIT_EXPECT_NE(), except it causes an assertion
- * failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_PTR_NE(test, left, right) \
- KUNIT_ASSERT_PTR_NE_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_PTR_NE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, !=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_LT() - An assertion that @left is less than @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an assertion that the value that @left evaluates to is less than the
- * value that @right evaluates to. This is the same as KUNIT_EXPECT_LT(), except
- * it causes an assertion failure (see KUNIT_ASSERT_TRUE()) when the assertion
- * is not met.
- */
- #define KUNIT_ASSERT_LT(test, left, right) \
- KUNIT_ASSERT_LT_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_LT_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, <, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_LE() - An assertion that @left is less than or equal to @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an assertion that the value that @left evaluates to is less than or
- * equal to the value that @right evaluates to. This is the same as
- * KUNIT_EXPECT_LE(), except it causes an assertion failure (see
- * KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_LE(test, left, right) \
- KUNIT_ASSERT_LE_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_LE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, <=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_GT() - An assertion that @left is greater than @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an assertion that the value that @left evaluates to is greater than the
- * value that @right evaluates to. This is the same as KUNIT_EXPECT_GT(), except
- * it causes an assertion failure (see KUNIT_ASSERT_TRUE()) when the assertion
- * is not met.
- */
- #define KUNIT_ASSERT_GT(test, left, right) \
- KUNIT_ASSERT_GT_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_GT_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, >, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_GE() - Assertion that @left is greater than or equal to @right.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a primitive C type.
- * @right: an arbitrary expression that evaluates to a primitive C type.
- *
- * Sets an assertion that the value that @left evaluates to is greater than the
- * value that @right evaluates to. This is the same as KUNIT_EXPECT_GE(), except
- * it causes an assertion failure (see KUNIT_ASSERT_TRUE()) when the assertion
- * is not met.
- */
- #define KUNIT_ASSERT_GE(test, left, right) \
- KUNIT_ASSERT_GE_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_GE_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_INT_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, >=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_STREQ() - An assertion that strings @left and @right are equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a null terminated string.
- * @right: an arbitrary expression that evaluates to a null terminated string.
- *
- * Sets an assertion that the values that @left and @right evaluate to are
- * equal. This is the same as KUNIT_EXPECT_STREQ(), except it causes an
- * assertion failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_STREQ(test, left, right) \
- KUNIT_ASSERT_STREQ_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_STREQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_STR_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, ==, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_STRNEQ() - An assertion that strings @left and @right are not equal.
- * @test: The test context object.
- * @left: an arbitrary expression that evaluates to a null terminated string.
- * @right: an arbitrary expression that evaluates to a null terminated string.
- *
- * Sets an assertion that the values that @left and @right evaluate to are
- * not equal. This is semantically equivalent to
- * KUNIT_ASSERT_TRUE(@test, strcmp((@left), (@right))). See KUNIT_ASSERT_TRUE()
- * for more information.
- */
- #define KUNIT_ASSERT_STRNEQ(test, left, right) \
- KUNIT_ASSERT_STRNEQ_MSG(test, left, right, NULL)
- #define KUNIT_ASSERT_STRNEQ_MSG(test, left, right, fmt, ...) \
- KUNIT_BINARY_STR_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, !=, right, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_MEMEQ() - Asserts that the first @size bytes of @left and @right are equal.
- * @test: The test context object.
- * @left: An arbitrary expression that evaluates to the specified size.
- * @right: An arbitrary expression that evaluates to the specified size.
- * @size: Number of bytes compared.
- *
- * Sets an assertion that the values that @left and @right evaluate to are
- * equal. This is semantically equivalent to
- * KUNIT_ASSERT_TRUE(@test, !memcmp((@left), (@right), (@size))). See
- * KUNIT_ASSERT_TRUE() for more information.
- *
- * Although this assertion works for any memory block, it is not recommended
- * for comparing more structured data, such as structs. This assertion is
- * recommended for comparing, for example, data arrays.
- */
- #define KUNIT_ASSERT_MEMEQ(test, left, right, size) \
- KUNIT_ASSERT_MEMEQ_MSG(test, left, right, size, NULL)
- #define KUNIT_ASSERT_MEMEQ_MSG(test, left, right, size, fmt, ...) \
- KUNIT_MEM_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, ==, right, \
- size, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_MEMNEQ() - Asserts that the first @size bytes of @left and @right are not equal.
- * @test: The test context object.
- * @left: An arbitrary expression that evaluates to the specified size.
- * @right: An arbitrary expression that evaluates to the specified size.
- * @size: Number of bytes compared.
- *
- * Sets an assertion that the values that @left and @right evaluate to are
- * not equal. This is semantically equivalent to
- * KUNIT_ASSERT_TRUE(@test, memcmp((@left), (@right), (@size))). See
- * KUNIT_ASSERT_TRUE() for more information.
- *
- * Although this assertion works for any memory block, it is not recommended
- * for comparing more structured data, such as structs. This assertion is
- * recommended for comparing, for example, data arrays.
- */
- #define KUNIT_ASSERT_MEMNEQ(test, left, right, size) \
- KUNIT_ASSERT_MEMNEQ_MSG(test, left, right, size, NULL)
- #define KUNIT_ASSERT_MEMNEQ_MSG(test, left, right, size, fmt, ...) \
- KUNIT_MEM_ASSERTION(test, \
- KUNIT_ASSERTION, \
- left, !=, right, \
- size, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_NULL() - Asserts that pointers @ptr is null.
- * @test: The test context object.
- * @ptr: an arbitrary pointer.
- *
- * Sets an assertion that the values that @ptr evaluates to is null. This is
- * the same as KUNIT_EXPECT_NULL(), except it causes an assertion
- * failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_NULL(test, ptr) \
- KUNIT_ASSERT_NULL_MSG(test, \
- ptr, \
- NULL)
- #define KUNIT_ASSERT_NULL_MSG(test, ptr, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_ASSERTION, \
- ptr, ==, NULL, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_NOT_NULL() - Asserts that pointers @ptr is not null.
- * @test: The test context object.
- * @ptr: an arbitrary pointer.
- *
- * Sets an assertion that the values that @ptr evaluates to is not null. This
- * is the same as KUNIT_EXPECT_NOT_NULL(), except it causes an assertion
- * failure (see KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_NOT_NULL(test, ptr) \
- KUNIT_ASSERT_NOT_NULL_MSG(test, \
- ptr, \
- NULL)
- #define KUNIT_ASSERT_NOT_NULL_MSG(test, ptr, fmt, ...) \
- KUNIT_BINARY_PTR_ASSERTION(test, \
- KUNIT_ASSERTION, \
- ptr, !=, NULL, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ASSERT_NOT_ERR_OR_NULL() - Assertion that @ptr is not null and not err.
- * @test: The test context object.
- * @ptr: an arbitrary pointer.
- *
- * Sets an assertion that the value that @ptr evaluates to is not null and not
- * an errno stored in a pointer. This is the same as
- * KUNIT_EXPECT_NOT_ERR_OR_NULL(), except it causes an assertion failure (see
- * KUNIT_ASSERT_TRUE()) when the assertion is not met.
- */
- #define KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr) \
- KUNIT_ASSERT_NOT_ERR_OR_NULL_MSG(test, ptr, NULL)
- #define KUNIT_ASSERT_NOT_ERR_OR_NULL_MSG(test, ptr, fmt, ...) \
- KUNIT_PTR_NOT_ERR_OR_NULL_MSG_ASSERTION(test, \
- KUNIT_ASSERTION, \
- ptr, \
- fmt, \
- ##__VA_ARGS__)
- /**
- * KUNIT_ARRAY_PARAM() - Define test parameter generator from an array.
- * @name: prefix for the test parameter generator function.
- * @array: array of test parameters.
- * @get_desc: function to convert param to description; NULL to use default
- *
- * Define function @name_gen_params which uses @array to generate parameters.
- */
- #define KUNIT_ARRAY_PARAM(name, array, get_desc) \
- static const void *name##_gen_params(struct kunit *test, \
- const void *prev, char *desc) \
- { \
- typeof((array)[0]) *__next = prev ? ((typeof(__next)) prev) + 1 : (array); \
- if (!prev) \
- kunit_register_params_array(test, array, ARRAY_SIZE(array), NULL); \
- if (__next - (array) < ARRAY_SIZE((array))) { \
- void (*__get_desc)(typeof(__next), char *) = get_desc; \
- if (__get_desc) \
- __get_desc(__next, desc); \
- return __next; \
- } \
- return NULL; \
- }
- /**
- * KUNIT_ARRAY_PARAM_DESC() - Define test parameter generator from an array.
- * @name: prefix for the test parameter generator function.
- * @array: array of test parameters.
- * @desc_member: structure member from array element to use as description
- *
- * Define function @name_gen_params which uses @array to generate parameters.
- */
- #define KUNIT_ARRAY_PARAM_DESC(name, array, desc_member) \
- static const void *name##_gen_params(struct kunit *test, \
- const void *prev, char *desc) \
- { \
- typeof((array)[0]) *__next = prev ? ((typeof(__next)) prev) + 1 : (array); \
- if (!prev) \
- kunit_register_params_array(test, array, ARRAY_SIZE(array), NULL); \
- if (__next - (array) < ARRAY_SIZE((array))) { \
- strscpy(desc, __next->desc_member, KUNIT_PARAM_DESC_SIZE); \
- return __next; \
- } \
- return NULL; \
- }
- /**
- * kunit_register_params_array() - Register parameter array for a KUnit test.
- * @test: The KUnit test structure to which parameters will be added.
- * @array: An array of test parameters.
- * @param_count: Number of parameters.
- * @get_desc: Function that generates a string description for a given parameter
- * element.
- *
- * This macro initializes the @test's parameter array data, storing information
- * including the parameter array, its count, the element size, and the parameter
- * description function within `test->params_array`.
- *
- * Note: If using this macro in param_init(), kunit_array_gen_params()
- * will then need to be manually provided as the parameter generator function to
- * KUNIT_CASE_PARAM_WITH_INIT(). kunit_array_gen_params() is a KUnit
- * function that uses the registered array to generate parameters
- */
- #define kunit_register_params_array(test, array, param_count, get_desc) \
- do { \
- struct kunit *_test = (test); \
- const typeof((array)[0]) * _params_ptr = &(array)[0]; \
- _test->params_array.params = _params_ptr; \
- _test->params_array.num_params = (param_count); \
- _test->params_array.elem_size = sizeof(*_params_ptr); \
- _test->params_array.get_description = (get_desc); \
- } while (0)
- // TODO(dlatypov@google.com): consider eventually migrating users to explicitly
- // include resource.h themselves if they need it.
- #include <kunit/resource.h>
- #endif /* _KUNIT_TEST_H */
|