diff options
author | Joseph Hunkeler <jhunkeler@users.noreply.github.com> | 2024-07-15 10:07:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-15 10:07:25 -0400 |
commit | 07dc44efdc5c2fbc2b34c969e623d3b0bc0df15a (patch) | |
tree | 1f41c27e50baeee149b59b8c3d37a9c72cbd0ded /src | |
parent | 70cd78cdef69237ba3c511b9e091715ec6d093e5 (diff) | |
download | stasis-07dc44efdc5c2fbc2b34c969e623d3b0bc0df15a.tar.gz |
Unit tests (#12)
* Change return value of conda_setup_headless() from void to int
* Replace exit() with return;
* Return early if unpacking the micromamba binary fails
* Exit program when pointer to INIFILE is NULL.
* Validation function cannot otherwise proceed
* The way the logic is set up I've decided to duplicate the installation code for now until I find time to revise it
* The only meaningful difference between a "fresh start" and reusing the conda installation is a rmtree().
* Exposes STASIS_DOWNLOAD_TIMEOUT environment variable
* Sets the connection timeout for libcurl to 30, instead of 300.
* Export ini_section_create() function
* Add download() tests
* Add conda_*() tests
* Add boilerplate source file for test framework
* Fixes segfault reported by @GeorgeJCleary (#10)
* The key is now an array index. When key is -1, the env variable is not defined.
* Free resources only when continue on error is disabled (#11)
* Fix segfault due to premature shutdown/cleanup
* If conda_setup_headless cannot succeed, die
* Set STASIS_SYSCONFDIR for tests
Diffstat (limited to 'src')
-rw-r--r-- | src/conda.c | 17 | ||||
-rw-r--r-- | src/delivery.c | 21 | ||||
-rw-r--r-- | src/download.c | 10 |
3 files changed, 41 insertions, 7 deletions
diff --git a/src/conda.c b/src/conda.c index 976bbbc..7aaec77 100644 --- a/src/conda.c +++ b/src/conda.c @@ -35,7 +35,10 @@ int micromamba(struct MicromambaInfo *info, char *command, ...) { char untarcmd[PATH_MAX * 2]; mkdirs(info->micromamba_prefix, 0755); sprintf(untarcmd, "tar -xvf %s -C %s --strip-components=1 bin/micromamba 1>/dev/null", installer_path, info->micromamba_prefix); - system(untarcmd); + int untarcmd_status = system(untarcmd); + if (untarcmd_status) { + return -1; + } } char cmd[STASIS_BUFSIZ]; @@ -249,7 +252,7 @@ int conda_check_required() { return 0; } -void conda_setup_headless() { +int conda_setup_headless() { if (globals.verbose) { conda_exec("config --system --set quiet false"); } else { @@ -285,7 +288,7 @@ void conda_setup_headless() { if (conda_exec(cmd)) { msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "Unable to install user-defined base packages (conda)\n"); - exit(1); + return 1; } } @@ -307,7 +310,7 @@ void conda_setup_headless() { if (pip_exec(cmd)) { msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "Unable to install user-defined base packages (pip)\n"); - exit(1); + return 1; } } @@ -315,15 +318,17 @@ void conda_setup_headless() { msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "Your STASIS configuration lacks the bare" " minimum software required to build conda packages." " Please fix it.\n"); - exit(1); + return 1; } if (globals.always_update_base_environment) { if (conda_exec("update --all")) { fprintf(stderr, "conda update was unsuccessful\n"); - exit(1); + return 1; } } + + return 0; } int conda_env_create_from_uri(char *name, char *uri) { diff --git a/src/delivery.c b/src/delivery.c index 0c20550..b27ab08 100644 --- a/src/delivery.c +++ b/src/delivery.c @@ -420,6 +420,10 @@ static int populate_mission_ini(struct Delivery **ctx) { } void validate_delivery_ini(struct INIFILE *ini) { + if (!ini) { + SYSERROR("%s", "INIFILE is NULL!"); + exit(1); + } if (ini_section_search(&ini, INI_SEARCH_EXACT, "meta")) { ini_has_key_required(ini, "meta", "name"); ini_has_key_required(ini, "meta", "version"); @@ -1428,6 +1432,18 @@ void delivery_install_conda(char *install_script, char *conda_install_dir) { fprintf(stderr, "conda installation failed\n"); exit(1); } + } else { + // Proceed with the installation + // -b = batch mode (non-interactive) + char cmd[PATH_MAX] = {0}; + snprintf(cmd, sizeof(cmd) - 1, "%s %s -b -p %s", + find_program("bash"), + install_script, + conda_install_dir); + if (shell_safe(&proc, cmd)) { + fprintf(stderr, "conda installation failed\n"); + exit(1); + } } } else { msg(STASIS_MSG_L3, "Conda removal disabled by configuration\n"); @@ -1451,7 +1467,10 @@ void delivery_conda_enable(struct Delivery *ctx, char *conda_install_dir) { exit(1); } - conda_setup_headless(); + if (conda_setup_headless()) { + // no COE check. this call must succeed. + exit(1); + } } void delivery_defer_packages(struct Delivery *ctx, int type) { diff --git a/src/download.c b/src/download.c index 1623560..f83adda 100644 --- a/src/download.c +++ b/src/download.c @@ -3,6 +3,7 @@ // #include <string.h> +#include <stdlib.h> #include "download.h" size_t download_writer(void *fp, size_t size, size_t nmemb, void *stream) { @@ -18,6 +19,8 @@ long download(char *url, const char *filename, char **errmsg) { FILE *fp; char user_agent[20]; sprintf(user_agent, "stasis/%s", VERSION); + long timeout = 30L; + char *timeout_str = getenv("STASIS_DOWNLOAD_TIMEOUT"); curl_global_init(CURL_GLOBAL_ALL); c = curl_easy_init(); @@ -27,11 +30,18 @@ long download(char *url, const char *filename, char **errmsg) { if (!fp) { return -1; } + curl_easy_setopt(c, CURLOPT_VERBOSE, 0L); curl_easy_setopt(c, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(c, CURLOPT_USERAGENT, user_agent); curl_easy_setopt(c, CURLOPT_NOPROGRESS, 0L); curl_easy_setopt(c, CURLOPT_WRITEDATA, fp); + + if (timeout_str) { + timeout = strtol(timeout_str, NULL, 10); + } + curl_easy_setopt(c, CURLOPT_CONNECTTIMEOUT, timeout); + curl_code = curl_easy_perform(c); if (curl_code != CURLE_OK) { if (errmsg) { |