Vodafone Test Suite

Dependencies:   mbed-rtos mbed HTTPClient VodafoneUSBModem

Tests/Test14.h

Committer:
ashleymills
Date:
2014-01-29
Revision:
74:e52ac9624f7f
Parent:
69:4fc3b0ad12c7

File content as of revision 74:e52ac9624f7f:

#pragma once
#include "VodafoneTestCase.h"
#include "TestHelper.h"
#include "socket.h"

extern const char *gTest14Description;

class Test14 : public VodafoneTestCase {
   public: 
      Test14(VodafoneUSBModem *m) : VodafoneTestCase(m) {}
   private:
   
      virtual void setupTest(){}
      
      virtual bool executeTest() {
         char urlBuffer[125],socketBuffer[256],strBytesToSend[32];
         bool outcome = true;
         int sockfd = NULL, socketBufferLength = 256, ret = -1;
         int bytesToSend = 128, nextBytesToSend = 128;
         unsigned char currentChar = 0;
         float timeOut = 1800; // half an hour
         
         LOG("Description: %s",gTest14Description);
         LOG("Connecting to internet");
         if(_modem->connect(APN,APN_USERNAME,APN_PASSWORD)==0) {
            LOG("Connected to internet");
         } else {
            LOG("Failed to connect to internet");
            _modem->disconnect();
            return false;
         }
         
         Timer t;
         for(int i=0; i<14; i++) {
            LOG("Doing upload for %d bytes",nextBytesToSend);
            // connect to socket and push message
            if(!connectToSocket("109.74.199.96",7777,&sockfd)) {
               LOG("Error connecting to socket");
               _modem->disconnect();
               return false;
            }
            
            // send password
            write(sockfd,"7834_0hf093",11);
                   
            ret = ::recv(sockfd,socketBuffer,socketBufferLength,0);
            socketBuffer[3] = 0x00;
            if(ret<0||strcmp(socketBuffer,"ACK")!=0) {
               LOG("Got :\"%s\"",socketBuffer);
               LOG("Error receiving ACK.");
               close(sockfd);
               _modem->disconnect();
               return false;
            } 
        
            // send file size
            sprintf(strBytesToSend,"%d",bytesToSend);
            write(sockfd,strBytesToSend,strlen(strBytesToSend));

            // get ACK
            if(read(sockfd,socketBuffer,256)<=0) {
               LOG("Timeout or error waiting for ack\r\n");
               close(sockfd);
               _modem->disconnect();
               return false;
            }

            socketBuffer[3] = 0x00;
            if(strcmp(socketBuffer,"ACK")!=0) {
               LOG("Failure to receive ACK\r\n");
               close(sockfd);
               _modem->disconnect();
               return false;
            }

            // sending file
            t.reset();
            t.start();
            int bytesSent = 0, currentBufferSize = 0;
            currentChar = 0;
            while(bytesToSend&&t.read()<timeOut) {
               if(bytesToSend<socketBufferLength) {
                  currentBufferSize = bytesToSend;
               } else {
                  currentBufferSize = socketBufferLength;
               }

               for(int i=0; i<currentBufferSize; i++) {
                  socketBuffer[i] = currentChar;
                  currentChar++;
               }

               if(write(sockfd,socketBuffer,currentBufferSize)!=currentBufferSize) {
                  LOG("Failure sending present buffer, failed at %d\r\n",bytesToSend);
                  close(sockfd);
                  _modem->disconnect();
                  return false;
               }
               bytesToSend -= currentBufferSize;
            }
            t.stop();
            
            if(t.read()>=timeOut) {
               LOG("Timeout when uploading file");
               close(sockfd);
               _modem->disconnect();
               return false;
            }

            // wait for confirm
            if(read(sockfd,socketBuffer,256)<=0) {
               LOG("Timeout or error waiting for ack\r\n");
               close(sockfd);
               _modem->disconnect();
               return false;
            }

            socketBuffer[3] = 0x00;
            if(strcmp(socketBuffer,"ACK")!=0) {
               LOG("Failure to receive ACK\r\n");
               close(sockfd);
               _modem->disconnect();
               return false;
            }
            LOG("   DONE. Sent %d bytes in %f seconds for an average of %f kb/s",
               nextBytesToSend,t.read(),((float)nextBytesToSend/1000.0)/t.read());
            close(sockfd);
         
            nextBytesToSend*=2;
            bytesToSend = nextBytesToSend;
         }
         
         _modem->disconnect();
         return true;
      }
      
      virtual void endTest() {}
      char *_ussdResponse;
};