efl/src/tests/eio/eio_test_manager_xattr.c

202 lines
4.5 KiB
C

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <Ecore.h>
#include <Ecore_File.h>
#include <Eio.h>
#include "eio_suite.h"
#include "eio_test_common.h"
#ifndef XATTR_TEST_DIR
#define DISABLE_XATTR_TEST
#define XATTR_TEST_DIR ""
#endif
static const char *attribute[] =
{
"user.comment1",
"user.comment2",
"user.comment3"
};
static const char *attr_data[] =
{
"This is a test file",
"This line is a comment",
"This file has extra attributes"
};
int total_attributes = sizeof(attribute)/sizeof(attribute[0]);
static void
_main_cb(void *data, const Efl_Event *ev)
{
Efl_Future_Event_Success *success = ev->info;
const char* attr = success->value;
int *num_of_attr = (int *)data;
unsigned int i;
for (i = 0; i < sizeof (attribute) / sizeof (attribute[0]); ++i)
if (strcmp(attr, attribute[i]) == 0)
{
(*num_of_attr)++;
break;
}
}
static void
_done_cb(void *data, const Efl_Event *ev EINA_UNUSED)
{
int *num_of_attr = (int *)data;
fail_if(*num_of_attr != total_attributes);
ecore_main_loop_quit();
}
static void
_done_get_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
Efl_Future_Event_Success *success = ev->info;
Eina_Accessor *ac = success->value;
int i = 0;
Eina_Binbuf *buf;
EINA_ACCESSOR_FOREACH(ac, i, buf)
{
fail_if(!buf);
fail_if(strcmp((const char*) eina_binbuf_string_get(buf),
attr_data[i]) != 0);
i++;
}
fail_if(i != total_attributes);
ecore_main_loop_quit();
}
static void
_done_set_cb(void *data, const Efl_Event *ev)
{
Efl_Future_Event_Success *success = ev->info;
Eina_Accessor *ac = success->value;
int *placeholder;
int *num_of_attr = data;
int i = 0;
EINA_ACCESSOR_FOREACH(ac, i, placeholder)
*num_of_attr += 1;
fail_if(*num_of_attr != total_attributes);
ecore_main_loop_quit();
}
static void
_error_cb(void *data EINA_UNUSED, const Efl_Event *ev)
{
Efl_Future_Event_Failure *failure = ev->info;
fprintf(stderr, "Something has gone wrong:%s\n", eina_error_msg_get(failure->error));
abort();
ecore_main_loop_quit();
}
START_TEST(eio_test_job_xattr_set)
{
char *filename = "eio-tmpfile";
Eina_Tmpstr *test_file_path;
int num_of_attr = 0, fd;
unsigned int i;
Eo *job;
Efl_Future *ls = NULL;
Efl_Future **futures = NULL;
ecore_init();
eina_init();
eio_init();
job = efl_add(EFL_IO_MANAGER_CLASS, ecore_main_loop_get());
test_file_path = get_full_path(XATTR_TEST_DIR, filename);
fd = open(test_file_path,
O_WRONLY | O_CREAT | O_TRUNC,
S_IRWXU | S_IRWXG | S_IRWXO);
fail_if(fd == 0);
futures = calloc(total_attributes + 1, sizeof(Efl_Future*));
futures[total_attributes] = NULL;
for (i = 0; i < sizeof(attribute) / sizeof(attribute[0]); ++i)
{
Eina_Binbuf *buf;
buf = eina_binbuf_manage_new((const unsigned char*) attr_data[i], strlen(attr_data[i]), EINA_TRUE);
futures[i] = efl_io_manager_xattr_set(job, test_file_path, attribute[i], buf, EINA_XATTR_INSERT);
eina_binbuf_free(buf);
fail_if(num_of_attr != 0); // test asynchronous
}
efl_future_then(efl_future_iterator_all(eina_carray_iterator_new((void**) futures)),
_done_set_cb, _error_cb, NULL, &num_of_attr);
ecore_main_loop_begin();
free(futures);
num_of_attr = 0;
futures = calloc(total_attributes + 1, sizeof(Efl_Future*));
futures[total_attributes] = NULL;
for (i = 0; i < sizeof(attribute) / sizeof(attribute[0]); ++i)
{
futures[i] = efl_io_manager_xattr_get(job, test_file_path, attribute[i]);
}
efl_future_then(efl_future_iterator_all(eina_carray_iterator_new((void**)futures)),
_done_get_cb, _error_cb, NULL, &num_of_attr);
ecore_main_loop_begin();
num_of_attr = 0;
efl_future_use(&ls, efl_io_manager_xattr_ls(job, test_file_path));
efl_future_then(ls, _done_cb, _error_cb, _main_cb, &num_of_attr);
fail_if(num_of_attr != 0);
ecore_main_loop_begin();
free(futures);
efl_unref(job);
close(fd);
unlink(test_file_path);
eina_tmpstr_del(test_file_path);
eio_shutdown();
eina_shutdown();
ecore_shutdown();
}
END_TEST
void eio_test_job_xattr(TCase *tc)
{
#ifndef DISABLE_XATTR_TEST
tcase_add_test(tc, eio_test_job_xattr_set);
#else
(void)eio_test_job_xattr_set;
(void)tc;
#endif
}