plr-speedtest 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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