From 867d89546931a37fd255cdd5af382e39b66ae09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Wennerstr=C3=B6m?= Date: Mon, 7 Dec 2020 16:16:15 +0100 Subject: [PATCH] Add tests for format_call_external_argv --- src/command/cmd_funcs.c | 43 +++++++++++++++--------- src/tools/aesgcm_download.c | 4 +-- tests/unittests/test_common.c | 61 +++++++++++++++++++++++++++++++++-- tests/unittests/test_common.h | 1 + tests/unittests/unittests.c | 1 + 5 files changed, 91 insertions(+), 19 deletions(-) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 3cff1ab5..024137d2 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -4809,8 +4809,7 @@ cmd_disco(ProfWin* window, const char* const command, gchar** args) return TRUE; } -// TODO(wstrm): Move this into its own tools such as HTTPUpload or -// AESGCMDownload. +// TODO: Move this into its own tools such as HTTPUpload or AESGCMDownload. #ifdef HAVE_OMEMO char* _add_omemo_stream(int* fd, FILE** fh, char** err) @@ -9126,35 +9125,39 @@ cmd_url_open(ProfWin* window, const char* const command, gchar** args) return TRUE; } - gchar* scheme = g_uri_parse_scheme(url); + gchar* scheme = NULL; + char* cmd_template = NULL; + char* filename = NULL; + + scheme = g_uri_parse_scheme(url); if (scheme == NULL) { cons_show("URL '%s' is not valid.", args[1]); - return TRUE; + goto out; } - char* cmd_template = prefs_get_string_with_option(PREF_URL_OPEN_CMD, scheme); + cmd_template = prefs_get_string_with_option(PREF_URL_OPEN_CMD, scheme); if (cmd_template == NULL) { cons_show("No default open command found in url open preferences"); - return TRUE; + goto out; } #ifdef HAVE_OMEMO // OMEMO URLs (aesgcm://) must be saved and decrypted before being opened. if (0 == g_strcmp0(scheme, "aesgcm")) { - char* filename = unique_filename_from_url(url, files_get_data_path(DIR_DOWNLOADS)); + filename = unique_filename_from_url(url, files_get_data_path(DIR_DOWNLOADS)); _url_aesgcm_method(window, cmd_template, url, filename); - free(filename); goto out; } #endif _url_external_method(cmd_template, url, NULL); -#ifdef HAVE_OMEMO out: -#endif + free(cmd_template); - free(scheme); + free(filename); + + g_free(scheme); return TRUE; } @@ -9174,21 +9177,25 @@ cmd_url_save(ProfWin* window, const char* const command, gchar** args) gchar* url = args[1]; gchar* path = g_strdup(args[2]); + gchar* scheme = NULL; + char* filename = NULL; + char* cmd_template = NULL; - gchar* scheme = g_uri_parse_scheme(url); + scheme = g_uri_parse_scheme(url); if (scheme == NULL) { cons_show("URL '%s' is not valid.", args[1]); - return TRUE; + goto out; } - char* filename = unique_filename_from_url(url, path); + filename = unique_filename_from_url(url, path); if (filename == NULL) { cons_show("Failed to generate unique filename" "from URL '%s' for path '%s'", url, path); + goto out; } - char* cmd_template = prefs_get_string_with_option(PREF_URL_SAVE_CMD, scheme); + cmd_template = prefs_get_string_with_option(PREF_URL_SAVE_CMD, scheme); if (cmd_template == NULL) { if (g_strcmp0(scheme, "http") == 0 || g_strcmp0(scheme, "https") == 0) { @@ -9204,8 +9211,14 @@ cmd_url_save(ProfWin* window, const char* const command, gchar** args) _url_external_method(cmd_template, url, filename); } +out: + + free(filename); free(cmd_template); + g_free(scheme); + g_free(path); + return TRUE; } diff --git a/src/tools/aesgcm_download.c b/src/tools/aesgcm_download.c index 20397b82..96f8d7e8 100644 --- a/src/tools/aesgcm_download.c +++ b/src/tools/aesgcm_download.c @@ -155,7 +155,7 @@ aesgcm_file_get(void* userdata) aesgcm_dl->filename, aesgcm_dl->filename); - // TODO(wstrm): Log the error. + // TODO: Log the error. if (!call_external(argv, NULL, NULL)) { http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url, "Downloading '%s' failed: Unable to call " @@ -163,7 +163,7 @@ aesgcm_file_get(void* userdata) aesgcm_dl->url, aesgcm_dl->cmd_template, aesgcm_dl->filename, - "TODO(wstrm): Log the error"); + "TODO: Log the error"); } g_strfreev(argv); diff --git a/tests/unittests/test_common.c b/tests/unittests/test_common.c index 2dee8722..fa5dd59e 100644 --- a/tests/unittests/test_common.c +++ b/tests/unittests/test_common.c @@ -330,6 +330,63 @@ strip_quotes_strips_both(void** state) free(result); } +typedef struct +{ + char* template; + char* url; + char* filename; + char* argv; +} format_call_external_argv_t; + +void +format_call_external_argv_td(void** state) +{ + + enum table { num_tests = 4 }; + + format_call_external_argv_t tests[num_tests] = { + (format_call_external_argv_t){ + .template = "/bin/echo %u %p", + .url = "https://example.org", + .filename = "image.jpeg", + .argv = "/bin/echo https://example.org image.jpeg", + }, + (format_call_external_argv_t){ + .template = "/bin/echo %p %u", + .url = "https://example.org", + .filename = "image.jpeg", + .argv = "/bin/echo image.jpeg https://example.org", + }, + (format_call_external_argv_t){ + .template = "/bin/echo %p", + .url = "https://example.org", + .filename = "image.jpeg", + .argv = "/bin/echo image.jpeg", + }, + (format_call_external_argv_t){ + .template = "/bin/echo %u", + .url = "https://example.org", + .filename = "image.jpeg", + .argv = "/bin/echo https://example.org", + }, + }; + + gchar** got_argv = NULL; + gchar* got_argv_str = NULL; + for (int i = 0; i < num_tests; i++) { + got_argv = format_call_external_argv( + tests[i].template, + tests[i].url, + tests[i].filename); + got_argv_str = g_strjoinv(" ", got_argv); + + assert_string_equal(got_argv_str, tests[i].argv); + + g_strfreev(got_argv); + g_free(got_argv_str); + } +} + typedef struct { char* url; @@ -438,8 +495,8 @@ unique_filename_from_url_td(void** state) }, }; - char* got_filename; - char* exp_filename; + char* got_filename = NULL; + char* exp_filename = NULL; for (int i = 0; i < num_tests; i++) { got_filename = unique_filename_from_url(tests[i].url, tests[i].path); exp_filename = g_build_filename(tests[i].target, tests[i].basename, NULL); diff --git a/tests/unittests/test_common.h b/tests/unittests/test_common.h index a1ef7c6e..46d990d9 100644 --- a/tests/unittests/test_common.h +++ b/tests/unittests/test_common.h @@ -32,3 +32,4 @@ void strip_quotes_strips_both(void** state); void prof_partial_occurrences_tests(void** state); void prof_whole_occurrences_tests(void** state); void unique_filename_from_url_td(void** state); +void format_call_external_argv_td(void** state); diff --git a/tests/unittests/unittests.c b/tests/unittests/unittests.c index c63a3783..7fd3b192 100644 --- a/tests/unittests/unittests.c +++ b/tests/unittests/unittests.c @@ -90,6 +90,7 @@ main(int argc, char* argv[]) unit_test(strip_quotes_strips_first), unit_test(strip_quotes_strips_last), unit_test(strip_quotes_strips_both), + unit_test(format_call_external_argv_td), unit_test(unique_filename_from_url_td), unit_test(clear_empty),