diff --git a/include/cosms-core/file.h b/include/cosms-core/file.h index 5ea7f01..e4ee28e 100644 --- a/include/cosms-core/file.h +++ b/include/cosms-core/file.h @@ -21,11 +21,14 @@ typedef enum { COSMS_CORE_FILE_FAILED_TO_ALLOCATE = -6, COSMS_CORE_FILE_FAILED_TO_READ = -7, COSMS_CORE_FILE_FAILED_TO_WRITE = -8, + COSMS_CORE_FILE_STILL_OPEN = -9, } CosmsCoreFileError; CosmsCoreFileError cosms_core_file_read(const char *path, char **content, unsigned long long *size); CosmsCoreFileError cosms_core_file_write(const char *path, const char *content, unsigned long long size, bool override); +CosmsCoreFileError cosms_core_file_delete(const char *path); + const char *cosms_core_file_error_string(CosmsCoreFileError error); #endif diff --git a/src/file.c b/src/file.c index 1f05ebe..7b91c70 100644 --- a/src/file.c +++ b/src/file.c @@ -237,6 +237,46 @@ CosmsCoreFileError cosms_core_file_write(const char *path, const char *content, return COSMS_CORE_FILE_OK; } +CosmsCoreFileError cosms_core_file_delete(const char *path) { + #if defined(__GNUC__) + if (unlink(path) == -1) { + switch (errno) { + case ENOENT: + return COSMS_CORE_FILE_NOT_FOUND; + + case EACCES: + return COSMS_CORE_FILE_NO_ACCESS; + + case EBUSY: + return COSMS_CORE_FILE_STILL_OPEN; + + default: + return COSMS_CORE_FILE_UNKOWN_ERROR; + } + } + #elif defined(_WIN32) + if (!DeleteFile(path)) { + switch(GetLastError()) { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return COSMS_CORE_FILE_NOT_FOUND; + + case ERROR_ACCESS_DENIED: + return COSMS_CORE_FILE_NO_ACCESS; + + case ERROR_LOCK_VIOLATION: + case ERROR_SHARING_VIOLATION: + return COSMS_CORE_FILE_STILL_OPEN; + + default: + return COSMS_CORE_FILE_UNKOWN_ERROR; + } + } + #endif + + return COSMS_CORE_FILE_OK; +} + const char *cosms_core_file_error_string(CosmsCoreFileError error) { switch(error) { case COSMS_CORE_FILE_OK: @@ -266,6 +306,9 @@ const char *cosms_core_file_error_string(CosmsCoreFileError error) { case COSMS_CORE_FILE_FAILED_TO_WRITE: return "cosms-file failed to write content to file"; + case COSMS_CORE_FILE_STILL_OPEN: + return "cosms-file still open"; + default: return NULL; } diff --git a/tests/data/append-write-file.txt b/tests/data/append-write-file.txt deleted file mode 100644 index b45ef6f..0000000 --- a/tests/data/append-write-file.txt +++ /dev/null @@ -1 +0,0 @@ -Hello, World! \ No newline at end of file diff --git a/tests/data/large-write-file.txt b/tests/data/large-write-file.txt deleted file mode 100644 index d4c5011..0000000 Binary files a/tests/data/large-write-file.txt and /dev/null differ diff --git a/tests/data/small-write-file.txt b/tests/data/small-write-file.txt deleted file mode 100644 index 2dd9088..0000000 --- a/tests/data/small-write-file.txt +++ /dev/null @@ -1 +0,0 @@ -Hello, World!Hello, World! \ No newline at end of file diff --git a/tests/main.c b/tests/main.c index a5695b7..714b09b 100644 --- a/tests/main.c +++ b/tests/main.c @@ -1,7 +1,9 @@ +#include "unit/file.h" #include "unit/unit.h" int main(void) { cosms_core_file_read_test(); cosms_core_file_write_test(); + cosms_core_file_delete_test(); return 0; } diff --git a/tests/unit/file.c b/tests/unit/file.c index 1f64993..5c4beb5 100644 --- a/tests/unit/file.c +++ b/tests/unit/file.c @@ -145,4 +145,48 @@ void cosms_core_file_write_test() { free(file_content); } +} + +void cosms_core_file_delete_test() { + COSMS_CORE_TEST_HEADER("file delete"); + + const char *current_test_name = "deleting small file"; + COSMS_CORE_TEST_START(current_test_name); + + CosmsCoreFileError error = cosms_core_file_delete("tests/data/small-write-file.txt"); + if (cosms_core_test_assert(current_test_name, error == COSMS_CORE_FILE_OK, cosms_core_file_error_string(error))) { + char *file_content = NULL; + error = cosms_core_file_read("tests/data/small-write-file.txt", &file_content, NULL); + if (cosms_core_test_assert(current_test_name, error == COSMS_CORE_FILE_NOT_FOUND, cosms_core_file_error_string(error))) { + COSMS_CORE_TEST_SUCCESS(current_test_name); + } + + if (file_content != NULL) { + free(file_content); + } + } + + current_test_name = "deleting large file"; + COSMS_CORE_TEST_START(current_test_name); + + error = cosms_core_file_delete("tests/data/append-write-file.txt"); + if (cosms_core_test_assert(current_test_name, error == COSMS_CORE_FILE_OK, cosms_core_file_error_string(error))) { + char *file_content = NULL; + error = cosms_core_file_read("tests/data/append-write-file.txt", &file_content, NULL); + if (cosms_core_test_assert(current_test_name, error == COSMS_CORE_FILE_NOT_FOUND, cosms_core_file_error_string(error))) { + COSMS_CORE_TEST_SUCCESS(current_test_name); + } + + if (file_content != NULL) { + free(file_content); + } + } + + current_test_name = "deleting non existing file"; + COSMS_CORE_TEST_START(current_test_name); + + error = cosms_core_file_delete("non-existing-file.cosms"); + if (cosms_core_test_assert(current_test_name, error == COSMS_CORE_FILE_NOT_FOUND, cosms_core_file_error_string(error))) { + COSMS_CORE_TEST_SUCCESS(current_test_name); + } } \ No newline at end of file diff --git a/tests/unit/file.h b/tests/unit/file.h index c789f04..1077dc0 100644 --- a/tests/unit/file.h +++ b/tests/unit/file.h @@ -5,5 +5,6 @@ void cosms_core_file_read_test(); void cosms_core_file_write_test(); +void cosms_core_file_delete_test(); #endif \ No newline at end of file