Eet tests: Added an hack to test what's wrong with the build bot.
[framework/uifw/eet.git] / src / tests / eet_suite.c
index 631fd6b..afff25c 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif /* ifdef HAVE_CONFIG_H */
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <unistd.h>
 
-#include <check.h>
+#include <Eina.h>
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
+#ifdef EINA_HAVE_THREADS
+#if ((!defined(_WIN32_WCE)) && (!defined(_WIN32)))
+# include <pthread.h>
+# define _EET_INCLUDED_PTHREAD
 #endif
+#endif /* ifdef EINA_HAVE_THREADS */
 
-#include <Eina.h>
+#include <check.h>
 
 #include "eet_suite.h"
 
+#define CERT_DIR "src/tests/" TESTS_SRC_DIR
+
 START_TEST(eet_test_init)
 {
    int ret;
@@ -32,39 +41,39 @@ END_TEST
 typedef struct _Eet_Test_Basic_Type Eet_Test_Basic_Type;
 struct _Eet_Test_Basic_Type
 {
-   char c;
-   short s;
-   int i;
-   long long l;
-   char *str;
-   char *istr;
-   float f1;
-   float f2;
-   double d;
-   unsigned char uc;
-   unsigned short us;
-   unsigned int ui;
-   unsigned long long ul;
+   char                 c;
+   short                s;
+   int                  i;
+   long long            l;
+   char                *str;
+   char                *istr;
+   float                f1;
+   float                f2;
+   double               d;
+   unsigned char        uc;
+   unsigned short       us;
+   unsigned int         ui;
+   unsigned long long   ul;
    Eet_Test_Basic_Type *empty;
    Eet_Test_Basic_Type *with;
 };
 
-#define EET_TEST_CHAR 0x42
-#define EET_TEST_SHORT 0x4224
-#define EET_TEST_INT 0x42211224
-#define EET_TEST_LONG_LONG 0x84CB42211224BC48
-#define EET_TEST_STRING "my little test with escape \\\""
-#define EET_TEST_KEY1 "key1"
-#define EET_TEST_KEY2 "key2"
-#define EET_TEST_FLOAT 123.45689
-#define EET_TEST_FLOAT2 1.0
-#define EET_TEST_FLOAT3 0.25
-#define EET_TEST_FLOAT4 0.0001234
-#define EET_TEST_DOUBLE 123456789.9876543210
-#define EET_TEST_DOUBLE2 1.0
-#define EET_TEST_DOUBLE3 0.25
-#define EET_TEST_FILE_KEY1 "keys/data/1"
-#define EET_TEST_FILE_KEY2 "keys/data/2"
+#define EET_TEST_CHAR       0x42
+#define EET_TEST_SHORT      0x4224
+#define EET_TEST_INT        0x42211224
+#define EET_TEST_LONG_LONG  0x84CB42211224BC48
+#define EET_TEST_STRING     "my little test with escape \\\""
+#define EET_TEST_KEY1       "key1"
+#define EET_TEST_KEY2       "key2"
+#define EET_TEST_FLOAT      123.45689
+#define EET_TEST_FLOAT2     1.0
+#define EET_TEST_FLOAT3     0.25
+#define EET_TEST_FLOAT4     0.0001234
+#define EET_TEST_DOUBLE     123456789.9876543210
+#define EET_TEST_DOUBLE2    1.0
+#define EET_TEST_DOUBLE3    0.25
+#define EET_TEST_FILE_KEY1  "keys/data/1"
+#define EET_TEST_FILE_KEY2  "keys/data/2"
 #define EET_TEST_FILE_IMAGE "keys/images/"
 
 typedef struct _Eet_Test_Image Eet_Test_Image;
@@ -72,40 +81,57 @@ struct _Eet_Test_Image
 {
    unsigned int w;
    unsigned int h;
-   int alpha;
-   unsigned int color[];
+   int          alpha;
+   unsigned int color[64];
 };
 
 static const Eet_Test_Image test_noalpha = {
-  8, 8, 0,
-  {
-    0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000,
-    0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000,
-    0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00,
-    0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA,
-    0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000,
-    0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000,
-    0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00,
-    0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA
-  }
+   8, 8, 0,
+   {
+      0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00,
+      0x000000AA, 0x00110000,
+      0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA,
+      0x00110000, 0x00AA0000,
+      0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000,
+      0x00AA0000, 0x0000AA00,
+      0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000,
+      0x0000AA00, 0x000000AA,
+      0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00,
+      0x000000AA, 0x00110000,
+      0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA,
+      0x00110000, 0x00AA0000,
+      0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000,
+      0x00AA0000, 0x0000AA00,
+      0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000,
+      0x0000AA00, 0x000000AA
+   }
 };
 
 static const Eet_Test_Image test_alpha = {
-  8, 8, 1,
-  {
-    0x0FAA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000,
-    0x0000AA00, 0x0F0000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000,
-    0x000000AA, 0x00110000, 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00,
-    0x00110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA,
-    0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x00110000,
-    0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, 0x00110000, 0x00AA0000,
-    0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x0FAA0000, 0x0000AA00,
-    0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA
-  }
+   8, 8, 1,
+   {
+      0x0FAA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000, 0x0000AA00,
+      0x000000AA, 0x0F110000,
+      0x0000AA00, 0x0F0000AA, 0x00110000, 0x00AA0000, 0x0000AA00, 0x000000AA,
+      0x0F110000, 0x00AA0000,
+      0x000000AA, 0x00110000, 0x0FAA0000, 0x0000AA00, 0x000000AA, 0x0F110000,
+      0x00AA0000, 0x0000AA00,
+      0x00110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA, 0x0F110000, 0x00AA0000,
+      0x0000AA00, 0x000000AA,
+      0x00AA0000, 0x0000AA00, 0x000000AA, 0x0F110000, 0x0FAA0000, 0x0000AA00,
+      0x000000AA, 0x00110000,
+      0x0000AA00, 0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x0F0000AA,
+      0x00110000, 0x00AA0000,
+      0x000000AA, 0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000,
+      0x0FAA0000, 0x0000AA00,
+      0x0F110000, 0x00AA0000, 0x0000AA00, 0x000000AA, 0x00110000, 0x00AA0000,
+      0x0000AA00, 0x0F0000AA
+   }
 };
 
 static void
-_eet_test_basic_set(Eet_Test_Basic_Type *res, int i)
+_eet_test_basic_set(Eet_Test_Basic_Type *res,
+                    int                  i)
 {
    res->c = EET_TEST_CHAR;
    res->s = EET_TEST_SHORT;
@@ -113,8 +139,8 @@ _eet_test_basic_set(Eet_Test_Basic_Type *res, int i)
    res->l = EET_TEST_LONG_LONG;
    res->str = EET_TEST_STRING;
    res->istr = EET_TEST_STRING;
-   res->f1 = - EET_TEST_FLOAT;
-   res->d = - EET_TEST_DOUBLE;
+   res->f1 = -EET_TEST_FLOAT;
+   res->d = -EET_TEST_DOUBLE;
    res->f2 = EET_TEST_FLOAT4;
    res->uc = EET_TEST_CHAR;
    res->us = EET_TEST_SHORT;
@@ -125,39 +151,40 @@ _eet_test_basic_set(Eet_Test_Basic_Type *res, int i)
 
    if (i == 0)
      {
-       Eet_Test_Basic_Type *tmp;
-
-       tmp = malloc(sizeof (Eet_Test_Basic_Type));
-       fail_if(!tmp);
-
-       res->with = tmp;
-       tmp->c = EET_TEST_CHAR;
-       tmp->s = EET_TEST_SHORT;
-       tmp->i = EET_TEST_INT + i + 1;
-       tmp->l = EET_TEST_LONG_LONG;
-       tmp->str = EET_TEST_STRING;
-       tmp->istr = EET_TEST_STRING;
-       tmp->f1 = - EET_TEST_FLOAT;
-       tmp->d = - EET_TEST_DOUBLE;
-       tmp->f2 = EET_TEST_FLOAT4;
-       tmp->uc = EET_TEST_CHAR;
-       tmp->us = EET_TEST_SHORT;
-       tmp->ui = EET_TEST_INT;
-       tmp->ul = EET_TEST_LONG_LONG;
-       tmp->empty = NULL;
-       tmp->with = NULL;
+        Eet_Test_Basic_Type *tmp;
+
+        tmp = malloc(sizeof (Eet_Test_Basic_Type));
+        fail_if(!tmp);
+
+        res->with = tmp;
+        tmp->c = EET_TEST_CHAR;
+        tmp->s = EET_TEST_SHORT;
+        tmp->i = EET_TEST_INT + i + 1;
+        tmp->l = EET_TEST_LONG_LONG;
+        tmp->str = EET_TEST_STRING;
+        tmp->istr = EET_TEST_STRING;
+        tmp->f1 = -EET_TEST_FLOAT;
+        tmp->d = -EET_TEST_DOUBLE;
+        tmp->f2 = EET_TEST_FLOAT4;
+        tmp->uc = EET_TEST_CHAR;
+        tmp->us = EET_TEST_SHORT;
+        tmp->ui = EET_TEST_INT;
+        tmp->ul = EET_TEST_LONG_LONG;
+        tmp->empty = NULL;
+        tmp->with = NULL;
      }
-}
+} /* _eet_test_basic_set */
 
 static void
-_eet_test_basic_check(Eet_Test_Basic_Type *result, int i)
+_eet_test_basic_check(Eet_Test_Basic_Type *result,
+                      int                  i)
 {
    float tmp;
 
    fail_if(result->c != EET_TEST_CHAR);
    fail_if(result->s != EET_TEST_SHORT);
    fail_if(result->i != EET_TEST_INT + i);
-   fail_if(result->l != (long long) EET_TEST_LONG_LONG);
+   fail_if(result->l != (long long)EET_TEST_LONG_LONG);
    fail_if(strcmp(result->str, EET_TEST_STRING) != 0);
    fail_if(strcmp(result->istr, EET_TEST_STRING) != 0);
    fail_if(result->uc != EET_TEST_CHAR);
@@ -166,60 +193,118 @@ _eet_test_basic_check(Eet_Test_Basic_Type *result, int i)
    fail_if(result->ul != EET_TEST_LONG_LONG);
 
    tmp = (result->f1 + EET_TEST_FLOAT);
-   if (tmp < 0) tmp = -tmp;
+   if (tmp < 0)
+     tmp = -tmp;
+
    fail_if(tmp > 0.005);
 
    tmp = (result->f2 - EET_TEST_FLOAT4);
-   if (tmp < 0) tmp = -tmp;
+   if (tmp < 0)
+     tmp = -tmp;
+
    fail_if(tmp > 0.005);
 
    tmp = (result->d + EET_TEST_DOUBLE);
-   if (tmp < 0) tmp = -tmp;
+   if (tmp < 0)
+     tmp = -tmp;
+
    fail_if(tmp > 0.00005);
 
    fail_if(result->empty != NULL);
    if (i == 0)
      {
-       Eet_Test_Basic_Type *tmp;
-
-       tmp = result->with;
-       fail_if(tmp == NULL);
-
-       fail_if(tmp->c != EET_TEST_CHAR);
-       fail_if(tmp->s != EET_TEST_SHORT);
-       fail_if(tmp->i != EET_TEST_INT + i + 1);
-       fail_if(tmp->l != (long long) EET_TEST_LONG_LONG);
-       fail_if(strcmp(tmp->str, EET_TEST_STRING) != 0);
-       fail_if(strcmp(tmp->istr, EET_TEST_STRING) != 0);
-       fail_if(tmp->uc != EET_TEST_CHAR);
-       fail_if(tmp->us != EET_TEST_SHORT);
-       fail_if(tmp->ui != EET_TEST_INT);
-       fail_if(tmp->ul != EET_TEST_LONG_LONG);
+        Eet_Test_Basic_Type *tmp2;
+
+        tmp2 = result->with;
+        fail_if(tmp2 == NULL);
+
+        fail_if(tmp2->c != EET_TEST_CHAR);
+        fail_if(tmp2->s != EET_TEST_SHORT);
+        fail_if(tmp2->i != EET_TEST_INT + i + 1);
+        fail_if(tmp2->l != (long long)EET_TEST_LONG_LONG);
+        fail_if(strcmp(tmp2->str, EET_TEST_STRING) != 0);
+        fail_if(strcmp(tmp2->istr, EET_TEST_STRING) != 0);
+        fail_if(tmp2->uc != EET_TEST_CHAR);
+        fail_if(tmp2->us != EET_TEST_SHORT);
+        fail_if(tmp2->ui != EET_TEST_INT);
+        fail_if(tmp2->ul != EET_TEST_LONG_LONG);
      }
    else
      fail_if(result->with != NULL);
-}
+} /* _eet_test_basic_check */
 
 static void
 _eet_build_basic_descriptor(Eet_Data_Descriptor *edd)
 {
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "c", c, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "s", s, EET_T_SHORT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "i", i, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "l", l, EET_T_LONG_LONG);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "str", str, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "istr", istr, EET_T_INLINED_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "f1", f1, EET_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "f2", f2, EET_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "d", d, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "uc", uc, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "us", us, EET_T_USHORT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "ui", ui, EET_T_UINT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Basic_Type, "ul", ul, EET_T_ULONG_LONG);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "c",
+                                 c,
+                                 EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "s",
+                                 s,
+                                 EET_T_SHORT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "i",
+                                 i,
+                                 EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "l",
+                                 l,
+                                 EET_T_LONG_LONG);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "str",
+                                 str,
+                                 EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "istr",
+                                 istr,
+                                 EET_T_INLINED_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "f1",
+                                 f1,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "f2",
+                                 f2,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "d",
+                                 d,
+                                 EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "uc",
+                                 uc,
+                                 EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "us",
+                                 us,
+                                 EET_T_USHORT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "ui",
+                                 ui,
+                                 EET_T_UINT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Basic_Type,
+                                 "ul",
+                                 ul,
+                                 EET_T_ULONG_LONG);
 
    EET_DATA_DESCRIPTOR_ADD_SUB(edd, Eet_Test_Basic_Type, "empty", empty, edd);
    EET_DATA_DESCRIPTOR_ADD_SUB(edd, Eet_Test_Basic_Type, "with", with, edd);
-}
+} /* _eet_build_basic_descriptor */
 
 START_TEST(eet_test_basic_data_type_encoding_decoding)
 {
@@ -238,7 +323,7 @@ START_TEST(eet_test_basic_data_type_encoding_decoding)
    eddc.name = "Eet_Test_Basic_Type";
    eddc.size = sizeof(Eet_Test_Basic_Type);
 
-   edd = eet_data_descriptor2_new(&eddc);
+   edd = eet_data_descriptor_stream_new(&eddc);
    fail_if(!edd);
 
    _eet_build_basic_descriptor(edd);
@@ -263,41 +348,42 @@ END_TEST
 typedef struct _Eet_Test_Ex_Type Eet_Test_Ex_Type;
 struct _Eet_Test_Ex_Type
 {
-   char c;
-   short s;
-   int i;
-   unsigned long long l;
-   char *str;
-   char *istr;
-   float f1;
-   float f2;
-   float f3;
-   float f4;
-   double d1;
-   double d2;
-   double d3;
-   double d4;
-   Eina_List *list;
-   Eina_Hash *hash;
-   Eina_List *ilist;
-   Eina_List *slist;
-   Eina_Hash *ihash;
-   Eet_Test_Basic_Type sarray1[10];
-   unsigned int sarray2[5];
-   unsigned int varray1_count;
-   unsigned int *varray1;
-   unsigned int varray2_count;
+   char                 c;
+   short                s;
+   int                  i;
+   unsigned long long   l;
+   char                *str;
+   char                *istr;
+   float                f1;
+   float                f2;
+   float                f3;
+   float                f4;
+   double               d1;
+   double               d2;
+   double               d3;
+   double               d4;
+   Eina_List           *list;
+   Eina_Hash           *hash;
+   Eina_List           *ilist;
+   Eina_List           *slist;
+   Eina_Hash           *ihash;
+   Eina_Hash           *shash;
+   Eet_Test_Basic_Type  sarray1[10];
+   unsigned int         sarray2[5];
+   unsigned int         varray1_count;
+   unsigned int        *varray1;
+   unsigned int         varray2_count;
    Eet_Test_Basic_Type *varray2;
-   unsigned char uc;
-   unsigned short us;
-   unsigned int ui;
-   unsigned long long ul;
+   unsigned char        uc;
+   unsigned short       us;
+   unsigned int         ui;
+   unsigned long long   ul;
+   char                *charray[10];
 };
 
 static int i42 = 42;
 static int i7 = 7;
 
-
 static void
 _eet_build_ex_descriptor(Eet_Data_Descriptor *edd)
 {
@@ -308,57 +394,151 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd)
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Basic_Type";
    eddc.size = sizeof(Eet_Test_Basic_Type);
-   eddb = eet_data_descriptor3_new(&eddc);
+   eddb = eet_data_descriptor_file_new(&eddc);
    fail_if(!eddb);
 
    _eet_build_basic_descriptor(eddb);
 
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "c", c, EET_T_CHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "s", s, EET_T_SHORT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "c",
+                                 c,
+                                 EET_T_CHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "s",
+                                 s,
+                                 EET_T_SHORT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "i", i, EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "l", l, EET_T_LONG_LONG);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "str", str, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "istr", istr, EET_T_INLINED_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f1", f1, EET_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f2", f2, EET_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f3", f3, EET_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "f4", f4, EET_T_FLOAT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d1", d1, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d2", d2, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d3", d3, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "d4", d4, EET_T_DOUBLE);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "uc", uc, EET_T_UCHAR);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "us", us, EET_T_USHORT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "ui", ui, EET_T_UINT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Eet_Test_Ex_Type, "ul", ul, EET_T_ULONG_LONG);
-   EET_DATA_DESCRIPTOR_ADD_ARRAY(edd, Eet_Test_Ex_Type, "sarray1", sarray1, eddb);
-   EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(edd, Eet_Test_Ex_Type, "varray2", varray2, eddb);
-   eet_data_descriptor_element_add(edd, "varray1", EET_T_INT, EET_G_VAR_ARRAY,
-                                  (char *)(&(etbt.varray1)) - (char *)(&(etbt)),
-                                  (char *)(&(etbt.varray1_count)) - (char *)(&(etbt)), /* 0,  */NULL, NULL);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "l",
+                                 l,
+                                 EET_T_LONG_LONG);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "str",
+                                 str,
+                                 EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "istr",
+                                 istr,
+                                 EET_T_INLINED_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "f1",
+                                 f1,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "f2",
+                                 f2,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "f3",
+                                 f3,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "f4",
+                                 f4,
+                                 EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "d1",
+                                 d1,
+                                 EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "d2",
+                                 d2,
+                                 EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "d3",
+                                 d3,
+                                 EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "d4",
+                                 d4,
+                                 EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "uc",
+                                 uc,
+                                 EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "us",
+                                 us,
+                                 EET_T_USHORT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "ui",
+                                 ui,
+                                 EET_T_UINT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd,
+                                 Eet_Test_Ex_Type,
+                                 "ul",
+                                 ul,
+                                 EET_T_ULONG_LONG);
+   EET_DATA_DESCRIPTOR_ADD_ARRAY(edd,
+                                 Eet_Test_Ex_Type,
+                                 "sarray1",
+                                 sarray1,
+                                 eddb);
+   EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(edd,
+                                     Eet_Test_Ex_Type,
+                                     "varray2",
+                                     varray2,
+                                     eddb);
+   eet_data_descriptor_element_add(edd,
+                                   "varray1",
+                                   EET_T_INT,
+                                   EET_G_VAR_ARRAY,
+                                   (char *)(&(etbt.varray1)) - (char *)(&(etbt)),
+                                   (char *)(&(etbt.varray1_count)) -
+                                   (char *)(&(etbt)),
+                                   /* 0,  */ NULL,
+                                   NULL);
    eet_data_descriptor_element_add(edd, "sarray2", EET_T_INT, EET_G_ARRAY,
-                                  (char *)(&(etbt.sarray2)) - (char *)(&(etbt)),
-                                  /* 0,  */sizeof(etbt.sarray2)/sizeof(etbt.sarray2[0]), NULL, NULL);
+                                   (char *)(&(etbt.sarray2)) - (char *)(&(etbt)),
+                                   /* 0,  */ sizeof(etbt.sarray2) /
+                                   sizeof(etbt.sarray2[0]), NULL, NULL);
+   eet_data_descriptor_element_add(edd, "charray", EET_T_STRING, EET_G_ARRAY,
+                                   (char *)(&(etbt.charray)) - (char *)(&(etbt)),
+                                   /* 0,  */ sizeof(etbt.charray) /
+                                   sizeof(etbt.charray[0]), NULL, NULL);
    EET_DATA_DESCRIPTOR_ADD_LIST(edd, Eet_Test_Ex_Type, "list", list, edd);
    EET_DATA_DESCRIPTOR_ADD_HASH(edd, Eet_Test_Ex_Type, "hash", hash, edd);
    eet_data_descriptor_element_add(edd, "ilist", EET_T_INT, EET_G_LIST,
-                                  (char *)(&(etbt.ilist)) - (char *)(&(etbt)),
-                                  0, /* 0,  */NULL, NULL);
+                                   (char *)(&(etbt.ilist)) - (char *)(&(etbt)),
+                                   0, /* 0,  */ NULL, NULL);
    eet_data_descriptor_element_add(edd, "ihash", EET_T_INT, EET_G_HASH,
-                                  (char *)(&(etbt.ihash)) - (char *)(&(etbt)),
-                                  0, /* 0,  */NULL, NULL);
+                                   (char *)(&(etbt.ihash)) - (char *)(&(etbt)),
+                                   0, /* 0,  */ NULL, NULL);
    eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST,
-                                  (char *)(&(etbt.slist)) - (char *)(&(etbt)),
-                                  0, /* 0,  */NULL, NULL);
-}
-
-static Eet_Test_Ex_Type*
-_eet_test_ex_set(Eet_Test_Ex_Type *res, int offset)
+                                   (char *)(&(etbt.slist)) - (char *)(&(etbt)),
+                                   0, /* 0,  */ NULL, NULL);
+   eet_data_descriptor_element_add(edd, "shash", EET_T_STRING, EET_G_HASH,
+                                   (char *)(&(etbt.shash)) - (char *)(&(etbt)),
+                                   0, /* 0,  */ NULL, NULL);
+} /* _eet_build_ex_descriptor */
+
+static Eet_Test_Ex_Type *
+_eet_test_ex_set(Eet_Test_Ex_Type *res,
+                 int               offset)
 {
-   int i;
+   unsigned int i;
+
+   if (!res)
+     res = malloc(sizeof(Eet_Test_Ex_Type));
 
-   if (!res) res = malloc( sizeof(Eet_Test_Ex_Type));
-   if (!res) return NULL;
+   if (!res)
+     return NULL;
 
    res->c = EET_TEST_CHAR + offset;
    res->s = EET_TEST_SHORT + offset;
@@ -379,20 +559,23 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset)
    res->ilist = NULL;
    res->ihash = NULL;
    res->slist = NULL;
+   res->shash = NULL;
+   for (i = 0; i < sizeof(res->charray) / sizeof(res->charray[0]); ++i)
+     res->charray[i] = NULL;
 
    res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10);
    res->varray1 = malloc(sizeof (int) * 5);
    fail_if(!res->varray1 || !res->varray2);
    for (i = 0; i < 10; ++i)
      {
-       _eet_test_basic_set(res->sarray1 + i, i);
-       _eet_test_basic_set(res->varray2 + i, i);
+        _eet_test_basic_set(res->sarray1 + i, i);
+        _eet_test_basic_set(res->varray2 + i, i);
      }
    res->varray2_count = 10;
    for (i = 0; i < 5; ++i)
      {
-       res->sarray2[i] = i * 42 + 1;
-       res->varray1[i] = i * 42 + 1;
+        res->sarray2[i] = i * 42 + 1;
+        res->varray1[i] = i * 42 + 1;
      }
    res->varray1_count = 5;
 
@@ -402,79 +585,135 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset)
    res->ul = EET_TEST_LONG_LONG + offset;
 
    return res;
-}
+} /* _eet_test_ex_set */
 
 static int
-_eet_test_ex_check(Eet_Test_Ex_Type *stuff, int offset)
+_eet_test_ex_check(Eet_Test_Ex_Type *stuff,
+                   int               offset)
 {
    double tmp;
    unsigned int i;
 
-   if (!stuff) return 1;
+   if (!stuff)
+     return 1;
+
+   if (stuff->c != EET_TEST_CHAR + offset)
+     return 1;
+
+   if (stuff->s != EET_TEST_SHORT + offset)
+     return 1;
+
+   if (stuff->i != EET_TEST_INT + offset)
+     return 1;
+
+   if (stuff->l != EET_TEST_LONG_LONG + offset)
+     return 1;
+
+   if (strcmp(stuff->str, EET_TEST_STRING) != 0)
+     return 1;
 
-   if (stuff->c != EET_TEST_CHAR + offset) return 1;
-   if (stuff->s != EET_TEST_SHORT + offset) return 1;
-   if (stuff->i != EET_TEST_INT + offset) return 1;
-   if (stuff->l != EET_TEST_LONG_LONG + offset) return 1;
-   if (strcmp(stuff->str, EET_TEST_STRING) != 0) return 1;
-   if (strcmp(stuff->istr, EET_TEST_STRING) != 0) return 1;
+   if (strcmp(stuff->istr, EET_TEST_STRING) != 0)
+     return 1;
 
    tmp = stuff->f1 - (EET_TEST_FLOAT + offset);
-   if (tmp < 0) tmp = -tmp;
-   if (tmp > 0.005) return 1;
+   if (tmp < 0)
+     tmp = -tmp;
+
+   if (tmp > 0.005)
+     return 1;
 
    tmp = stuff->d1 - (EET_TEST_DOUBLE + offset);
-   if (tmp < 0) tmp = -tmp;
-   if (tmp > 0.00005) return 1;
+   if (tmp < 0)
+     tmp = -tmp;
+
+   if (tmp > 0.00005)
+     return 1;
+
+   if (stuff->f2 != -(EET_TEST_FLOAT2 + offset))
+     return 1;
+
+   if (stuff->d2 != -(EET_TEST_DOUBLE2 + offset))
+     return 1;
+
+   if (stuff->f3 != EET_TEST_FLOAT3 + offset)
+     return 1;
+
+   if (stuff->d3 != EET_TEST_DOUBLE3 + offset)
+     return 1;
+
+   if (stuff->f4 != EET_TEST_FLOAT2 + offset)
+     return 1;
+
+   if (stuff->d4 != EET_TEST_DOUBLE2 + offset)
+     return 1;
 
-   if (stuff->f2 != - (EET_TEST_FLOAT2 + offset)) return 1;
-   if (stuff->d2 != - (EET_TEST_DOUBLE2 + offset)) return 1;
+   if (stuff->uc != EET_TEST_CHAR + offset)
+     return 1;
 
-   if (stuff->f3 != EET_TEST_FLOAT3 + offset) return 1;
-   if (stuff->d3 != EET_TEST_DOUBLE3 + offset) return 1;
+   if (stuff->us != EET_TEST_SHORT + offset)
+     return 1;
 
-   if (stuff->f4 != EET_TEST_FLOAT2 + offset) return 1;
-   if (stuff->d4 != EET_TEST_DOUBLE2 + offset) return 1;
+   if (stuff->ui != (unsigned int)EET_TEST_INT + offset)
+     return 1;
 
-   if (stuff->uc != EET_TEST_CHAR + offset) return 1;
-   if (stuff->us != EET_TEST_SHORT + offset) return 1;
-   if (stuff->ui != (unsigned int) EET_TEST_INT + offset) return 1;
-   if (stuff->ul != EET_TEST_LONG_LONG + offset) return 1;
+   if (stuff->ul != EET_TEST_LONG_LONG + offset)
+     return 1;
+
+   if (stuff->varray1_count != 5)
+     return 1;
+
+   if (stuff->varray2_count != 10)
+     return 1;
 
    for (i = 0; i < 5; ++i)
-     if (stuff->sarray2[i] != i * 42 + 1)
+     if (stuff->sarray2[i] != i * 42 + 1 && stuff->varray1[i] != i * 42 + 1)
        return 1;
 
    for (i = 0; i < 10; ++i)
-     _eet_test_basic_check(stuff->sarray1 + i, i);
+     {
+        _eet_test_basic_check(stuff->sarray1 + i, i);
+        _eet_test_basic_check(stuff->varray2 + i, i);
+     }
 
    return 0;
-}
+} /* _eet_test_ex_check */
 
 static Eina_Bool
-func(__UNUSED__ const Eina_Hash *hash, const char *key, void *data, void *fdata)
+func(__UNUSED__ const Eina_Hash *hash,
+     const void                 *key,
+     void                       *data,
+     void                       *fdata)
 {
    int *res = fdata;
 
    if (strcmp(key, EET_TEST_KEY1) != 0
-       && strcmp(key, EET_TEST_KEY2) != 0) *res = 1;
-   if (_eet_test_ex_check(data, 2)) *res = 1;
+       && strcmp(key, EET_TEST_KEY2) != 0)
+     *res = 1;
+
+   if (_eet_test_ex_check(data, 2))
+     *res = 1;
 
    return EINA_TRUE;
-}
+} /* func */
 
 static Eina_Bool
-func7(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const char *key, void *data, void *fdata)
+func7(__UNUSED__ const Eina_Hash *hash,
+      __UNUSED__ const void      *key,
+      void                       *data,
+      void                       *fdata)
 {
    int *res = fdata;
    int *val;
 
    val = data;
-   if (!val) *res = 1;
-   if (*val != 7) *res = 1;
+   if (!val)
+     *res = 1;
+
+   if (*val != 7)
+     *res = 1;
 
    return EINA_TRUE;
-}
+} /* func7 */
 
 START_TEST(eet_test_data_type_encoding_decoding)
 {
@@ -495,13 +734,18 @@ START_TEST(eet_test_data_type_encoding_decoding)
    etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
-   etbt.slist = eina_list_prepend(NULL, strdup("test"));
+   etbt.slist = eina_list_prepend(NULL, "test");
+   etbt.shash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
+   memset(&etbt.charray, 0, sizeof(etbt.charray));
+   etbt.charray[0] = "test";
+   etbt.charray[5] = "plouf";
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
    eddc.size = sizeof(Eet_Test_Ex_Type);
 
-   edd = eet_data_descriptor3_new(&eddc);
+   edd = eet_data_descriptor_file_new(&eddc);
    fail_if(!edd);
 
    _eet_build_ex_descriptor(edd);
@@ -515,14 +759,22 @@ START_TEST(eet_test_data_type_encoding_decoding)
    fail_if(_eet_test_ex_check(result, 0) != 0);
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
-   fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(*((int *)eina_list_data_get(result->ilist)) != 42);
    fail_if(eina_list_data_get(result->slist) == NULL);
    fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
+   fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
+   fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
+   fail_if(strcmp(result->charray[0], "test") != 0);
+   fail_if(strcmp(result->charray[5], "plouf") != 0);
 
    test = 0;
-   eina_hash_foreach(result->hash, func, &test);
+   if (result->hash)
+     eina_hash_foreach(result->hash, func, &test);
+
    fail_if(test != 0);
-   eina_hash_foreach(result->ihash, func7, &test);
+   if (result->ihash)
+     eina_hash_foreach(result->ihash, func7, &test);
+
    fail_if(test != 0);
 
    eet_shutdown();
@@ -530,18 +782,20 @@ START_TEST(eet_test_data_type_encoding_decoding)
 END_TEST
 
 static void
-append_string(void *data, const char *str)
+append_string(void       *data,
+              const char *str)
 {
    char **string = data;
    int length;
 
-   if (!data) return ;
+   if (!data)
+     return;
 
    length = *string ? strlen(*string) : 0;
    *string = realloc(*string, strlen(str) + length + 1);
 
    memcpy((*string) + length, str, strlen(str) + 1);
-}
+} /* append_string */
 
 START_TEST(eet_test_data_type_dump_undump)
 {
@@ -572,13 +826,17 @@ START_TEST(eet_test_data_type_dump_undump)
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
-   etbt.slist = eina_list_prepend(NULL, strdup("test"));
+   etbt.slist = eina_list_prepend(NULL, "test");
+   etbt.shash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
+   memset(&etbt.charray, 0, sizeof(etbt.charray));
+   etbt.charray[0] = "test";
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
    eddc.size = sizeof(Eet_Test_Ex_Type);
 
-   edd = eet_data_descriptor3_new(&eddc);
+   edd = eet_data_descriptor_file_new(&eddc);
    fail_if(!edd);
 
    _eet_build_ex_descriptor(edd);
@@ -590,15 +848,15 @@ START_TEST(eet_test_data_type_dump_undump)
    eet_data_text_dump(transfert1, size1, append_string, &string1);
    fail_if(!string1);
 
-   transfert2 = eet_data_text_undump(string1, strlen(string1), &size2);
+   transfert2 = eet_data_text_undump(string1, string1 ? strlen(
+                                       string1) : 0, &size2);
    fail_if(!transfert2 && size2 <= 0);
-   fail_if(size1 != size2);
 
    string2 = NULL;
    eet_data_text_dump(transfert2, size2, append_string, &string2);
    fail_if(!string2);
 
-   fail_if(memcmp(transfert1, transfert2, size1) != 0);
+   fail_if(strlen(string2) != strlen(string1));
 
    result = eet_data_descriptor_decode(edd, transfert2, size2);
    fail_if(!result);
@@ -606,20 +864,26 @@ START_TEST(eet_test_data_type_dump_undump)
    fail_if(_eet_test_ex_check(result, 0) != 0);
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
-   fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(*((int *)eina_list_data_get(result->ilist)) != 42);
    fail_if(eina_list_data_get(result->slist) == NULL);
    fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
+   fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
+   fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
+   fail_if(strcmp(result->charray[0], "test") != 0);
 
    test = 0;
-   eina_hash_foreach(result->hash, func, &test);
+   if (result->hash)
+     eina_hash_foreach(result->hash, func, &test);
+
    fail_if(test != 0);
-   eina_hash_foreach(result->ihash, func7, &test);
+   if (result->ihash)
+     eina_hash_foreach(result->ihash, func7, &test);
+
    fail_if(test != 0);
 
    eet_shutdown();
 }
 END_TEST
-
 START_TEST(eet_file_simple_write)
 {
    const char *buffer = "Here is a string of data to save !";
@@ -630,7 +894,7 @@ START_TEST(eet_file_simple_write)
 
    eet_init();
 
-   mktemp(file);
+   fail_if(!(file = tmpnam(file)));
 
    fail_if(eet_mode_get(NULL) != EET_FILE_MODE_INVALID);
 
@@ -638,6 +902,8 @@ START_TEST(eet_file_simple_write)
    fail_if(!ef);
 
    fail_if(!eet_write(ef, "keys/tests", buffer, strlen(buffer) + 1, 1));
+   fail_if(!eet_alias(ef, "keys/alias", "keys/tests", 0));
+   fail_if(!eet_alias(ef, "keys/alias2", "keys/alias", 1));
 
    fail_if(eet_mode_get(ef) != EET_FILE_MODE_WRITE);
 
@@ -652,12 +918,18 @@ START_TEST(eet_file_simple_write)
 
    test = eet_read(ef, "keys/tests", &size);
    fail_if(!test);
-   fail_if(size != (int) strlen(buffer) + 1);
+   fail_if(size != (int)strlen(buffer) + 1);
 
    fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0);
 
+   test = eet_read(ef, "keys/alias2", &size);
+   fail_if(!test);
+   fail_if(size != (int)strlen(buffer) + 1);
+
+   fail_if(eet_read_direct(ef, "key/alias2", &size));
+
    fail_if(eet_mode_get(ef) != EET_FILE_MODE_READ);
-   fail_if(eet_num_entries(ef) != 1);
+   fail_if(eet_num_entries(ef) != 3);
 
    eet_close(ef);
 
@@ -667,7 +939,7 @@ START_TEST(eet_file_simple_write)
 
    test = eet_read(ef, "keys/tests", &size);
    fail_if(!test);
-   fail_if(size != (int) strlen(buffer) + 1);
+   fail_if(size != (int)strlen(buffer) + 1);
 
    fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0);
 
@@ -676,9 +948,9 @@ START_TEST(eet_file_simple_write)
    fail_if(unlink(file) != 0);
 
    eet_shutdown();
-}
-END_TEST
+} /* START_TEST */
 
+END_TEST
 START_TEST(eet_file_data_test)
 {
    Eet_Data_Descriptor *edd;
@@ -707,18 +979,22 @@ START_TEST(eet_file_data_test)
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
-   etbt.slist = eina_list_prepend(NULL, strdup("test"));
+   etbt.slist = eina_list_prepend(NULL, "test");
+   etbt.shash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
+   memset(&etbt.charray, 0, sizeof(etbt.charray));
+   etbt.charray[0] = "test";
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
    eddc.size = sizeof(Eet_Test_Ex_Type);
 
-   edd = eet_data_descriptor3_new(&eddc);
+   edd = eet_data_descriptor_file_new(&eddc);
    fail_if(!edd);
 
    _eet_build_ex_descriptor(edd);
 
-   mktemp(file);
+   fail_if(!(file = tmpnam(file)));
 
    /* Insert an error in etbt. */
    etbt.i = 0;
@@ -750,13 +1026,19 @@ START_TEST(eet_file_data_test)
 
    fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
 
+   result = eet_data_read(ef, edd, EET_TEST_FILE_KEY1);
+   fail_if(!result);
+
+   /* Test the resulting data. */
+   fail_if(_eet_test_ex_check(result, 0) != 0);
+
    eet_close(ef);
 
    /* Read back the data. */
    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
    fail_if(!ef);
 
-   fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY2, &etbt, 1));
+   fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY2, &etbt, 0));
 
    result = eet_data_read(ef, edd, EET_TEST_FILE_KEY1);
    fail_if(!result);
@@ -772,21 +1054,32 @@ START_TEST(eet_file_data_test)
    fail_if(_eet_test_ex_check(result, 0) != 0);
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
-   fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(*((int *)eina_list_data_get(result->ilist)) != 42);
    fail_if(eina_list_data_get(result->slist) == NULL);
    fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
+   fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
+   fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
+   fail_if(strcmp(result->charray[0], "test") != 0);
 
    test = 0;
-   eina_hash_foreach(result->hash, func, &test);
+   if (result->hash)
+     eina_hash_foreach(result->hash, func, &test);
+
    fail_if(test != 0);
-   eina_hash_foreach(result->ihash, func7, &test);
+   if (result->ihash)
+     eina_hash_foreach(result->ihash, func7, &test);
+
    fail_if(test != 0);
 
    list = eet_list(ef, "keys/*", &size);
    fail_if(eet_num_entries(ef) != 2);
    fail_if(size != 2);
-   fail_if(!(strcmp(list[0], EET_TEST_FILE_KEY1) == 0 && strcmp(list[1], EET_TEST_FILE_KEY2) == 0)
-          && !(strcmp(list[0], EET_TEST_FILE_KEY2) == 0 && strcmp(list[1], EET_TEST_FILE_KEY1) == 0));
+   fail_if(!(strcmp(list[0],
+                    EET_TEST_FILE_KEY1) == 0 &&
+             strcmp(list[1], EET_TEST_FILE_KEY2) == 0)
+           && !(strcmp(list[0],
+                       EET_TEST_FILE_KEY2) == 0 &&
+                strcmp(list[1], EET_TEST_FILE_KEY1) == 0));
    free(list);
 
    fail_if(eet_delete(ef, NULL) != 0);
@@ -811,9 +1104,9 @@ START_TEST(eet_file_data_test)
    fail_if(unlink(file) != 0);
 
    eet_shutdown();
-}
-END_TEST
+} /* START_TEST */
 
+END_TEST
 START_TEST(eet_file_data_dump_test)
 {
    Eet_Data_Descriptor *edd;
@@ -832,32 +1125,34 @@ START_TEST(eet_file_data_dump_test)
    etbt.list = eina_list_prepend(etbt.list, _eet_test_ex_set(NULL, 1));
    etbt.hash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.hash, EET_TEST_KEY1, _eet_test_ex_set(NULL, 2));
-   etbt.hash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.hash, EET_TEST_KEY2, _eet_test_ex_set(NULL, 2));
    etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
    etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
-   etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
-   etbt.slist = eina_list_prepend(NULL, strdup("test"));
+   etbt.slist = eina_list_prepend(NULL, "test");
+   etbt.shash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
+   memset(&etbt.charray, 0, sizeof(etbt.charray));
+   etbt.charray[0] = "test";
 
-   eet_test_setup_eddc(&eddc);
-   eddc.name = "Eet_Test_Ex_Type";
-   eddc.size = sizeof(Eet_Test_Ex_Type);
+   eet_eina_file_data_descriptor_class_set(&eddc, sizeof (eddc),
+                                           "Eet_Test_Ex_Type",
+                                           sizeof(Eet_Test_Ex_Type));
 
-   edd = eet_data_descriptor3_new(&eddc);
+   edd = eet_data_descriptor_file_new(&eddc);
    fail_if(!edd);
 
    _eet_build_ex_descriptor(edd);
 
-   mktemp(file);
+   fail_if(!(file = tmpnam(file)));
 
    /* Save the encoded data in a file. */
    ef = eet_open(file, EET_FILE_MODE_WRITE);
    fail_if(!ef);
 
-   fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 1));
+   fail_if(!eet_data_write(ef, edd, EET_TEST_FILE_KEY1, &etbt, 0));
 
    eet_close(ef);
 
@@ -885,22 +1180,29 @@ START_TEST(eet_file_data_dump_test)
    fail_if(_eet_test_ex_check(result, 0) != 0);
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
-   fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(*((int *)eina_list_data_get(result->ilist)) != 42);
    fail_if(eina_list_data_get(result->slist) == NULL);
    fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
+   fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
+   fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
+   fail_if(strcmp(result->charray[0], "test") != 0);
 
    test = 0;
-   eina_hash_foreach(result->hash, func, &test);
+   if (result->hash)
+     eina_hash_foreach(result->hash, func, &test);
+
    fail_if(test != 0);
-   eina_hash_foreach(result->ihash, func7, &test);
+   if (result->ihash)
+     eina_hash_foreach(result->ihash, func7, &test);
+
    fail_if(test != 0);
 
    fail_if(unlink(file) != 0);
 
    eet_shutdown();
-}
-END_TEST
+} /* START_TEST */
 
+END_TEST
 START_TEST(eet_image)
 {
    Eet_File *ef;
@@ -914,63 +1216,114 @@ START_TEST(eet_image)
    unsigned int w;
    unsigned int h;
 
-   mktemp(file);
+   eet_init();
+
+   fail_if(!(file = tmpnam(file)));
 
    /* Save the encoded data in a file. */
    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
    fail_if(!ef);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "0", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                0, 100, 0);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "0",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 0,
+                                 100,
+                                 0);
    fail_if(result == 0);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "1", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                5, 100, 0);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "1",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 5,
+                                 100,
+                                 0);
    fail_if(result == 0);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "2", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                9, 100, 0);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "2",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 9,
+                                 100,
+                                 0);
    fail_if(result == 0);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "3", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                0, 100, 1);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "3",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 0,
+                                 100,
+                                 1);
    fail_if(result == 0);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "4", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                0, 60, 1);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "4",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 0,
+                                 60,
+                                 1);
    fail_if(result == 0);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "5", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                0, 10, 1);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "5",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 0,
+                                 10,
+                                 1);
    fail_if(result == 0);
 
-   result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "6", test_noalpha.color,
-                                test_noalpha.w, test_noalpha.h, test_noalpha.alpha,
-                                0, 0, 1);
+   result = eet_data_image_write(ef,
+                                 EET_TEST_FILE_IMAGE "6",
+                                 test_noalpha.color,
+                                 test_noalpha.w,
+                                 test_noalpha.h,
+                                 test_noalpha.alpha,
+                                 0,
+                                 0,
+                                 1);
    fail_if(result == 0);
 
    result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "7", test_alpha.color,
-                                test_alpha.w, test_alpha.h, test_alpha.alpha,
-                                9, 100, 0);
+                                 test_alpha.w, test_alpha.h, test_alpha.alpha,
+                                 9, 100, 0);
    fail_if(result == 0);
 
    result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "8", test_alpha.color,
-                                test_alpha.w, test_alpha.h, test_alpha.alpha,
-                                0, 80, 1);
+                                 test_alpha.w, test_alpha.h, test_alpha.alpha,
+                                 0, 80, 1);
    fail_if(result == 0);
 
    result = eet_data_image_write(ef, EET_TEST_FILE_IMAGE "9", test_alpha.color,
-                                test_alpha.w, test_alpha.h, test_alpha.alpha,
-                                0, 100, 1);
+                                 test_alpha.w, test_alpha.h, test_alpha.alpha,
+                                 0, 100, 1);
    fail_if(result == 0);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "2", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "2",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -980,7 +1333,14 @@ START_TEST(eet_image)
    fail_if(data[0] != test_noalpha.color[0]);
    free(data);
 
-   result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "2", &w, &h, &alpha, &compress, &quality, &lossy);
+   result = eet_data_image_header_read(ef,
+                                       EET_TEST_FILE_IMAGE "2",
+                                       &w,
+                                       &h,
+                                       &alpha,
+                                       &compress,
+                                       &quality,
+                                       &lossy);
    fail_if(result == 0);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -994,7 +1354,14 @@ START_TEST(eet_image)
    ef = eet_open(file, EET_FILE_MODE_READ);
    fail_if(!ef);
 
-   result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "0", &w, &h, &alpha, &compress, &quality, &lossy);
+   result = eet_data_image_header_read(ef,
+                                       EET_TEST_FILE_IMAGE "0",
+                                       &w,
+                                       &h,
+                                       &alpha,
+                                       &compress,
+                                       &quality,
+                                       &lossy);
    fail_if(result == 0);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -1004,7 +1371,18 @@ START_TEST(eet_image)
 
    data = malloc(w * h * 4);
    fail_if(data == NULL);
-   result = eet_data_image_read_to_surface(ef, EET_TEST_FILE_IMAGE "0", 4, 4, data, 2, 2, w * 4, &alpha, &compress, &quality, &lossy);
+   result = eet_data_image_read_to_surface(ef,
+                                           EET_TEST_FILE_IMAGE "0",
+                                           4,
+                                           4,
+                                           data,
+                                           2,
+                                           2,
+                                           w * 4,
+                                           &alpha,
+                                           &compress,
+                                           &quality,
+                                           &lossy);
    fail_if(result != 1);
    fail_if(alpha != test_noalpha.alpha);
    fail_if(compress != 0);
@@ -1015,7 +1393,18 @@ START_TEST(eet_image)
 
    data = malloc(w * h * 4);
    fail_if(data == NULL);
-   result = eet_data_image_read_to_surface(ef, EET_TEST_FILE_IMAGE "0", 0, 0, data, w, h, w * 4, &alpha, &compress, &quality, &lossy);
+   result = eet_data_image_read_to_surface(ef,
+                                           EET_TEST_FILE_IMAGE "0",
+                                           0,
+                                           0,
+                                           data,
+                                           w,
+                                           h,
+                                           w * 4,
+                                           &alpha,
+                                           &compress,
+                                           &quality,
+                                           &lossy);
    fail_if(result != 1);
    fail_if(alpha != test_noalpha.alpha);
    fail_if(compress != 0);
@@ -1024,7 +1413,14 @@ START_TEST(eet_image)
    fail_if(data[0] != test_noalpha.color[0]);
    free(data);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "1", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "1",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -1035,7 +1431,14 @@ START_TEST(eet_image)
    fail_if(data[0] != test_noalpha.color[0]);
    free(data);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "2", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "2",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -1045,7 +1448,14 @@ START_TEST(eet_image)
    fail_if(data[0] != test_noalpha.color[0]);
    free(data);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "3", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "3",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -1053,7 +1463,14 @@ START_TEST(eet_image)
    fail_if(lossy != 1);
    free(data);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "5", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "5",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -1061,7 +1478,14 @@ START_TEST(eet_image)
    fail_if(lossy != 1);
    free(data);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "6", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "6",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_noalpha.w);
    fail_if(h != test_noalpha.h);
@@ -1069,7 +1493,14 @@ START_TEST(eet_image)
    fail_if(lossy != 1);
    free(data);
 
-   result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "7", &w, &h, &alpha, &compress, &quality, &lossy);
+   result = eet_data_image_header_read(ef,
+                                       EET_TEST_FILE_IMAGE "7",
+                                       &w,
+                                       &h,
+                                       &alpha,
+                                       &compress,
+                                       &quality,
+                                       &lossy);
    fail_if(result == 0);
    fail_if(w != test_alpha.w);
    fail_if(h != test_alpha.h);
@@ -1077,7 +1508,14 @@ START_TEST(eet_image)
    fail_if(compress != 9);
    fail_if(lossy != 0);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "7", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "7",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_alpha.w);
    fail_if(h != test_alpha.h);
@@ -1087,14 +1525,28 @@ START_TEST(eet_image)
    fail_if(data[0] != test_alpha.color[0]);
    free(data);
 
-   result = eet_data_image_header_read(ef, EET_TEST_FILE_IMAGE "9", &w, &h, &alpha, &compress, &quality, &lossy);
+   result = eet_data_image_header_read(ef,
+                                       EET_TEST_FILE_IMAGE "9",
+                                       &w,
+                                       &h,
+                                       &alpha,
+                                       &compress,
+                                       &quality,
+                                       &lossy);
    fail_if(result == 0);
    fail_if(w != test_alpha.w);
    fail_if(h != test_alpha.h);
    fail_if(alpha != test_alpha.alpha);
    fail_if(lossy != 1);
 
-   data = eet_data_image_read(ef, EET_TEST_FILE_IMAGE "9", &w, &h, &alpha, &compress, &quality, &lossy);
+   data = eet_data_image_read(ef,
+                              EET_TEST_FILE_IMAGE "9",
+                              &w,
+                              &h,
+                              &alpha,
+                              &compress,
+                              &quality,
+                              &lossy);
    fail_if(data == NULL);
    fail_if(w != test_alpha.w);
    fail_if(h != test_alpha.h);
@@ -1104,8 +1556,11 @@ START_TEST(eet_image)
 
    eet_close(ef);
 
+   fail_if(unlink(file) != 0);
+
    eet_shutdown();
-}
+} /* START_TEST */
+
 END_TEST
 
 #define IM0 0x00112233
@@ -1134,7 +1589,7 @@ START_TEST(eet_small_image)
 
    eet_init();
 
-   mktemp(file);
+   fail_if(!(file = tmpnam(file)));
 
    ef = eet_open(file, EET_FILE_MODE_WRITE);
    fail_if(!ef);
@@ -1147,11 +1602,20 @@ START_TEST(eet_small_image)
    ef = eet_open(file, EET_FILE_MODE_READ);
    fail_if(!ef);
 
-   data = (unsigned int*) eet_data_image_read(ef, "/images/test", &w, &h, &alpha, &compression, &quality, &lossy);
+   data = (unsigned int *)eet_data_image_read(ef,
+                                              "/images/test",
+                                              &w,
+                                              &h,
+                                              &alpha,
+                                              &compression,
+                                              &quality,
+                                              &lossy);
    fail_if(data == NULL);
 
    eet_close(ef);
 
+   fail_if(unlink(file) != 0);
+
    fail_if(data[0] != IM0);
    fail_if(data[1] != IM1);
    fail_if(data[2] != IM2);
@@ -1160,15 +1624,16 @@ START_TEST(eet_small_image)
    free(data);
 
    eet_shutdown();
-}
-END_TEST
+} /* START_TEST */
 
+END_TEST
 START_TEST(eet_identity_simple)
 {
    const char *buffer = "Here is a string of data to save !";
    const void *tmp;
    Eet_File *ef;
    Eet_Key *k;
+   FILE *noread;
    char *test;
    char *file = strdup("/tmp/eet_suite_testXXXXXX");
    int size;
@@ -1176,8 +1641,18 @@ START_TEST(eet_identity_simple)
 
    eet_init();
 
-   mktemp(file);
-   chdir("src/tests");
+   fail_if(!(file = tmpnam(file)));
+   /* Hack to fix issue in buildbot. */
+   int chret = chdir(CERT_DIR);
+   if (chret)
+     {
+        static char CWD[1024];
+        getcwd(CWD, 1024);
+        perror(NULL);
+        printf("TAsn: '%s' '%s'\n", CWD, CERT_DIR);
+     }
+   fail_if(chret);
+   fail_if(!(noread = fopen("/dev/null", "w")));
 
    /* Sign an eet file. */
    ef = eet_open(file, EET_FILE_MODE_WRITE);
@@ -1189,6 +1664,7 @@ START_TEST(eet_identity_simple)
    fail_if(!k);
 
    fail_if(eet_identity_set(ef, k) != EET_ERROR_NONE);
+   eet_identity_print(k, noread);
 
    eet_close(ef);
 
@@ -1198,13 +1674,15 @@ START_TEST(eet_identity_simple)
 
    test = eet_read(ef, "keys/tests", &size);
    fail_if(!test);
-   fail_if(size != (int) strlen(buffer) + 1);
+   fail_if(size != (int)strlen(buffer) + 1);
 
    fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0);
 
    tmp = eet_identity_x509(ef, &size);
    fail_if(tmp == NULL);
 
+   eet_identity_certificate_print(tmp, size, noread);
+
    eet_close(ef);
 
    /* As we are changing file contain in less than 1s, this could get unnoticed
@@ -1231,59 +1709,1080 @@ START_TEST(eet_identity_simple)
    fail_if(unlink(file) != 0);
 
    eet_shutdown();
-}
+} /* START_TEST */
+
 END_TEST
+START_TEST(eet_identity_open_simple)
+{
+   Eet_Key *k = NULL;
 
-Suite *
-eet_suite(void)
+   eet_init();
+
+   fail_if(chdir(CERT_DIR));
+
+   k = eet_identity_open("cert.pem", "key.pem", NULL);
+   fail_if(!k);
+
+   if (k)
+     eet_identity_close(k);
+
+   eet_shutdown();
+} /* START_TEST */
+
+END_TEST
+START_TEST(eet_identity_open_pkcs8)
 {
-   Suite *s;
-   TCase *tc;
+   Eet_Key *k = NULL;
 
-   s = suite_create("Eet");
+   eet_init();
 
-   tc = tcase_create("Eet_Init");
-   tcase_add_test(tc, eet_test_init);
-   suite_add_tcase(s, tc);
+   fail_if(chdir(CERT_DIR));
 
-   tc = tcase_create("Eet Data Encoding/Decoding");
-   tcase_add_test(tc, eet_test_basic_data_type_encoding_decoding);
-   tcase_add_test(tc, eet_test_data_type_encoding_decoding);
-   tcase_add_test(tc, eet_test_data_type_dump_undump);
-   suite_add_tcase(s, tc);
+   k = eet_identity_open("cert.pem", "key_enc_none.pem", NULL);
+   fail_if(!k);
 
-   tc = tcase_create("Eet File");
-   tcase_add_test(tc, eet_file_simple_write);
-   tcase_add_test(tc, eet_file_data_test);
-   tcase_add_test(tc, eet_file_data_dump_test);
-   suite_add_tcase(s, tc);
+   if (k)
+     eet_identity_close(k);
 
-   tc = tcase_create("Eet Image");
-   tcase_add_test(tc, eet_image);
-   tcase_add_test(tc, eet_small_image);
-   suite_add_tcase(s, tc);
+   eet_shutdown();
+} /* START_TEST */
 
-#ifdef HAVE_SIGNATURE
-   tc = tcase_create("Eet Identity");
-   tcase_add_test(tc, eet_identity_simple);
-   suite_add_tcase(s, tc);
-#endif
+END_TEST
 
-   return s;
+static int
+pass_get(char            *pass,
+         int              size,
+         __UNUSED__ int   rwflags,
+         __UNUSED__ void *u)
+{
+   memset(pass, 0, size);
+
+   if ((int)strlen("password") > size)
+     return 0;
+
+   snprintf(pass, size, "%s", "password");
+   return strlen(pass);
+} /* pass_get */
+
+static int
+badpass_get(char            *pass,
+            int              size,
+            __UNUSED__ int   rwflags,
+            __UNUSED__ void *u)
+{
+   memset(pass, 0, size);
+
+   if ((int)strlen("bad password") > size)
+     return 0;
+
+   snprintf(pass, size, "%s", "bad password");
+   return strlen(pass);
+} /* badpass_get */
+
+START_TEST(eet_identity_open_pkcs8_enc)
+{
+   Eet_Key *k = NULL;
+
+   eet_init();
+
+   fail_if(chdir(CERT_DIR));
+
+   k = eet_identity_open("cert.pem", "key_enc.pem", NULL);
+   fail_if(k);
+
+   if (k)
+     eet_identity_close(k);
+
+   k = eet_identity_open("cert.pem", "key_enc.pem", &badpass_get);
+   fail_if(k);
+
+   if (k)
+     eet_identity_close(k);
+
+   k = eet_identity_open("cert.pem", "key_enc.pem", &pass_get);
+   fail_if(!k);
+
+   if (k)
+     eet_identity_close(k);
+
+   eet_shutdown();
 }
+END_TEST
+START_TEST(eet_cipher_decipher_simple)
+{
+   const char *buffer = "Here is a string of data to save !";
+   const char *key = "This is a crypto key";
+   const char *key_bad = "This is another crypto key";
+   Eet_File *ef;
+   char *test;
+   char *file = strdup("/tmp/eet_suite_testXXXXXX");
+   int size;
 
-int
-main(void)
+   eet_init();
+
+   fail_if(!(file = tmpnam(file)));
+   fail_if(chdir(CERT_DIR));
+
+   /* Crypt an eet file. */
+   ef = eet_open(file, EET_FILE_MODE_WRITE);
+   fail_if(!ef);
+
+   fail_if(!eet_write_cipher(ef, "keys/tests", buffer, strlen(buffer) + 1, 0,
+                             key));
+
+   eet_close(ef);
+
+   /* Decrypt an eet file. */
+   ef = eet_open(file, EET_FILE_MODE_READ);
+   fail_if(!ef);
+
+   test = eet_read_cipher(ef, "keys/tests", &size, key);
+   fail_if(!test);
+   fail_if(size != (int)strlen(buffer) + 1);
+
+   fail_if(memcmp(test, buffer, strlen(buffer) + 1) != 0);
+
+   eet_close(ef);
+
+   /* Decrypt an eet file. */
+   ef = eet_open(file, EET_FILE_MODE_READ);
+   fail_if(!ef);
+
+   test = eet_read_cipher(ef, "keys/tests", &size, key_bad);
+
+   if (size == (int)strlen(buffer) + 1)
+     fail_if(memcmp(test, buffer, strlen(buffer) + 1) == 0);
+
+   eet_close(ef);
+
+   fail_if(unlink(file) != 0);
+
+   eet_shutdown();
+} /* START_TEST */
+
+END_TEST
+
+#ifdef EINA_HAVE_THREADS
+
+static Eina_Bool open_worker_stop;
+
+# ifdef _EET_INCLUDED_PTHREAD
+
+static void *
+open_close_worker(void *path)
 {
-   Suite   *s;
-   SRunner *sr;
-   int      failed_count;
+   while (!open_worker_stop)
+     {
+        Eet_File *ef = eet_open((char const *)path, EET_FILE_MODE_READ);
+        if (ef == NULL)
+          pthread_exit("eet_open() failed");
+        else
+          {
+             Eet_Error err_code = eet_close(ef);
+             if (err_code != EET_ERROR_NONE)
+               pthread_exit("eet_close() failed");
+          }
+     }
 
-   s = eet_suite();
-   sr = srunner_create(s);
-   srunner_run_all(sr, CK_NORMAL);
-   failed_count = srunner_ntests_failed(sr);
-   srunner_free(sr);
+   pthread_exit(NULL);
+} /* open_close_worker */
 
-   return (failed_count == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+# else /* ifdef _EET_INCLUDED_PTHREAD */
+
+static unsigned int __stdcall
+open_close_worker(void *path)
+{
+   while (!open_worker_stop)
+     {
+        Eet_File *ef = eet_open((char const *)path, EET_FILE_MODE_READ);
+        if (ef == NULL)
+          _endthreadex(-1);
+        else
+          {
+             Eet_Error err_code = eet_close(ef);
+             if (err_code != EET_ERROR_NONE)
+               _endthreadex(-2);
+          }
+     }
+
+   _endthreadex(0);
+} /* open_close_worker */
+
+# endif /* ifdef _EET_INCLUDED_PTHREAD */
+
+START_TEST(eet_cache_concurrency)
+{
+   char *file = strdup("/tmp/eet_suite_testXXXXXX");
+   const char *buffer = "test data";
+   Eet_File *ef;
+   void *thread_ret;
+   unsigned int n;
+# ifdef _EET_INCLUDED_PTHREAD
+   pthread_t thread;
+# else /* ifdef _EET_INCLUDED_PTHREAD */
+   uintptr_t thread;
+   unsigned int thread_id;
+   DWORD ret;
+# endif /* ifdef _EET_INCLUDED_PTHREAD */
+
+   eet_init();
+   eina_threads_init();
+
+   /* create a file to test with */
+   fail_if(!(file = tmpnam(file)));
+   ef = eet_open(file, EET_FILE_MODE_WRITE);
+   fail_if(!ef);
+   fail_if(!eet_write(ef, "keys/tests", buffer, strlen(buffer) + 1, 0));
+
+   /* start a thread that repeatedly opens and closes a file */
+   open_worker_stop = 0;
+# ifdef _EET_INCLUDED_PTHREAD
+   pthread_create(&thread, NULL, open_close_worker, file);
+# else /* ifdef _EET_INCLUDED_PTHREAD */
+   thread = _beginthreadex(NULL, 0, open_close_worker, file, 0, &thread_id);
+# endif /* ifdef _EET_INCLUDED_PTHREAD */
+   /* clear the cache repeatedly in this thread */
+   for (n = 0; n < 50000; ++n)
+     {
+        eet_clearcache();
+     }
+
+   /* join the other thread, and fail if it returned an error message */
+   open_worker_stop = 1;
+# ifdef _EET_INCLUDED_PTHREAD
+   fail_if(pthread_join(thread, &thread_ret) != 0);
+   fail_unless(thread_ret == NULL, (char const *)thread_ret);
+# else /* ifdef _EET_INCLUDED_PTHREAD */
+   ret = WaitForSingleObject((HANDLE)thread, INFINITE);
+   fail_if(ret != WAIT_OBJECT_0);
+   fail_if(GetExitCodeThread((HANDLE)thread, &ret) == FALSE);
+   fail_if(ret != 0);
+# endif /* ifdef _EET_INCLUDED_PTHREAD */
+
+   fail_if(unlink(file) != 0);
+
+   eina_threads_shutdown();
+   eet_shutdown();
 }
+END_TEST
+
+#endif /* EINA_HAVE_THREADS */
+
+typedef struct _Eet_Connection_Data Eet_Connection_Data;
+struct _Eet_Connection_Data
+{
+   Eet_Connection      *conn;
+   Eet_Data_Descriptor *edd;
+   Eina_Bool            test;
+};
+
+static Eina_Bool
+_eet_connection_read(const void *eet_data,
+                     size_t      size,
+                     void       *user_data)
+{
+   Eet_Connection_Data *dt = user_data;
+   Eet_Test_Ex_Type *result;
+   Eet_Node *node;
+   int test;
+
+   result = eet_data_descriptor_decode(dt->edd, eet_data, size);
+   node = eet_data_node_decode_cipher(eet_data, NULL, size);
+
+   /* Test the resulting data. */
+   fail_if(!node);
+   fail_if(_eet_test_ex_check(result, 0) != 0);
+   fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
+   fail_if(eina_list_data_get(result->ilist) == NULL);
+   fail_if(*((int *)eina_list_data_get(result->ilist)) != 42);
+   fail_if(eina_list_data_get(result->slist) == NULL);
+   fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
+   fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL);
+   fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0);
+   fail_if(strcmp(result->charray[0], "test") != 0);
+
+   test = 0;
+   if (result->hash)
+     eina_hash_foreach(result->hash, func, &test);
+
+   fail_if(test != 0);
+   if (result->ihash)
+     eina_hash_foreach(result->ihash, func7, &test);
+
+   fail_if(test != 0);
+
+   if (!dt->test)
+     {
+        dt->test = EINA_TRUE;
+        fail_if(!eet_connection_node_send(dt->conn, node, NULL));
+     }
+
+   return EINA_TRUE;
+} /* _eet_connection_read */
+
+static Eina_Bool
+_eet_connection_write(const void *data,
+                      size_t      size,
+                      void       *user_data)
+{
+   Eet_Connection_Data *dt = user_data;
+   int still;
+
+   if (!dt->test)
+     {
+        int step = size / 3;
+
+        eet_connection_received(dt->conn, data, step);
+        eet_connection_received(dt->conn, (char *)data + step, step);
+        size -= 2 * step;
+        still = eet_connection_received(dt->conn, (char *)data + 2 * step, size);
+     }
+   else
+     still = eet_connection_received(dt->conn, data, size);
+
+   fail_if(still);
+
+   return EINA_TRUE;
+} /* _eet_connection_write */
+
+START_TEST(eet_connection_check)
+{
+   Eet_Connection *conn;
+   Eet_Data_Descriptor *edd;
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Connection_Data ecd;
+   Eet_Test_Ex_Type etbt;
+   Eina_Bool on_going;
+
+   eet_init();
+
+   _eet_test_ex_set(&etbt, 0);
+   etbt.list = eina_list_prepend(etbt.list, _eet_test_ex_set(NULL, 1));
+   etbt.list = eina_list_prepend(etbt.list, _eet_test_ex_set(NULL, 1));
+   etbt.hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.hash, EET_TEST_KEY1, _eet_test_ex_set(NULL, 2));
+   eina_hash_add(etbt.hash, EET_TEST_KEY2, _eet_test_ex_set(NULL, 2));
+   etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
+   etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
+   etbt.ihash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
+   eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
+   etbt.slist = eina_list_prepend(NULL, "test");
+   etbt.shash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(etbt.shash, EET_TEST_KEY1, "test");
+   memset(&etbt.charray, 0, sizeof(etbt.charray));
+   etbt.charray[0] = "test";
+
+   eet_eina_file_data_descriptor_class_set(&eddc, sizeof (eddc),
+                                           "Eet_Test_Ex_Type",
+                                           sizeof(Eet_Test_Ex_Type));
+
+   edd = eet_data_descriptor_file_new(&eddc);
+   fail_if(!edd);
+
+   _eet_build_ex_descriptor(edd);
+
+   /* Create a connection. */
+   conn = eet_connection_new(_eet_connection_read, _eet_connection_write, &ecd);
+   fail_if(!conn);
+
+   /* Init context. */
+   ecd.test = EINA_FALSE;
+   ecd.conn = conn;
+   ecd.edd = edd;
+
+   /* Test the connection. */
+   fail_if(!eet_connection_send(conn, edd, &etbt, NULL));
+
+   fail_if(!ecd.test);
+
+   fail_if(!eet_connection_close(conn, &on_going));
+
+   fail_if(on_going);
+
+   eet_shutdown();
+}
+END_TEST
+
+struct _Eet_5FP
+{
+   Eina_F32p32 fp32;
+   Eina_F16p16 fp16;
+   Eina_F8p24  fp8;
+   Eina_F32p32 f1;
+   Eina_F32p32 f0;
+};
+typedef struct _Eet_5FP Eet_5FP;
+
+struct _Eet_5DBL
+{
+   double fp32;
+   double fp16;
+   float  fp8;
+   double f1;
+   double f0;
+};
+typedef struct _Eet_5DBL Eet_5DBL;
+
+START_TEST(eet_fp)
+{
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *edd_5FP;
+   Eet_Data_Descriptor *edd_5DBL;
+   Eet_5FP origin;
+   Eet_5DBL *convert;
+   Eet_5FP *build;
+   void *blob;
+   int size;
+
+   eet_init();
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_5FP);
+   edd_5FP = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp32", fp32, EET_T_F32P32);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp16", fp16, EET_T_F16P16);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp8", fp8, EET_T_F8P24);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f1", f1, EET_T_F32P32);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f0", f0, EET_T_F32P32);
+
+   eet_eina_stream_data_descriptor_class_set(&eddc, sizeof (eddc), "Eet_5FP", sizeof (Eet_5DBL));
+   edd_5DBL = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp32", fp32, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp16", fp16, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp8", fp8, EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f1", f1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f0", f0, EET_T_DOUBLE);
+
+   origin.fp32 = eina_f32p32_double_from(1.125);
+   origin.fp16 = eina_f16p16_int_from(2000);
+   origin.fp8 = eina_f8p24_int_from(125);
+   origin.f1 = eina_f32p32_int_from(1);
+   origin.f0 = 0;
+
+   blob = eet_data_descriptor_encode(edd_5FP, &origin, &size);
+   fail_if(!blob || size <= 0);
+
+   build = eet_data_descriptor_decode(edd_5FP, blob, size);
+   fail_if(!build);
+
+   convert = eet_data_descriptor_decode(edd_5DBL, blob, size);
+   fail_if(!convert);
+
+   fail_if(build->fp32 != eina_f32p32_double_from(1.125));
+   fail_if(build->fp16 != eina_f16p16_int_from(2000));
+   fail_if(build->fp8 != eina_f8p24_int_from(125));
+   fail_if(build->f1 != eina_f32p32_int_from(1));
+   fail_if(build->f0 != 0);
+
+   fail_if(convert->fp32 != 1.125);
+   fail_if(convert->fp16 != 2000);
+   fail_if(convert->fp8 != 125);
+   fail_if(convert->f1 != 1);
+   fail_if(convert->f0 != 0);
+
+   eet_shutdown();
+}
+END_TEST
+START_TEST(eet_file_fp)
+{
+   char *file = strdup("/tmp/eet_suite_testXXXXXX");
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *edd_5FP;
+   Eet_Data_Descriptor *edd_5DBL;
+   Eet_File *ef;
+   Eet_5FP origin;
+   Eet_5DBL *convert;
+   Eet_5FP *build;
+
+   eet_init();
+
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_5FP);
+   edd_5FP = eet_data_descriptor_file_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp32", fp32, EET_T_F32P32);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp16", fp16, EET_T_F16P16);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "fp8", fp8, EET_T_F8P24);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f1", f1, EET_T_F32P32);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5FP, Eet_5FP, "f0", f0, EET_T_F32P32);
+
+   eet_eina_file_data_descriptor_class_set(&eddc, sizeof (eddc), "Eet_5FP", sizeof (Eet_5DBL));
+   edd_5DBL = eet_data_descriptor_file_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp32", fp32, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp16", fp16, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "fp8", fp8, EET_T_FLOAT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f1", f1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(edd_5DBL, Eet_5DBL, "f0", f0, EET_T_DOUBLE);
+
+   origin.fp32 = eina_f32p32_double_from(1.125);
+   origin.fp16 = eina_f16p16_int_from(2000);
+   origin.fp8 = eina_f8p24_int_from(125);
+   origin.f1 = eina_f32p32_int_from(1);
+   origin.f0 = 0;
+
+   fail_if(!(file = tmpnam(file)));
+
+   ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
+   fail_if(!ef);
+
+   fail_if(!eet_data_write(ef, edd_5FP, EET_TEST_FILE_KEY1, &origin, 1));
+
+   build = eet_data_read(ef, edd_5FP, EET_TEST_FILE_KEY1);
+   fail_if(!build);
+
+   convert = eet_data_read(ef, edd_5DBL, EET_TEST_FILE_KEY1);
+   fail_if(!convert);
+
+   fail_if(build->fp32 != eina_f32p32_double_from(1.125));
+   fail_if(build->fp16 != eina_f16p16_int_from(2000));
+   fail_if(build->fp8 != eina_f8p24_int_from(125));
+   fail_if(build->f1 != eina_f32p32_int_from(1));
+   fail_if(build->f0 != 0);
+
+   fail_if(convert->fp32 != 1.125);
+   fail_if(convert->fp16 != 2000);
+   fail_if(convert->fp8 != 125);
+   fail_if(convert->f1 != 1);
+   fail_if(convert->f0 != 0);
+
+   eet_close(ef);
+
+   fail_if(unlink(file) != 0);
+
+   eet_shutdown();
+} /* START_TEST */
+
+END_TEST
+
+typedef struct _Eet_Union_Test    Eet_Union_Test;
+typedef struct _Eet_Variant_Test  Eet_Variant_Test;
+typedef struct _Eet_Variant_Type  Eet_Variant_Type;
+typedef struct _Eet_Inherit_Test1 Eet_Inherit_Test1;
+typedef struct _Eet_Inherit_Test2 Eet_Inherit_Test2;
+typedef struct _Eet_Inherit_Test3 Eet_Inherit_Test3;
+typedef struct _Eet_St1           Eet_St1;
+typedef struct _Eet_St2           Eet_St2;
+typedef struct _Eet_St3           Eet_St3;
+typedef struct _Eet_List          Eet_List;
+
+typedef enum _Eet_Union
+{
+   EET_UNKNOWN,
+   EET_ST1,
+   EET_ST2,
+   EET_ST3
+} Eet_Union;
+
+struct
+{
+   Eet_Union   u;
+   const char *name;
+} eet_mapping[] = {
+   { EET_ST1, "ST1" },
+   { EET_ST2, "ST2" },
+   { EET_ST3, "ST3" },
+   { EET_UNKNOWN, NULL }
+};
+
+struct _Eet_St1
+{
+   double val1;
+   int    stuff;
+   char  *s1;
+};
+
+struct _Eet_St2
+{
+   Eina_Bool          b1;
+   unsigned long long v1;
+};
+
+struct _Eet_St3
+{
+   int boby;
+};
+
+struct _Eet_Union_Test
+{
+   Eet_Union type;
+
+   union {
+      Eet_St1 st1;
+      Eet_St2 st2;
+      Eet_St3 st3;
+   } u;
+};
+
+struct _Eet_Variant_Type
+{
+   const char *type;
+   Eina_Bool   unknow : 1;
+};
+
+struct _Eet_Variant_Test
+{
+   Eet_Variant_Type t;
+
+   void            *data;
+   Eina_List       *data_list;
+};
+
+struct _Eet_Inherit_Test1
+{
+   Eet_Union type;
+   Eet_St1   st1;
+};
+struct _Eet_Inherit_Test2
+{
+   Eet_Union type;
+   Eet_St2   st2;
+};
+struct _Eet_Inherit_Test3
+{
+   Eet_Union type;
+   Eet_St3   st3;
+};
+
+struct _Eet_List
+{
+   Eina_List *list;
+};
+
+static const char *
+_eet_union_type_get(const void *data,
+                    Eina_Bool  *unknow)
+{
+   const Eet_Union *u = data;
+   int i;
+
+   if (unknow)
+     *unknow = EINA_FALSE;
+
+   for (i = 0; eet_mapping[i].name != NULL; ++i)
+     if (*u == eet_mapping[i].u)
+       return eet_mapping[i].name;
+
+   if (unknow)
+     *unknow = EINA_TRUE;
+
+   return NULL;
+} /* _eet_union_type_get */
+
+static Eina_Bool
+_eet_union_type_set(const char *type,
+                    void       *data,
+                    Eina_Bool   unknow)
+{
+   Eet_Union *u = data;
+   int i;
+
+   if (unknow)
+     return EINA_FALSE;
+
+   for (i = 0; eet_mapping[i].name != NULL; ++i)
+     if (strcmp(eet_mapping[i].name, type) == 0)
+       {
+          *u = eet_mapping[i].u;
+          return EINA_TRUE;
+       }
+
+   return EINA_FALSE;
+} /* _eet_union_type_set */
+
+static const char *
+_eet_variant_type_get(const void *data,
+                      Eina_Bool  *unknow)
+{
+   const Eet_Variant_Type *type = data;
+   int i;
+
+   if (unknow)
+     *unknow = type->unknow;
+
+   for (i = 0; eet_mapping[i].name != NULL; ++i)
+     if (strcmp(type->type, eet_mapping[i].name) == 0)
+       return eet_mapping[i].name;
+
+   if (unknow)
+     *unknow = EINA_FALSE;
+
+   return type->type;
+} /* _eet_variant_type_get */
+
+static Eina_Bool
+_eet_variant_type_set(const char *type,
+                      void       *data,
+                      Eina_Bool   unknow)
+{
+   Eet_Variant_Type *vt = data;
+
+   vt->type = type;
+   vt->unknow = unknow;
+   return EINA_TRUE;
+} /* _eet_variant_type_set */
+
+static Eet_Data_Descriptor *
+_eet_st1_dd(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *res;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_St1);
+   res = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "val1", val1, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "stuff", stuff, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St1, "s1", s1, EET_T_STRING);
+
+   return res;
+} /* _eet_st1_dd */
+
+static void
+_eet_st1_set(Eet_St1 *st1,
+             int      i)
+{
+   st1->val1 = EET_TEST_DOUBLE;
+   st1->stuff = EET_TEST_INT + i;
+   st1->s1 = EET_TEST_STRING;
+} /* _eet_st1_set */
+
+static void
+_eet_st1_cmp(Eet_St1 *st1,
+             int      i)
+{
+   double tmp;
+
+   fail_if(!st1);
+
+   tmp = st1->val1 - EET_TEST_DOUBLE;
+   if (tmp < 0)
+     tmp = -tmp;
+
+   fail_if(tmp > 0.005);
+   fail_if(st1->stuff != EET_TEST_INT + i);
+   fail_if(strcmp(st1->s1, EET_TEST_STRING));
+} /* _eet_st1_cmp */
+
+static Eet_Data_Descriptor *
+_eet_st2_dd(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *res;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_St2);
+   res = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St2, "b1", b1, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St2, "v1", v1, EET_T_ULONG_LONG);
+
+   return res;
+} /* _eet_st2_dd */
+
+static void
+_eet_st2_set(Eet_St2 *st2,
+             int      i)
+{
+   st2->b1 = EINA_TRUE;
+   st2->v1 = EET_TEST_LONG_LONG + i;
+} /* _eet_st2_set */
+
+static void
+_eet_st2_cmp(Eet_St2 *st2,
+             int      i)
+{
+   fail_if(!st2->b1);
+   fail_if(st2->v1 != EET_TEST_LONG_LONG + i);
+} /* _eet_st2_cmp */
+
+static Eet_Data_Descriptor *
+_eet_st3_dd(void)
+{
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *res;
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_St3);
+   res = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(res, Eet_St3, "boby", boby, EET_T_INT);
+
+   return res;
+} /* _eet_st3_dd */
+
+static void
+_eet_st3_set(Eet_St3 *st3,
+             int      i)
+{
+   st3->boby = EET_TEST_INT + i;
+} /* _eet_st3_set */
+
+static void
+_eet_st3_cmp(Eet_St3 *st3,
+             int      i)
+{
+   fail_if(st3->boby != EET_TEST_INT + i);
+} /* _eet_st3_cmp */
+
+START_TEST(eet_test_union)
+{
+   Eet_Union_Test *eut;
+   Eet_List *l;
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *edd;
+   Eet_Data_Descriptor *unified;
+   Eet_Data_Descriptor *m;
+   void *blob;
+   int size;
+   int i;
+
+   eina_init();
+   eet_init();
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_Union_Test);
+   edd = eet_data_descriptor_stream_new(&eddc);
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_Union_Test);
+   m = eet_data_descriptor_stream_new(&eddc);
+
+   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
+   eddc.func.type_get = _eet_union_type_get;
+   eddc.func.type_set = _eet_union_type_set;
+   unified = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST1", _eet_st1_dd());
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST2", _eet_st2_dd());
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST3", _eet_st3_dd());
+
+   EET_DATA_DESCRIPTOR_ADD_UNION(edd, Eet_Union_Test, "u", u, type, unified);
+
+   EET_DATA_DESCRIPTOR_ADD_LIST(m, Eet_List, "list", list, edd);
+
+   l = calloc(1, sizeof (Eet_List));
+
+#define EUT_NEW(Type_Index)                 \
+  eut = calloc(1, sizeof (Eet_Union_Test)); \
+  eut->type = EET_ST ## Type_Index;         \
+  _eet_st ## Type_Index ## _set(&(eut->u.st ## Type_Index), i);
+
+   for (i = 0; i < 3; ++i)
+     {
+        EUT_NEW(1);
+        l->list = eina_list_append(l->list, eut);
+
+        EUT_NEW(2);
+        l->list = eina_list_append(l->list, eut);
+
+        EUT_NEW(3);
+        l->list = eina_list_append(l->list, eut);
+     }
+
+   blob = eet_data_descriptor_encode(m, l, &size);
+   fail_if(!blob || size <= 0);
+
+   l = eet_data_descriptor_decode(m, blob, size);
+   fail_if(!l);
+
+   fail_if(eina_list_count(l->list) != 9);
+
+#define EUT_CMP(Type_Index)                             \
+  eut = eina_list_nth(l->list, i * 3 + Type_Index - 1); \
+  fail_if(eut->type != EET_ST ## Type_Index);           \
+  _eet_st ## Type_Index ## _cmp(&(eut->u.st ## Type_Index), i);
+
+   for (i = 0; i < 3; ++i)
+     {
+        EUT_CMP(1);
+        EUT_CMP(2);
+        EUT_CMP(3);
+     }
+
+   eet_shutdown();
+   eina_shutdown();
+}
+END_TEST
+START_TEST(eet_test_variant)
+{
+   Eet_Variant_Test *evt;
+   Eet_List *l;
+   Eet_St1 *st1;
+   Eet_St2 *st2;
+   Eet_St3 *st3;
+   Eet_Data_Descriptor_Class eddc;
+   Eet_Data_Descriptor *edd;
+   Eet_Data_Descriptor *unified;
+   Eet_Data_Descriptor *m;
+   void *blob;
+   int size;
+   int i;
+
+   eina_init();
+   eet_init();
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_Variant_Test);
+   edd = eet_data_descriptor_stream_new(&eddc);
+
+   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Eet_Variant_Test);
+   m = eet_data_descriptor_stream_new(&eddc);
+
+   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
+   eddc.func.type_get = _eet_variant_type_get;
+   eddc.func.type_set = _eet_variant_type_set;
+   unified = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST1", _eet_st1_dd());
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST2", _eet_st2_dd());
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(unified, "ST3", _eet_st3_dd());
+
+   EET_DATA_DESCRIPTOR_ADD_VARIANT(edd,
+                                   Eet_Variant_Test,
+                                   "data",
+                                   data,
+                                   t,
+                                   unified);
+
+   unified = eet_data_descriptor_stream_new(&eddc);
+   eet_data_descriptor_element_add(unified, "ST1",
+                                   EET_T_UNKNOW, EET_G_LIST,
+                                   0, 0, NULL, _eet_st1_dd());
+   eet_data_descriptor_element_add(unified, "ST2",
+                                   EET_T_UNKNOW, EET_G_LIST,
+                                   0, 0, NULL, _eet_st2_dd());
+
+   EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, Eet_Variant_Test,
+                                   "data_list", data_list, t, unified);
+
+   EET_DATA_DESCRIPTOR_ADD_LIST(m, Eet_List, "list", list, edd);
+
+   l = calloc(1, sizeof (Eet_List));
+
+#define EVT_NEW(Type_Index)                                    \
+  evt = calloc(1, sizeof (Eet_Variant_Test));                  \
+  evt->t.type = eet_mapping[Type_Index - 1].name;              \
+  st ## Type_Index = calloc(1, sizeof (Eet_St ## Type_Index)); \
+  _eet_st ## Type_Index ## _set(st ## Type_Index, i);          \
+  evt->data = st ## Type_Index;
+
+   for (i = 0; i < 3; ++i)
+     {
+        EVT_NEW(1);
+        l->list = eina_list_append(l->list, evt);
+
+        st1 = calloc(1, sizeof (Eet_St1));
+        _eet_st1_set(st1, i);
+        evt->data_list = eina_list_append(evt->data_list, st1);
+
+        EVT_NEW(2);
+        l->list = eina_list_append(l->list, evt);
+
+        EVT_NEW(3);
+        l->list = eina_list_append(l->list, evt);
+     }
+
+   blob = eet_data_descriptor_encode(m, l, &size);
+   fail_if(!blob || size <= 0);
+
+   l = eet_data_descriptor_decode(m, blob, size);
+   fail_if(!l);
+
+   fail_if(eina_list_count(l->list) != 9);
+
+#define EVT_CMP(Type_Index)                                            \
+  evt = eina_list_nth(l->list, i * 3 + Type_Index - 1);                \
+  fail_if(strcmp(evt->t.type, eet_mapping[Type_Index - 1].name) != 0); \
+  _eet_st ## Type_Index ## _cmp(evt->data, i);
+
+   for (i = 0; i < 3; ++i)
+     {
+        EVT_CMP(1);
+
+        fail_if(!evt->data_list);
+        fail_if(eina_list_count(evt->data_list) != 1);
+
+        st1 = eina_list_data_get(evt->data_list);
+        _eet_st1_cmp(st1, i);
+
+        EVT_CMP(2);
+        EVT_CMP(3);
+     }
+
+   eet_shutdown();
+   eina_shutdown();
+} /* START_TEST */
+
+END_TEST
+
+Suite *
+eet_suite(void)
+{
+   Suite *s;
+   TCase *tc;
+
+   s = suite_create("Eet");
+
+   tc = tcase_create("Eet_Init");
+   tcase_add_test(tc, eet_test_init);
+   suite_add_tcase(s, tc);
+
+   tc = tcase_create("Eet Data Encoding/Decoding");
+   tcase_add_test(tc, eet_test_basic_data_type_encoding_decoding);
+   tcase_add_test(tc, eet_test_data_type_encoding_decoding);
+   tcase_add_test(tc, eet_test_data_type_dump_undump);
+   tcase_add_test(tc, eet_fp);
+   tcase_add_test(tc, eet_test_union);
+   tcase_add_test(tc, eet_test_variant);
+   suite_add_tcase(s, tc);
+
+   tc = tcase_create("Eet File");
+   tcase_add_test(tc, eet_file_simple_write);
+   tcase_add_test(tc, eet_file_data_test);
+   tcase_add_test(tc, eet_file_data_dump_test);
+   tcase_add_test(tc, eet_file_fp);
+   suite_add_tcase(s, tc);
+
+   tc = tcase_create("Eet Image");
+   tcase_add_test(tc, eet_image);
+   tcase_add_test(tc, eet_small_image);
+   suite_add_tcase(s, tc);
+
+#ifdef HAVE_SIGNATURE
+   tc = tcase_create("Eet Identity");
+   tcase_add_test(tc, eet_identity_simple);
+   tcase_add_test(tc, eet_identity_open_simple);
+   tcase_add_test(tc, eet_identity_open_pkcs8);
+   tcase_add_test(tc, eet_identity_open_pkcs8_enc);
+   suite_add_tcase(s, tc);
+#endif /* ifdef HAVE_SIGNATURE */
+
+#ifdef HAVE_CIPHER
+   tc = tcase_create("Eet Cipher");
+   tcase_add_test(tc, eet_cipher_decipher_simple);
+   suite_add_tcase(s, tc);
+#endif /* ifdef HAVE_CIPHER */
+
+#ifdef EINA_HAVE_THREADS
+   tc = tcase_create("Eet Cache");
+   tcase_add_test(tc, eet_cache_concurrency);
+   suite_add_tcase(s, tc);
+#endif /* ifdef EFL_HAVE_THREADS */
+
+   tc = tcase_create("Eet Connection");
+   tcase_add_test(tc, eet_connection_check);
+   suite_add_tcase(s, tc);
+
+   return s;
+} /* eet_suite */
+
+int
+main(void)
+{
+   Suite *s;
+   SRunner *sr;
+   int failed_count;
+
+   s = eet_suite();
+   sr = srunner_create(s);
+   srunner_run_all(sr, CK_ENV);
+   failed_count = srunner_ntests_failed(sr);
+   srunner_free(sr);
+
+   return (failed_count == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+} /* main */
+