ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / Examples / Linux / Testbenches / ftp_test / Sources / ardrone_testing_tool.c
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/Examples/Linux/Testbenches/ftp_test/Sources/ardrone_testing_tool.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/Examples/Linux/Testbenches/ftp_test/Sources/ardrone_testing_tool.c
new file mode 100644 (file)
index 0000000..875a2f6
--- /dev/null
@@ -0,0 +1,836 @@
+/**
+ * @file main.c
+ * @author sylvain.gaeremynck@parrot.com
+ * @date 2009/07/01
+ */
+#include <ardrone_testing_tool.h>
+
+//ARDroneLib
+#include <ardrone_tool/ardrone_time.h>
+#include <ardrone_tool/Navdata/ardrone_navdata_client.h>
+#include <ardrone_tool/Control/ardrone_control.h>
+#include <ardrone_tool/UI/ardrone_input.h>
+#include <ardrone_tool/ardrone_tool_configuration.h>
+
+//Common
+#include <config.h>
+#include <ardrone_api.h>
+
+//VP_SDK
+#include <ATcodec/ATcodec_api.h>
+#include <VP_Os/vp_os_print.h>
+#include <VP_Os/vp_os_thread.h>
+#include <VP_Api/vp_api_thread_helper.h>
+#include <VP_Os/vp_os_signal.h>
+#include <VP_Os/vp_os_types.h>
+#include <VP_Os/vp_os_delay.h>
+
+//Local project
+#include <UI/gamepad.h>
+#include <Video/video_stage.h>
+
+#include <utils/ardrone_ftp.h>
+
+#include <semaphore.h>
+
+static int32_t exit_ihm_program = 1;
+
+/* Implementing Custom methods for the main function of an ARDrone application */
+
+/* The delegate object calls this method during initialization of an ARDrone application */
+C_RESULT ardrone_tool_init_custom(int argc, char **argv)
+{
+  /* Start all threads of your application */
+  START_THREAD( main_application_thread , NULL );
+  return C_OK;
+}
+
+/* The delegate object calls this method when the event loop exit */
+C_RESULT ardrone_tool_shutdown_custom()
+{
+  /* Relinquish all threads of your application */
+  JOIN_THREAD( main_application_thread );
+  
+  return C_OK;
+}
+
+/* The event loop calls this method for the exit condition */
+bool_t ardrone_tool_exit()
+{
+  return exit_ihm_program == 0;
+}
+
+C_RESULT signal_exit()
+{
+  exit_ihm_program = 0;
+  
+  return C_OK;
+}
+
+PROTO_THREAD_ROUTINE(main_application_thread, data);
+
+/* Implementing thread table in which you add routines of your application and those provided by the SDK */
+BEGIN_THREAD_TABLE
+THREAD_TABLE_ENTRY( main_application_thread, 20 )
+END_THREAD_TABLE
+  
+sem_t synchroSem;
+
+#define BLUE { printf("%s","\033[34;01m"); }
+#define RED { printf("%s","\033[31;01m"); }
+#define GREEN { printf("%s","\033[32;01m"); }
+#define RAZ { printf("%s","\033[0m"); }
+
+#define TEST_RESULT(result, formatFAIL, formatOK, ...)  \
+  do                                                    \
+    {                                                   \
+      _ftp_status locResult = (result);                 \
+      totalOp++;                                        \
+      if (FTP_FAILED (locResult))                       \
+        {                                               \
+          RED;                                          \
+          printf ("[%i : KO] : ", __LINE__);            \
+          printf (formatFAIL, __VA_ARGS__);             \
+          printf ("\n");                                \
+          RAZ;                                          \
+        }                                               \
+      else                                              \
+        {                                               \
+          GREEN;                                        \
+          printf ("[%i : OK] : ", __LINE__);            \
+          printf (formatOK, __VA_ARGS__);               \
+          printf ("\n");                                \
+          RAZ;                                          \
+          opOk++;                                       \
+        }                                               \
+      if ((FTP_TIMEOUT == locResult) ||                 \
+          (FTP_BUSY == locResult))                      \
+        {                                               \
+          runOperation = 1;                             \
+        }                                               \
+      else                                              \
+        {                                               \
+          runOperation = 0;                             \
+        }                                               \
+    }                                                   \
+  while (0)
+
+#define COMPUTE_PERCENT_OK                                              \
+  do                                                                    \
+    {                                                                   \
+      if (totalOp> 0)                                                   \
+        {                                                               \
+          float percentOk = (100.0 * opOk) / (1.0 * totalOp);           \
+          if (90.0 < percentOk)                                         \
+            {                                                           \
+              GREEN;                                                    \
+            }                                                           \
+          else                                                          \
+            {                                                           \
+              RED;                                                      \
+            }                                                           \
+          printf ("Success of %llu operations on %llu (%6.2f %%)\n", opOk, totalOp, percentOk); \
+          RAZ;                                                          \
+        }                                                               \
+    } while (0)
+
+
+#define TEST_ABORTION(abortFunc)                                \
+  do                                                            \
+    {                                                           \
+      _ftp_status locStat = (abortFunc);                        \
+      totalOp++;                                                \
+      switch (locStat)                                          \
+        {                                                       \
+        case FTP_SUCCESS:                                       \
+          GREEN;                                                \
+          printf ("[%i : OK] : ", __LINE__);                    \
+          printf ("Abortion successfull\n");                    \
+          RAZ;                                                  \
+          opOk++;                                               \
+          break;                                                \
+        case FTP_SAMESIZE:                                      \
+          RED;                                                  \
+          printf ("[%i : KO] : ", __LINE__);                    \
+          printf ("Abortion failed, op was not running\n");     \
+          RAZ;                                                  \
+          break;                                                \
+        case FTP_FAIL:                                          \
+        default:                                                \
+          RED;                                                  \
+          printf ("[%i : KO] : ", __LINE__);                    \
+          printf ("Unknown result\n");                          \
+          RAZ;                                                  \
+          break;                                                \
+        }                                                       \
+    } while (0)                                                 \
+    
+#define WAIT_COND(result)                       \
+  do                                            \
+    {                                           \
+      sem_wait (&synchroSem);                   \
+    } while (0)
+
+
+#define SEND_COND                               \
+  do                                            \
+    {                                           \
+      sem_post (&synchroSem);                   \
+    }                                           \
+  while (0)
+
+_ftp_status globalStatus;
+int runOperation = 1;
+char *listBuffer = NULL;
+
+void
+ftpCallback (_ftp_status status, void *arg, _ftp_t *callingFtp)
+{
+  float percent = (NULL != arg) ? *(float *)arg : -1.0;
+  if (NULL != arg && FTP_SUCCESS == status) { listBuffer = arg; }
+  globalStatus = status;
+  static int calls = 0;
+#define CALLBACK_FORMAT "Callback called with status %s\n"
+#ifdef DEBUG
+#define PRINT_CALLBACK_FORMAT(statusString) { printf (CALLBACK_FORMAT, statusString); calls++; }
+#else
+#define PRINT_CALLBACK_FORMAT(statusString) { calls++; }
+#endif
+  switch (status)
+    {
+    case FTP_BUSY:
+      PRINT_CALLBACK_FORMAT ("FTP_BUSY");
+      SEND_COND;
+      break;
+    case FTP_ABORT:
+      PRINT_CALLBACK_FORMAT ("FTP_ABORT");
+      SEND_COND;
+      break;
+    case FTP_FAIL:
+      PRINT_CALLBACK_FORMAT ("FTP_FAIL");
+      SEND_COND;
+      break;
+    case FTP_SUCCESS:
+      PRINT_CALLBACK_FORMAT ("FTP_SUCCESS");
+      SEND_COND;
+      break;
+    case FTP_TIMEOUT:
+      PRINT_CALLBACK_FORMAT ("FTP_TIMEOUT");
+      SEND_COND;
+      break;
+    case FTP_BADSIZE:
+      PRINT_CALLBACK_FORMAT ("FTP_BADSIZE");
+      SEND_COND;
+      break;
+    case FTP_SAMESIZE:
+      PRINT_CALLBACK_FORMAT ("FTP_SAMESIZE");
+      SEND_COND;
+      break;
+    case FTP_PROGRESS:
+      printf ("\rProgress : %5.2f", percent);
+      fflush (stdout);
+      if (100.0 <= percent)
+        {
+          printf ("\n");
+        }
+      break;
+    default: // Should not happen ... kill the program in this case !
+      printf ("Callback called with unknown status : %d\n", status);
+      exit (-1);
+      break;
+    }
+#undef CALLBACK_FORMAT
+}
+  
+#define title(x) { BLUE; printf("[%i] %s",__LINE__,x); RAZ; }
+
+#define _USE_EMENCIA_SERVER (0)
+#if _USE_EMENCIA_SERVER
+#define ARDRONE_IP "parrot02.nyx.emencia.net"
+#define ARDRONE_PORT (21)
+#define ARDRONE_USER "parrot"
+#define ARDRONE_PASSWORD "parrot"
+#else
+#define ARDRONE_IP "192.168.1.1"
+#define ARDRONE_PORT (21)
+#define ARDRONE_USER "anonymous"
+#define ARDRONE_PASSWORD ""
+#endif
+
+#define _1MB_ORIGIN_FILE "origin.txt"
+#define _512K_FAILED_FILE "half_file.txt"
+#define _256K_FAILED_FILE "quarter_file.txt"
+#define _1MB_MERGED_FILE "merged.txt"
+#define LOCAL_RESULT_FILE "result.txt"
+
+#define NOCB_NORESUME_RESULT "result_nocb_noresume.txt"
+#define CB_NORESUME_RESULT "result_cb_noresume.txt"
+#define NOCB_RESUME_RESULT "result_nocb_resume.txt"
+#define CB_RESUME_RESULT "result_cb_resume.txt"
+
+#define ARDRONE_FILE_BEFORE_RENAME "origin.txt"
+#define ARDRONE_FILE_AFTER_RENAME "result.txt"
+
+DEFINE_THREAD_ROUTINE(main_application_thread, data)
+{
+  
+  /* Semaphore for synchronisation */
+  sem_init (&synchroSem, 0, 0);
+  
+  vp_os_delay(1000);
+
+  char buffer [512] = {0};
+  int systemRet = 0;
+  
+  _ftp_t *droneFtp = NULL;
+  _ftp_status ftp_result = FTP_FAIL;
+
+  int runOperation = 1;
+
+  uint64_t totalOp = 0;
+  uint64_t opOk = 0;
+
+  
+  title ("\n\n------ CLEANING ------\n\n");
+  
+  title ("--- Connecting to AR.Drone FTP ---\n");
+  
+  for (runOperation = 1; runOperation;)
+    {
+      droneFtp = ftpConnect (ARDRONE_IP, ARDRONE_PORT, ARDRONE_USER, ARDRONE_PASSWORD, &ftp_result);
+      TEST_RESULT (ftp_result, "Unable to connect to %s@%s:%d (PASS : %s)", "Connected to %s@%s:%d (PASS : %s)", ARDRONE_USER, ARDRONE_IP, ARDRONE_PORT, ARDRONE_PASSWORD);
+    }
+  
+  title ("--- Getting PWD ---\n");
+  
+  char pwd [256] = {0};
+  ftp_result = ftpPwd (droneFtp, pwd, 256);
+  TEST_RESULT (ftp_result, "Unable to get PWD [%1s]", "Got PWD : %s", pwd);
+
+  title ("--- Removing previous file on AR.Drone ---\n");
+
+  for (runOperation = 1; runOperation;)
+    {
+      ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_BEFORE_RENAME);
+      TEST_RESULT (ftp_result, " (STILL OK !) file %s does not exist", "Deleted file %s", ARDRONE_FILE_BEFORE_RENAME);
+    }
+
+  for (runOperation = 1; runOperation;)
+    {
+      ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_AFTER_RENAME);
+      TEST_RESULT (ftp_result, " (STILL OK !) file %s does not exist", "Deleted file %s", ARDRONE_FILE_AFTER_RENAME);
+    }
+
+  title ("--- Removing local result file ---\n");
+  vp_os_memset (buffer, 0x0, 512);
+  snprintf (buffer, 512, "rm -f %s", LOCAL_RESULT_FILE);
+  systemRet = system (buffer);
+  printf ("System : %s\n", buffer);
+
+  title ("--- Disconnecting from AR.Drone FTP ---\n");
+
+  TEST_RESULT (ftpClose (&droneFtp), "AR.Drone FTP (%s:%d) was not opened", "Closed AR.Drone FTP (%s:%d)", ARDRONE_IP, ARDRONE_PORT);
+
+  while (1)
+    {
+
+      title ("\n\n------ TESTS WITHOUT RESUME NOR CALLBACK ------\n\n");
+  
+      title ("--- Connecting to AR.Drone FTP ---\n");
+      
+      for (runOperation = 1; runOperation;)
+        {  
+          droneFtp = ftpConnect (ARDRONE_IP, ARDRONE_PORT, ARDRONE_USER, ARDRONE_PASSWORD, &ftp_result);
+          TEST_RESULT (ftp_result, "Unable to connect to %s@%s:%d (PASS : %s)", "Connected to %s@%s:%d (PASS : %s)", ARDRONE_USER, ARDRONE_IP, ARDRONE_PORT, ARDRONE_PASSWORD);
+        }
+  
+      title ("--- Sending origin file to the AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME, 0, NULL);
+          TEST_RESULT (ftp_result, "Unable to send file %s->%s", "Sent file %s->%s", _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+
+      title ("--- Renaming file on the AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRename (droneFtp, ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Impossible to rename %s->%s", "Renamed %s->%s", ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+        }
+
+      title ("--- Getting AR.Drone FTP Listing ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpList (droneFtp, &listBuffer, NULL);
+          TEST_RESULT (ftp_result, "Unable to list FTP [%1s]", "Listed FTP :\n%s", listBuffer);
+          if (NULL != listBuffer) { vp_os_free (listBuffer); listBuffer = NULL; }
+        }
+
+      title ("--- Getting back result file ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpGet (droneFtp, ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE, 0, NULL);
+          TEST_RESULT (ftp_result, "Unable to get file %s->%s", "Got back file %s->%s", ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE);
+        }
+
+      title ("--- Checking file ---\n");
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "diff %s %s > /dev/null", LOCAL_RESULT_FILE, _1MB_ORIGIN_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+      totalOp++;
+      if (0 != systemRet)
+        {
+          RED; printf ("[%d : KO] : Files are different !\n", __LINE__); RAZ;
+        }
+      else
+        {
+          opOk++;
+          GREEN; printf ("[%d : OK] : Files are the same\n", __LINE__); RAZ;
+        }
+
+      title ("--- Removing file on AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {      
+          ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Unable to delete file %s", "Deleted file %s", ARDRONE_FILE_AFTER_RENAME);
+        }
+
+      title ("--- Local file backup ---\n");
+  
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "mv %s %s", LOCAL_RESULT_FILE, NOCB_NORESUME_RESULT);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+
+      title ("--- Closing AR.Drone FTP ---\n");
+  
+      TEST_RESULT (ftpClose (&droneFtp), "AR.Drone FTP (%s:%d) was not opened", "Closed AR.Drone FTP (%s:%d)", ARDRONE_IP, ARDRONE_PORT);
+
+
+
+
+
+
+
+
+      title ("\n\n------ TESTS WITHOUT RESUME / WITH CALLBACK ------\n\n");
+  
+      title ("--- Connecting to AR.Drone FTP ---\n");
+      for (runOperation = 1; runOperation;)
+        {
+          droneFtp = ftpConnect (ARDRONE_IP, ARDRONE_PORT, ARDRONE_USER, ARDRONE_PASSWORD, &ftp_result);
+          TEST_RESULT (ftp_result, "Unable to connect to %s@%s:%d (PASS : %s)", "Connected to %s@%s:%d (PASS : %s)", ARDRONE_USER, ARDRONE_IP, ARDRONE_PORT, ARDRONE_PASSWORD);
+        }
+      
+      title ("--- Sending origin file to the AR.Drone ---\n");
+
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME, 0, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to send file %s->%s", "Sent file %s->%s", _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+
+      title ("--- Renaming file on the AR.Drone ---\n");
+
+      ftp_result = ftpRename (droneFtp, ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+      TEST_RESULT (ftp_result, "Impossible to rename %s->%s", "Renamed %s->%s", ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+
+      title ("--- Getting AR.Drone FTP Listing ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpList (droneFtp, NULL, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to list FTP [%1s]", "Listed FTP :\n%s", listBuffer);
+          if (NULL != listBuffer) { vp_os_free (listBuffer); listBuffer = NULL; }
+        }
+
+      title ("--- Getting back result file ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpGet (droneFtp, ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE, 0, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to get file %s->%s", "Got back file %s->%s", ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE);
+        }
+
+      title ("--- Checking file ---\n");
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "diff %s %s > /dev/null", LOCAL_RESULT_FILE, _1MB_ORIGIN_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+      totalOp++;
+      if (0 != systemRet)
+        {
+          RED; printf ("[%d : KO] : Files are different !\n", __LINE__); RAZ;
+        }
+      else
+        {
+          opOk++;
+          GREEN; printf ("[%d : OK] : Files are the same\n", __LINE__); RAZ;
+        }
+
+      title ("--- Removing file on AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Unable to delete file %s", "Deleted file %s", ARDRONE_FILE_AFTER_RENAME);
+        }
+      
+      title ("--- Local file backup ---\n");
+  
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "mv %s %s", LOCAL_RESULT_FILE, CB_NORESUME_RESULT);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+
+      title ("--- Closing AR.Drone FTP ---\n");
+  
+      TEST_RESULT (ftpClose (&droneFtp), "AR.Drone FTP (%s:%d) was not opened", "Closed AR.Drone FTP (%s:%d)", ARDRONE_IP, ARDRONE_PORT);
+
+
+
+
+
+
+      title ("\n\n------ TESTS WITH RESUME / NO CALLBACK ------\n\n");
+
+      title ("--- Preparing bad file (256K) locally ---\n");
+
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "cp %s %s", _256K_FAILED_FILE, LOCAL_RESULT_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+  
+      title ("--- Connecting to AR.Drone FTP ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          droneFtp = ftpConnect (ARDRONE_IP, ARDRONE_PORT, ARDRONE_USER, ARDRONE_PASSWORD, &ftp_result);
+          TEST_RESULT (ftp_result, "Unable to connect to %s@%s:%d (PASS : %s)", "Connected to %s@%s:%d (PASS : %s)", ARDRONE_USER, ARDRONE_IP, ARDRONE_PORT, ARDRONE_PASSWORD);
+        }
+
+      title ("--- Preparing bad file (512K) on AR.Drone FTP ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _512K_FAILED_FILE, ARDRONE_FILE_BEFORE_RENAME, 1, NULL);
+          TEST_RESULT (ftp_result, "Unable to send partial file %s->%s", "Sent partial file %s->%s", _512K_FAILED_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+  
+      title ("--- Sending origin file to the AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME, 1, NULL);
+          TEST_RESULT (ftp_result, "Unable to send file %s->%s", "Sent file %s->%s", _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+
+      title ("--- Renaming file on the AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRename (droneFtp, ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Impossible to rename %s->%s", "Renamed %s->%s", ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+        }
+
+      title ("--- Getting AR.Drone FTP Listing ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpList (droneFtp, &listBuffer, NULL);
+          TEST_RESULT (ftp_result, "Unable to list FTP [%1s]", "Listed FTP :\n%s", listBuffer);
+          if (NULL != listBuffer) { vp_os_free (listBuffer); listBuffer = NULL; }
+        }
+
+      title ("--- Getting back result file ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpGet (droneFtp, ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE, 1, NULL);
+          TEST_RESULT (ftp_result, "Unable to get file %s->%s", "Got back file %s->%s", ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE);
+        }
+
+      title ("--- Checking file ---\n");
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "diff %s %s > /dev/null", LOCAL_RESULT_FILE, _1MB_MERGED_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+      totalOp++;
+      if (0 != systemRet)
+        {
+          RED; printf ("[%d : KO] : Files are different !\n", __LINE__); RAZ;
+        }
+      else
+        {
+          opOk++;
+          GREEN; printf ("[%d : OK] : Files are the same\n", __LINE__); RAZ;
+        }
+
+      title ("--- Removing file on AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Unable to delete file %s", "Deleted file %s", ARDRONE_FILE_AFTER_RENAME);
+        }
+
+      title ("--- Local file backup ---\n");
+  
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "mv %s %s", LOCAL_RESULT_FILE, NOCB_RESUME_RESULT);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+
+      title ("--- Closing AR.Drone FTP ---\n");
+  
+      TEST_RESULT (ftpClose (&droneFtp), "AR.Drone FTP (%s:%d) was not opened", "Closed AR.Drone FTP (%s:%d)", ARDRONE_IP, ARDRONE_PORT);
+
+
+
+
+
+
+
+
+
+
+
+
+      title ("\n\n------ TESTS WITH RESUME AND CALLBACK ------\n\n");
+
+      title ("--- Preparing bad file (256K) locally ---\n");
+
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "cp %s %s", _256K_FAILED_FILE, LOCAL_RESULT_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+  
+      title ("--- Connecting to AR.Drone FTP ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          droneFtp = ftpConnect (ARDRONE_IP, ARDRONE_PORT, ARDRONE_USER, ARDRONE_PASSWORD, &ftp_result);
+          TEST_RESULT (ftp_result, "Unable to connect to %s@%s:%d (PASS : %s)", "Connected to %s@%s:%d (PASS : %s)", ARDRONE_USER, ARDRONE_IP, ARDRONE_PORT, ARDRONE_PASSWORD);
+        }
+
+      title ("--- Preparing bad file (512K) on AR.Drone FTP ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _512K_FAILED_FILE, ARDRONE_FILE_BEFORE_RENAME, 1, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to send partial file %s->%s", "Sent partial file %s->%s", _512K_FAILED_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+  
+      title ("--- Sending origin file to the AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME, 1, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to send file %s->%s", "Sent file %s->%s", _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+
+      title ("--- Renaming file on the AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRename (droneFtp, ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Impossible to rename %s->%s", "Renamed %s->%s", ARDRONE_FILE_BEFORE_RENAME, ARDRONE_FILE_AFTER_RENAME);
+        }
+
+      title ("--- Getting AR.Drone FTP Listing ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpList (droneFtp, NULL, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to list FTP [%1s]", "Listed FTP :\n%s", listBuffer);
+          if (NULL != listBuffer) { vp_os_free (listBuffer); listBuffer = NULL; }
+        }
+
+      title ("--- Getting back result file ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpGet (droneFtp, ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE, 1, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to get file %s->%s", "Got back file %s->%s", ARDRONE_FILE_AFTER_RENAME, LOCAL_RESULT_FILE);
+        }
+
+      title ("--- Checking file ---\n");
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "diff %s %s > /dev/null", LOCAL_RESULT_FILE, _1MB_MERGED_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+      totalOp++;
+      if (0 != systemRet)
+        {
+          RED; printf ("[%d : KO] : Files are different !\n", __LINE__); RAZ;
+        }
+      else
+        {
+          opOk++;
+          GREEN; printf ("[%d : OK] : Files are the same\n", __LINE__); RAZ;
+        }
+
+      title ("--- Removing file on AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_AFTER_RENAME);
+          TEST_RESULT (ftp_result, "Unable to delete file %s", "Deleted file %s", ARDRONE_FILE_AFTER_RENAME);
+        }
+  
+      title ("--- Local file backup ---\n");
+  
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "mv %s %s", LOCAL_RESULT_FILE, CB_RESUME_RESULT);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+
+      title ("--- Closing AR.Drone FTP ---\n");
+  
+      TEST_RESULT (ftpClose (&droneFtp), "AR.Drone FTP (%s:%d) was not opened", "Closed AR.Drone FTP (%s:%d)", ARDRONE_IP, ARDRONE_PORT);
+
+     
+
+
+
+
+
+
+      title ("\n\n------ ABORTION TESTS ------\n\n");
+
+      
+      title ("--- Connecting to AR.Drone FTP ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          droneFtp = ftpConnect (ARDRONE_IP, ARDRONE_PORT, ARDRONE_USER, ARDRONE_PASSWORD, &ftp_result);
+          TEST_RESULT (ftp_result, "Unable to connect to %s@%s:%d (PASS : %s)", "Connected to %s@%s:%d (PASS : %s)", ARDRONE_USER, ARDRONE_IP, ARDRONE_PORT, ARDRONE_PASSWORD);
+        }
+
+      title ("--- Sending origin file to the AR.Drone ... aborted ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME, 1, ftpCallback);
+          usleep (500000);
+          TEST_ABORTION (ftpAbort (droneFtp));
+          WAIT_COND (ftp_result);
+          TEST_RESULT ((FTP_ABORT == globalStatus) ? FTP_SUCCESS : FTP_FAIL, "Impossible to abort %s->%s transfert", "Aborted %s->%s transfert", _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+
+      title ("--- Sending origin file to the AR.Drone ... complete previous operation ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpPut (droneFtp, _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME, 1, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to send file %s->%s", "Sent file %s->%s", _1MB_ORIGIN_FILE, ARDRONE_FILE_BEFORE_RENAME);
+        }
+
+      title ("--- Getting AR.Drone FTP Listing ... aborted ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpList (droneFtp, NULL, ftpCallback);
+          usleep (1000);
+          TEST_ABORTION (ftpAbort (droneFtp));
+          WAIT_COND (ftp_result);
+          TEST_RESULT ((FTP_ABORT == globalStatus) ? FTP_SUCCESS : FTP_FAIL, "Impossible to abort %s", "Aborted %s", "listing");
+          if (NULL != listBuffer) { vp_os_free (listBuffer); listBuffer = NULL; }
+        }
+
+      title ("--- Getting AR.Drone FTP Listing ... ok ---\n");
+  
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpList (droneFtp, NULL, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to list FTP [%1s]", "Listed FTP :\n%s", listBuffer);
+          if (NULL != listBuffer) { vp_os_free (listBuffer); listBuffer = NULL; }
+        }
+
+      title ("--- Getting back origin file as result ... aborted ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpGet (droneFtp, ARDRONE_FILE_BEFORE_RENAME, LOCAL_RESULT_FILE, 1, ftpCallback);
+          usleep (500000);
+          TEST_ABORTION (ftpAbort (droneFtp));
+          WAIT_COND (ftp_result);
+          TEST_RESULT ((FTP_ABORT == globalStatus) ? FTP_SUCCESS : FTP_FAIL, "Impossible to abort %s->%s transfert", "Aborted %s->%s transfert", ARDRONE_FILE_BEFORE_RENAME, LOCAL_RESULT_FILE);
+        }
+
+      title ("--- Getting back origin file as result ... complete previous operation ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpGet (droneFtp, ARDRONE_FILE_BEFORE_RENAME, LOCAL_RESULT_FILE, 1, ftpCallback);
+          WAIT_COND (ftp_result);
+          TEST_RESULT (globalStatus, "Unable to get file %s->%s", "Got back file %s->%s", ARDRONE_FILE_BEFORE_RENAME, LOCAL_RESULT_FILE);
+        }
+
+      title ("--- Checking file ---\n");
+      vp_os_memset (buffer, 0x0, 512);
+      snprintf (buffer, 512, "diff %s %s > /dev/null", LOCAL_RESULT_FILE, _1MB_ORIGIN_FILE);
+      systemRet = system (buffer);
+      printf ("System : %s\n", buffer);
+      totalOp++;
+      if (0 != systemRet)
+        {
+          RED; printf ("[%d : KO] : Files are different !\n", __LINE__); RAZ;
+        }
+      else
+        {
+          opOk++;
+          GREEN; printf ("[%d : OK] : Files are the same\n", __LINE__); RAZ;
+        }
+
+      title ("--- Removing file on AR.Drone ---\n");
+
+      for (runOperation = 1; runOperation;)
+        {
+          ftp_result = ftpRemove (droneFtp, ARDRONE_FILE_BEFORE_RENAME);
+          TEST_RESULT (ftp_result, "Unable to delete file %s", "Deleted file %s", ARDRONE_FILE_BEFORE_RENAME);
+        }
+  
+      title ("--- Closing AR.Drone FTP ---\n");
+  
+      TEST_RESULT (ftpClose (&droneFtp), "AR.Drone FTP (%s:%d) was not opened", "Closed AR.Drone FTP (%s:%d)", ARDRONE_IP, ARDRONE_PORT);
+
+
+
+
+
+
+
+      title ("\n\n------ RESULT ------\n\n");
+
+      COMPUTE_PERCENT_OK;
+    }
+
+  sem_destroy (&synchroSem);
+  
+  exit (0);
+  return 0;
+}