ublox-at-cellular-interface-ext

Dependencies:   ublox-at-cellular-interface

Revision:
0:0b75e22c9231
Child:
5:9fd89567f769
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TESTS/unit_tests/ftp/main.cpp	Mon Jun 05 12:58:04 2017 +0000
@@ -0,0 +1,529 @@
+#include "mbed.h"
+#include "greentea-client/test_env.h"
+#include "unity.h"
+#include "utest.h"
+#include "UbloxATCellularInterfaceExt.h"
+#include "UDPSocket.h"
+#include "FEATURE_COMMON_PAL/nanostack-libservice/mbed-client-libservice/common_functions.h"
+#include "mbed_trace.h"
+#define TRACE_GROUP "TEST"
+
+using namespace utest::v1;
+
+// ----------------------------------------------------------------
+// COMPILE-TIME MACROS
+// ----------------------------------------------------------------
+
+// These macros can be overridden with an mbed_app.json file and
+// contents of the following form:
+//
+//{
+//    "config": {
+//      "apn": {
+//          "value": "\"my_apn\""
+//      },
+//      "ftp-server": {
+//          "value": "\"test.rebex.net\""
+//      },
+//      "ftp-username": {
+//          "value": "\"demo\""
+//      },
+//      "ftp-password": {
+//          "value": "\"password\""
+//      },
+//      "ftp-use-passive": {
+//          "value": true
+//      },
+//      "ftp-server-supports-write": {
+//          "value": false
+//      },
+//      "ftp-filename": {
+//          "value": "\"readme.txt\""
+//      },
+//      "ftp-dirname": {
+//          "value": "\"pub\""
+//      }
+//}
+
+// The credentials of the SIM in the board.
+#ifndef MBED_CONF_APP_DEFAULT_PIN
+// Note: this is the PIN for the SIM with ICCID
+// 8944501104169548380.
+# define MBED_CONF_APP_DEFAULT_PIN "5134"
+#endif
+
+// Network credentials.
+#ifndef MBED_CONF_APP_APN
+# define MBED_CONF_APP_APN         NULL
+#endif
+#ifndef MBED_CONF_APP_USERNAME
+# define MBED_CONF_APP_USERNAME    NULL
+#endif
+#ifndef MBED_CONF_APP_PASSWORD
+# define MBED_CONF_APP_PASSWORD    NULL
+#endif
+
+// FTP server name
+#ifndef MBED_CONF_APP_FTP_SERVER
+# error "Must define an FTP server name to run these tests"
+#endif
+
+// User name on the FTP server
+#ifndef MBED_CONF_APP_FTP_USERNAME
+# define MBED_CONF_APP_FTP_SERVER_USERNAME ""
+#endif
+
+// Password on the FTP server
+#ifndef MBED_CONF_APP_FTP_PASSWORD
+# define MBED_CONF_APP_FTP_SERVER_PASSWORD ""
+#endif
+
+// Whether to use SFTP or not
+#ifndef MBED_CONF_APP_FTP_SECURE
+# define MBED_CONF_APP_FTP_SECURE false
+#endif
+
+// Port to use on the remote server
+#ifndef MBED_CONF_APP_FTP_SERVER_PORT
+# if MBED_CONF_APP_FTP_SECURE
+#   define MBED_CONF_APP_FTP_SERVER_PORT 22
+# else
+#   define MBED_CONF_APP_FTP_SERVER_PORT 21
+# endif
+#endif
+
+// Whether to use passive or active mode
+// default to true as many servers/networks
+// require this
+#ifndef MBED_CONF_APP_FTP_USE_PASSIVE
+# define MBED_CONF_APP_FTP_USE_PASSIVE true
+#endif
+
+// Whether the server supports FTP write operations
+#ifndef MBED_CONF_APP_FTP_SERVER_SUPPORTS_WRITE
+# define MBED_CONF_APP_FTP_SERVER_SUPPORTS_WRITE false
+#endif
+
+#if MBED_CONF_APP_FTP_SERVER_SUPPORTS_WRITE
+// The name of the file to PUT, GET and then delete
+# ifndef MBED_CONF_APP_FTP_FILENAME
+#  define MBED_CONF_APP_FTP_FILENAME "test_file_delete_me"
+# endif
+// The name of the directory to create, CD to and then remove
+# ifndef MBED_CONF_APP_FTP_DIRNAME
+#  define MBED_CONF_APP_FTP_DIRNAME "test_dir_delete_me"
+# endif
+#else
+// The name of the file to GET
+# ifndef MBED_CONF_APP_FTP_FILENAME
+# error "Must define the name of a file you know exists on the FTP server"
+# endif
+// The name of the directory to CD to
+# ifndef MBED_CONF_APP_FTP_DIRNAME
+# error "Must define the name of a directory you know exists on the FTP server"
+# endif
+#endif
+
+// The size of file when testing PUT/GET
+#ifndef MBED_CONF_APP_FTP_FILE_SIZE
+#  define MBED_CONF_APP_FTP_FILE_SIZE 42000
+#endif
+
+// ----------------------------------------------------------------
+// PRIVATE VARIABLES
+// ----------------------------------------------------------------
+
+// Lock for debug prints
+static Mutex mtx;
+
+// An instance of the cellular interface
+static UbloxATCellularInterfaceExt *pDriver =
+       new UbloxATCellularInterfaceExt(MDMTXD, MDMRXD,
+                                       MBED_CONF_UBLOX_CELL_BAUD_RATE,
+                                       true);
+// A buffer for general use
+static char buf[MBED_CONF_APP_FTP_FILE_SIZE];
+
+// ----------------------------------------------------------------
+// PRIVATE FUNCTIONS
+// ----------------------------------------------------------------
+
+// Locks for debug prints
+static void lock()
+{
+    mtx.lock();
+}
+
+static void unlock()
+{
+    mtx.unlock();
+}
+
+
+// Write a file to the module's file system with known contents
+void createFile(const char * filename) {
+
+    for (unsigned int x = 0; x < sizeof (buf); x++) {
+        buf[x] = (char) x;
+    }
+
+    TEST_ASSERT(pDriver->writeFile(filename, buf, sizeof (buf)) == sizeof (buf));
+    tr_debug("%d bytes written to file \"%s\"", sizeof (buf), filename);
+}
+
+// Read a file back from the module's file system and check the contents
+void checkFile(const char * filename) {
+    memset(buf, 0, sizeof (buf));
+
+    int x = pDriver->readFile(filename, buf, sizeof (buf));
+    tr_debug ("File is %d bytes big", x);
+    TEST_ASSERT(x == sizeof (buf));
+
+    tr_debug("%d bytes read from file \"%s\"", sizeof (buf), filename);
+
+    for (unsigned int x = 0; x < sizeof (buf); x++) {
+        TEST_ASSERT(buf[x] == (char) x);
+    }
+}
+
+// ----------------------------------------------------------------
+// TESTS
+// ----------------------------------------------------------------
+
+// Test the setting up of parameters, connection and login to an FTP session
+void test_ftp_login() {
+    SocketAddress address;
+    char portString[10];
+
+    sprintf(portString, "%d", MBED_CONF_APP_FTP_SERVER_PORT);
+
+    TEST_ASSERT(pDriver->init(MBED_CONF_APP_DEFAULT_PIN));
+
+    // Reset parameters to default to begin with
+    TEST_ASSERT(pDriver->ftpResetPar());
+
+    // Set a timeout for FTP commands
+    TEST_ASSERT(pDriver->ftpSetTimeout(60000));
+
+    // Set up the FTP server parameters
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_SERVER_NAME,
+                                   MBED_CONF_APP_FTP_SERVER));
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_SERVER_PORT,
+                                   portString));
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_USER_NAME,
+                                   MBED_CONF_APP_FTP_USERNAME));
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_PASSWORD,
+                                   MBED_CONF_APP_FTP_PASSWORD));
+#ifdef MBED_CONF_APP_FTP_ACCOUNT
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_ACCOUNT,
+                                   MBED_CONF_APP_FTP_ACCOUNT));
+#endif
+#if MBED_CONF_APP_FTP_SECURE
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_SECURE, "1"));
+#endif
+#if MBED_CONF_APP_FTP_USE_PASSIVE
+    TEST_ASSERT(pDriver->ftpSetPar(UbloxATCellularInterfaceExt::FTP_MODE, "1"));
+#endif
+
+    // Now connect to the network
+    TEST_ASSERT(pDriver->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
+                                 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
+
+    // Get the server IP address, purely to make sure it's there
+    TEST_ASSERT(pDriver->gethostbyname(MBED_CONF_APP_FTP_SERVER, &address) == 0);
+    tr_debug ("Using FTP \"%s\", which is at %s", MBED_CONF_APP_FTP_SERVER,
+              address.get_ip_address());
+
+    // Log into the FTP server
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LOGIN) == NULL);
+}
+
+// Test FTP directory listing
+void test_ftp_dir() {
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The file we will GET should appear in the directory listing
+    TEST_ASSERT(strstr(buf, MBED_CONF_APP_FTP_FILENAME) > NULL);
+    // As should the directory name we will change to
+    TEST_ASSERT(strstr(buf, MBED_CONF_APP_FTP_DIRNAME) > NULL);
+}
+
+// Test FTP file information
+void test_ftp_fileinfo() {
+    // Get the info
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_FILE_INFO,
+                                    MBED_CONF_APP_FTP_FILENAME, NULL, 0,
+                                    buf, sizeof (buf)) == NULL);
+    tr_debug("File info:\n%s", buf);
+
+    // The file info string should at least include the file name
+    TEST_ASSERT(strstr(buf, MBED_CONF_APP_FTP_FILENAME) > NULL);
+}
+
+#if MBED_CONF_APP_FTP_SERVER_SUPPORTS_WRITE
+
+// In case a previous test failed half way, do some cleaning up first
+// Note: don't check return values as these operations will fail
+// if there's nothing to clean up
+void test_ftp_write_cleanup() {
+    pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_DELETE_FILE,
+                        MBED_CONF_APP_FTP_FILENAME);
+    pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_DELETE_FILE,
+                        MBED_CONF_APP_FTP_FILENAME "_2");
+    pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_RMDIR,
+                        MBED_CONF_APP_FTP_DIRNAME);
+    pDriver->delFile(MBED_CONF_APP_FTP_FILENAME);
+    pDriver->delFile(MBED_CONF_APP_FTP_FILENAME "_1");
+}
+
+// Test FTP put and then get
+void test_ftp_put_get() {
+    // Create the file
+    createFile(MBED_CONF_APP_FTP_FILENAME);
+
+    // Put the file
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_PUT_FILE,
+                                    MBED_CONF_APP_FTP_FILENAME) == NULL);
+
+    // Get the file
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_GET_FILE,
+                                    MBED_CONF_APP_FTP_FILENAME,
+                                    MBED_CONF_APP_FTP_FILENAME "_1") == NULL);
+
+    // Check that it is the same as we sent
+    checkFile(MBED_CONF_APP_FTP_FILENAME "_1");
+}
+
+// Test FTP rename file
+void test_ftp_rename() {
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The file we are renaming to should not appear
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_FILENAME "_2") == NULL);
+
+    // Rename the file
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_RENAME_FILE,
+                                    MBED_CONF_APP_FTP_FILENAME,
+                                    MBED_CONF_APP_FTP_FILENAME "_2") == NULL);
+
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The new file should now exist
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_FILENAME "_2") > NULL);
+
+}
+
+// Test FTP delete file
+void test_ftp_delete() {
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The file we are to delete should appear in the list
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_FILENAME "_2") > NULL);
+
+    // Delete the file
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_DELETE_FILE,
+                                    MBED_CONF_APP_FTP_FILENAME "_2") == NULL);
+
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The file we deleted should no longer appear in the list
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_FILENAME "_2") == NULL);
+}
+
+// Test FTP MKDIR
+void test_ftp_mkdir() {
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The directory we are to create should not appear in the list
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_DIRNAME) == NULL);
+
+    // Create the directory
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_MKDIR,
+                                    MBED_CONF_APP_FTP_DIRNAME) == NULL);
+
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The directory we created should now appear in the list
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_DIRNAME) > NULL);
+}
+
+// Test FTP RMDIR
+void test_ftp_rmdir() {
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The directory we are to remove should appear in the list
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_DIRNAME) > NULL);
+
+    // Remove the directory
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_RMDIR,
+                                    MBED_CONF_APP_FTP_DIRNAME) == NULL);
+
+    // Get a directory listing
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The directory we removed should no longer appear in the list
+    TEST_ASSERT(strstr(buf,  MBED_CONF_APP_FTP_DIRNAME) == NULL);
+}
+
+#endif // MBED_CONF_APP_FTP_SERVER_SUPPORTS_WRITE
+
+// Test FTP get
+void test_ftp_get() {
+    // Make sure that the 'get' filename we're going to use
+    // isn't already here (but don't assert on this one
+    // as, if the file isn't there, we will get an error)
+    pDriver->delFile(MBED_CONF_APP_FTP_FILENAME);
+
+    // Get the file
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_GET_FILE,
+                                    MBED_CONF_APP_FTP_FILENAME) == NULL);
+
+    // Check that it has arrived
+    TEST_ASSERT(pDriver->fileSize(MBED_CONF_APP_FTP_FILENAME) > 0);
+}
+
+// Test FTP change directory
+void test_ftp_cd() {
+    // Get a directory listing
+    *buf = 0;
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+
+    tr_debug("Listing:\n%s", buf);
+
+    // The listing should include the directory name we are going to move to
+    TEST_ASSERT(strstr(buf, MBED_CONF_APP_FTP_DIRNAME) > NULL);
+
+    // Change directories
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_CD,
+                                    MBED_CONF_APP_FTP_DIRNAME) == NULL);
+    // Get a directory listing
+    *buf = 0;
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The listing should no longer include the directory name we have moved
+    TEST_ASSERT(strstr(buf, MBED_CONF_APP_FTP_DIRNAME) == NULL);
+
+    // Go back to where we were
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_CD, "..")
+                == NULL);
+
+    // Get a directory listing
+    *buf = 0;
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LS,
+                                    NULL, NULL, 0, buf, sizeof (buf)) == NULL);
+    tr_debug("Listing:\n%s", buf);
+
+    // The listing should include the directory name we went to once more
+    TEST_ASSERT(strstr(buf, MBED_CONF_APP_FTP_DIRNAME) > NULL);
+}
+
+#ifdef MBED_CONF_APP_FTP_FOTA_FILENAME
+// Test FTP FOTA
+// TODO: test not tested as I don't have a module that supports the FTP FOTA operation
+void test_ftp_fota() {
+    *buf = 0;
+    // Do FOTA on a file
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_FOTA_FILE,
+                                    MBED_CONF_APP_FTP_FOTA_FILENAME, NULL,
+                                    0, buf, sizeof (buf)) == NULL);
+    tr_debug("MD5 sum: %s\n", buf);
+
+    // Check that the 128 bit MD5 sum is now there
+    TEST_ASSERT(strlen (buf) == 32);
+}
+#endif
+
+// Test logout and disconnect from an FTP session
+void test_ftp_logout() {
+    // Log out from the FTP server
+    TEST_ASSERT(pDriver->ftpCommand(UbloxATCellularInterfaceExt::FTP_LOGOUT) == NULL);
+
+    TEST_ASSERT(pDriver->disconnect() == 0);
+
+    // Wait for printfs to leave the building or the test result string gets messed up
+    wait_ms(500);
+}
+
+// ----------------------------------------------------------------
+// TEST ENVIRONMENT
+// ----------------------------------------------------------------
+
+// Setup the test environment
+utest::v1::status_t test_setup(const size_t number_of_cases) {
+    // Setup Greentea with a timeout
+    GREENTEA_SETUP(540, "default_auto");
+    return verbose_test_setup_handler(number_of_cases);
+}
+
+// Test cases
+Case cases[] = {
+    Case("FTP log in", test_ftp_login),
+#if MBED_CONF_APP_FTP_SERVER_SUPPORTS_WRITE
+    Case("Clean-up", test_ftp_write_cleanup),
+    Case("FTP put and get", test_ftp_put_get),
+    Case("FTP file info", test_ftp_fileinfo),
+    Case("FTP rename", test_ftp_rename),
+    Case("FTP make directory", test_ftp_mkdir),
+    Case("FTP directory list", test_ftp_dir),
+    Case("FTP delete", test_ftp_delete),
+    Case("FTP change directory", test_ftp_cd),
+    Case("FTP delete directory", test_ftp_rmdir),
+#else
+    Case("FTP directory list", test_ftp_dir),
+    Case("FTP file info", test_ftp_fileinfo),
+    Case("FTP get", test_ftp_get),
+    Case("FTP change directory", test_ftp_cd),
+#endif
+#ifdef MBED_CONF_APP_FTP_FOTA_FILENAME
+    Case("FTP FOTA", test_ftp_fota),
+#endif
+    Case("FTP log out", test_ftp_logout)
+};
+
+Specification specification(test_setup, cases);
+
+// ----------------------------------------------------------------
+// MAIN
+// ----------------------------------------------------------------
+
+int main() {
+    mbed_trace_init();
+
+    mbed_trace_mutex_wait_function_set(lock);
+    mbed_trace_mutex_release_function_set(unlock);
+    
+    // Run tests
+    return !Harness::run(specification);
+}
+
+// End Of File
+