Code Monkey home page Code Monkey logo

speed-test-lib's Introduction

JSpeedTest

Build Status Download Maven Central Coverage Status Codacy Badge Javadoc License

Speed Test client library for Java/Android with HTTP & FTP support

  • speed test download
  • speed test upload
  • download / upload progress monitoring
  • configurable hostname / port / uri (username & password for FTP)
  • configurable socket timeout and chunk size
  • configure upload file storage

Check a non-exhaustive list of compatible speed test server.

Include in your project

  • with Gradle, from jcenter or mavenCentral :
compile 'fr.bmartel:jspeedtest:1.32.1'

Usage

  • setup a speed test listener to monitor progress, completion and error catch :
SpeedTestSocket speedTestSocket = new SpeedTestSocket();

// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

    @Override
    public void onCompletion(SpeedTestReport report) {
        // called when download/upload is complete
        System.out.println("[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
        System.out.println("[COMPLETED] rate in bit/s   : " + report.getTransferRateBit());
    }

    @Override
    public void onError(SpeedTestError speedTestError, String errorMessage) {
         // called when a download/upload error occur
    }

    @Override
    public void onProgress(float percent, SpeedTestReport report) {
        // called to notify download/upload progress
        System.out.println("[PROGRESS] progress : " + percent + "%");
        System.out.println("[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
        System.out.println("[PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
    }
});

Download

  • HTTP download 1Mo from http://ipv4.ikoula.testdebit.info
speedTestSocket.startDownload("http://ipv4.ikoula.testdebit.info/1M.iso");
  • FTP download 1Mo from speedtest.tele2.net
speedTestSocket.startDownload("ftp://speedtest.tele2.net/1MB.zip");
  • FTP download 1Mo from ftp.otenet.gr with credentials (username/password), default is anonymous/no password
speedTestSocket.startDownload("ftp://speedtest:[email protected]/test1Mb.db");

Upload

  • HTTP upload 1Mo to http://ipv4.ikoula.testdebit.info
speedTestSocket.startUpload("http://ipv4.ikoula.testdebit.info/", 1000000);
  • FTP upload a 1Mo file to speedtest.tele2.net
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startUpload("ftp://speedtest.tele2.net/upload/" + fileName, 1000000);

Fixed duration download

Download during a fixed duration. Download will be stopped when the max duration is reached.

  • HTTP download for 10s max, a 100 Mo file from http://ipv4.ikoula.testdebit.info
speedTestSocket.startFixedDownload("http://ipv4.ikoula.testdebit.info/100M.iso", 10000);
  • FTP download for 10s max, a 100 Mo file from speedtest.tele2.net
speedTestSocket.startFixedDownload("ftp://speedtest.tele2.net/100MB.zip");

Fixed duration Upload

Upload during a fixed duration. Upload will be stopped when the max duration is reached

  • HTTP upload for 10s max, a 10Mo file to http://ipv4.ikoula.testdebit.info
speedTestSocket.startFixedUpload("http://ipv4.ikoula.testdebit.info/", 10000000, 10000);
  • FTP upload for 10s max, a 10Mo file to speedtest.tele2.net
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startFixedUpload("ftp://speedtest.tele2.net/upload/" + fileName, 10000000, 10000);

Define report interval

You can define your own report interval (interval between each onDownloadProgress & onUploadProgress) in milliseconds.

  • HTTP download with download reports each 1.5 seconds
speedTestSocket.startDownload("http://ipv4.ikoula.testdebit.info/1M.iso", 1500);
  • FTP download with download reports each 1.5 seconds
speedTestSocket.startDownload("ftp://speedtest.tele2.net/1MB.zip", 1500);
  • HTTP upload with upload reports each 1.5 seconds
speedTestSocket.startUpload("http://ipv4.ikoula.testdebit.info/", 10000000, 1500);
  • FTP upload with upload reports each 1.5 seconds
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startUpload("ftp://speedtest.tele2.net/upload/" + fileName, 10000000, 1500);

Use proxy server

speedTestSocket.setProxyServer("http://216.56.48.118:9000");

default proxy server port is 8080

Chain download/upload requests

You can chain multiple download/upload requests during a fixed duration. This way, there will be as much download/upload request until the end of the period

  • download repeat

The following will download regularly for 20 seconds a file of 1Mo with download report each 2 seconds. Download reports will appear in onReport callback of IRepeatListener instead of onDownloadProgress :

speedTestSocket.startDownloadRepeat("http://ipv4.ikoula.testdebit.info/1M.iso",
    20000, 2000, new
            IRepeatListener() {
                @Override
                public void onCompletion(final SpeedTestReport report) {
                    // called when repeat task is finished
                }

                @Override
                public void onReport(final SpeedTestReport report) {
                    // called when a download report is dispatched
                }
            });
  • upload repeat

The following will upload regularly for 20 seconds a file of 1Mo with download report each 2 seconds. Upload reports will appear in onReport callback of IRepeatListener instead of onUploadProgress :

speedTestSocket.startUploadRepeat("http://ipv4.ikoula.testdebit.info/", 1000000
    20000, 2000, new
            IRepeatListener() {
                @Override
                public void onCompletion(final SpeedTestReport report) {
                    // called when repeat task is finished
                }

                @Override
                public void onReport(final SpeedTestReport report) {
                    // called when an upload report is dispatched
                }
            });

Get live download & upload

  • retrieve current download report :
SpeedTestReport getLiveReport()
  • retrieve current upload report :
SpeedTestReport getLiveReport()

Set setup time

Setup time is the amount of time in milliseconds from which speed test will be calculated :

The following will set the setup time to 5 seconds which mean, the speed rate will begin to be computed 5 seconds after the speed test start :

  • download
speedTestSocket.setDownloadSetupTime(5000);
  • upload
speedTestSocket.setUploadSetupTime(5000);

Set upload file storage type

By default, data to be uploaded is stored in RAM, for large data it is recommended to used file storage :

speedTestSocket.setUploadStorageType(UploadStorageType.FILE_STORAGE);

It will create a temporary file containing random data. File will be deleted automatically at the end of the upload.

Set size of each packet sent to upload server

speedTestSocket.setUploadChunkSize(65535);

Set socket timeout value

You can set download/upload socket timeout in milliseconds :

speedTestSocket.setSocketTimeout(5000);

Set transfer rate precision

These settings are used to alter transfer rate float rounding / scale :

  • set RoundingMode :
speedTestSocket.setDefaultRoundingMode(RoundingMode.HALF_EVEN);

Default RoundingMode used for transfer rate calculation is HALF_EVEN. It can be override with :

  • set Scale :
speedTestSocket.setDefaultScale(4);

Default scale used for transfer rate calculation is 4

FTP mode

Set passive/active mode with :

speedTestSocket.setFtpMode(FtpMode.ACTIVE);

default is FtpMode.PASSIVE

Android Integration

  • add Internet permission to manifest :
<uses-permission android:name="android.permission.INTERNET" />
  • use an AsyncTask to run your speed test :
public class SpeedTestTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {

        SpeedTestSocket speedTestSocket = new SpeedTestSocket();

        // add a listener to wait for speedtest completion and progress
        speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

            @Override
            public void onCompletion(SpeedTestReport report) {
                // called when download/upload is finished
                Log.v("speedtest", "[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
                Log.v("speedtest", "[COMPLETED] rate in bit/s   : " + report.getTransferRateBit());
            }

            @Override
            public void onError(SpeedTestError speedTestError, String errorMessage) {
                // called when a download/upload error occur
            }

            @Override
            public void onProgress(float percent, SpeedTestReport report) {
                // called to notify download/upload progress
                Log.v("speedtest", "[PROGRESS] progress : " + percent + "%");
                Log.v("speedtest", "[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
                Log.v("speedtest", "[PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
            }
        });

        speedTestSocket.startDownload("http://ipv4.ikoula.testdebit.info/1M.iso");

        return null;
    }
}

Execute it with : new SpeedTestTask().execute();

Features examples

All following examples use speed test server http://ipv4.ikoula.testdebit.info for HTTP and speedtest.tele2.net for FTP

  • HTTP download (1Mo)
./gradlew downloadFile
  • HTTP upload (1Mo)
./gradlew uploadFile
  • FTP download (1Mo)
./gradlew downloadFTP
  • FTP upload (1Mo)
./gradlew uploadFTP
  • HTTP download (1Mo) through proxy server 216.56.48.118:9000
./gradlew downloadFileProxy
  • download during a fixed duration (size: 100Mo, duration: 15s, report interval: 1s)
./gradlew fixedDownload
  • upload during a fixed duration (size: 100Mo, duration: 15s, report interval: 1s)
./gradlew fixedUpload
  • download repeatedly a file during a fixed duration (size:10Mo, duration 11s, report interval: 1s)
./gradlew repeatDownload
  • upload repeatedly a file during a fixed duration (size:1Mo, duration 11s, report interval: 1s)
./gradlew repeatUpload
  • successive 2 x (download + upload) repeatedly a file during a fixed duration (1 download size:1Mo, duration 3s, report interval: 1s following by 1 upload size:1Mo, duration 3s, report interval: 1s)
./gradlew repeatChain

Speed Test issues

It's important to choose an adequate speed test server depending on latency/jitter. This library is not responsible for the speed test server choice.

Note that this library :

  • doesn't adjust the chunk size depending on the connection speed either
  • doesn't provide pre-estimation of the connection speed based on small chunk sent to/from server
  • doesn't detect anomaly either (for instance taking away X% slowest chunk and X% fastest chunk downloaded)

This library does provide an average of transfer rate for all individual chunks read/written for download/upload.

The 2 following links describe the process of speedtest.net :

Compatibility

JRE 1.7 compliant

Build & test

  • build without test :
./gradlew clean build -x test
  • build with test :
./gradlew clean build
  • run specific test
./gradlew test --tests "fr.bmartel.speedtest.test.SpeedTestFunctionalTest"

External libraries

License

The MIT License (MIT) Copyright (c) 2016-2018 Bertrand Martel

speed-test-lib's People

Contributors

bertrandmartel avatar tiwiz avatar trisgerra avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

speed-test-lib's Issues

Continuous sampling of UL and DL rate

Very interesting library. I want to develop a profiler Android app that every say 4 seconds gets UL and DL rates and saves as a .csv file (plus I will add some extra info such as time stamp, and others). I quickly noticed I can set time interval for DL and UL, right? Does it given me enough flexibility to do my tasks? How easy is it to do that? Any working examples?

How do I start startFixedUpload after the startFixedDownload method is finished?

How do I start startFixedUpload after the startFixedDownload method is finished?
The way I'm doing the return is:
08-24 12:59:39.026 3908-4208/com.br.dominio.speedtestmdbrasil E/ERRORRRR: mSocket error
08-24 12:59:39.026 3908-4208/com.br.dominio.speedtestmdbrasil E/ERRORRRR: SOCKET_ERROR

class SpeedTestTask extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {

        final SpeedTestSocket speedTestSocket = new SpeedTestSocket();

        speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

            @Override
            public void onCompletion(SpeedTestReport report) {

                downloadRate = report.getTransferRateBit().divide(MEGA_VALUE_PER_SECONDS).doubleValue();
                downloadTime = ((double) report.getReportTime() - (double) report.getStartTime()) / 1000;
                totalTime = uploadTime + downloadTime;
                publishProgress(String.format("%.2f Mbits/s", downloadRate), downloadTime + " seg",
                        String.format("%.2f seg", totalTime), "100");
                
                //Upload
                speedTestSocket.startFixedUpload("http://www.mdbrasil.com.br/",29099000,15000,500);
                isFinished = true;
                uploadRate = report.getTransferRateBit().divide(MEGA_VALUE_PER_SECONDS).doubleValue();
                uploadTime = ((double) report.getReportTime() - (double) report.getStartTime()) / 1000;
                totalTime = uploadTime + downloadTime;
                publishProgress(String.format("%.2f Mbits/s", uploadRate), uploadTime + " seg",
                        String.format("%.2f seg", totalTime), 100 + "");

            }

            @Override
            public void onProgress(float percent, SpeedTestReport report) {
                if(report.getSpeedTestMode().toString() == "DOWNLOAD") {
                    isDownload = true;
                    isUpload = false;
                    downloadRate = report.getTransferRateBit().divide(MEGA_VALUE_PER_SECONDS).doubleValue();
                    downloadTime = ((double) report.getReportTime() - (double) report.getStartTime()) / 1000;
                    totalTime = uploadTime + downloadTime;
                    publishProgress(String.format("%.2f Mbits/s", downloadRate), downloadTime + " seg",
                            String.format("%.2f seg", totalTime), (int) percent + "");
                    Log.i("Porcentagem", ""+percent);
                } else if (report.getSpeedTestMode().toString() == "UPLOAD") {

                    isDownload = false;
                    isUpload = true;
                    uploadRate = report.getTransferRateBit().divide(MEGA_VALUE_PER_SECONDS).doubleValue();
                    Log.i("UPLOAD", report.getTransferRateBit().toString());
                    uploadTime = ((double) report.getReportTime() - (double) report.getStartTime()) / 1000;
                    totalTime = uploadTime + downloadTime;
                    publishProgress(String.format("%.2f Mbits/s", uploadRate), uploadTime + " seg",
                            String.format("%.2f seg", totalTime), (int) percent + "");
                }
            }

            @Override
            public void onError(SpeedTestError speedTestError, String errorMessage) {
                Log.e("ERRORRRR", errorMessage);
                Log.e("ERRORRRR", speedTestError.toString());
            }
        });

        speedTestSocket.startFixedDownload("http://mdbrasil.com.br/500m.dat", 15000,500);
        return null;
    }



    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);

        if (isDownload) {
            labelDownloadRate.setText(values[0]);
            labelDownloadTime.setText(values[1]);
            labelTotalTime.setText(values[2]);
            progressBarSpeedTest.setProgress(Integer.parseInt(values[3]));
        } else if (isUpload) {
            labelUploadRate.setText(values[0]);
            labelUploadTime.setText(values[1]);
            labelTotalTime.setText(values[2]);
            progressBarSpeedTest.setProgress(Integer.parseInt(values[3]));
        }

        if (isFinished) {
            buttonStart.setText("Reiniciar teste");
            buttonStart.setEnabled(true);
        }
    }
}

Refactor fields to reduce methods number

target fields to refactor :

  • hostname
  • port
  • uri
  • ftp/http

Goal would be to have the same method for httpd & ftp like

  • ftp
startUpload("ftp://speedtest.tele2.net/upload/upload123.txt",1000000)
  • http
startUpload("http://2.testdebit.info/",1000000)

Connection error (Permisssion denied)

Hi,

I'm testing your code to use in my own Android application and I have a problem. Always cant connect with speedtest servers, onDownloadError get the same error: CONNECTION_ERROR, socket failed: EACCES (Permission denied).

My code is very simple:

`

/**
 * socket timeout used in ms.
 */
private final static int SOCKET_TIMEOUT = 5000;

/**
 * speed examples server host name.
 */
private final static String SPEED_TEST_SERVER_HOST = "2.testdebit.info";

/**
 * spedd examples server uri.
 */
private final static String SPEED_TEST_SERVER_URI_DL = "/fichiers/1Mo.dat";

/**
 * speed examples server port.
 */
private final static int SPEED_TEST_SERVER_PORT = 80;

private SpeedTestSocket speedTestSocket = null;
private Button btnStartTest;
private TextView txtDownValue;
private TextView txtUpValue;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    speedTestSocket = new SpeedTestSocket();
    //set timeout for download
    speedTestSocket.setSocketTimeout(SOCKET_TIMEOUT);

    btnStartTest = (Button) findViewById(R.id.buttonStartTest);
    txtDownValue = (TextView) findViewById(R.id.downValue);
    txtUpValue = (TextView) findViewById(R.id.upValue);

    btnStartTest.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
             speedTestSocket.startDownload(SPEED_TEST_SERVER_HOST, SPEED_TEST_SERVER_PORT, SPEED_TEST_SERVER_URI_DL);
         }
    });

    speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {
        @Override
        public void onDownloadFinished(SpeedTestReport report) {
            // called when download is finished
            Log.i("MainActivity SpeedTest", "[DL FINISHED] rate in octet/s : " + report.getTransferRateOctet());
            Log.i("MainActivity SpeedTest", "[DL FINISHED] rate in bit/s   : " + report.getTransferRateBit());
            txtDownValue.setText(report.getTransferRateBit() + " bps");
            //speedTestSocket.startUpload("2.testdebit.info", "/", 1000000);
        }

        @Override
        public void onDownloadError(SpeedTestError speedTestError, String errorMessage) {
            // called when a download error occur
            Log.i("MainActivity SpeedTest", "Error: " + speedTestError.toString() + "\n" + errorMessage.toString());
        }

        @Override
        public void onUploadFinished(SpeedTestReport report) {
            // called when an upload is finished
            Log.i("MainActivity SpeedTest", "[UL FINISHED] rate in octet/s : " + report.getTransferRateOctet());
            Log.i("MainActivity SpeedTest", "[UL FINISHED] rate in bit/s   : " + report.getTransferRateBit());
            txtUpValue.setText(report.getTransferRateBit() + " bps");
        }

        @Override
        public void onUploadError(SpeedTestError speedTestError, String errorMessage) {
            // called when an upload error occur
        }

        @Override
        public void onDownloadProgress(float percent, SpeedTestReport report) {
            // called to notify download progress
            Log.i("MainActivity SpeedTest", "[DL PROGRESS] progress : " + percent + "%");
            Log.i("MainActivity SpeedTest", "[DL PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
            Log.i("MainActivity SpeedTest", "[DL PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
        }

        @Override
        public void onUploadProgress(float percent, SpeedTestReport report) {
            // called to notify upload progress
            Log.i("MainActivity SpeedTest", "[UL PROGRESS] progress : " + percent + "%");
            Log.i("MainActivity SpeedTest", "[UL PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
            Log.i("MainActivity SpeedTest", "[UL PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
        }

        @Override
        public void onInterruption() {
            // triggered when forceStopTask is called
        }
    });
}

`

Am I forgetting anything in my code?
thanks!!

forceStopTask() not work

Hello again!
When i'm using forceStopTask for stop all task ... task keeps executing.
This bug work in methods

startUploadRepeat
startDownloadRepeat

Reports stopping but percent progress keep increment in IRepeatListener (onReport)!

Speed test over time mode

[This can enhancement]

Was trying to figure how you are doing calculations in your SpeedTestReport class.
So, if you put eg Report interval to 200ms, and you are getting eg bytes per second on which time period is calculated that throughput? Per 200ms and than getting average for last one second or?
Maybe link to lib code will help me more (was trying to find this in SpeedTestTask.class).

Also, in a case that we are interested in current bytes received/transmit on the nw interface rather than calculated speed, would it be possible to expose that info somehow from Socket or whatever? Like, we set report interval to 100ms and receiving number of bytes transferred every 100ms in your onProgress method?

Sorry if I'm being not so clear...

Best,
G

Upload timeout Android

Hi ! First of all, your library looks great and very easy to use, but I have a problem to use it in my Android app.
When I'm using it without specific network config in my Android emulator it works perfectly.
But when I set my emulator's network speed to something else than "Full" (for example: UMTS, EDGE, etc.) I always get a SOCKET_TIMEOUT.

I have set the timeout to 20 seconds and I'm trying to upload 256kB

Here's my class :

public class Network extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {

        SpeedTestSocket speedTestSocket = new SpeedTestSocket();
        speedTestSocket.setSocketTimeout(20000);
        speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

            @Override
            public void onDownloadPacketsReceived(long packetSize, float transferRateBps, float transferRateOps) {
                Log.i("speed-test-app","download transfer rate  : " + transferRateOps + "Bps");
            }

            @Override
            public void onDownloadError(SpeedTestError errorCode, String message) {
                Log.i("speed-test-app","Download error " + errorCode + " occured with message : " + message);
            }

            @Override
            public void onUploadPacketsReceived(long packetSize, float transferRateBps, float transferRateOps) {
                Log.i("speed-test-app","upload transfer rate  : " + transferRateOps / 1000 + "kbps");
            }

            @Override
            public void onUploadError(SpeedTestError errorCode, String message) {
                Log.i("speed-test-app","Upload error " + errorCode + " occured with message : " + message);
            }

            @Override
            public void onDownloadProgress(float percent,SpeedTestReport downloadReport) {
            }

            @Override
            public void onUploadProgress(float percent,SpeedTestReport uploadReport) {
                Log.i("speed-test-app","Uploading " + percent + "%");
            }

        });

        speedTestSocket.startUpload("2.testdebit.info",
                80, "/", 256000); //will block until upload is finished

        return null;
    }
}

Here's my log :

06-01 15:17:32.253 2281-2419/com.myapp.app I/speed-test-app: Uploading 0.0%
06-01 15:17:32.254 2281-2419/com.myappapp I/speed-test-app: Uploading 25.59961%
06-01 15:17:32.256 2281-2419/com.myapp.app I/speed-test-app: Uploading 51.19922%
06-01 15:17:52.310 2281-2419/com.myapp.app I/speed-test-app: Upload error SOCKET_TIMEOUT occured with message : Error occurred while writing to socket
06-01 15:35:05.693 2281-2417/com.myapp.app I/speed-test-app: Uploading 0.0%
06-01 15:35:05.709 2281-2417/com.myapp.app I/speed-test-app: Uploading 25.59961%
06-01 15:35:05.712 2281-2417/com.myapp.app I/speed-test-app: Uploading 51.19922%
06-01 15:35:25.766 2281-2417/com.myapp.app I/speed-test-app: Upload error SOCKET_TIMEOUT occured with message : Error occurred while writing to socket
06-01 15:35:26.871 2281-2419/com.myapp.app I/speed-test-app: Uploading 0.0%
06-01 15:35:26.874 2281-2419/com.myapp.app I/speed-test-app: Uploading 25.59961%
06-01 15:35:26.875 2281-2419/com.myapp.app I/speed-test-app: Uploading 51.19922%
06-01 15:35:46.927 2281-2419/com.myapp.app I/speed-test-app: Upload error SOCKET_TIMEOUT occured with message : Error occurred while writing to socket

And here's my emualator config
capture

And here's my log when uploading with a full network:

06-01 15:49:47.131 2305-2430/com.myapp.app I/speed-test-app: Uploading 0.0%
06-01 15:49:47.134 2305-2430/com.myapp.app I/speed-test-app: Uploading 25.59961%
06-01 15:49:47.137 2305-2430/com.myapp.app I/speed-test-app: Uploading 51.19922%
06-01 15:49:48.192 2305-2430/com.myapp.app I/speed-test-app: Uploading 100.0%
06-01 15:49:59.477 2305-2618/com.myapp.app I/speed-test-app: upload transfer rate  : 20.680185kbps
06-01 15:50:02.153 2305-2432/com.myapp.app I/speed-test-app: Uploading 0.0%
06-01 15:50:02.156 2305-2432/com.myapp.app I/speed-test-app: Uploading 25.59961%
06-01 15:50:02.159 2305-2432/com.myapp.app I/speed-test-app: Uploading 51.19922%
06-01 15:50:02.601 2305-2432/com.myapp.app I/speed-test-app: Uploading 100.0%
06-01 15:50:14.081 2305-2996/com.myapp.app I/speed-test-app: upload transfer rate  : 21.427975kbps
06-01 15:50:16.702 2305-2430/com.myapp.app I/speed-test-app: Uploading 0.0%
06-01 15:50:16.705 2305-2430/com.myapp.app I/speed-test-app: Uploading 25.59961%
06-01 15:50:16.707 2305-2430/com.myapp.app I/speed-test-app: Uploading 51.19922%
06-01 15:50:17.563 2305-2430/com.myapp.app I/speed-test-app: Uploading 100.0%
06-01 15:50:29.349 2305-3210/com.myapp.app I/speed-test-app: upload transfer rate  : 20.18609kbps

As you can see, everything works perfectly without a network limitation :)

INVALID_HTTP_RESPONSE on onUploadCompleted

Upon UploadCompleted, with latest version 1.21 (the only thing changed was the version, from 1.16 to 1.21) the onUploadError gets called with the following data instead on onUploadCompleted

screen shot 2016-10-10 at 14 02 26

The upload, though, looks good.

We are trying to upload to the following location: 52.18.71.122/tools/test_upload.dat (with version 1.16 it was working as intended)

Speed Test Seems to stop after n iterations

Hi,

Not sure whether this is a code bug, or my implementation is incorrect, but I've written a Runnable() speedTestRun that utilises your download and upload test methods in the library. They are scheduled as so:

scheduledThreadPool.scheduleAtFixedRate(speedTestRun, 0, 60); //60 minutes

It then calls an upload and download test as follows (same process for both):

speedTestSocket.startDownload(speedTestHost, speedTestPort, downloadTestURI, LOG_INTERVAL);

        long startTime = Instant.now().toEpochMilli();
        float progress = 0f;
        while ((progress < 100f) && (startTime + speedTestTimeout >= Instant.now().toEpochMilli())) {
            progress = speedTestSocket.getLiveDownloadReport().getProgressPercent();
        }

        speedTestSocket.forceStopTask(); 
        speedTestSocket.closeSocket(); //called in forceStopTask()

The purpose of the epochMillis timer is in the event that the speed test freezes, say at 90%, I have a timeout that still returns the speed test value, after my timeout.

This runs fine for a couple of hours maybe, but then something is blocking the scheduledThreadPool from running it again - maybe your library or my implementation is leaving a socket/resource open which is blocking?

I understand this is a free library (thank you so much!) and I'm not expecting you to provide support, but I'd feel guilty not reporting this if it is a genuine issue. Furthermore, my issue may help others in the future, therefore a little guidance would be deeply appreciated.

Thank you,
Joe

Crash when uploading(set file size)

For example. When i'm trying upload 100MB file app catch OOM.

FATAL EXCEPTION: pool-7-thread-1
java.lang.OutOfMemoryError
at fr.bmartel.speedtest.utils.RandomGen.generateRandomArray(RandomGen.java:59)
at fr.bmartel.speedtest.SpeedTestTask$7.run(SpeedTestTask.java:990)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)

Possible concurrency issue when starting upload

Hello,

I noticed something a bit strange: when starting the upload, often I get very wrong values (such as 200 Mbps in lines where the average is 1). It usually takes 3 to 4 "onUpdateProgress" call to stabilise it.

Here's an extract of the measurement I get:
D/SpeedTestPresenter: Current speed of 0,00 Mbps. D/SpeedTestPresenter: Current speed of 50,00 Mbps. D/SpeedTestPresenter: Current speed of 62,50 Mbps. D/SpeedTestPresenter: Current speed of 76,92 Mbps. D/SpeedTestPresenter: Current speed of 2,53 Mbps. D/SpeedTestPresenter: Current speed of 1,39 Mbps. D/SpeedTestPresenter: Current speed of 1,07 Mbps. D/SpeedTestPresenter: Current speed of 0,92 Mbps. D/SpeedTestPresenter: Current speed of 0,83 Mbps. D/SpeedTestPresenter: Current speed of 0,77 Mbps. D/SpeedTestPresenter: Current speed of 0,72 Mbps. D/SpeedTestPresenter: Current speed of 0,67 Mbps. D/SpeedTestPresenter: Current speed of 0,65 Mbps. D/SpeedTestPresenter: Current speed of 0,63 Mbps. D/SpeedTestPresenter: Upload: MAX 76,92 Mbps - AVG 14,26 Mbps

java.lang.OutOfMemoryError in generateRandomArray()

Exception in thread "pool-12981-thread-1" java.lang.OutOfMemoryError: Java heap space
at fr.bmartel.speedtest.utils.RandomGen.generateRandomArray(RandomGen.java:59)
at fr.bmartel.speedtest.SpeedTestTask$1.run(SpeedTestTask.java:253)
at fr.bmartel.speedtest.SpeedTestTask$3.run(SpeedTestTask.java:425)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Running on a Raspberry Pi 2

OOM exception using startFixedUpload

I face OOM exception using startFixedUpload with these parameters. I uses lots of memory. About 100Mb on HTC One api 5.0.2

public static final String SPEED_TEST_SERVER_HOST = "2.testdebit.info";
public static final int SPEED_TEST_SERVER_PORT = 80;
public static final String SPEED_TEST_SERVER_URI_DL = "/fichiers/1000Mo.dat";
public static final int FILE_SIZE = 20_000_000 ;
public static final int SPEED_TEST_MAX_DURATION = 10000;
public static final int SPEED_TEST_REPORT_INTERVAL = 500;

speedTestSocket.startFixedUpload(
   SPEED_TEST_SERVER_HOST,
   SPEED_TEST_SERVER_PORT,
   SPEED_TEST_SERVER_URI_DL,
   FILE_SIZE,
   SPEED_TEST_MAX_DURATION,
   SPEED_TEST_REPORT_INTERVAL);
10-17 17:31:26.681 4041-4094/pervacio.com.signalstrength I/art: Forcing collection of SoftReferences for 95MB allocation
10-17 17:31:26.721 4041-4094/pervacio.com.signalstrength E/art: Throwing OutOfMemoryError "Failed to allocate a 100000012 byte allocation with 8388512 free bytes and 94MB until OOM"
10-17 17:31:26.721 4041-4094/pervacio.com.signalstrength E/AndroidRuntime_2_crash: crash in the same process: Thread-4674
     java.lang.OutOfMemoryError: Failed to allocate a 100000012 byte allocation with 8388512 free bytes and 94MB until OOM
         at java.util.Arrays.copyOfRange(Arrays.java:2671)
         at java.util.Arrays.copyOf(Arrays.java:2455)
         at fr.bmartel.speedtest.RandomGen.nextArray(RandomGen.java:91)
         at fr.bmartel.speedtest.SpeedTestTask.writeUpload(SpeedTestTask.java:231)
         at fr.bmartel.speedtest.SpeedTestSocket.startUpload(SpeedTestSocket.java:546)
         at fr.bmartel.speedtest.SpeedTestSocket.startFixedUpload(SpeedTestSocket.java:360)
         at fr.bmartel.speedtest.SpeedTestSocket.startFixedUpload(SpeedTestSocket.java:383)
         at com.signalstrength.ui.fragment.PlaceholderFragment2.lambda$new$2(PlaceholderFragment2.java:110)
         at com.signalstrength.ui.fragment.PlaceholderFragment2$$Lambda$3.execute(Unknown Source)
         at com.signalstrength.Router.startTask(Router.java:42)
         at com.signalstrength.Router.onSpeedListenerFinish(Router.java:26)
         at com.signalstrength.speedListeners.AbstractSpeedListener.onStop(AbstractSpeedListener.java:98)
         at com.signalstrength.speedListeners.AbstractSpeedListener.onTimerStop(AbstractSpeedListener.java:70)
         at com.signalstrength.StopWaiter.run(StopWaiter.java:34)

Setting TextView text inside onDownloadPacketsReceived()

I'm having an issue where I am trying to set the text of a TextView inside the onDownloadPacketsReceived() and onUploadPacketsReceived method but the app halts as soon as it gets to setting the text. Do you have any suggestions on how to fix this?

Thanks.

@Override
public void onUploadPacketsReceived(long packetSize, float transferRateBps, float transferRateOps) {
    txtStatus.setText("Speed Test Finished");
     //Reset SpeedTest for next speedtest
     resetSTT();
}

onUploadPacketsReceived not fired

Often, when reaching a percent of 100, the method is not called.

This is a "non-issue", because checking for the percentage can solve it, but I wanted to let you know anyways

Irrelevant Results for downloading

I created speed test for http downloading and uploading.

Upload works and give me relevant results such as that if first time may 30mbits then such as 20 28 35 38 mbits.

But when i use download, it gives me irrelevant results. For example, one time gives 2mbits and then i start again and gives 30mbits. I cant give relevant values always. Its big problem for me. I download 4 times for giving values but its not enough. Can you advice something for this?

``
public class SpeedTestTask extends AsyncTask<Void, Void, String> {

   SpeedTestSocket speedTestSocket = new SpeedTestSocket();

    @Override
    protected String doInBackground(Void... params) {
        speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

            @Override
            public void onCompletion(SpeedTestReport report) {
				if (startType == 6) 
				{
	            	System.out.println("[UL COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
					BigDecimal a = new BigDecimal("1048576");
					System.out.println("[UL COMPLETED] rate in Mbit/s   : " + report.getTransferRateBit().divide(a));
					olduploadspeed = report.getTransferRateBit().divide(a);
					uploadspeed = olduploadspeed.setScale(2,RoundingMode.FLOOR);
					enablebutton = true;
					finishedupload = true;
				}
				else if(startType >= 1)
				{
					System.out.println("[DL COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
					BigDecimal a = new BigDecimal("1048576");
					System.out.println("[DL COMPLETED] rate in Mbit/s : " + report.getTransferRateBit().divide(a));
					olddownloadspeed = report.getTransferRateBit().divide(a);
				    downloadspeed = olddownloadspeed.setScale(2,RoundingMode.FLOOR);
					startType++;
					if(startType == 6)
					{
					 finisheddownload = true;
				     speedTestSocket.startFixedUpload("http://2.testdebit.info/", 5000000,30000,500);
					}
					else if(startType > 1)
					{
					 speedTestSocket.startFixedDownload("http://2.testdebit.info/fichiers/20Mo.dat",15000,500);
					}	
				}
            }

            @Override
            public void onError(SpeedTestError speedTestError, String errorMessage) {
              }

            @Override
            public void onProgress(float percent, SpeedTestReport report) {
    	        if (startType == 6)
    	        {
					if (forcetoStop == true) {
						startType = 1;
						speedTestSocket.forceStopTask();
						speedTestSocket.clearListeners();
						speedTestSocket.closeSocket();
						uploadspeed = BigDecimal.ZERO;
						downloadspeed = BigDecimal.ZERO;
					} else {
						System.out.println("[UL PROGRESS] progress : "
								+ percent + "%");
						System.out.println("[UL PROGRESS] rate in octet/s : "
								+ report.getTransferRateOctet());
						BigDecimal a = new BigDecimal("1048576");
						System.out.println("[UL PROGRESS] rate in Mbit/s   : "
								+ report.getTransferRateBit().divide(a));
							olduploadspeed = report.getTransferRateBit().divide(a);
							uploadspeed = olduploadspeed.setScale(2,RoundingMode.FLOOR);
					}
    	        }
    	        else if (startType >= 1) 
    	        {
					enablebutton = false;
					if (forcetoStop == true) {
						startType = 1;
						speedTestSocket.forceStopTask();
						speedTestSocket.clearListeners();
						speedTestSocket.closeSocket();
						downloadspeed = BigDecimal.ZERO;
						uploadspeed = BigDecimal.ZERO;
					} else {						
						System.out.println("[DL PROGRESS] progress : "
								+ percent + "%");
						System.out.println("[DL PROGRESS] rate in octet/s : "
								+ report.getTransferRateOctet());
						BigDecimal a = new BigDecimal("1048576");
						System.out.println("[DL PROGRESS] rate in Mbit/s : "
								+ report.getTransferRateBit().divide(a));
						olddownloadspeed = report.getTransferRateBit().divide(a);
						downloadspeed = olddownloadspeed.setScale(2,RoundingMode.FLOOR);
					}
    			}
            }

            @Override
            public void onInterruption() {
				if (startType == 6) {
					finisheddownload = true;
				}	
				if (forcetoStop == true) {
					speedTestSocket.forceStopTask();
					speedTestSocket.clearListeners();
					speedTestSocket.closeSocket();
					uploadspeed = BigDecimal.ZERO;
					downloadspeed = BigDecimal.ZERO;
					startType = 1;
					finisheddownload = false;
					finishedupload = false;
				} else {
					if(startType != 1) startAgain();
					else finishedupload = true;
				}
            }
        });
        
        if (startType == 6)
        {
	        speedTestSocket.startFixedUpload("http://2.testdebit.info/", 50000000,30000,500);
        }
        else if (startType >= 1) 
        {
			speedTestSocket.startFixedDownload("http://2.testdebit.info/fichiers/20Mo.dat",15000,500);
			startType++;
		}
        return null;
    }
}

onCompletion not called

Hello. After call forceStopTask() onCompletion not called. I think it's bug.
P.S.
This for
startDownloadRepeat or startUploadRepeat

Download speed gives irrelevant values after some tests

` public class SpeedTestTask extends AsyncTask<Void, Void, String> {

	SpeedTestSocket speedTestSocket = new SpeedTestSocket();
	
    @Override
    protected String doInBackground(Void... params) {

    	// add a listener to wait for speed test completion and progress
    	speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

    	    @Override
    	    public void onDownloadFinished(SpeedTestReport report) {
    	        // called when download is finished
    	        System.out.println("[DL FINISHED] rate in octet/s : " + report.getTransferRateOctet());
    	        BigDecimal a = new BigDecimal("1048576");
    	        System.out.println("[DL FINISHED] rate in Mbit/s   : " + report.getTransferRateBit().divide(a));
    	        olddownloadspeed = report.getTransferRateBit().divide(a);
    	        downloadspeed = olddownloadspeed.setScale(2,RoundingMode.FLOOR);
    	        if (startType == 6){
        	        startType = 1;
        	        speedTestSocket.startFixedUpload("2.testdebit.info", 80, "/", 100000000, 30000,500);
    	        }
    	        else  if (startType >= 1){
    	        	startType++;
            	    speedTestSocket.startFixedDownload("2.testdebit.info", 80, "/fichiers/10Mo.dat", 10000,500);
    	        }

    	    }

    	    @Override
    	    public void onDownloadError(SpeedTestError speedTestError, String errorMessage) {
    	         // called when a download error occur
    	    }

    	    @Override
    	    public void onUploadFinished(SpeedTestReport report) {
    	        // called when an upload is finished
    	        System.out.println("[UL FINISHED] rate in octet/s : " + report.getTransferRateOctet());
    	        BigDecimal a = new BigDecimal("1048576");
    	        System.out.println("[UL FINISHED] rate in Mbit/s   : " + report.getTransferRateBit().divide(a));
    	        olduploadspeed = report.getTransferRateBit().divide(a);
    	        uploadspeed = olduploadspeed.setScale(2,RoundingMode.FLOOR);
    	        enablebutton = true;
    	    }

    	    @Override
    	    public void onUploadError(SpeedTestError speedTestError, String errorMessage) {
    	        // called when an upload error occur
    	    }

    	    @Override
    	    public void onDownloadProgress(float percent, SpeedTestReport report) {
    	        // called to notify download progress
    	    	enablebutton = false;
              	if(forcetoStop == true){
             		 speedTestSocket.forceStopTask();
             		 speedTestSocket.clearListeners();
             		 speedTestSocket.closeSocket();
             		 downloadspeed = BigDecimal.ZERO;
             		 uploadspeed = BigDecimal.ZERO;
             	}
              	else{
    	        System.out.println("[DL PROGRESS] progress : " + percent + "%");
    	        System.out.println("[DL PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
    	        BigDecimal a = new BigDecimal("1048576");
    	        System.out.println("[DL PROGRESS] rate in Mbit/s   : " + report.getTransferRateBit().divide(a));
    	        olddownloadspeed = report.getTransferRateBit().divide(a);
    	        downloadspeed = olddownloadspeed.setScale(2,RoundingMode.FLOOR);
    	        }
    	    }

    	    @Override
    	    public void onUploadProgress(float percent, SpeedTestReport report) {
    	        // called to notify upload progress
             	if(forcetoStop == true){
              		 speedTestSocket.forceStopTask();
             		 speedTestSocket.clearListeners();
             		 speedTestSocket.closeSocket();
              		 uploadspeed = BigDecimal.ZERO;
              		downloadspeed = BigDecimal.ZERO;
              	}
             	else{
        	        System.out.println("[UL PROGRESS] progress : " + percent + "%");
        	        System.out.println("[UL PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
        	        BigDecimal a = new BigDecimal("1048576");
        	        System.out.println("[UL PROGRESS] rate in Mbit/s   : " + report.getTransferRateBit().divide(a));
        	        olduploadspeed = report.getTransferRateBit().divide(a);
        	        uploadspeed = olduploadspeed.setScale(2,RoundingMode.FLOOR);
             	}
    	    }

    	    @Override
    	    public void onInterruption() {
    	        // triggered when forceStopTask is called
    	    	if(forcetoStop == true){
               	 	speedTestSocket.forceStopTask();
            		 speedTestSocket.clearListeners();
            		 speedTestSocket.closeSocket();
              		uploadspeed = BigDecimal.ZERO;
              		downloadspeed = BigDecimal.ZERO;
    	    	}
    	    	else{
        	    	startAgain();
    	    }}       	    	
    	});     	       	
    	if(startType == 6){
    		speedTestSocket.startFixedUpload("2.testdebit.info", 80, "/", 100000000, 30000,500);
    		startType = 1;
    	}
    	else if(startType >= 1){
    	    speedTestSocket.startFixedDownload("2.testdebit.info", 80, "/fichiers/10Mo.dat", 10000,500);
    	    startType++;
    	} 	
    	return null;
    }
}
public void startAgain(){
  new SpeedTestTask().execute();
}`

I try to get download and upload values. I changed my methods several times but i get irrelevant values from download speeds such as 5mbps and after short time 30mbps and then 5 or 1. But i get upload speeds usually relevant values. Now i downloaded 5 times 10mb but values its not relevant always. In past i downloaded 100mb but this problem was same. How can i solve this problem? If i change download or upload adress, is that value can be relevant?

java.util.concurrent.RejectedExecutionException ScheduledThreadPoolExecutor

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask@90a731a rejected from java.util.concurrent.ScheduledThreadPoolExecutor@8a11e4b[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2049)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:814)
    at java.util.concurrent.ScheduledThreadPoolExecutor.delayedExecute(ScheduledThreadPoolExecutor.java:305)
    at java.util.concurrent.ScheduledThreadPoolExecutor.schedule(ScheduledThreadPoolExecutor.java:533)
    at java.util.concurrent.ScheduledThreadPoolExecutor.execute(ScheduledThreadPoolExecutor.java:625)
    at fr.bmartel.speedtest.SpeedTestSocket.connectAndExecuteTask(SpeedTestSocket.java:319)
    at fr.bmartel.speedtest.SpeedTestSocket.writeUpload(SpeedTestSocket.java:859)
    at fr.bmartel.speedtest.SpeedTestSocket.startUpload(SpeedTestSocket.java:846)
    at com.koa.test.speedtest.FixedTimeUploadThead.run(FixedTimeUploadThead.java:194)

Cannot resolve symbol HttpFrame

Hello,

I try to use this library in an android studio project.

When I try to compile for a run on my test tablet, I have an error :
in file : SpeedTestTask.java
on line : final HttpFrame httpFrame = new HttpFrame();

HttpFrame seems to doesn't exist.

Is there anything to import before ?

Thank you,

ConcurrentModificationException

Hello. Sometimes this error on Samsung, LGE, Google device. Android 6,7.

Fatal Exception: java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at fr.bmartel.speedtest.RepeatWrapper.getRepeatReport(RepeatWrapper.java:159)
at fr.bmartel.speedtest.SpeedTestTask.getReport(SpeedTestTask.java:871)
at fr.bmartel.speedtest.SpeedTestSocket.getLiveUploadReport(SpeedTestSocket.java:396)
at fr.bmartel.speedtest.RepeatWrapper$6.run(RepeatWrapper.java:346)
at java.util.Timer$TimerImpl.run(Timer.java:284)

Java compativility issue

Trying to build android project with speed-test-lib but during build got following error:

Error:Error converting bytecode to dex:
Cause: Dex cannot parse version 52 byte code.
This is caused by library dependencies that have been compiled using Java 8 or above.
If you are using the 'java' gradle plugin in a library submodule add
targetCompatibility = '1.7'
sourceCompatibility = '1.7'
to that submodule's build.gradle file.

Download/Upload Speed in onPostExecute

How can I get Download/Upload Speed in onPostExecute function after finishing DoInBackground process? DoInBackground function returns null, that's why can't able to access any parameters.

It's possible to get the float Mb\s?

Hi there. I'm testing this library, and I think it amazing. But I would like to get the float Mb\s of the speed test. Somebody know to tell me if it's possible?

start***Download & start***Upload overrides with FTP account params

So as title says, could you please override mentioned methods so that we can use lib on custom FTP servers with appropriate FTP account credentials, not with Constant class you build in lib. So like:

startFixedDownload(java.lang.String uri, int maxDuration, int reportInterval, String ftpUsername, String ftpPassword) where uri is with ftp:// protocol prefix.

Best,
G

onError -- reports back URL

Hi,

Great tool. Thank you for providing it.

I am using it in Android, but I am having trouble.

I get an error message. In the onError callback shown below I get the message as the URL. It simply spits out the primary URL path. Callback is shown below, and so is the logged error message.

                @Override
                public void onError(SpeedTestError speedTestError, String errorMessage) {
                    Log.d("onError", "[ERROR] " + errorMessage);
                }

E.g. error message:
05-12 20:01:06.749 2583-3688/com.google.uxbandit D/onError: [ERROR] ipv4.bouygues.testdebit.info

What does it mean to get such an error message? When I access the URL i actually provide "http://ipv4.bouygues.testdebit.info/1M.iso" to start download it all works well elsewhere, as in I am able to download the file through my computer, as well as the Android emulator.

Thanks,
vj.

Unexpected download speed

 public class SpeedTestTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {

            SpeedTestSocket speedTestSocket = new SpeedTestSocket();

            // add a listener to wait for speedtest completion and progress
            speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

                @Override
                public void onDownloadFinished(final SpeedTestReport report) {
                    // called when download is finished
                    Log.v("speedtest", "[DL FINISHED] rate in mb/s : " + report.getTransferRateOctet().divide(MEGA_VALUE_PER_SECONDS));
                    Log.v("speedtest", "[DL FINISHED] rate in bit/s   : " + report.getTransferRateBit());
                }

                @Override
                public void onDownloadError(SpeedTestError speedTestError, String errorMessage) {
                    // called when a download error occur
                }

                @Override
                public void onUploadFinished(SpeedTestReport report) {
                    // called when an upload is finished
                    Log.v("speedtest", "[UL FINISHED] rate in octet/s : " + report.getTransferRateOctet());
                    Log.v("speedtest", "[UL FINISHED] rate in bit/s   : " + report.getTransferRateBit());
                }

                @Override
                public void onUploadError(SpeedTestError speedTestError, String errorMessage) {
                    // called when an upload error occur
                }

                @Override
                public void onDownloadProgress(final float percent, final SpeedTestReport report) {
                    // called to notify download progress
                    Log.v("speedtest", "[DL PROGRESS] progress : " + percent + "%");
                    Log.v("speedtest", "[DL PROGRESS] rate in mb/s : " + report.getTransferRateOctet().divide(MEGA_VALUE_PER_SECONDS));
                    Log.v("speedtest", "[DL PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
                }

                @Override
                public void onUploadProgress(float percent, SpeedTestReport report) {
                    // called to notify upload progress
                    Log.v("speedtest", "[UL PROGRESS] progress : " + percent + "%");
                    Log.v("speedtest", "[UL PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
                    Log.v("speedtest", "[UL PROGRESS] rate in bit/s   : " + report.getTransferRateBit());
                }

                @Override
                public void onInterruption() {
                    // triggered when forceStopTask is called
                }
            });
            speedTestSocket.startFixedDownload("europass.cedefop.europa.eu",80,"/sites/default/files/cvtemplate_6.doc",10000);
            //speedTestSocket.setSocketTimeout(5000);
//            speedTestSocket.startDownload("2.testdebit.info", "/fichiers/1Mo.dat");

            return null;
        }
    }

The above code is giving me 0.09mbps download speed where as i tested ookola speedtest it gives me 3.5Mbps on same network.

Can you please help me to calculate the download and upload speed to be displayed as result of test.
thanks

SpeedTestReport : getTransferRateBit()

public void onDownloadProgress(float percent, SpeedTestReport report) {
report.getTransferRateBit()
}
The result will be cumulatively.
I think the calculation seems to be wrong, and here is my calculation :

            float getTemporaryPacketSize = report.getTemporaryPacketSize();
            float intervalDLSize = getTemporaryPacketSize-tempSize;
            tempSize = getTemporaryPacketSize;

            if(tempDLTime ==0)
                tempDLTime = report.getStartTime();

            long getReportTime = report.getReportTime();
            long intervalDLTime = getReportTime-tempDLTime ;
            tempDLTime = getReportTime;

            float mKBps = (intervalDLSize/intervalDLTime)*1000/8/1000 ;

Eclipse doest not found the classes

Hi there. I found today this library and I decided to test it, It's already implemented the library in my project with Maven, but the Eclipse does not found the classes:
captura de tela 15
Somebody know to tell me what's happening here?

Not working on android?

I used it on my android and got the following error:

E/speedtest( 2132): Error occurred while parsing http frame
E/speedtest( 2132): Error content length is inconsistent
E/speedtest( 2132): Error status code -1

And the onError method of the listener is called.

I am using a Nexus 5 running android 5.1. I changed to a different server and the error is reproducible.

Division by zero

When i'm trying upload file to ftp server(using startUpload, not startUploadFTP) app crash with

java.lang.ArithmeticException: Division by zero
at java.math.BigDecimal.divide(BigDecimal.java:1065)
at fr.bmartel.speedtest.SpeedTestTask.getReport(SpeedTestTask.java:774)
at fr.bmartel.speedtest.SpeedTestSocket.getLiveDownloadReport(SpeedTestSocket.java:678)
at fr.bmartel.speedtest.SpeedTestTask.startSocketDownloadTask(SpeedTestTask.java:484)
at fr.bmartel.speedtest.SpeedTestTask.access$1300(SpeedTestTask.java:57)
at fr.bmartel.speedtest.SpeedTestTask$2.run(SpeedTestTask.java:409)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)

Speed test for pages

Hello. Can you add feature for measure loading web pages?
Like this for example:

    try
    {
        URL url_t = new URL(url);
        URLConnection connection = url_t.openConnection();
        connection.connect();
        InputStream input = new BufferedInputStream(connection.getInputStream());

        int BUFFER_SIZE = 1024;
        byte buffer[] = new byte[BUFFER_SIZE];
        long start = System.currentTimeMillis();
        long size = 0;
        int bytes;

        while ((bytes = input.read(buffer, 0, BUFFER_SIZE)) > 0)
        {
            size += bytes;
            long delta_time = System.currentTimeMillis() - start;
            double speed = 10000F * size / delta_time;
        }

        input.close();
    }
    catch(Exception ignored) {}

Socket constructors & params

Now SpeedTestSocket has empty constructor and default update report time == -1. I think param for update report interval should be moved to constructor from startDownloadRepeat and startUploadRepeat btw default should be set as 1000 for example(for empty constructor). Thanks foк your work and updated!

Setting timeout

Thanks for such a nice library. Can you add one more parameter for time out. Lets say user is in very low network, I dont want keep the user in the screen for a long time. I just want an option like if the download is not complete in one minute, Just stop speed test process.

Starting upload when the download finished

Hi, i would first thank you for this useful library.
Here's my problem i want to trigger the upload process when the download is finished.
So on the ISpeedTestListener onDownloadPacketsReceived method i have putted the speedTestSocket.startUpload("XXXXXX.com", 80, "/upload/upload.php", 10000000) but it doesn't start.
Is it a bug? or am i doing something wrong?

Thanks

Send the download/upload updates with a number of milliseconds apart

Hi, thank you for creating this library, works great! I have one suggestion, could you please add a new mode where the time duration for the test is settable for small files? The test will have to be restarted after every cycle finishes so I can update the user after each cycle. This will be nice for UI animations and such. I am trying to test this against the mobile network so the users don't spend too much from their data plan.
Regards.

bitrate is very very high!! (not correct)

Hi,
The bitrate I obtained in upload (.startFixedUpload("2.testdebit.info", 80, "/", 10000000, 10000);) is very high, which indicates an error in calculation somewhere...
following is sample of output. real bitrate should be around 100kbps, but output is ~262Mbps.

V/speedtest: [UL PROGRESS] progress : 0.6554%
V/speedtest: [UL PROGRESS] rate in bit/s   : 262140000.0000
V/speedtest: [UL PROGRESS] progress : 1.3107%
V/speedtest: [UL PROGRESS] rate in bit/s   : 262140000.0000
V/speedtest: [UL PROGRESS] progress : 1.966%
V/speedtest: [UL PROGRESS] rate in bit/s   : 262140000.0000
V/speedtest: [UL PROGRESS] progress : 2.6214%
V/speedtest: [UL PROGRESS] rate in bit/s   : 299588571.4288

Calculate Upload/Donwload speed during testing

First of all, your library is pretty amazing and easy to use. Thanks for that. Still, I want to show the speed of download and upload during testing. I already done on the download part but I can't figure out how to do on the upload part. Do you have any idea how to work on that?

Possible java.lang.ArrayIndexOutOfBoundsException

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
       at java.util.ArrayList.fastRemove(ArrayList.java:531)
       at java.util.ArrayList.remove(ArrayList.java:514)
       at fr.bmartel.speedtest.SpeedTestSocket.initReportTask(Unknown Source)
       at fr.bmartel.speedtest.RepeatWrapper.getRepeatReport$1869eac7(Unknown Source)
       at fr.bmartel.speedtest.RepeatWrapper$1.onCompletion(Unknown Source)
       at fr.bmartel.speedtest.utils.SpeedTestUtils.dispatchError(Unknown Source)
       at fr.bmartel.speedtest.SpeedTestTask.setReportInterval(Unknown Source)
       at fr.bmartel.speedtest.SpeedTestTask$2.run(Unknown Source)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run(Thread.java:762)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.