Adding upstream version 2.0.24.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
e508fcfeb9
commit
afb0a8fea7
118 changed files with 45084 additions and 0 deletions
125
tests/client/test_client.c
Normal file
125
tests/client/test_client.c
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <cmocka.h>
|
||||
#include <libyang/libyang.h>
|
||||
#include <log.h>
|
||||
#include <session_client.h>
|
||||
#include "tests/config.h"
|
||||
|
||||
static int
|
||||
setup_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
|
||||
nc_verbosity(NC_VERB_VERBOSE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
teardown_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_setting_schema_searchpath(void **state)
|
||||
{
|
||||
(void)state;
|
||||
const char *path;
|
||||
int ret;
|
||||
|
||||
/* initiate client */
|
||||
nc_client_init();
|
||||
|
||||
path = nc_client_get_schema_searchpath();
|
||||
assert_null(path);
|
||||
|
||||
ret = nc_client_set_schema_searchpath("path");
|
||||
assert_int_equal(ret, 0);
|
||||
path = nc_client_get_schema_searchpath();
|
||||
assert_string_equal(path, "path");
|
||||
|
||||
ret = nc_client_set_schema_searchpath("path1");
|
||||
assert_int_equal(ret, 0);
|
||||
path = nc_client_get_schema_searchpath();
|
||||
assert_string_equal(path, "path1");
|
||||
}
|
||||
|
||||
LY_ERR
|
||||
test_clb(const char *mod_name, const char *mod_rev, const char *submod_name, const char *sub_rev, void *user_data,
|
||||
LYS_INFORMAT *format, const char **model_data, void (**free_module_data)(void *model_data, void *user_data))
|
||||
{
|
||||
(void)mod_name;
|
||||
(void)mod_rev;
|
||||
(void)submod_name;
|
||||
(void)sub_rev;
|
||||
(void)user_data;
|
||||
(void)format;
|
||||
(void)model_data;
|
||||
(void)free_module_data;
|
||||
|
||||
return LY_SUCCESS;
|
||||
}
|
||||
|
||||
LY_ERR
|
||||
test_clb1(const char *mod_name, const char *mod_rev, const char *submod_name, const char *sub_rev, void *user_data,
|
||||
LYS_INFORMAT *format, const char **model_data, void (**free_module_data)(void *model_data, void *user_data))
|
||||
{
|
||||
(void)mod_name;
|
||||
(void)mod_rev;
|
||||
(void)submod_name;
|
||||
(void)sub_rev;
|
||||
(void)user_data;
|
||||
(void)format;
|
||||
(void)model_data;
|
||||
(void)free_module_data;
|
||||
|
||||
return LY_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_setting_schema_callback(void **state)
|
||||
{
|
||||
(void)state;
|
||||
ly_module_imp_clb ret_f;
|
||||
char *data_ret;
|
||||
int ret;
|
||||
|
||||
ret_f = nc_client_get_schema_callback((void **)&data_ret);
|
||||
assert_null(ret_f);
|
||||
assert_null(data_ret);
|
||||
|
||||
ret = nc_client_set_schema_callback(test_clb, "DATA");
|
||||
assert_int_equal(ret, 0);
|
||||
ret_f = nc_client_get_schema_callback((void **)&data_ret);
|
||||
assert_ptr_equal(test_clb, ret_f);
|
||||
assert_string_equal("DATA", data_ret);
|
||||
|
||||
ret = nc_client_set_schema_callback(test_clb1, "DATA1");
|
||||
assert_int_equal(ret, 0);
|
||||
ret_f = nc_client_get_schema_callback((void **)&data_ret);
|
||||
assert_ptr_equal(test_clb1, ret_f);
|
||||
assert_string_equal("DATA1", data_ret);
|
||||
|
||||
/* destroy client */
|
||||
nc_client_destroy();
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_setting_schema_searchpath, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_setting_schema_callback, setup_f, teardown_f),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
709
tests/client/test_client_messages.c
Normal file
709
tests/client/test_client_messages.c
Normal file
|
@ -0,0 +1,709 @@
|
|||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <cmocka.h>
|
||||
#include <config.h>
|
||||
#include <libyang/libyang.h>
|
||||
#include <log.h>
|
||||
#include <messages_p.h>
|
||||
#include <session_client.h>
|
||||
#include "tests/config.h"
|
||||
|
||||
static int
|
||||
setup_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
|
||||
nc_verbosity(NC_VERB_VERBOSE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
teardown_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_act_generic_xml(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
struct nc_rpc_act_generic *generic_rpc = NULL;
|
||||
|
||||
/* create generic rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_act_generic_xml("xml", NC_PARAMTYPE_CONST);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_ACT_GENERIC);
|
||||
generic_rpc = (struct nc_rpc_act_generic *)rpc;
|
||||
assert_int_equal(generic_rpc->type, NC_RPC_ACT_GENERIC);
|
||||
assert_int_equal(generic_rpc->has_data, 0);
|
||||
assert_string_equal(generic_rpc->content.xml_str, "xml");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create generic rpc with NC_PARAMTYPE_FREE */
|
||||
char *str = strdup("str");
|
||||
|
||||
rpc = nc_rpc_act_generic_xml(str, NC_PARAMTYPE_FREE);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_ACT_GENERIC);
|
||||
generic_rpc = (struct nc_rpc_act_generic *)rpc;
|
||||
assert_int_equal(generic_rpc->type, NC_RPC_ACT_GENERIC);
|
||||
assert_int_equal(generic_rpc->has_data, 0);
|
||||
assert_string_equal(generic_rpc->content.xml_str, str);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create generic rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_act_generic_xml("xml", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_ACT_GENERIC);
|
||||
generic_rpc = (struct nc_rpc_act_generic *)rpc;
|
||||
assert_int_equal(generic_rpc->type, NC_RPC_ACT_GENERIC);
|
||||
assert_int_equal(generic_rpc->has_data, 0);
|
||||
assert_string_equal(generic_rpc->content.xml_str, "xml");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_act_generic(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
struct nc_rpc_act_generic *generic_rpc = NULL;
|
||||
struct lyd_node node;
|
||||
|
||||
node.next = NULL;
|
||||
node.prev = &node;
|
||||
|
||||
rpc = nc_rpc_act_generic(&node, NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_ACT_GENERIC);
|
||||
generic_rpc = (struct nc_rpc_act_generic *)rpc;
|
||||
assert_int_equal(generic_rpc->type, NC_RPC_ACT_GENERIC);
|
||||
assert_int_equal(generic_rpc->has_data, 1);
|
||||
assert_ptr_equal(generic_rpc->content.data, &node);
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of getconfig rpc are set correctly */
|
||||
void
|
||||
check_getconfig(struct nc_rpc *rpc, enum NC_DATASTORE_TYPE source, char *filter, NC_WD_MODE wd_mode)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_GETCONFIG);
|
||||
struct nc_rpc_getconfig *getconfig_rpc = (struct nc_rpc_getconfig *)rpc;
|
||||
|
||||
assert_int_equal(getconfig_rpc->type, NC_RPC_GETCONFIG);
|
||||
assert_int_equal(getconfig_rpc->source, source);
|
||||
assert_string_equal(getconfig_rpc->filter, filter);
|
||||
assert_int_equal(getconfig_rpc->wd_mode, wd_mode);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_getconfig(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create getconfig rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_getconfig(NC_DATASTORE_CANDIDATE, "filter-string", NC_WD_UNKNOWN, NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_getconfig(rpc, NC_DATASTORE_CANDIDATE, "filter-string", NC_WD_UNKNOWN);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create getconfig rpc with NC_PARAMTYPE_FREE */
|
||||
char *filter = strdup("string");
|
||||
|
||||
rpc = nc_rpc_getconfig(NC_DATASTORE_CONFIG, filter, NC_WD_EXPLICIT, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_getconfig(rpc, NC_DATASTORE_CONFIG, filter, NC_WD_EXPLICIT);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create getconfig rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_getconfig(NC_DATASTORE_RUNNING, "filter", NC_WD_ALL, NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_getconfig(rpc, NC_DATASTORE_RUNNING, "filter", NC_WD_ALL);
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of edit rpc are set correctly */
|
||||
void
|
||||
check_edit(struct nc_rpc *rpc, NC_DATASTORE target, NC_RPC_EDIT_DFLTOP default_op, NC_RPC_EDIT_TESTOPT test_opt,
|
||||
NC_RPC_EDIT_ERROPT error_opt, const char *edit_content)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_EDIT);
|
||||
struct nc_rpc_edit *edit_rpc = (struct nc_rpc_edit *)rpc;
|
||||
|
||||
assert_int_equal(edit_rpc->type, NC_RPC_EDIT);
|
||||
assert_int_equal(edit_rpc->target, target);
|
||||
assert_int_equal(edit_rpc->default_op, default_op);
|
||||
assert_int_equal(edit_rpc->test_opt, test_opt);
|
||||
assert_int_equal(edit_rpc->error_opt, error_opt);
|
||||
assert_string_equal(edit_rpc->edit_cont, edit_content);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_edit(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create edit rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_edit(NC_DATASTORE_RUNNING, NC_RPC_EDIT_DFLTOP_REPLACE, NC_RPC_EDIT_TESTOPT_TESTSET,
|
||||
NC_RPC_EDIT_ERROPT_STOP, "url", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_edit(rpc, NC_DATASTORE_RUNNING, NC_RPC_EDIT_DFLTOP_REPLACE,
|
||||
NC_RPC_EDIT_TESTOPT_TESTSET, NC_RPC_EDIT_ERROPT_STOP, "url");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create edit rpc with NC_PARAMTYPE_FREE */
|
||||
char *str = strdup("string");
|
||||
|
||||
rpc = nc_rpc_edit(NC_DATASTORE_CANDIDATE, NC_RPC_EDIT_DFLTOP_MERGE, NC_RPC_EDIT_TESTOPT_SET,
|
||||
NC_RPC_EDIT_ERROPT_ROLLBACK, str, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_edit(rpc, NC_DATASTORE_CANDIDATE, NC_RPC_EDIT_DFLTOP_MERGE,
|
||||
NC_RPC_EDIT_TESTOPT_SET, NC_RPC_EDIT_ERROPT_ROLLBACK, str);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create edit rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_edit(NC_DATASTORE_CONFIG, NC_RPC_EDIT_DFLTOP_NONE, NC_RPC_EDIT_TESTOPT_TEST,
|
||||
NC_RPC_EDIT_ERROPT_CONTINUE, "url1", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_edit(rpc, NC_DATASTORE_CONFIG, NC_RPC_EDIT_DFLTOP_NONE,
|
||||
NC_RPC_EDIT_TESTOPT_TEST, NC_RPC_EDIT_ERROPT_CONTINUE, "url1");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of copy rpc are set correctly */
|
||||
void
|
||||
check_copy(struct nc_rpc *rpc, NC_DATASTORE target, const char *url_trg, NC_DATASTORE source,
|
||||
const char *url_or_config_src, NC_WD_MODE wd_mode)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_COPY);
|
||||
struct nc_rpc_copy *copy_rpc = (struct nc_rpc_copy *)rpc;
|
||||
|
||||
assert_int_equal(copy_rpc->type, NC_RPC_COPY);
|
||||
assert_int_equal(copy_rpc->target, target);
|
||||
assert_string_equal(copy_rpc->url_trg, url_trg);
|
||||
assert_int_equal(copy_rpc->source, source);
|
||||
assert_string_equal(copy_rpc->url_config_src, url_or_config_src);
|
||||
assert_int_equal(copy_rpc->wd_mode, wd_mode);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_copy(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create copy rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_copy(NC_DATASTORE_RUNNING, "target-url", NC_DATASTORE_RUNNING, "src-url",
|
||||
NC_WD_ALL, NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_copy(rpc, NC_DATASTORE_RUNNING, "target-url", NC_DATASTORE_RUNNING, "src-url", NC_WD_ALL);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create copy rpc with NC_PARAMTYPE_FREE */
|
||||
char *target = strdup("target");
|
||||
char *src = strdup("src");
|
||||
|
||||
rpc = nc_rpc_copy(NC_DATASTORE_STARTUP, target, NC_DATASTORE_RUNNING, src,
|
||||
NC_WD_ALL_TAG, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_copy(rpc, NC_DATASTORE_STARTUP, target, NC_DATASTORE_RUNNING, src, NC_WD_ALL_TAG);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create copy rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_copy(NC_DATASTORE_STARTUP, "url", NC_DATASTORE_CANDIDATE, "url",
|
||||
NC_WD_TRIM, NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_copy(rpc, NC_DATASTORE_STARTUP, "url", NC_DATASTORE_CANDIDATE, "url", NC_WD_TRIM);
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of delete rpc are set correctly */
|
||||
void
|
||||
check_delete(struct nc_rpc *rpc, NC_DATASTORE target, const char *url)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_DELETE);
|
||||
struct nc_rpc_delete *delete_rpc = (struct nc_rpc_delete *)rpc;
|
||||
|
||||
assert_int_equal(delete_rpc->type, NC_RPC_DELETE);
|
||||
assert_int_equal(delete_rpc->target, target);
|
||||
assert_string_equal(delete_rpc->url, url);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_delete(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create delete rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_delete(NC_DATASTORE_RUNNING, "target-url", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_delete(rpc, NC_DATASTORE_RUNNING, "target-url");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create delete rpc with NC_PARAMTYPE_FREE */
|
||||
char *url = strdup("url");
|
||||
|
||||
rpc = nc_rpc_delete(NC_DATASTORE_CANDIDATE, url, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_delete(rpc, NC_DATASTORE_CANDIDATE, url);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create delete rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_delete(NC_DATASTORE_CONFIG, "target", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_delete(rpc, NC_DATASTORE_CONFIG, "target");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_lock(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
struct nc_rpc_lock *lock_rpc = NULL;
|
||||
|
||||
rpc = nc_rpc_lock(NC_DATASTORE_RUNNING);
|
||||
assert_non_null(rpc);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_LOCK);
|
||||
|
||||
lock_rpc = (struct nc_rpc_lock *)rpc;
|
||||
assert_int_equal(lock_rpc->type, NC_RPC_LOCK);
|
||||
assert_int_equal(lock_rpc->target, NC_DATASTORE_RUNNING);
|
||||
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_unlock(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
struct nc_rpc_lock *unlock_rpc = NULL;
|
||||
|
||||
rpc = nc_rpc_unlock(NC_DATASTORE_RUNNING);
|
||||
assert_non_null(rpc);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_UNLOCK);
|
||||
|
||||
unlock_rpc = (struct nc_rpc_lock *)rpc;
|
||||
assert_int_equal(unlock_rpc->type, NC_RPC_UNLOCK);
|
||||
assert_int_equal(unlock_rpc->target, NC_DATASTORE_RUNNING);
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of get rpc are set correctly */
|
||||
void
|
||||
check_get_rpc(struct nc_rpc *rpc, const char *filter, NC_WD_MODE wd_mode)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_GET);
|
||||
struct nc_rpc_get *get_rpc = (struct nc_rpc_get *)rpc;
|
||||
|
||||
assert_int_equal(get_rpc->type, NC_RPC_GET);
|
||||
assert_string_equal(get_rpc->filter, filter);
|
||||
assert_int_equal(get_rpc->wd_mode, wd_mode);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_get(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create get rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_get("filter", NC_WD_ALL, NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_get_rpc(rpc, "filter", NC_WD_ALL);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create get rpc with NC_PARAMTYPE_FREE */
|
||||
char *str = strdup("string");
|
||||
|
||||
rpc = nc_rpc_get(str, NC_WD_EXPLICIT, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_get_rpc(rpc, str, NC_WD_EXPLICIT);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create get rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_get("filter-string", NC_WD_UNKNOWN, NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_get_rpc(rpc, "filter-string", NC_WD_UNKNOWN);
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_kill(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
struct nc_rpc_kill *kill_rpc = NULL;
|
||||
|
||||
rpc = nc_rpc_kill(10);
|
||||
assert_non_null(rpc);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_KILL);
|
||||
|
||||
kill_rpc = (struct nc_rpc_kill *)rpc;
|
||||
assert_int_equal(kill_rpc->type, NC_RPC_KILL);
|
||||
assert_int_equal(kill_rpc->sid, 10);
|
||||
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of commit rpc are set correctly */
|
||||
void
|
||||
check_commit_rpc(struct nc_rpc *rpc, int confirmed, uint32_t confirm_timeout, const char *persist, const char *persist_id)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_COMMIT);
|
||||
struct nc_rpc_commit *commit_rpc = (struct nc_rpc_commit *)rpc;
|
||||
|
||||
assert_int_equal(commit_rpc->type, NC_RPC_COMMIT);
|
||||
assert_int_equal(commit_rpc->confirmed, confirmed);
|
||||
assert_int_equal(commit_rpc->confirm_timeout, confirm_timeout);
|
||||
assert_string_equal(commit_rpc->persist, persist);
|
||||
assert_string_equal(commit_rpc->persist_id, persist_id);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_commit(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create commit rpc with NC_PARAMTYPE_CONST*/
|
||||
rpc = nc_rpc_commit(1, 100, "persist", "persist-id", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_commit_rpc(rpc, 1, 100, "persist", "persist-id");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create commit rpc with NC_PARAMTYPE_FREE*/
|
||||
char *str1 = strdup("str1");
|
||||
char *str2 = strdup("str2");
|
||||
|
||||
rpc = nc_rpc_commit(2, 5, str1, str2, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_commit_rpc(rpc, 2, 5, str1, str2);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create commit rpc with NC_PARAMTYPE_DUP_AND_FREE*/
|
||||
rpc = nc_rpc_commit(10, 200, "persistent", "persistent-id", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_commit_rpc(rpc, 10, 200, "persistent", "persistent-id");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_discard(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
rpc = nc_rpc_discard();
|
||||
assert_non_null(rpc);
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_DISCARD);
|
||||
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of cancel rpc are set correctly */
|
||||
void
|
||||
check_cancel_rpc(struct nc_rpc *rpc, const char *persist_id)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_CANCEL);
|
||||
struct nc_rpc_cancel *cancel_rpc = (struct nc_rpc_cancel *)rpc;
|
||||
|
||||
assert_int_equal(cancel_rpc->type, NC_RPC_CANCEL);
|
||||
assert_string_equal(cancel_rpc->persist_id, persist_id);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_cancel(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create cancel rpc with NC_PARAMTYPE_CONST*/
|
||||
rpc = nc_rpc_cancel("persist-id", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_cancel_rpc(rpc, "persist-id");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create cancel rpc with NC_PARAMTYPE_FREE*/
|
||||
char *str = strdup("string");
|
||||
|
||||
rpc = nc_rpc_cancel(str, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_cancel_rpc(rpc, str);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create cancel rpc with NC_PARAMTYPE_DUP_AND_FREE*/
|
||||
rpc = nc_rpc_cancel("id", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_cancel_rpc(rpc, "id");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of validate rpc are set correctly */
|
||||
void
|
||||
check_validate_rpc(struct nc_rpc *rpc, NC_DATASTORE source, const char *url_or_config)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_VALIDATE);
|
||||
struct nc_rpc_validate *validate_rpc = (struct nc_rpc_validate *)rpc;
|
||||
|
||||
assert_int_equal(validate_rpc->type, NC_RPC_VALIDATE);
|
||||
assert_int_equal(validate_rpc->source, source);
|
||||
assert_string_equal(validate_rpc->url_config_src, url_or_config);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_validate(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create validate rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_validate(NC_DATASTORE_RUNNING, "url", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_validate_rpc(rpc, NC_DATASTORE_RUNNING, "url");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create validate rpc with NC_PARAMTYPE_FREE */
|
||||
char *str = strdup("string");
|
||||
|
||||
rpc = nc_rpc_validate(NC_DATASTORE_CANDIDATE, str, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_validate_rpc(rpc, NC_DATASTORE_CANDIDATE, str);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create validate rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_validate(NC_DATASTORE_CONFIG, "url1", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_validate_rpc(rpc, NC_DATASTORE_CONFIG, "url1");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of getschema rpc are set correctly */
|
||||
void
|
||||
check_getschema_rpc(struct nc_rpc *rpc, const char *identifier, const char *version, const char *format)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_GETSCHEMA);
|
||||
struct nc_rpc_getschema *getchema_rpc = (struct nc_rpc_getschema *)rpc;
|
||||
|
||||
assert_int_equal(getchema_rpc->type, NC_RPC_GETSCHEMA);
|
||||
assert_string_equal(getchema_rpc->identifier, identifier);
|
||||
assert_string_equal(getchema_rpc->version, version);
|
||||
assert_string_equal(getchema_rpc->format, format);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_getschema(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create getchema with NC_PARAMTYPE_CONST*/
|
||||
rpc = nc_rpc_getschema("id", "version", "format", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_getschema_rpc(rpc, "id", "version", "format");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create getchema with NC_PARAMTYPE_FREE*/
|
||||
char *str1 = strdup("str1");
|
||||
char *str2 = strdup("str2");
|
||||
char *str3 = strdup("str3");
|
||||
|
||||
rpc = nc_rpc_getschema(str1, str2, str3, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_getschema_rpc(rpc, str1, str2, str3);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create getchema with NC_PARAMTYPE_DUP_AND_FREE*/
|
||||
rpc = nc_rpc_getschema("id1", "version1", "format1", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_getschema_rpc(rpc, "id1", "version1", "format1");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of subscribe rpc are set correctly */
|
||||
void
|
||||
check_subscribe_rpc(struct nc_rpc *rpc, const char *stream_name, const char *filter,
|
||||
const char *start_time, const char *stop_time)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_SUBSCRIBE);
|
||||
struct nc_rpc_subscribe *subscribe_rpc = (struct nc_rpc_subscribe *)rpc;
|
||||
|
||||
assert_int_equal(subscribe_rpc->type, NC_RPC_SUBSCRIBE);
|
||||
assert_string_equal(subscribe_rpc->stream, stream_name);
|
||||
assert_string_equal(subscribe_rpc->filter, filter);
|
||||
assert_string_equal(subscribe_rpc->start, start_time);
|
||||
assert_string_equal(subscribe_rpc->stop, stop_time);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_subscribe(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create subscribe rpc with NC_PARAMTYPE_CONST*/
|
||||
rpc = nc_rpc_subscribe("stream-name", "filter", "start-time", "stop-time", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_subscribe_rpc(rpc, "stream-name", "filter", "start-time", "stop-time");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create subscribe rpc with NC_PARAMTYPE_FREE*/
|
||||
char *str1 = strdup("str1");
|
||||
char *str2 = strdup("str2");
|
||||
char *str3 = strdup("str3");
|
||||
char *str4 = strdup("str4");
|
||||
|
||||
rpc = nc_rpc_subscribe(str1, str2, str3, str4, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_subscribe_rpc(rpc, str1, str2, str3, str4);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create subscribe rpc with NC_PARAMTYPE_DUP_AND_FREE*/
|
||||
rpc = nc_rpc_subscribe("name", "filter-str", "start", "stop", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_subscribe_rpc(rpc, "name", "filter-str", "start", "stop");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of getdata rpc are set correctly */
|
||||
void
|
||||
check_getdata(struct nc_rpc *rpc, char *datastore, const char *filter, const char *config_filter,
|
||||
char **origin_filter, int origin_filter_count, int negated_origin_filter, uint16_t max_depth,
|
||||
int with_origin, NC_WD_MODE wd_mode)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_GETDATA);
|
||||
struct nc_rpc_getdata *rpc_getdata = (struct nc_rpc_getdata *)rpc;
|
||||
|
||||
assert_int_equal(rpc_getdata->type, NC_RPC_GETDATA);
|
||||
assert_string_equal(rpc_getdata->datastore, datastore);
|
||||
assert_string_equal(rpc_getdata->filter, filter);
|
||||
assert_string_equal(rpc_getdata->config_filter, config_filter);
|
||||
assert_string_equal(*rpc_getdata->origin_filter, *origin_filter);
|
||||
assert_int_equal(rpc_getdata->origin_filter_count, origin_filter_count);
|
||||
assert_int_equal(rpc_getdata->negated_origin_filter, negated_origin_filter);
|
||||
assert_int_equal(rpc_getdata->max_depth, max_depth);
|
||||
assert_int_equal(rpc_getdata->with_origin, with_origin);
|
||||
assert_int_equal(rpc_getdata->wd_mode, wd_mode);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_getdata(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create getdata rpc with NC_PARAMTYPE_CONST */
|
||||
char *origin_filters = "origin_filter";
|
||||
|
||||
rpc = nc_rpc_getdata("candidate", "filter", "true", &origin_filters, 1, 1, 3, 1, NC_WD_UNKNOWN, NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_getdata(rpc, "candidate", "filter", "true", &origin_filters, 1, 1, 3, 1, NC_WD_UNKNOWN);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create getdata rpc with NC_PARAMTYPE_FREE */
|
||||
char *datastore = strdup("running");
|
||||
char *filter = strdup("filter");
|
||||
char *config_filter = strdup("true");
|
||||
char buf[20] = {0};
|
||||
char **origin_filter;
|
||||
int origin_filter_count = 2;
|
||||
|
||||
origin_filter = calloc(origin_filter_count, sizeof *origin_filter);
|
||||
assert_non_null(origin_filter);
|
||||
for (int i = 0; i < origin_filter_count; i++) {
|
||||
snprintf(buf, sizeof(buf) - 1, "origin_filter%d", i + 1);
|
||||
origin_filter[i] = strdup(buf);
|
||||
}
|
||||
|
||||
rpc = nc_rpc_getdata(datastore, filter, config_filter, origin_filter, origin_filter_count, 2, 3, 1, NC_WD_EXPLICIT, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_getdata(rpc, datastore, filter, config_filter, origin_filter, origin_filter_count, 2, 3, 1, NC_WD_EXPLICIT);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create getdata rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
char *origin_filter1 = "origin_filter1";
|
||||
|
||||
rpc = nc_rpc_getdata("startup", "filter1", "false", &origin_filter1, 1, 0, 3, 1, NC_WD_ALL, NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_getdata(rpc, "startup", "filter1", "false", &origin_filter1, 1, 0, 3, 1, NC_WD_ALL);
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
/* function to check if values of editdata rpc are set correctly */
|
||||
void
|
||||
check_editdata(struct nc_rpc *rpc, char *datastore, NC_RPC_EDIT_DFLTOP default_op, const char *edit_content)
|
||||
{
|
||||
assert_int_equal(nc_rpc_get_type(rpc), NC_RPC_EDITDATA);
|
||||
struct nc_rpc_editdata *rpc_editdata = (struct nc_rpc_editdata *)rpc;
|
||||
|
||||
assert_int_equal(rpc_editdata->type, NC_RPC_EDITDATA);
|
||||
assert_string_equal(rpc_editdata->datastore, datastore);
|
||||
assert_int_equal(rpc_editdata->default_op, default_op);
|
||||
assert_string_equal(rpc_editdata->edit_cont, edit_content);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_rpc_editdata(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_rpc *rpc = NULL;
|
||||
|
||||
/* create editdata rpc with NC_PARAMTYPE_CONST */
|
||||
rpc = nc_rpc_editdata("candidate", NC_RPC_EDIT_DFLTOP_UNKNOWN, "edit", NC_PARAMTYPE_CONST);
|
||||
assert_non_null(rpc);
|
||||
check_editdata(rpc, "candidate", NC_RPC_EDIT_DFLTOP_UNKNOWN, "edit");
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create editdata rpc with NC_PARAMTYPE_FREE */
|
||||
char *datastore = strdup("running");
|
||||
char *edit_cont = strdup("edit_data");
|
||||
|
||||
rpc = nc_rpc_editdata(datastore, NC_RPC_EDIT_DFLTOP_MERGE, edit_cont, NC_PARAMTYPE_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_editdata(rpc, datastore, NC_RPC_EDIT_DFLTOP_MERGE, edit_cont);
|
||||
nc_rpc_free(rpc);
|
||||
|
||||
/* create editdata rpc with NC_PARAMTYPE_DUP_AND_FREE */
|
||||
rpc = nc_rpc_editdata("startup", NC_RPC_EDIT_DFLTOP_REPLACE, "edit_cont", NC_PARAMTYPE_DUP_AND_FREE);
|
||||
assert_non_null(rpc);
|
||||
check_editdata(rpc, "startup", NC_RPC_EDIT_DFLTOP_REPLACE, "edit_cont");
|
||||
nc_rpc_free(rpc);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_act_generic_xml, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_act_generic, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_getconfig, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_edit, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_copy, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_delete, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_lock, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_unlock, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_get, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_kill, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_commit, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_discard, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_cancel, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_validate, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_getschema, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_subscribe, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_getdata, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_rpc_editdata, setup_f, teardown_f),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
813
tests/client/test_client_ssh.c
Normal file
813
tests/client/test_client_ssh.c
Normal file
|
@ -0,0 +1,813 @@
|
|||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <cmocka.h>
|
||||
#include <config.h>
|
||||
#include <libyang/libyang.h>
|
||||
#include <log.h>
|
||||
#include <session_client.h>
|
||||
#include <session_client_ch.h>
|
||||
#include <session_p.h>
|
||||
#include "tests/config.h"
|
||||
|
||||
#include <libssh/callbacks.h>
|
||||
#include <libssh/libssh.h>
|
||||
#include <libssh/server.h>
|
||||
|
||||
static int
|
||||
ssh_hostkey_check_clb(const char *hostname, ssh_session session, void *priv)
|
||||
{
|
||||
(void)hostname;
|
||||
(void)session;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
setup_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
|
||||
nc_verbosity(NC_VERB_VERBOSE);
|
||||
|
||||
ret = nc_client_ssh_set_username("username");
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_ssh_ch_set_username("ch_username");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_ssh_set_auth_hostkey_check_clb(ssh_hostkey_check_clb, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
teardown_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
|
||||
{
|
||||
(void)sockfd;
|
||||
(void)addr;
|
||||
(void)addrlen;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_connect(ssh_session session)
|
||||
{
|
||||
(void)session;
|
||||
|
||||
/* set support of all authentication methods by fake server */
|
||||
ssh_set_auth_methods(session, SSH_AUTH_METHOD_PUBLICKEY | SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_INTERACTIVE);
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_userauth_none(ssh_session session, const char *username)
|
||||
{
|
||||
(void)session;
|
||||
(void)username;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_userauth_kbdint(ssh_session session, const char *user, const char *submethods)
|
||||
{
|
||||
(void)session;
|
||||
(void)user;
|
||||
(void)submethods;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_is_connected(ssh_session session)
|
||||
{
|
||||
(void)session;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_channel_open_session(ssh_channel channel)
|
||||
{
|
||||
(void)channel;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_channel_request_subsystem(ssh_channel channel, const char *subsystem)
|
||||
{
|
||||
(void)channel;
|
||||
(void)subsystem;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_channel_is_closed(ssh_channel channel)
|
||||
{
|
||||
(void)channel;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_channel_write(ssh_channel channel, const void *data, uint32_t len)
|
||||
{
|
||||
(void)channel;
|
||||
(void)data;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_channel_poll_timeout(ssh_channel channel, int timeout, int is_stderr)
|
||||
{
|
||||
(void)channel;
|
||||
(void)timeout;
|
||||
(void)is_stderr;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_userauth_password(ssh_session session, const char *username, const char *password)
|
||||
{
|
||||
(void)session;
|
||||
check_expected(password);
|
||||
check_expected(username);
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_nc_handshake_io(struct nc_session *session)
|
||||
{
|
||||
(void)session;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_nc_ctx_check_and_fill(struct nc_session *session)
|
||||
{
|
||||
(void)session;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_userauth_try_publickey(ssh_session session, const char *username, const ssh_key pubkey)
|
||||
{
|
||||
(void)session;
|
||||
(void)username;
|
||||
(void)pubkey;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_ssh_userauth_publickey(ssh_session session, const char *username, const ssh_key privkey)
|
||||
{
|
||||
(void)session;
|
||||
(void)username;
|
||||
(void)privkey;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_nc_sock_listen_inet(const char *address, uint16_t port, struct nc_keepalives *ka)
|
||||
{
|
||||
(void)address;
|
||||
(void)port;
|
||||
(void)ka;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_nc_sock_accept_binds(struct nc_bind *binds, uint16_t bind_count, int timeout, char **host, uint16_t *port, uint16_t *idx)
|
||||
{
|
||||
(void)binds;
|
||||
(void)bind_count;
|
||||
(void)timeout;
|
||||
(void)host;
|
||||
(void)port;
|
||||
|
||||
*idx = 0;
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK struct nc_session *
|
||||
__wrap_nc_accept_callhome_ssh_sock(int sock, const char *host, uint16_t port, struct ly_ctx *ctx, int timeout)
|
||||
{
|
||||
(void)sock;
|
||||
(void)host;
|
||||
(void)port;
|
||||
(void)ctx;
|
||||
(void)timeout;
|
||||
|
||||
return mock_ptr_type(struct nc_session *);
|
||||
}
|
||||
|
||||
static int
|
||||
test_hostkey_clb(const char *hostname, ssh_session session, void *priv)
|
||||
{
|
||||
(void)hostname;
|
||||
(void)session;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_setting_auth_hostkey_check_clb(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int (*ret_f)(const char *hostname, ssh_session session, void *priv);
|
||||
char *priv_data_ret;
|
||||
|
||||
/* ssh_hostkey_check_clb is set in setup_f */
|
||||
nc_client_ssh_get_auth_hostkey_check_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(ret_f, ssh_hostkey_check_clb);
|
||||
assert_null(priv_data_ret);
|
||||
|
||||
/* set different callback and private data */
|
||||
nc_client_ssh_set_auth_hostkey_check_clb(test_hostkey_clb, "DATA");
|
||||
nc_client_ssh_get_auth_hostkey_check_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(ret_f, test_hostkey_clb);
|
||||
assert_string_equal(priv_data_ret, "DATA");
|
||||
}
|
||||
|
||||
char *
|
||||
test_pwd_clb1(const char *username, const char *hostname, void *priv)
|
||||
{
|
||||
char *pass, *pass_to_return;
|
||||
|
||||
check_expected(username);
|
||||
check_expected(hostname);
|
||||
check_expected(priv);
|
||||
|
||||
pass = (char *)mock();
|
||||
pass_to_return = malloc(sizeof *pass * (strlen(pass) + 1));
|
||||
strcpy(pass_to_return, pass);
|
||||
|
||||
return pass_to_return;
|
||||
}
|
||||
|
||||
char *
|
||||
test_pwd_clb2(const char *username, const char *hostname, void *priv)
|
||||
{
|
||||
(void)username;
|
||||
(void)hostname;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_setting_auth_password_clb(void **state)
|
||||
{
|
||||
(void)state;
|
||||
char *(*ret_f)(const char *username, const char *hostname, void *priv);
|
||||
char *priv_data_ret;
|
||||
|
||||
/* set callback */
|
||||
nc_client_ssh_set_auth_password_clb(test_pwd_clb1, "DATA");
|
||||
nc_client_ssh_get_auth_password_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(test_pwd_clb1, ret_f);
|
||||
assert_string_equal("DATA", priv_data_ret);
|
||||
|
||||
/* set different callback */
|
||||
nc_client_ssh_set_auth_password_clb(test_pwd_clb2, "NEW DATA");
|
||||
nc_client_ssh_get_auth_password_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(test_pwd_clb2, ret_f);
|
||||
assert_string_equal("NEW DATA", priv_data_ret);
|
||||
}
|
||||
|
||||
char *
|
||||
test_inter_clb1(const char *auth_name, const char *instruction, const char *prompt, int echo, void *priv)
|
||||
{
|
||||
(void)auth_name;
|
||||
(void)instruction;
|
||||
(void)prompt;
|
||||
(void)echo;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *
|
||||
test_inter_clb2(const char *auth_name, const char *instruction, const char *prompt, int echo, void *priv)
|
||||
{
|
||||
(void)auth_name;
|
||||
(void)instruction;
|
||||
(void)prompt;
|
||||
(void)echo;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_setting_auth_interactive_clb(void **state)
|
||||
{
|
||||
(void)state;
|
||||
char *(*ret_f)(const char *auth_name, const char *instruction, const char *prompt, int echo, void *priv);
|
||||
char *priv_data_ret;
|
||||
|
||||
/* set callback */
|
||||
nc_client_ssh_set_auth_interactive_clb(test_inter_clb1, "DATA");
|
||||
nc_client_ssh_get_auth_interactive_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(test_inter_clb1, ret_f);
|
||||
assert_string_equal("DATA", priv_data_ret);
|
||||
|
||||
/* set diferent callback */
|
||||
nc_client_ssh_set_auth_interactive_clb(test_inter_clb2, "NEW DATA");
|
||||
nc_client_ssh_get_auth_interactive_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(test_inter_clb2, ret_f);
|
||||
assert_string_equal("NEW DATA", priv_data_ret);
|
||||
}
|
||||
|
||||
char *
|
||||
test_passphrase_clb1(const char *privkey_path, void *priv)
|
||||
{
|
||||
(void)privkey_path;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *
|
||||
test_passphrase_clb2(const char *privkey_path, void *priv)
|
||||
{
|
||||
(void)privkey_path;
|
||||
(void)priv;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_setting_auth_privkey_passphrase_clb(void **state)
|
||||
{
|
||||
(void)state;
|
||||
char *(*ret_f)(const char *privkey_path, void *priv);
|
||||
char *priv_data_ret;
|
||||
|
||||
/* set first callback */
|
||||
nc_client_ssh_set_auth_privkey_passphrase_clb(test_passphrase_clb1, "DATA");
|
||||
nc_client_ssh_get_auth_privkey_passphrase_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(ret_f, test_passphrase_clb1);
|
||||
assert_string_equal("DATA", priv_data_ret);
|
||||
|
||||
/* set different callback */
|
||||
nc_client_ssh_set_auth_privkey_passphrase_clb(test_passphrase_clb2, "NEW DATA");
|
||||
nc_client_ssh_get_auth_privkey_passphrase_clb(&ret_f, (void **)&priv_data_ret);
|
||||
assert_ptr_equal(ret_f, test_passphrase_clb2);
|
||||
assert_string_equal("NEW DATA", priv_data_ret);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_adding_keypair(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
const char *pubkey1, *pubkey2;
|
||||
|
||||
/* at the beginning keypair count should be 0 */
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* add first key pair */
|
||||
ret = nc_client_ssh_add_keypair(TESTS_DIR "/data/key_dsa.pub", TESTS_DIR "/data/key_dsa");
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 1);
|
||||
|
||||
/* add second keypair */
|
||||
ret = nc_client_ssh_add_keypair("key_pub", "key_priv");
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 2);
|
||||
ret = nc_client_ssh_get_keypair(1, &pubkey1, &pubkey2);
|
||||
assert_int_equal(ret, 0);
|
||||
assert_string_equal(pubkey1, "key_pub");
|
||||
assert_string_equal(pubkey2, "key_priv");
|
||||
|
||||
/* delete first keypair */
|
||||
ret = nc_client_ssh_del_keypair(0);
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 1);
|
||||
/* try to get deleted keypair */
|
||||
ret = nc_client_ssh_get_keypair(5, &pubkey1, &pubkey2);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* try to add keypair that is already set */
|
||||
ret = nc_client_ssh_add_keypair("key_pub", "key_priv");
|
||||
assert_int_equal(ret, -1);
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 1);
|
||||
|
||||
/* try to delete keypair with id that is not used */
|
||||
ret = nc_client_ssh_del_keypair(42);
|
||||
assert_int_equal(ret, -1);
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 1);
|
||||
|
||||
/* remove remaining keypairs */
|
||||
ret = nc_client_ssh_del_keypair(0);
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_ssh_get_keypair_count();
|
||||
assert_int_equal(ret, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_setting_auth_pref(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
|
||||
/* initiate client, must be called in first test */
|
||||
nc_client_init();
|
||||
|
||||
/* check default prefference settings according to documentation */
|
||||
ret = nc_client_ssh_get_auth_pref(NC_SSH_AUTH_INTERACTIVE);
|
||||
assert_int_equal(ret, 3);
|
||||
ret = nc_client_ssh_get_auth_pref(NC_SSH_AUTH_PASSWORD);
|
||||
assert_int_equal(ret, 2);
|
||||
ret = nc_client_ssh_get_auth_pref(NC_SSH_AUTH_PUBLICKEY);
|
||||
assert_int_equal(ret, 1);
|
||||
|
||||
/* try to set prefetence of non existing method */
|
||||
nc_client_ssh_set_auth_pref(42, 22);
|
||||
|
||||
/* try to get preference of non existing method */
|
||||
ret = nc_client_ssh_get_auth_pref(42);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* change values of all methods and check if they actually changed */
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, 9);
|
||||
ret = nc_client_ssh_get_auth_pref(NC_SSH_AUTH_INTERACTIVE);
|
||||
assert_int_equal(ret, 9);
|
||||
|
||||
/* negative value should be set as -1 */
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PASSWORD, -5);
|
||||
ret = nc_client_ssh_get_auth_pref(NC_SSH_AUTH_PASSWORD);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PUBLICKEY, 11);
|
||||
ret = nc_client_ssh_get_auth_pref(NC_SSH_AUTH_PUBLICKEY);
|
||||
assert_int_equal(ret, 11);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_setting_username(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
const char *username_ret;
|
||||
|
||||
username_ret = nc_client_ssh_get_username();
|
||||
/* username is set to "username" in setup_f */
|
||||
assert_string_equal(username_ret, "username");
|
||||
|
||||
/* set new username and check if it changes */
|
||||
ret = nc_client_ssh_set_username("new_username");
|
||||
assert_int_equal(ret, 0);
|
||||
username_ret = nc_client_ssh_get_username();
|
||||
assert_string_equal(username_ret, "new_username");
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_ssh_interactive_succesfull(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session;
|
||||
|
||||
/* set authentication method to use interactive authentication */
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, 1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PASSWORD, -1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PUBLICKEY, -1);
|
||||
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, 20);
|
||||
|
||||
/* prepare return values for functions used by nc_connect_ssh */
|
||||
will_return(__wrap_connect, 0);
|
||||
will_return(__wrap_ssh_connect, 0);
|
||||
will_return(__wrap_ssh_userauth_none, 1);
|
||||
|
||||
will_return(__wrap_ssh_userauth_kbdint, 0);
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
|
||||
will_return(__wrap_ssh_channel_open_session, 0);
|
||||
will_return(__wrap_ssh_channel_request_subsystem, 0);
|
||||
|
||||
will_return(__wrap_nc_handshake_io, 3);
|
||||
will_return(__wrap_nc_ctx_check_and_fill, 0);
|
||||
|
||||
session = nc_connect_ssh("127.0.0.1", 8080, NULL);
|
||||
assert_non_null(session);
|
||||
|
||||
will_return(__wrap_ssh_channel_poll_timeout, 0);
|
||||
nc_session_free(session, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_ssh_password_succesfull(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session;
|
||||
|
||||
/* set authentication method to use password authentication */
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PASSWORD, 1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PUBLICKEY, -1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, -1);
|
||||
|
||||
/* set authentication callback */
|
||||
nc_client_ssh_set_auth_password_clb(test_pwd_clb1, "private_data");
|
||||
will_return(test_pwd_clb1, "secret password");
|
||||
/* set values that are expected as parameters for authentication callback */
|
||||
expect_string(test_pwd_clb1, username, "username");
|
||||
expect_string(test_pwd_clb1, hostname, "127.0.0.1");
|
||||
expect_string(test_pwd_clb1, priv, "private_data");
|
||||
|
||||
/* fake succesfull connection */
|
||||
will_return(__wrap_connect, 0);
|
||||
will_return(__wrap_ssh_connect, 0);
|
||||
/* do not authenticate using no authentication method */
|
||||
will_return(__wrap_ssh_userauth_none, 1);
|
||||
|
||||
/* succesfully authenticate via password authentication */
|
||||
expect_string(__wrap_ssh_userauth_password, password, "secret password");
|
||||
expect_string(__wrap_ssh_userauth_password, username, "username");
|
||||
will_return(__wrap_ssh_userauth_password, 0);
|
||||
|
||||
/* fake ssh functions that are used to open netconf channel */
|
||||
will_return(__wrap_ssh_channel_open_session, 0);
|
||||
will_return(__wrap_ssh_channel_request_subsystem, 0);
|
||||
|
||||
/* fake that connection is still alive*/
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
|
||||
/* fake ssh function for recieving hello message */
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
|
||||
will_return(__wrap_nc_handshake_io, 3);
|
||||
will_return(__wrap_nc_ctx_check_and_fill, 0);
|
||||
|
||||
session = nc_connect_ssh("127.0.0.1", 8080, NULL);
|
||||
assert_non_null(session);
|
||||
|
||||
/* disconnect */
|
||||
will_return(__wrap_ssh_channel_poll_timeout, 0);
|
||||
nc_session_free(session, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_ssh_pubkey_succesfull(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session;
|
||||
int ret = 0;
|
||||
|
||||
/* set authentication method to use password authentication */
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PASSWORD, -1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PUBLICKEY, 1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, -1);
|
||||
|
||||
/* add keypair for authentication */
|
||||
ret = nc_client_ssh_add_keypair(TESTS_DIR "/data/key_dsa.pub", TESTS_DIR "/data/key_dsa");
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* fake succesfull connection */
|
||||
will_return(__wrap_connect, 0);
|
||||
will_return(__wrap_ssh_connect, 0);
|
||||
/* do not authenticate using no authentication method */
|
||||
will_return(__wrap_ssh_userauth_none, 1);
|
||||
will_return(__wrap_ssh_userauth_try_publickey, 0);
|
||||
will_return(__wrap_ssh_userauth_publickey, 0);
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
will_return(__wrap_ssh_channel_open_session, 0);
|
||||
will_return(__wrap_ssh_channel_request_subsystem, 0);
|
||||
|
||||
/* fake ssh function for recieving hello message */
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
|
||||
will_return(__wrap_nc_handshake_io, 3);
|
||||
will_return(__wrap_nc_ctx_check_and_fill, 0);
|
||||
session = nc_connect_ssh("127.0.0.1", 8080, NULL);
|
||||
assert_non_null(session);
|
||||
|
||||
/* disconnect */
|
||||
will_return(__wrap_ssh_channel_poll_timeout, 0);
|
||||
nc_session_free(session, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_connection_failed(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session;
|
||||
|
||||
errno = ECONNREFUSED;
|
||||
will_return(__wrap_connect, -1);
|
||||
will_return(__wrap_ssh_is_connected, 0);
|
||||
|
||||
session = nc_connect_ssh("127.0.0.1", 8080, NULL);
|
||||
assert_null(session);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_ssh_bad_hello(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session;
|
||||
|
||||
/* set authentication method to use interactive authentication */
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_INTERACTIVE, 1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PASSWORD, -1);
|
||||
nc_client_ssh_set_auth_pref(NC_SSH_AUTH_PUBLICKEY, 1);
|
||||
|
||||
nc_client_ssh_set_auth_password_clb(test_pwd_clb2, NULL);
|
||||
|
||||
will_return(__wrap_connect, 0);
|
||||
will_return(__wrap_ssh_connect, 0);
|
||||
will_return(__wrap_ssh_userauth_none, 1);
|
||||
|
||||
will_return(__wrap_ssh_userauth_kbdint, 0);
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
will_return(__wrap_ssh_is_connected, 1);
|
||||
|
||||
will_return(__wrap_ssh_channel_open_session, 0);
|
||||
will_return(__wrap_ssh_channel_request_subsystem, 0);
|
||||
will_return(__wrap_nc_handshake_io, 4);
|
||||
|
||||
session = nc_connect_ssh("127.0.0.1", 8080, NULL);
|
||||
assert_null(session);
|
||||
|
||||
/* destroy client, must be called in last test */
|
||||
nc_client_destroy();
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_ch_setting_username(void **state)
|
||||
{
|
||||
(void)state;
|
||||
const char *username_ret;
|
||||
int ret;
|
||||
|
||||
/* username is set to "ch_username" in setup_f */
|
||||
username_ret = nc_client_ssh_ch_get_username();
|
||||
assert_string_equal(username_ret, "ch_username");
|
||||
/* set new username and check if it changes */
|
||||
ret = nc_client_ssh_ch_set_username("new_ch_username");
|
||||
assert_int_equal(ret, 0);
|
||||
username_ret = nc_client_ssh_ch_get_username();
|
||||
assert_string_equal(username_ret, "new_ch_username");
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_ch_add_bind_listen(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
|
||||
/* invalid parameters, address NULL or port 0 */
|
||||
ret = nc_client_ssh_ch_add_bind_listen(NULL, 4334);
|
||||
assert_int_equal(ret, -1);
|
||||
ret = nc_client_ssh_ch_add_bind_listen("127.0.0.1", 0);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* failed to create an ssh listening socket */
|
||||
will_return(__wrap_nc_sock_listen_inet, -1);
|
||||
ret = nc_client_ssh_ch_add_bind_listen("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* fake a successful CH ssh listening socket */
|
||||
will_return(__wrap_nc_sock_listen_inet, 1);
|
||||
ret = nc_client_ssh_ch_add_bind_listen("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* remove ssh listening client binds */
|
||||
ret = nc_client_ssh_ch_del_bind("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_accept_callhome(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session = NULL;
|
||||
int timeout = 10;
|
||||
int ret;
|
||||
|
||||
/* invalid parameter session */
|
||||
ret = nc_accept_callhome(timeout, NULL, NULL);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* no client bind */
|
||||
ret = nc_accept_callhome(timeout, NULL, &session);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* successfully add a client Call Home bind */
|
||||
will_return(__wrap_nc_sock_listen_inet, 1);
|
||||
ret = nc_client_ssh_ch_add_bind_listen("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* failed to accept a client bind */
|
||||
will_return(__wrap_nc_sock_accept_binds, -1);
|
||||
ret = nc_accept_callhome(timeout, NULL, &session);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* failed to accept a server Call Home connection */
|
||||
will_return(__wrap_nc_accept_callhome_ssh_sock, NULL);
|
||||
will_return(__wrap_nc_sock_accept_binds, 2);
|
||||
ret = nc_accept_callhome(timeout, NULL, &session);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
/* create session structure to fake a successful server call home connection */
|
||||
session = nc_new_session(NC_CLIENT, 0);
|
||||
assert_non_null(session);
|
||||
will_return(__wrap_nc_sock_accept_binds, 2);
|
||||
will_return(__wrap_nc_accept_callhome_ssh_sock, session);
|
||||
ret = nc_accept_callhome(timeout, NULL, &session);
|
||||
assert_int_equal(ret, 1);
|
||||
|
||||
/* remove ssh listening client binds */
|
||||
ret = nc_client_ssh_ch_del_bind("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* free session */
|
||||
nc_session_free(session, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_ssh_callhome_successful(void **state)
|
||||
{
|
||||
(void)state;
|
||||
struct nc_session *session = NULL;
|
||||
int timeout = 10;
|
||||
int ret;
|
||||
|
||||
/* create session structure */
|
||||
session = nc_new_session(NC_CLIENT, 0);
|
||||
assert_non_null(session);
|
||||
|
||||
/* prepare to fake return values for functions used by nc_accept_callhome */
|
||||
will_return(__wrap_nc_sock_listen_inet, 1);
|
||||
will_return(__wrap_nc_sock_accept_binds, 2);
|
||||
will_return(__wrap_nc_accept_callhome_ssh_sock, session);
|
||||
|
||||
ret = nc_client_ssh_ch_add_bind_listen("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_accept_callhome(timeout, NULL, &session);
|
||||
assert_int_equal(ret, 1);
|
||||
|
||||
/* remove ssh listening client binds */
|
||||
ret = nc_client_ssh_ch_del_bind("127.0.0.1", 4334);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
/* free session */
|
||||
nc_session_free(session, NULL);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_setting_auth_pref, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_setting_auth_hostkey_check_clb, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_setting_auth_password_clb, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_setting_auth_interactive_clb, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_setting_auth_privkey_passphrase_clb, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_adding_keypair, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_setting_username, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_ssh_interactive_succesfull, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_ssh_password_succesfull, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_ssh_pubkey_succesfull, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_connection_failed, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_ssh_bad_hello, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_ch_setting_username, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_ch_add_bind_listen, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_accept_callhome, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_ssh_callhome_successful, setup_f, teardown_f),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
200
tests/client/test_client_tls.c
Normal file
200
tests/client/test_client_tls.c
Normal file
|
@ -0,0 +1,200 @@
|
|||
#include <errno.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <cmocka.h>
|
||||
#include <config.h>
|
||||
#include <libyang/libyang.h>
|
||||
#include <log.h>
|
||||
#include <session_client.h>
|
||||
#include "tests/config.h"
|
||||
|
||||
static int
|
||||
setup_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
|
||||
nc_verbosity(NC_VERB_VERBOSE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
teardown_f(void **state)
|
||||
{
|
||||
(void)state;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
|
||||
{
|
||||
(void)sockfd;
|
||||
(void)addr;
|
||||
(void)addrlen;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_SSL_connect(SSL *ssl)
|
||||
{
|
||||
(void)ssl;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_nc_handshake_io(struct nc_session *session)
|
||||
{
|
||||
(void)session;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
MOCK int
|
||||
__wrap_nc_ctx_check_and_fill(struct nc_session *session)
|
||||
{
|
||||
(void)session;
|
||||
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_tls_setting_cert_key_paths(void **state)
|
||||
{
|
||||
(void)state;
|
||||
const char *cert, *key;
|
||||
int ret;
|
||||
|
||||
nc_client_init();
|
||||
|
||||
/* no certificats are set, nc_client_tls_get_cert_key_paths should output NULL */
|
||||
nc_client_tls_get_cert_key_paths(&cert, &key);
|
||||
assert_null(cert);
|
||||
assert_null(key);
|
||||
|
||||
/* set certificate path */
|
||||
ret = nc_client_tls_set_cert_key_paths("cert_path", "key_path");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_tls_get_cert_key_paths(&cert, &key);
|
||||
assert_string_equal(cert, "cert_path");
|
||||
assert_string_equal(key, "key_path");
|
||||
|
||||
/* override certificate path */
|
||||
ret = nc_client_tls_set_cert_key_paths("cert_path1", "key_path1");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_tls_get_cert_key_paths(&cert, &key);
|
||||
assert_string_equal(cert, "cert_path1");
|
||||
assert_string_equal(key, "key_path1");
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_tls_setting_trusted_ca_paths(void **state)
|
||||
{
|
||||
(void)state;
|
||||
const char *file, *dir;
|
||||
int ret;
|
||||
|
||||
ret = nc_client_tls_set_trusted_ca_paths("ca_file", "ca_dir");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_tls_get_trusted_ca_paths(&file, &dir);
|
||||
assert_string_equal("ca_file", file);
|
||||
assert_string_equal("ca_dir", dir);
|
||||
|
||||
ret = nc_client_tls_set_trusted_ca_paths("ca_file1", "ca_dir1");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_tls_get_trusted_ca_paths(&file, &dir);
|
||||
assert_string_equal("ca_file1", file);
|
||||
assert_string_equal("ca_dir1", dir);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_tls_succesfull(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
struct nc_session *session;
|
||||
|
||||
ret = nc_client_tls_set_cert_key_paths(TESTS_DIR "/data/client.crt", TESTS_DIR "/data/client.key");
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_tls_set_trusted_ca_paths(NULL, TESTS_DIR "/data");
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
will_return(__wrap_connect, 0);
|
||||
will_return(__wrap_SSL_connect, 1);
|
||||
|
||||
/* fake succesfull handshake */
|
||||
will_return(__wrap_nc_handshake_io, 3);
|
||||
will_return(__wrap_nc_ctx_check_and_fill, 0);
|
||||
session = nc_connect_tls("0.0.0.0", 6001, NULL);
|
||||
assert_non_null(session);
|
||||
|
||||
nc_session_free(session, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_client_tls_setting_crl_paths(void **state)
|
||||
{
|
||||
(void)state;
|
||||
const char *file, *dir;
|
||||
int ret;
|
||||
|
||||
nc_client_tls_get_crl_paths(&file, &dir);
|
||||
assert_null(file);
|
||||
assert_null(dir);
|
||||
|
||||
ret = nc_client_tls_set_crl_paths("file", "dir");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_tls_get_crl_paths(&file, &dir);
|
||||
assert_string_equal(file, "file");
|
||||
assert_string_equal(dir, "dir");
|
||||
|
||||
ret = nc_client_tls_set_crl_paths("file1", "dir1");
|
||||
assert_int_equal(ret, 0);
|
||||
nc_client_tls_get_crl_paths(&file, &dir);
|
||||
assert_string_equal(file, "file1");
|
||||
assert_string_equal(dir, "dir1");
|
||||
|
||||
/* destroy client */
|
||||
nc_client_destroy();
|
||||
}
|
||||
|
||||
static void
|
||||
test_nc_connect_tls_handshake_failed(void **state)
|
||||
{
|
||||
(void)state;
|
||||
int ret;
|
||||
struct nc_session *session;
|
||||
|
||||
ret = nc_client_tls_set_cert_key_paths(TESTS_DIR "/data/client.crt", TESTS_DIR "/data/client.key");
|
||||
assert_int_equal(ret, 0);
|
||||
ret = nc_client_tls_set_trusted_ca_paths(NULL, TESTS_DIR "/data");
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
will_return(__wrap_connect, 0);
|
||||
will_return(__wrap_SSL_connect, 1);
|
||||
|
||||
/* fake failed handshake */
|
||||
will_return(__wrap_nc_handshake_io, 0);
|
||||
session = nc_connect_tls("0.0.0.0", 6001, NULL);
|
||||
assert_null(session);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_tls_setting_cert_key_paths, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_tls_handshake_failed, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_connect_tls_succesfull, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_tls_setting_trusted_ca_paths, setup_f, teardown_f),
|
||||
cmocka_unit_test_setup_teardown(test_nc_client_tls_setting_crl_paths, setup_f, teardown_f),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue