startTesting method

Future<void> startTesting({
  1. required ResultCallback onCompleted,
  2. DefaultCallback? onStarted,
  3. ResultCompletionCallback? onDownloadComplete,
  4. ResultCompletionCallback? onUploadComplete,
  5. TestProgressCallback? onProgress,
  6. DefaultCallback? onDefaultServerSelectionInProgress,
  7. DefaultServerSelectionCallback? onDefaultServerSelectionDone,
  8. ErrorCallback? onError,
  9. CancelCallback? onCancel,
  10. String? downloadTestServer,
  11. String? uploadTestServer,
  12. int fileSizeInBytes = _defaultFileSize,
  13. bool useFastApi = true,
})

Implementation

Future<void> startTesting({
  required ResultCallback onCompleted,
  DefaultCallback? onStarted,
  ResultCompletionCallback? onDownloadComplete,
  ResultCompletionCallback? onUploadComplete,
  TestProgressCallback? onProgress,
  DefaultCallback? onDefaultServerSelectionInProgress,
  DefaultServerSelectionCallback? onDefaultServerSelectionDone,
  ErrorCallback? onError,
  CancelCallback? onCancel,
  String? downloadTestServer,
  String? uploadTestServer,
  int fileSizeInBytes = _defaultFileSize,
  bool useFastApi = true,
}) async {
  if (_isTestInProgress) {
    return;
  }
  // Check if internet is available
  if (await isInternetAvailable() == false) {
    if (onError != null) {
      onError('No internet connection', 'No internet connection');
    }
    return;
  } else {
    debugPrint('Internet is available');
  }

  if (fileSizeInBytes < _defaultFileSize) {
    fileSizeInBytes = _defaultFileSize;
  }
  _isTestInProgress = true;

  if (onStarted != null) onStarted();

  if ((downloadTestServer == null || uploadTestServer == null) && useFastApi) {
    if (onDefaultServerSelectionInProgress != null) {
      onDefaultServerSelectionInProgress();
    }
    final serverSelectionResponse = await RekoSpeedTestPlatform.instance.getDefaultServer();

    if (onDefaultServerSelectionDone != null) {
      onDefaultServerSelectionDone(serverSelectionResponse?.client);
    }
    String? url = serverSelectionResponse?.targets?.first.url;
    if (url != null) {
      downloadTestServer = downloadTestServer ?? url;
      uploadTestServer = uploadTestServer ?? url;
    }
  }
  if (downloadTestServer == null || uploadTestServer == null) {
    downloadTestServer = downloadTestServer ?? _defaultDownloadTestServer;
    uploadTestServer = uploadTestServer ?? _defaultUploadTestServer;
  }

  if (_isCancelled) {
    if (onCancel != null) {
      onCancel();
      _isTestInProgress = false;
      _isCancelled = false;
      return;
    }
  }

  final startDownloadTimeStamp = DateTime.now().millisecondsSinceEpoch;
  RekoSpeedTestPlatform.instance.startDownloadTesting(
    onDone: (double transferRate, SpeedUnit unit) {
      final downloadDuration = DateTime.now().millisecondsSinceEpoch - startDownloadTimeStamp;
      final downloadResult =
          TestResult(TestType.download, transferRate, unit, durationInMillis: downloadDuration);

      if (onProgress != null) onProgress(100, downloadResult);
      if (onDownloadComplete != null) onDownloadComplete(downloadResult);

      final startUploadTimeStamp = DateTime.now().millisecondsSinceEpoch;
      RekoSpeedTestPlatform.instance.startUploadTesting(
        onDone: (double transferRate, SpeedUnit unit) {
          final uploadDuration = DateTime.now().millisecondsSinceEpoch - startUploadTimeStamp;
          final uploadResult =
              TestResult(TestType.upload, transferRate, unit, durationInMillis: uploadDuration);

          if (onProgress != null) onProgress(100, uploadResult);
          if (onUploadComplete != null) onUploadComplete(uploadResult);

          onCompleted(downloadResult, uploadResult);
          _isTestInProgress = false;
          _isCancelled = false;
        },
        onProgress: (double percent, double transferRate, SpeedUnit unit) {
          final uploadProgressResult = TestResult(TestType.upload, transferRate, unit);
          if (onProgress != null) {
            onProgress(percent, uploadProgressResult);
          }
        },
        onError: (String errorMessage, String speedTestError) {
          if (onError != null) onError(errorMessage, speedTestError);
          _isTestInProgress = false;
          _isCancelled = false;
        },
        onCancel: () {
          if (onCancel != null) onCancel();
          _isTestInProgress = false;
          _isCancelled = false;
        },
        fileSize: fileSizeInBytes,
        testServer: uploadTestServer!,
      );
    },
    onProgress: (double percent, double transferRate, SpeedUnit unit) {
      final downloadProgressResult = TestResult(TestType.download, transferRate, unit);
      if (onProgress != null) onProgress(percent, downloadProgressResult);
    },
    onError: (String errorMessage, String speedTestError) {
      if (onError != null) onError(errorMessage, speedTestError);
      _isTestInProgress = false;
      _isCancelled = false;
    },
    onCancel: () {
      if (onCancel != null) onCancel();
      _isTestInProgress = false;
      _isCancelled = false;
    },
    fileSize: fileSizeInBytes,
    testServer: downloadTestServer,
  );
}