plr-speedtest 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73d4d621364f2ead38d1d11300cbe8e31f99eb61e99cb2b240eb3dd5a9e1f805
4
- data.tar.gz: 373baa9881da4b0169caa9877f4ad438ec0bebb2a0570a890c9d579d9e4e65ba
3
+ metadata.gz: 55d8ad59a06d925a76c6a9a5097034ff454bf0f9c60ec1d1fd3c4cc2abd70fd5
4
+ data.tar.gz: 96160eb37e01c31d0c0b2eabc79e521ec0795b9ca07da20acd41aef2c35ff4c1
5
5
  SHA512:
6
- metadata.gz: 46fb6d63bf16d3e98b836446dae58306c652bc9abeba0f91090abec890f6d7e0de6c3e2cca7ef6977c59e8a3a8a1fee13ca4a4f76a3a999c371e1537b4cb3b43
7
- data.tar.gz: 18f813f4b4333bf9da00f37add3f270c297b3a6a16ab7d980bfd1345c75a9069b44a69686c9ff849850f5cc92a8035585d8044ef2893a51e114cc34f137d7323
6
+ metadata.gz: 751405ec1d2fff2afdf5b742569527b95758998b4d0c64e42324cf79541ab6a56e12bd83ad963b15598cd9fcf5f928e3b9c39561875cb6e5a159e97a274ddf7e
7
+ data.tar.gz: 5da842bfbcde57f40acd8bd2d72b0d780f667cc94900a0ca2c7517d9f1e6549049b09859550a76bc17d6ba0bb4fc34074efb81756ea69aaa74b9219a7930d5d4
@@ -0,0 +1,44 @@
1
+ require 'celluloid/current'
2
+
3
+ module Speedtest
4
+ class TransferWorker
5
+ include Celluloid
6
+
7
+ def initialize(url, logger)
8
+ @url = url
9
+ @logger = logger
10
+ end
11
+
12
+ def log(msg)
13
+ return unless @logger
14
+ @logger.debug msg
15
+ end
16
+
17
+ def download
18
+ log " downloading: #{@url}"
19
+ status = ThreadStatus.new(false, 0)
20
+
21
+ page = HTTParty.get(@url, timeout: 10)
22
+ unless page.code / 100 == 2
23
+ error "GET #{@url} failed with code #{page.code}"
24
+ status.error = true
25
+ end
26
+ status.size = page.body.length
27
+ status
28
+ end
29
+
30
+ def upload(content)
31
+ log " uploading: #{@url}"
32
+ status = ThreadStatus.new(false, 0)
33
+
34
+ page = HTTParty.post(@url, :body => { "content" => content }, timeout: 10)
35
+ log "upload response body = [#{page.body}]"
36
+ unless page.code / 100 == 2
37
+ error "GET #{@url} failed with code #{page.code}"
38
+ status.error = true
39
+ end
40
+ status.size = page.body.split('=')[1].to_i
41
+ status
42
+ end
43
+ end
44
+ end
@@ -1,3 +1,3 @@
1
1
  module Speedtest
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
data/lib/speedtest.rb CHANGED
@@ -2,8 +2,7 @@ require 'httparty'
2
2
 
3
3
  require_relative 'speedtest/result'
4
4
  require_relative 'speedtest/geo_point'
5
- require_relative 'speedtest/download_worker'
6
- require_relative 'speedtest/upload_worker'
5
+ require_relative 'speedtest/transfer_worker'
7
6
  require_relative 'speedtest/ring'
8
7
 
9
8
  module Speedtest
@@ -68,13 +67,17 @@ module Speedtest
68
67
  @logger.error msg if @logger
69
68
  end
70
69
 
70
+ def download_url(server_root)
71
+ "#{server_root}/speedtest/random#{@download_size}x#{@download_size}.jpg"
72
+ end
73
+
71
74
  def download
72
75
  log "\nstarting download tests:"
73
76
 
74
77
  start_time = Time.now
75
78
  futures_ring = Ring.new(@num_threads + @num_transfers_padding)
76
- download_url = "#{@server_root}/speedtest/random#{@download_size}x#{@download_size}.jpg"
77
- pool = DownloadWorker.pool(size: @num_threads, args: [download_url, @logger])
79
+ download_url = download_url(@server_root)
80
+ pool = TransferWorker.pool(size: @num_threads, args: [download_url, @logger])
78
81
  1.upto(@num_threads + @num_transfers_padding).each do |i|
79
82
  futures_ring.append(pool.future.download)
80
83
  end
@@ -100,6 +103,10 @@ module Speedtest
100
103
  (1.upto(size)).map { alphabet[rand(alphabet.length)] }.join
101
104
  end
102
105
 
106
+ def upload_url(server_root)
107
+ "#{server_root}/speedtest/upload.php"
108
+ end
109
+
103
110
  def upload
104
111
  log "\nstarting upload tests:"
105
112
 
@@ -108,8 +115,8 @@ module Speedtest
108
115
  start_time = Time.now
109
116
 
110
117
  futures_ring = Ring.new(@num_threads + @num_transfers_padding)
111
- upload_url = "#{@server_root}/speedtest/upload.php"
112
- pool = UploadWorker.pool(size: @num_threads, args: [upload_url, @logger])
118
+ upload_url = upload_url(@server_root)
119
+ pool = TransferWorker.pool(size: @num_threads, args: [upload_url, @logger])
113
120
  1.upto(@num_threads + @num_transfers_padding).each do |i|
114
121
  futures_ring.append(pool.future.upload(data))
115
122
  end
@@ -152,12 +159,30 @@ module Speedtest
152
159
  :latency => ping(x[:url]),
153
160
  :url => x[:url]
154
161
  }}.sort_by { |x| x[:latency] }
155
- selected = latency_sorted_servers[0]
162
+
163
+
164
+ selected = latency_sorted_servers.detect { |s| validate_server_transfer(s[:url]) }
156
165
  log "Automatically selected server: #{selected[:url]} - #{selected[:latency]} ms"
157
166
 
158
167
  selected
159
168
  end
160
169
 
170
+ def validate_server_transfer(server_root)
171
+ downloader = TransferWorker.new(download_url(server_root), @logger)
172
+ status = downloader.download
173
+ raise RuntimeError if status.error
174
+
175
+ uploader = TransferWorker.new(upload_url(server_root), @logger)
176
+ data = randomString(('A'..'Z').to_a, @upload_size)
177
+ status = uploader.upload(data)
178
+ raise RuntimeError if status.error || status.size < @upload_size
179
+
180
+ true
181
+ rescue => e
182
+ log "Rejecting #{server_root}"
183
+ false
184
+ end
185
+
161
186
  def ping(server)
162
187
  times = []
163
188
  1.upto(@ping_runs) {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plr-speedtest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Myron
@@ -112,11 +112,10 @@ files:
112
112
  - README.md
113
113
  - Rakefile
114
114
  - lib/speedtest.rb
115
- - lib/speedtest/download_worker.rb
116
115
  - lib/speedtest/geo_point.rb
117
116
  - lib/speedtest/result.rb
118
117
  - lib/speedtest/ring.rb
119
- - lib/speedtest/upload_worker.rb
118
+ - lib/speedtest/transfer_worker.rb
120
119
  - lib/speedtest/version.rb
121
120
  - speedtest.gemspec
122
121
  homepage: https://github.com/petemyron/speedtest
@@ -1,26 +0,0 @@
1
- require 'celluloid/current'
2
-
3
- module Speedtest
4
-
5
- class DownloadWorker
6
- include Celluloid
7
-
8
- def initialize(url, logger)
9
- @logger = logger
10
- @url = url
11
- end
12
-
13
- def download
14
- @logger.debug " downloading: #{@url}"
15
- status = ThreadStatus.new(false, 0)
16
-
17
- page = HTTParty.get(@url, timeout: 10)
18
- unless page.code / 100 == 2
19
- error "GET #{url} failed with code #{page.code}"
20
- status.error = true
21
- end
22
- status.size = page.body.length
23
- status
24
- end
25
- end
26
- end
@@ -1,25 +0,0 @@
1
- require 'celluloid/current'
2
-
3
- module Speedtest
4
- class UploadWorker
5
- include Celluloid
6
-
7
- def initialize(url, logger)
8
- @url = url
9
- @logger = logger
10
- end
11
-
12
- def upload(content)
13
- status = ThreadStatus.new(false, 0)
14
-
15
- page = HTTParty.post(@url, :body => { "content" => content }, timeout: 10)
16
- @logger.debug "upload response body = [#{page.body}]"
17
- unless page.code / 100 == 2
18
- error "GET #{url} failed with code #{page.code}"
19
- status.error = true
20
- end
21
- status.size = page.body.split('=')[1].to_i
22
- status
23
- end
24
- end
25
- end