diff options
Diffstat (limited to 'src/third_party/wiredtiger/test/utility/test_util.i')
-rw-r--r-- | src/third_party/wiredtiger/test/utility/test_util.i | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/test/utility/test_util.i b/src/third_party/wiredtiger/test/utility/test_util.i new file mode 100644 index 00000000000..48b5d191a32 --- /dev/null +++ b/src/third_party/wiredtiger/test/utility/test_util.i @@ -0,0 +1,148 @@ +/*- + * Public Domain 2014-2015 MongoDB, Inc. + * Public Domain 2008-2014 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <wiredtiger.h> +#include "wt_internal.h" /* For __wt_XXX */ + +#ifdef _WIN32 +#include "windows_shim.h" +#endif + +#ifdef _WIN32 + #define DIR_DELIM '\\' + #define RM_COMMAND "rd /s /q " +#else + #define DIR_DELIM '/' + #define RM_COMMAND "rm -rf " +#endif + +#define DEFAULT_DIR "WT_TEST" +#define MKDIR_COMMAND "mkdir " + +/* + * die -- + * Report an error and quit. + */ +static inline void +testutil_die(int e, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + if (e != 0) + fprintf(stderr, ": %s", wiredtiger_strerror(e)); + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); +} + +/* + * testutil_work_dir_from_path -- + * Takes a buffer, its size and the intended work directory. + * Creates the full intended work directory in buffer. + */ +static inline void +testutil_work_dir_from_path(char *buffer, size_t inputSize, char *dir) +{ + /* If no directory is provided, use the default. */ + if (dir == NULL) { + if (inputSize < sizeof(DEFAULT_DIR)) + testutil_die(ENOMEM, + "Not enough memory in buffer for directory %s%c%s", + dir, DIR_DELIM, DEFAULT_DIR); + + snprintf(buffer, inputSize, DEFAULT_DIR); + return; + } + + /* Additional bytes for the directory and WT_TEST. */ + if (inputSize < strlen(dir) + sizeof(DEFAULT_DIR) + sizeof(DIR_DELIM)) + testutil_die(ENOMEM, + "Not enough memory in buffer for directory %s%c%s", + dir, DIR_DELIM, DEFAULT_DIR); + + snprintf(buffer, inputSize, "%s%c%s", dir, DIR_DELIM, DEFAULT_DIR); +} + +/* + * testutil_clean_work_dir -- + * Remove any existing work directories, can optionally fail on error + */ +static inline void +testutil_clean_work_dir(char *dir) +{ + size_t inputSize; + int ret; + bool exist; + char *buffer; + + /* Additional bytes for the Windows rd command. */ + inputSize = strlen(dir) + sizeof(RM_COMMAND); + if ((buffer = malloc(inputSize)) == NULL) + testutil_die(ENOMEM, "Failed to allocate memory"); + + snprintf(buffer, inputSize, "%s%s", RM_COMMAND, dir); + + exist = 0; + if ((ret = __wt_exist(NULL, dir, &exist)) != 0) + testutil_die(ret, + "Unable to check if directory exists"); + if (exist == 1 && (ret = system(buffer)) != 0) + testutil_die(ret, + "System call to remove directory failed"); + free(buffer); +} + +/* + * testutil_make_work_dir -- + * Delete the existing work directory if it exists, then create a new one. + */ +static inline void +testutil_make_work_dir(char *dir) +{ + size_t inputSize; + int ret; + char *buffer; + + testutil_clean_work_dir(dir); + + /* Additional bytes for the mkdir command */ + inputSize = strlen(dir) + sizeof(MKDIR_COMMAND); + if ((buffer = malloc(inputSize)) == NULL) + testutil_die(ENOMEM, "Failed to allocate memory"); + + /* mkdir shares syntax between Windows and Linux */ + snprintf(buffer, inputSize, "%s%s", MKDIR_COMMAND, dir); + if ((ret = system(buffer)) != 0) + testutil_die(ret, "directory create call of '%s%s' failed", + MKDIR_COMMAND, dir); + free(buffer); +} |