Resource API¶
This file documents the KUnit resource API.
Most users won’t need to use this API directly, power users can use it to store state on a per-test basis, register custom cleanup actions, and more.
-
struct kunit_resource¶
represents a test managed resource
Definition:
struct kunit_resource {
void *data;
const char *name;
kunit_resource_free_t free;
};
Members
datafor the user to store arbitrary data.
nameoptional name
freea user supplied function to free the resource.
Description
Represents a test managed resource, a resource which will automatically be
cleaned up at the end of a test case. This cleanup is performed by the ‘free’
function. The struct kunit_resource itself is freed automatically with
kfree() if it was allocated by KUnit (e.g., by kunit_alloc_resource()), but
must be freed by the user otherwise.
Resources are reference counted so if a resource is retrieved via
kunit_alloc_and_get_resource() or kunit_find_resource(), we need
to call kunit_put_resource() to reduce the resource reference count
when finished with it. Note that kunit_alloc_resource() does not require a
kunit_resource_put() because it does not retrieve the resource itself.
Example
struct kunit_kmalloc_params {
size_t size;
gfp_t gfp;
};
static int kunit_kmalloc_init(struct kunit_resource *res, void *context)
{
struct kunit_kmalloc_params *params = context;
res->data = kmalloc(params->size, params->gfp);
if (!res->data)
return -ENOMEM;
return 0;
}
static void kunit_kmalloc_free(struct kunit_resource *res)
{
kfree(res->data);
}
void *kunit_kmalloc(struct kunit *test, size_t size, gfp_t gfp)
{
struct kunit_kmalloc_params params;
params.size = size;
params.gfp = gfp;
return kunit_alloc_resource(test, kunit_kmalloc_init,
kunit_kmalloc_free, gfp, ¶ms);
}
Resources can also be named, with lookup/removal done on a name
basis also. kunit_add_named_resource(), kunit_find_named_resource()
and kunit_destroy_named_resource(). Resource names must be
unique within the test instance.
-
void kunit_get_resource(struct kunit_resource *res)¶
Hold resource for use. Should not need to be used by most users as we automatically get resources retrieved by kunit_find_resource*().
Parameters
struct kunit_resource *resresource
-
void kunit_put_resource(struct kunit_resource *res)¶
When caller is done with retrieved resource,
kunit_put_resource()should be called to drop reference count. The resource list maintains a reference count on resources, so if no users are utilizing a resource and it is removed from the resource list, it will be freed via the associated free function (if any). Only needs to be used if wealloc_and_get()orfind()resource.
Parameters
struct kunit_resource *resresource
-
int __kunit_add_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)¶
Internal helper to add a resource.
Parameters
struct kunit *testThe test context object.
kunit_resource_init_t inita user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to data. If an init function is supplied, data is passed to it instead.
kunit_resource_free_t freea user-supplied function to free the resource (if needed).
struct kunit_resource *resThe resource.
void *datavalue to pass to init function or set in resource data field.
Description
res->should_kfree is not initialised.
-
int kunit_add_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, void *data)¶
Add a test managed resource.
Parameters
struct kunit *testThe test context object.
kunit_resource_init_t inita user-supplied function to initialize the result (if needed). If none is supplied, the resource data value is simply set to data. If an init function is supplied, data is passed to it instead.
kunit_resource_free_t freea user-supplied function to free the resource (if needed).
struct kunit_resource *resThe resource.
void *datavalue to pass to init function or set in resource data field.
-
int kunit_add_named_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, struct kunit_resource *res, const char *name, void *data)¶
Add a named test managed resource.
Parameters
struct kunit *testThe test context object.
kunit_resource_init_t inita user-supplied function to initialize the resource data, if needed.
kunit_resource_free_t freea user-supplied function to free the resource data, if needed.
struct kunit_resource *resThe resource.
const char *namename to be set for resource.
void *datavalue to pass to init function or set in resource data field.
-
struct kunit_resource *kunit_alloc_and_get_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)¶
Allocates and returns a test managed resource.
Parameters
struct kunit *testThe test context object.
kunit_resource_init_t inita user supplied function to initialize the resource.
kunit_resource_free_t freea user supplied function to free the resource (if needed).
gfp_t internal_gfpgfp to use for internal allocations, if unsure, use GFP_KERNEL
void *contextfor the user to pass in arbitrary data to the init function.
Description
Allocates a test managed resource, a resource which will automatically be
cleaned up at the end of a test case. See struct kunit_resource for an
example.
This is effectively identical to kunit_alloc_resource, but returns the
struct kunit_resource pointer, not just the ‘data’ pointer. It therefore
also increments the resource’s refcount, so kunit_put_resource() should be
called when you’ve finished with it.
Note
KUnit needs to allocate memory for a kunit_resource object. You must specify an internal_gfp that is compatible with the use context of your resource.
-
void *kunit_alloc_resource(struct kunit *test, kunit_resource_init_t init, kunit_resource_free_t free, gfp_t internal_gfp, void *context)¶
Allocates a test managed resource.
Parameters
struct kunit *testThe test context object.
kunit_resource_init_t inita user supplied function to initialize the resource.
kunit_resource_free_t freea user supplied function to free the resource (if needed).
gfp_t internal_gfpgfp to use for internal allocations, if unsure, use GFP_KERNEL
void *contextfor the user to pass in arbitrary data to the init function.
Description
Allocates a test managed resource, a resource which will automatically be
cleaned up at the end of a test case. See struct kunit_resource for an
example.
Note
KUnit needs to allocate memory for a kunit_resource object. You must specify an internal_gfp that is compatible with the use context of your resource.
-
bool kunit_resource_name_match(struct kunit *test, struct kunit_resource *res, void *match_name)¶
Match a resource with the same name.
Parameters
struct kunit *testTest case to which the resource belongs.
struct kunit_resource *resThe resource.
void *match_nameThe name to match against.
-
struct kunit_resource *kunit_find_resource(struct kunit *test, kunit_resource_match_t match, void *match_data)¶
Find a resource using match function/data.
Parameters
struct kunit *testTest case to which the resource belongs.
kunit_resource_match_t matchmatch function to be applied to resources/match data.
void *match_datadata to be used in matching.
-
struct kunit_resource *kunit_find_named_resource(struct kunit *test, const char *name)¶
Find a resource using match name.
Parameters
struct kunit *testTest case to which the resource belongs.
const char *namematch name.
-
int kunit_destroy_resource(struct kunit *test, kunit_resource_match_t match, void *match_data)¶
Find a kunit_resource and destroy it.
Parameters
struct kunit *testTest case to which the resource belongs.
kunit_resource_match_t matchMatch function. Returns whether a given resource matches match_data.
void *match_dataData passed into match.
Return
0 if kunit_resource is found and freed, -ENOENT if not found.
-
void kunit_remove_resource(struct kunit *test, struct kunit_resource *res)¶
remove resource from resource list associated with test.
Parameters
struct kunit *testThe test context object.
struct kunit_resource *resThe resource to be removed.
Description
Note that the resource will not be immediately freed since it is likely
the caller has a reference to it via alloc_and_get() or find();
in this case a final call to kunit_put_resource() is required.
-
KUNIT_DEFINE_ACTION_WRAPPER¶
KUNIT_DEFINE_ACTION_WRAPPER (wrapper, orig, arg_type)
Wrap a function for use as a deferred action.
Parameters
wrapperThe name of the new wrapper function define.
origThe original function to wrap.
arg_typeThe type of the argument accepted by orig.
Description
Defines a wrapper for a function which accepts a single, pointer-sized
argument. This wrapper can then be passed to kunit_add_action() and
similar. This should be used in preference to casting a function
directly to kunit_action_t, as casting function pointers will break
control flow integrity (CFI), leading to crashes.
-
int kunit_add_action(struct kunit *test, kunit_action_t *action, void *ctx)¶
Call a function when the test ends.
Parameters
struct kunit *testTest case to associate the action with.
kunit_action_t *actionThe function to run on test exit
void *ctxData passed into func
Description
Defer the execution of a function until the test exits, either normally or
due to a failure. ctx is passed as additional context. All functions
registered with kunit_add_action() will execute in the opposite order to that
they were registered in.
This is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion.
See also: devm_add_action() for the devres equivalent.
Return
0 on success, an error if the action could not be deferred.
-
int kunit_add_action_or_reset(struct kunit *test, kunit_action_t *action, void *ctx)¶
Call a function when the test ends.
Parameters
struct kunit *testTest case to associate the action with.
kunit_action_t *actionThe function to run on test exit
void *ctxData passed into func
Description
Defer the execution of a function until the test exits, either normally or
due to a failure. ctx is passed as additional context. All functions
registered with kunit_add_action() will execute in the opposite order to that
they were registered in.
This is useful for cleaning up allocated memory and resources, as these functions are called even if the test aborts early due to, e.g., a failed assertion.
If the action cannot be created (e.g., due to the system being out of memory), then action(ctx) will be called immediately, and an error will be returned.
See also: devm_add_action_or_reset() for the devres equivalent.
Return
0 on success, an error if the action could not be deferred.
-
void kunit_remove_action(struct kunit *test, kunit_action_t *action, void *ctx)¶
Cancel a matching deferred action.
Parameters
struct kunit *testTest case the action is associated with.
kunit_action_t *actionThe deferred function to cancel.
void *ctxThe context passed to the deferred function to trigger.
Description
Prevent an action deferred via kunit_add_action() from executing when the
test terminates.
If the function/context pair was deferred multiple times, only the most recent one will be cancelled.
See also: devm_remove_action() for the devres equivalent.
-
void kunit_release_action(struct kunit *test, kunit_action_t *action, void *ctx)¶
Run a matching action call immediately.
Parameters
struct kunit *testTest case the action is associated with.
kunit_action_t *actionThe deferred function to trigger.
void *ctxThe context passed to the deferred function to trigger.
Description
Execute a function deferred via kunit_add_action()) immediately, rather than
when the test ends.
If the function/context pair was deferred multiple times, it will only be executed once here. The most recent deferral will no longer execute when the test ends.
kunit_release_action(test, func, ctx); is equivalent to func(ctx); kunit_remove_action(test, func, ctx);
See also: devm_release_action() for the devres equivalent.
Managed Devices¶
Functions for using KUnit-managed struct device and struct device_driver.
Include kunit/device.h to use these.
-
struct device_driver *kunit_driver_create(struct kunit *test, const char *name)¶
Create a
struct device_driverattached to the kunit_bus
Parameters
struct kunit *testThe test context object.
const char *nameThe name to give the created driver.
Description
Creates a struct device_driver attached to the kunit_bus, with the name name.
This driver will automatically be cleaned up on test exit.
Return
a stub struct device_driver, managed by KUnit, with the name name.
-
struct device *kunit_device_register(struct kunit *test, const char *name)¶
Create a
struct devicefor use in KUnit tests
Parameters
struct kunit *testThe test context object.
const char *nameThe name to give the created device.
Description
Creates a struct kunit_device (which is a struct device) with the given name,
and a corresponding driver. The device and driver will be cleaned up on test
exit, or when kunit_device_unregister is called. See also
kunit_device_register_with_driver, if you wish to provide your own
struct device_driver.
Return
a pointer to a struct device which will be cleaned up when the test
exits, or an error pointer if the device could not be allocated or registered.
-
struct device *kunit_device_register_with_driver(struct kunit *test, const char *name, const struct device_driver *drv)¶
Create a
struct devicefor use in KUnit tests
Parameters
struct kunit *testThe test context object.
const char *nameThe name to give the created device.
const struct device_driver *drvThe
struct device_driverto associate with the device.
Description
Creates a struct kunit_device (which is a struct device) with the given
name, and driver. The device will be cleaned up on test exit, or when
kunit_device_unregister is called. See also kunit_device_register, if you
wish KUnit to create and manage a driver for you.
Return
a pointer to a struct device which will be cleaned up when the test
exits, or an error pointer if the device could not be allocated or registered.
-
void kunit_device_unregister(struct kunit *test, struct device *dev)¶
Unregister a KUnit-managed device
Parameters
struct kunit *testThe test context object which created the device
struct device *devThe device.
Description
Unregisters and destroys a struct device which was created with
kunit_device_register or kunit_device_register_with_driver. If KUnit created
a driver, cleans it up as well.