1
1

tests: Introduce torture_make_temp_dir()

Introduces a function to create temporary dir for testing purposes.
Also adds a minimal test for the temporary directory creation.

Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Этот коммит содержится в:
Anderson Toshiyuki Sasaki 2018-10-24 20:01:04 +02:00 коммит произвёл Andreas Schneider
родитель 1f6b929735
Коммит 65e16b8d9e
4 изменённых файлов: 258 добавлений и 0 удалений

Просмотреть файл

@ -788,6 +788,210 @@ void torture_teardown_sshd_server(void **state)
torture_teardown_socket_dir(state);
}
char *torture_make_temp_dir(const char *template)
{
char *new_dir = NULL;
char *template_copy = NULL;
if (template == NULL) {
goto end;
}
template_copy = strdup(template);
if (template_copy == NULL) {
goto end;
}
new_dir = mkdtemp(template_copy);
if (new_dir == NULL) {
free(template_copy);
}
end:
return new_dir;
}
#else /* _WIN32 */
char *torture_make_temp_dir(const char *template)
{
DWORD rc = 0;
char tmp_dir_path[MAX_PATH];
char tmp_file_name[MAX_PATH];
char *prefix = NULL;
char *path = NULL;
char *prefix_end = NULL;
char *slash = NULL;
BOOL created;
if (template == NULL) {
goto end;
}
prefix = strdup(template);
if (prefix == NULL) {
goto end;
}
/* Replace slashes with backslashes */
slash = strchr(prefix, '/');
for (; slash != NULL; slash = strchr(prefix, '/')) {
*slash = '\\';
}
prefix_end = strstr(prefix, "XXXXXX");
if (prefix_end != NULL) {
*prefix_end = '\0';
}
rc = GetTempPathA(MAX_PATH, tmp_dir_path);
if ((rc > MAX_PATH) || (rc == 0)) {
goto free_prefix;
}
rc = GetTempFileNameA(tmp_dir_path, TEXT(prefix), 0, tmp_file_name);
if (rc == 0) {
goto free_prefix;
}
path = strdup(tmp_file_name);
if (path == NULL) {
goto free_prefix;
}
/* GetTempFileNameA() creates a temporary file; we need to remove it */
rc = DeleteFileA(path);
if (rc == 0) {
rc = -1;
SAFE_FREE(path);
goto free_prefix;
}
created = CreateDirectoryA(path, NULL);
if (!created) {
SAFE_FREE(path);
}
free_prefix:
SAFE_FREE(prefix);
end:
return path;
}
static int recursive_rm_dir_content(const char *path)
{
WIN32_FIND_DATA file_data;
HANDLE file_handle;
DWORD attributes;
DWORD last_error = 0;
char file_path[MAX_PATH];
int rc = 0;
BOOL removed;
strcpy(file_path, path);
strcat(file_path, "\\*");
file_handle = FindFirstFile(file_path, &file_data);
if (file_handle == INVALID_HANDLE_VALUE) {
last_error = GetLastError();
/* Empty directory */
if (last_error == ERROR_FILE_NOT_FOUND) {
rc = 0;
}
else {
/*TODO print error message?*/
rc = last_error;
}
goto end;
}
else {
do {
rc = strcmp(file_data.cFileName, ".");
if (rc == 0) {
continue;
}
rc = strcmp(file_data.cFileName, "..");
if (rc == 0) {
continue;
}
/* Create full file path */
strcpy(file_path, path);
strcat(file_path, "\\");
strcat(file_path, file_data.cFileName);
attributes = GetFileAttributes(file_path);
if (attributes & FILE_ATTRIBUTE_DIRECTORY) {
rc = recursive_rm_dir_content((const char *)file_path);
if (rc != 0) {
goto end;
}
removed = RemoveDirectoryA(file_path);
if (!removed) {
last_error = GetLastError();
/*TODO print error message?*/
rc = last_error;
goto end;
}
}
else {
rc = remove(file_path);
if (rc) {
goto end;
}
}
} while(FindNextFile(file_handle, &file_data));
FindClose(file_handle);
}
end:
return rc;
}
int torture_rmdirs(const char *path)
{
int rc = 0;
BOOL removed;
rc = recursive_rm_dir_content(path);
if (rc) {
return rc;
}
removed = RemoveDirectoryA(path);
if (!removed) {
rc = -1;
}
return rc;
}
int torture_isdir(const char *path)
{
DWORD attributes = 0;
attributes = GetFileAttributes(path);
if (attributes & FILE_ATTRIBUTE_DIRECTORY) {
return 1;
}
return 0;
}
#endif /* _WIN32 */
int torture_libssh_verbosity(void){

Просмотреть файл

@ -125,4 +125,6 @@ void torture_teardown_sshd_server(void **state);
*/
int torture_run_tests(void);
char *torture_make_temp_dir(const char *template);
#endif /* _TORTURE_H */

Просмотреть файл

@ -16,6 +16,7 @@ set(LIBSSH_UNIT_TESTS
torture_knownhosts_parsing
torture_hashes
torture_packet_filter
torture_temp_dir
)
set(LIBSSH_THREAD_UNIT_TESTS

51
tests/unittests/torture_temp_dir.c Обычный файл
Просмотреть файл

@ -0,0 +1,51 @@
#include "config.h"
#include "torture.h"
#define LIBSSH_STATIC
const char template[] = "temp_dir_XXXXXX";
static int setup(void **state)
{
char *temp_dir = NULL;
temp_dir = torture_make_temp_dir(template);
assert_non_null(temp_dir);
*state = (void *)temp_dir;
return 0;
}
static int teardown(void **state)
{
char *temp_dir = *((char **)state);
torture_rmdirs((const char *)temp_dir);
free(temp_dir);
return 0;
}
static void torture_create_temp_dir(void **state)
{
char *temp_dir = *((char **)state);
printf("Created temp dir: %s\n", temp_dir);
}
int torture_run_tests(void)
{
int rc;
struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(torture_create_temp_dir, setup, teardown),
};
torture_filter_tests(tests);
rc = cmocka_run_group_tests(tests, NULL, NULL);
return rc;
}