tests: Verify functionality of low-level config parser functions
Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
Этот коммит содержится в:
родитель
349abe5942
Коммит
c7da113f1d
@ -5,6 +5,7 @@
|
|||||||
#include "torture.h"
|
#include "torture.h"
|
||||||
#include "libssh/options.h"
|
#include "libssh/options.h"
|
||||||
#include "libssh/session.h"
|
#include "libssh/session.h"
|
||||||
|
#include "libssh/config_parser.h"
|
||||||
|
|
||||||
extern LIBSSH_THREAD int ssh_log_level;
|
extern LIBSSH_THREAD int ssh_log_level;
|
||||||
|
|
||||||
@ -907,6 +908,128 @@ static void torture_config_pubkeyacceptedkeytypes(void **state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ssh_config_get_cmd() does three things:
|
||||||
|
* * Strips leading whitespace
|
||||||
|
* * Terminate the characted on the end of next quotes-enclosed string
|
||||||
|
* * Terminate on the end of line
|
||||||
|
*/
|
||||||
|
static void torture_config_parser_get_cmd(void **state)
|
||||||
|
{
|
||||||
|
char *p = NULL, *tok = NULL;
|
||||||
|
char data[256];
|
||||||
|
|
||||||
|
(void) state;
|
||||||
|
|
||||||
|
/* Ignore leading whitespace */
|
||||||
|
strncpy(data, " \t\t string\n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_cmd(&p);
|
||||||
|
assert_string_equal(tok, "string");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* but keeps the trailing whitespace */
|
||||||
|
strncpy(data, "string \t\t \n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_cmd(&p);
|
||||||
|
assert_string_equal(tok, "string \t\t ");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* should drop the quotes and split them into separate arguments */
|
||||||
|
strncpy(data, "\"multi string\" something\n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_cmd(&p);
|
||||||
|
assert_string_equal(tok, "multi string");
|
||||||
|
assert_int_equal(*p, ' ');
|
||||||
|
tok = ssh_config_get_cmd(&p);
|
||||||
|
assert_string_equal(tok, "something");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* But it does not split tokens by whitespace if they are not quoted, which is weird */
|
||||||
|
strncpy(data, "multi string something\n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_cmd(&p);
|
||||||
|
assert_string_equal(tok, "multi string something");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ssh_config_get_token() should behave as expected
|
||||||
|
* * Strip leading whitespace
|
||||||
|
* * Return first token separated by whitespace or equal sign, respecting quotes!
|
||||||
|
*/
|
||||||
|
static void torture_config_parser_get_token(void **state)
|
||||||
|
{
|
||||||
|
char *p = NULL, *tok = NULL;
|
||||||
|
char data[256];
|
||||||
|
|
||||||
|
(void) state;
|
||||||
|
|
||||||
|
/* Ignore leading whitespace (from get_cmd() already */
|
||||||
|
strncpy(data, " \t\t string\n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "string");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* drops trailing whitespace */
|
||||||
|
strncpy(data, "string \t\t \n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "string");
|
||||||
|
assert_int_equal(*p, ' ');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "\0");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* Correctly handles tokens in quotes */
|
||||||
|
strncpy(data, "\"multi string\" something\n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "multi string");
|
||||||
|
assert_int_equal(*p, ' ');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "something");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* Consistently splits unquoted strings */
|
||||||
|
strncpy(data, "multi string something\n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "multi");
|
||||||
|
assert_int_equal(*p, 's');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "string");
|
||||||
|
assert_int_equal(*p, 's');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "something");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* It is made to parse also option=value pairs as well */
|
||||||
|
strncpy(data, " key=value \n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "key");
|
||||||
|
assert_int_equal(*p, 'v');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "value");
|
||||||
|
assert_int_equal(*p, ' ');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "\0");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
|
||||||
|
/* correctly parses even key=value pairs with either one in quotes */
|
||||||
|
strncpy(data, " key=\"value with spaces\" \n", sizeof(data));
|
||||||
|
p = data;
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "key");
|
||||||
|
assert_int_equal(*p, '\"');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "value with spaces");
|
||||||
|
assert_int_equal(*p, ' ');
|
||||||
|
tok = ssh_config_get_token(&p);
|
||||||
|
assert_string_equal(tok, "\0");
|
||||||
|
assert_int_equal(*p, '\0');
|
||||||
|
}
|
||||||
|
|
||||||
int torture_run_tests(void) {
|
int torture_run_tests(void) {
|
||||||
int rc;
|
int rc;
|
||||||
struct CMUnitTest tests[] = {
|
struct CMUnitTest tests[] = {
|
||||||
@ -920,6 +1043,8 @@ int torture_run_tests(void) {
|
|||||||
cmocka_unit_test(torture_config_proxyjump),
|
cmocka_unit_test(torture_config_proxyjump),
|
||||||
cmocka_unit_test(torture_config_rekey),
|
cmocka_unit_test(torture_config_rekey),
|
||||||
cmocka_unit_test(torture_config_pubkeyacceptedkeytypes),
|
cmocka_unit_test(torture_config_pubkeyacceptedkeytypes),
|
||||||
|
cmocka_unit_test(torture_config_parser_get_cmd),
|
||||||
|
cmocka_unit_test(torture_config_parser_get_token),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user