aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnderson Toshiyuki Sasaki <ansasaki@redhat.com>2018-11-20 14:01:57 +0100
committerAndreas Schneider <asn@cryptomilk.org>2018-11-28 15:51:06 +0100
commit0dd2b375c770854f73fa64b8e43c741e074de7e6 (patch)
treeabda610bbcec6c88406a96285790fe950a088958
parent77be4ce9056e86f13b06fe15f410d663f5e7b771 (diff)
downloadlibssh-0dd2b375c770854f73fa64b8e43c741e074de7e6.tar.gz
libssh-0dd2b375c770854f73fa64b8e43c741e074de7e6.tar.xz
libssh-0dd2b375c770854f73fa64b8e43c741e074de7e6.zip
tests: Introduce functions to change directories
This introduces torture_get_current_working_dir() and torture_change_dir() to allow changing directories in tests. Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
-rw-r--r--tests/torture.c60
-rw-r--r--tests/torture.h3
-rw-r--r--tests/unittests/CMakeLists.txt1
-rw-r--r--tests/unittests/torture_push_pop_dir.c78
4 files changed, 142 insertions, 0 deletions
diff --git a/tests/torture.c b/tests/torture.c
index f7ed775e..88387edb 100644
--- a/tests/torture.c
+++ b/tests/torture.c
@@ -39,11 +39,13 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#elif (defined _WIN32) || (defined _WIN64)
+#include <direct.h>
#include <io.h>
#define read _read
#define open _open
#define write _write
#define close _close
+#define chdir _chdir
#endif
#include "torture.h"
@@ -842,6 +844,28 @@ end:
return new_file;
}
+char *torture_get_current_working_dir(void)
+{
+
+ char *cwd = NULL;
+ char *result = NULL;
+
+ cwd = (char *)malloc(PATH_MAX + 1);
+ if (cwd == NULL) {
+ goto end;
+ }
+
+ result = getcwd(cwd, PATH_MAX);
+
+ if (result == NULL) {
+ SAFE_FREE(cwd);
+ goto end;
+ }
+
+end:
+ return cwd;
+}
+
#else /* _WIN32 */
char *torture_make_temp_dir(const char *template)
@@ -1072,8 +1096,44 @@ end:
return path;
}
+char *torture_get_current_working_dir(void)
+{
+ char *cwd = NULL;
+ char *result = NULL;
+
+ cwd = (char *)malloc(_MAX_PATH + 1);
+ if (cwd == NULL) {
+ goto end;
+ }
+
+ result = _getcwd(cwd, _MAX_PATH);
+
+ if (result == NULL) {
+ SAFE_FREE(cwd);
+ goto end;
+ }
+
+end:
+ return cwd;
+}
+
#endif /* _WIN32 */
+int torture_change_dir(char *path)
+{
+ int rc = 0;
+
+ if (path == NULL) {
+ rc = -1;
+ goto end;
+ }
+
+ rc = chdir(path);
+
+end:
+ return rc;
+}
+
int torture_libssh_verbosity(void){
return verbosity;
}
diff --git a/tests/torture.h b/tests/torture.h
index 0367653b..b47c7cbb 100644
--- a/tests/torture.h
+++ b/tests/torture.h
@@ -128,4 +128,7 @@ int torture_run_tests(void);
char *torture_make_temp_dir(const char *template);
char *torture_create_temp_file(const char *template);
+char *torture_get_current_working_dir(void);
+int torture_change_dir(char *path);
+
#endif /* _TORTURE_H */
diff --git a/tests/unittests/CMakeLists.txt b/tests/unittests/CMakeLists.txt
index 730da341..d2dbdd72 100644
--- a/tests/unittests/CMakeLists.txt
+++ b/tests/unittests/CMakeLists.txt
@@ -18,6 +18,7 @@ set(LIBSSH_UNIT_TESTS
torture_packet_filter
torture_temp_dir
torture_temp_file
+ torture_push_pop_dir
)
set(LIBSSH_THREAD_UNIT_TESTS
diff --git a/tests/unittests/torture_push_pop_dir.c b/tests/unittests/torture_push_pop_dir.c
new file mode 100644
index 00000000..faf10866
--- /dev/null
+++ b/tests/unittests/torture_push_pop_dir.c
@@ -0,0 +1,78 @@
+#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_back_and_forth(void **state)
+{
+ char *temp_dir = *((char **)state);
+ char *cwd = NULL;
+ char *after_change = NULL;
+ char *after_changing_back = NULL;
+ int rc = 0;
+
+ cwd = torture_get_current_working_dir();
+ assert_non_null(cwd);
+
+ printf("Current dir: %s\n", cwd);
+
+ rc = torture_change_dir(temp_dir);
+ assert_int_equal(rc, 0);
+
+ after_change = torture_get_current_working_dir();
+ assert_non_null(after_change);
+
+ printf("Current dir after change: %s\n", after_change);
+
+ rc = torture_change_dir(cwd);
+ assert_int_equal(rc, 0);
+
+ after_changing_back = torture_get_current_working_dir();
+ assert_non_null(after_changing_back);
+
+ printf("Back to dir: %s\n", after_changing_back);
+
+ SAFE_FREE(cwd);
+ SAFE_FREE(after_change);
+ SAFE_FREE(after_changing_back);
+}
+
+int torture_run_tests(void)
+{
+ int rc;
+ struct CMUnitTest tests[] = {
+ cmocka_unit_test_setup_teardown(torture_back_and_forth,
+ setup, teardown),
+ };
+
+ torture_filter_tests(tests);
+ rc = cmocka_run_group_tests(tests, NULL, NULL);
+
+ return rc;
+}
+