5ca9c731d7
Added unit tests for rpm-ostree ex kargs --delete, --append and --replace. Also exposed two getter functions for kargs table and array so people can retrieve information from kargs. Also includes a minor fix for a bug caught by the unit test. Closes: #1013 Approved by: cgwalters
171 lines
6.5 KiB
C
171 lines
6.5 KiB
C
#include "config.h"
|
|
#include "libglnx.h"
|
|
#include "rpmostree-kargs-process.h"
|
|
|
|
static gboolean
|
|
check_string_existance (OstreeKernelArgs *karg,
|
|
const char *string_to_find)
|
|
{
|
|
g_autofree gchar* string_with_spaces = _ostree_kernel_args_to_string (karg);
|
|
g_auto(GStrv) string_list = g_strsplit (string_with_spaces, " ", -1);
|
|
return g_strv_contains ((const char* const*) string_list, string_to_find);
|
|
}
|
|
|
|
static void
|
|
test_kargs_delete (void)
|
|
{
|
|
g_autoptr(GError) error = NULL;
|
|
gboolean ret;
|
|
int key_index = 0;
|
|
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *karg = _ostree_kernel_args_new ();
|
|
|
|
_ostree_kernel_args_append (karg, "single_key=test");
|
|
_ostree_kernel_args_append (karg, "test=firstval");
|
|
_ostree_kernel_args_append (karg, "test=secondval");
|
|
|
|
/* Delete a non-existant key should fail */
|
|
ret = _ostree_kernel_args_delete (karg, "non_existant_key", &error);
|
|
g_assert (!ret);
|
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
|
g_clear_error (&error);
|
|
|
|
/* Delete a key with multiple values when only specifying key should fail */
|
|
ret = _ostree_kernel_args_delete (karg, "test", &error);
|
|
g_assert (!ret);
|
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
|
g_clear_error (&error);
|
|
|
|
/* Delete a key with a non existant value should fail */
|
|
ret = _ostree_kernel_args_delete (karg, "test=non_existant_value", &error);
|
|
g_assert (!ret);
|
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
|
g_clear_error (&error);
|
|
|
|
/* Delete a key with only one value should succeed by only specifying key */
|
|
ret = _ostree_kernel_args_delete (karg, "single_key", &error);
|
|
g_assert (ret);
|
|
g_assert_no_error (error);
|
|
/* verify the value array is properly updated */
|
|
GPtrArray *kargs_array = _ostree_kernel_arg_get_key_array (karg);
|
|
g_assert (!_ostree_ptr_array_find (kargs_array, "single_key", &key_index));
|
|
g_assert (!check_string_existance (karg, "single_key"));
|
|
|
|
/* Delete a key/value pair by specifying correct key=value should succeed */
|
|
ret = _ostree_kernel_args_delete (karg, "test=secondval", &error);
|
|
g_assert (ret);
|
|
g_assert_no_error (error);
|
|
g_assert (!check_string_existance (karg, "test=secondval"));
|
|
|
|
}
|
|
|
|
static void
|
|
test_kargs_replace (void)
|
|
{
|
|
g_autoptr(GError) error = NULL;
|
|
gboolean ret;
|
|
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *karg = _ostree_kernel_args_new ();
|
|
|
|
_ostree_kernel_args_append (karg, "single_key");
|
|
_ostree_kernel_args_append (karg, "test=firstval");
|
|
_ostree_kernel_args_append (karg, "test=secondval");
|
|
|
|
/* Replace when the input key is non-existant should fail */
|
|
ret = _ostree_kernel_args_new_replace (karg, "nonexistantkey", &error);
|
|
g_assert (!ret);
|
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
|
g_clear_error (&error);
|
|
|
|
/* Replace non-existant value with input key=nonexistantvalue=newvalue should fail */
|
|
ret = _ostree_kernel_args_new_replace (karg, "single_key=nonexistantval=newval", &error);
|
|
g_assert (!ret);
|
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
|
g_clear_error (&error);
|
|
|
|
/* Replace with input key=value will fail for a key with multiple values */
|
|
ret = _ostree_kernel_args_new_replace (karg, "test=newval", &error);
|
|
g_assert (!ret);
|
|
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
|
g_clear_error (&error);
|
|
|
|
/* Replace with input key=value for a key with single value should succeed
|
|
* Also note, we also allow ''(empty string) valid to be a value
|
|
*/
|
|
ret = _ostree_kernel_args_new_replace (karg, "single_key=newvalue", &error);
|
|
g_assert (ret);
|
|
g_assert_no_error (error);
|
|
g_assert (check_string_existance (karg, "single_key=newvalue"));
|
|
|
|
/* Replace with input key=value=newvalue if key and value both
|
|
* exist, the action should succeed
|
|
*/
|
|
ret = _ostree_kernel_args_new_replace (karg, "test=firstval=newval", &error);
|
|
g_assert (ret);
|
|
g_assert_no_error (error);
|
|
g_assert (check_string_existance (karg, "test=newval"));
|
|
}
|
|
|
|
|
|
/* In this function, we want to verify that _ostree_kernel_args_append
|
|
* and _ostree_kernel_args_to_string is correct. After that
|
|
* we will use these two functions(append and tostring) in other tests: delete and replace
|
|
*/
|
|
static void
|
|
test_kargs_append (void)
|
|
|
|
{
|
|
/* Note, here we assume the _ostree_ptr_array_find has
|
|
* a working functionality, as it shares a similar logic
|
|
* as the GLib function, and easy to tell the correctness of it
|
|
*/
|
|
int test_num = 0;
|
|
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *append_arg = _ostree_kernel_args_new ();
|
|
/* Some valid cases (key=value) pair */
|
|
_ostree_kernel_args_append (append_arg, "test=valid");
|
|
_ostree_kernel_args_append (append_arg, "test=secondvalid");
|
|
/* Add some 'invalid cases' */
|
|
_ostree_kernel_args_append (append_arg, "second_test");
|
|
|
|
/* We loops through the kargs inside table to verify
|
|
* the functionality of append because at this stage
|
|
* we have yet to find the conversion kargs to string fully "functional"
|
|
*/
|
|
GHashTable *kargs_table = _ostree_kernel_arg_get_kargs_table (append_arg);
|
|
GLNX_HASH_TABLE_FOREACH_KV (kargs_table, const char*, key, GPtrArray*, value_array)
|
|
{
|
|
if ( g_strcmp0 (key, "test") == 0)
|
|
{
|
|
g_assert (_ostree_ptr_array_find (value_array, "valid", &test_num));
|
|
g_assert (_ostree_ptr_array_find (value_array, "secondvalid", &test_num));
|
|
}
|
|
else
|
|
g_assert (_ostree_ptr_array_find (value_array, "", &test_num));
|
|
}
|
|
/* verify the value array is properly updated */
|
|
GPtrArray *kargs_array = _ostree_kernel_arg_get_key_array (append_arg);
|
|
g_assert (_ostree_ptr_array_find (kargs_array, "test", &test_num));
|
|
g_assert (_ostree_ptr_array_find (kargs_array, "second_test", &test_num));
|
|
|
|
/* Up till this point, we verified that the above was all correct, we then
|
|
* check _ostree_kernel_args_to_string has the right result
|
|
*/
|
|
g_autofree gchar* kargs_str = _ostree_kernel_args_to_string (append_arg);
|
|
g_auto(GStrv) kargs_list = g_strsplit(kargs_str, " ", -1);
|
|
g_assert (g_strv_contains ((const char* const *)kargs_list, "test=valid"));
|
|
g_assert (g_strv_contains ((const char* const *)kargs_list, "second_test"));
|
|
g_assert (g_strv_contains ((const char* const *)kargs_list, "test=secondvalid"));
|
|
g_assert_cmpint (3, ==, g_strv_length (kargs_list));
|
|
|
|
}
|
|
|
|
int
|
|
main (int argc,
|
|
char *argv[])
|
|
{
|
|
g_test_init (&argc, &argv, NULL);
|
|
|
|
g_test_add_func ("/kargs/kargs_append", test_kargs_append);
|
|
g_test_add_func ("/kargs/kargs_delete", test_kargs_delete);
|
|
g_test_add_func ("/kargs/kargs_replace", test_kargs_replace);
|
|
return g_test_run ();
|
|
}
|