Skip to content

Commit

Permalink
Merge branch '__rultor'
Browse files Browse the repository at this point in the history
  • Loading branch information
rultor committed Nov 15, 2018
2 parents c7b06bd + fd78436 commit 800a6cb
Show file tree
Hide file tree
Showing 10 changed files with 74 additions and 69 deletions.
Empty file modified .rultor.yml 100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion lib/zold/commands/fetch.rb 100644 → 100755
Expand Up @@ -107,7 +107,7 @@ def fetch_one(id, r, cps, opts)
size = r.http(uri + '/size').get
r.assert_code(200, size)
res = r.http(uri).get(timeout: 2 + size.body.to_i * 0.01 / 1024)
raise "Wallet #{id} not found" if res.code == '404'
raise "Wallet #{id} not found" if res.status == '404'
r.assert_code(200, res)
json = JsonPage.new(res.body, uri).to_hash
score = Score.parse_json(json['score'])
Expand Down
2 changes: 1 addition & 1 deletion lib/zold/commands/push.rb 100644 → 100755
Expand Up @@ -94,7 +94,7 @@ def push_one(id, r, opts)
uri = "/wallet/#{id}"
response = r.http(uri).put(content, timeout: 2 + content.length * 0.01 / 1024)
@wallets.acq(id) do |wallet|
if response.code == '304'
if response.status == 304
@log.info("#{r}: same version of #{wallet.mnemo} there, in #{Age.new(start, limit: 0.5)}")
return 0
end
Expand Down
2 changes: 1 addition & 1 deletion lib/zold/commands/remote.rb
Expand Up @@ -188,7 +188,7 @@ def add(host, port, opts)
end
unless opts['skip-ping']
res = Http.new(uri: "http://#{host}:#{port}/version", network: opts['network']).get
raise "The node #{host}:#{port} is not responding, #{res.code}:#{res.message}" unless res.code == '200'
raise "The node #{host}:#{port} is not responding, #{res.status}:#{res.status_line}" unless res.status == 200
end
@remotes.add(host, port)
@log.info("#{host}:#{port} added to the list, #{@remotes.all.count} total")
Expand Down
41 changes: 22 additions & 19 deletions lib/zold/http.rb 100644 → 100755
Expand Up @@ -22,8 +22,8 @@

require 'rainbow'
require 'uri'
require 'net/http'
require 'backtrace'
require 'patron'
require 'zold/score'
require_relative 'version'

Expand Down Expand Up @@ -68,31 +68,34 @@ def initialize(uri:, score: Score::ZERO, network: 'test')
end

def get(timeout: READ_TIMEOUT + CONNECT_TIMEOUT)
http = Net::HTTP.new(@uri.host, @uri.port)
http.use_ssl = @uri.scheme == 'https'
http.read_timeout = timeout
http.open_timeout = CONNECT_TIMEOUT
base_url = "#{@uri.scheme}://#{@uri.host}:#{@uri.port}"
session = Patron::Session.new(
timeout: timeout,
connect_timeout: CONNECT_TIMEOUT,
base_url: base_url,
headers: headers
)
path = @uri.path
path += '?' + @uri.query if @uri.query
http.request_get(path, headers)
session.get(path)
rescue StandardError => e
Error.new(e)
end

def put(body, timeout: READ_TIMEOUT + CONNECT_TIMEOUT)
http = Net::HTTP.new(@uri.host, @uri.port)
http.use_ssl = @uri.scheme == 'https'
http.read_timeout = timeout
http.open_timeout = CONNECT_TIMEOUT
path = @uri.path
path += '?' + @uri.query if @uri.query
http.request_put(
path, body,
headers.merge(
base_url = "#{@uri.scheme}://#{@uri.host}:#{@uri.port}"
session = Patron::Session.new(
timeout: timeout,
connect_timeout: CONNECT_TIMEOUT,
base_url: base_url,
headers: headers.merge(
'Content-Type': 'text/plain',
'Content-Length': body.length.to_s
)
)
path = @uri.path
path += '?' + @uri.query if @uri.query
session.put(path, body)
rescue StandardError => e
Error.new(e)
end
Expand All @@ -113,15 +116,15 @@ def body
Backtrace.new(@ex).to_s
end

def code
'599'
def status
599
end

def message
def status_line
@ex.message
end

def header
def headers
{}
end
end
Expand Down
13 changes: 7 additions & 6 deletions lib/zold/remotes.rb
Expand Up @@ -92,13 +92,14 @@ def to_s
end

def assert_code(code, response)
msg = response.message.strip
return if response.code.to_i == code
if response.header['X-Zold-Error']
raise "Error ##{response.code} \"#{response.header['X-Zold-Error']}\" at #{response.header['X-Zold-Path']}"
msg = response.status_line.strip
return if response.status.to_i == code
if response.headers['X-Zold-Error']
raise "Error ##{response.status} \"#{response.headers['X-Zold-Error']}\"
at #{response.headers['X-Zold-Path']}"
end
raise "Unexpected HTTP code #{response.code}, instead of #{code}" if msg.empty?
raise "#{msg} (HTTP code #{response.code}, instead of #{code})"
raise "Unexpected HTTP code #{response.status}, instead of #{code}" if msg.empty?
raise "#{msg} (HTTP code #{response.status}, instead of #{code})"
end

def assert_valid_score(score)
Expand Down
4 changes: 2 additions & 2 deletions test/node/fake_node.rb 100644 → 100755
Expand Up @@ -66,8 +66,8 @@ def run(args = ['--standalone', '--no-metronome'])
attempt = 0
loop do
ping = Zold::Http.new(uri: uri).get
break unless ping.code == '599' && node.alive?
@log.debug("Waiting for #{uri} (attempt no.#{attempt}): ##{ping.code}...")
break unless ping.status == 599 && node.alive?
@log.debug("Waiting for #{uri} (attempt no.#{attempt}): ##{ping.status}...")
sleep 0.5
attempt += 1
break if attempt > 10
Expand Down
60 changes: 30 additions & 30 deletions test/node/test_front.rb
Expand Up @@ -74,7 +74,7 @@ def test_renders_front_json
def test_renders_public_pages
FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--no-metronome', '--threads=0']) do |port|
{
'200' => [
200 => [
'/robots.txt',
'/',
'/remotes',
Expand All @@ -87,7 +87,7 @@ def test_renders_public_pages
'/threads',
'/ps'
],
'404' => [
404 => [
'/this-is-absent',
'/wallet/ffffeeeeddddcccc',
'/wallet/ffffeeeeddddcccc.bin',
Expand All @@ -103,8 +103,8 @@ def test_renders_public_pages
uri = URI("http://localhost:#{port}#{p}")
response = Zold::Http.new(uri: uri).get
assert_equal(
code, response.code,
"Invalid response code for #{uri}: #{response.message}"
code, response.status,
"Invalid response code for #{uri}: #{response.status_line}"
)
end
end
Expand All @@ -117,7 +117,7 @@ def test_updates_list_of_remotes
host: 'localhost', port: port, invoice: 'NOPREFIX@ffffffffffffffff', strength: 1
).next.next.next.next
response = Zold::Http.new(uri: "http://localhost:#{port}/remotes", score: score).get
assert_equal('200', response.code, response.body)
assert_equal(200, response.status, response.body)
assert_equal(1, Zold::JsonPage.new(response.body).to_hash['all'].count, response.body)
assert_match(
/(\d{4})-(\d{2})-(\d{2})T(\d{2})\:(\d{2})\:(\d{2})Z/,
Expand All @@ -132,7 +132,7 @@ def test_increments_score
3.times do |i|
assert_equal_wait(true) do
response = Zold::Http.new(uri: "http://localhost:#{port}/").get
assert_equal('200', response.code, response.body)
assert_equal(200, response.status, response.body)
score = Zold::Score.parse_json(Zold::JsonPage.new(response.body).to_hash['score'])
score.value >= i
end
Expand All @@ -147,8 +147,8 @@ def test_renders_wallet_pages
base = "http://localhost:#{port}"
response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}")
.put(IO.read(wallet.path))
assert_equal('200', response.code, response.body)
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
assert_equal(200, response.status, response.body)
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
[
"/wallet/#{wallet.id}.txt",
"/wallet/#{wallet.id}.json",
Expand All @@ -162,7 +162,7 @@ def test_renders_wallet_pages
"/wallet/#{wallet.id}.bin",
"/wallet/#{wallet.id}/copies"
].each do |u|
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}#{u}").get.code }
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}#{u}").get.status }
end
end
end
Expand All @@ -174,14 +174,14 @@ def test_fetch_in_multiple_threads
wallet = home.create_wallet
base = "http://localhost:#{port}"
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
threads = []
mutex = Mutex.new
Threads.new(6).assert(100) do
assert_equal_wait('200') do
assert_equal_wait(200) do
res = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get
mutex.synchronize { threads << res.header['X-Zold-Thread'] }
res.code
mutex.synchronize { threads << res.headers['X-Zold-Thread'] }
res.status
end
end
assert(threads.uniq.count > 1)
Expand All @@ -195,14 +195,14 @@ def test_pushes_twice
wallet = home.create_wallet
base = "http://localhost:#{port}"
assert_equal(
'200',
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path)).code
200,
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path)).status
)
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
3.times do
r = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}")
.put(IO.read(wallet.path))
assert_equal('304', r.code, r.body)
assert_equal(304, r.status, r.body)
end
end
end
Expand All @@ -215,7 +215,7 @@ def test_pushes_many_wallets
Threads.new(5).assert do
wallet = home.create_wallet
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
end
end
end
Expand Down Expand Up @@ -258,11 +258,11 @@ def test_gzip
FakeNode.new(log: test_log).run(['--ignore-score-weakness']) do |port|
response = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
assert_equal(
'200', response.code,
"Expected HTTP 200 OK: Found #{response.code}"
200, response.status,
"Expected HTTP 200 OK: Found #{response.status}"
)
assert_operator(
750, :>, response['content-length'].to_i,
750, :>, response.body.length.to_i,
'Expected the content to be smaller than 600 bytes for gzip'
)
end
Expand All @@ -286,13 +286,13 @@ def test_headers_are_being_set_correctly
Time.stub :now, Time.at(0) do
FakeNode.new(log: test_log).run(['--expose-version=9.9.9', '--no-metronome', '--threads=0']) do |port|
response = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
assert_equal('no-cache', response.header['Cache-Control'])
assert_equal('close', response.header['Connection'])
assert_equal('9.9.9', response.header['X-Zold-Version'])
assert_equal(app.settings.protocol.to_s, response.header[Zold::Http::PROTOCOL_HEADER])
assert_equal('*', response.header['Access-Control-Allow-Origin'])
assert(response.header['X-Zold-Milliseconds'])
assert(!response.header[Zold::Http::SCORE_HEADER].nil?)
assert_equal('no-cache', response.headers['Cache-Control'])
assert_equal('close', response.headers['Connection'])
assert_equal('9.9.9', response.headers['X-Zold-Version'])
assert_equal(app.settings.protocol.to_s, response.headers[Zold::Http::PROTOCOL_HEADER])
assert_equal('*', response.headers['Access-Control-Allow-Origin'])
assert(response.headers['X-Zold-Milliseconds'])
assert(!response.headers[Zold::Http::SCORE_HEADER].nil?)
end
end
end
Expand Down Expand Up @@ -344,12 +344,12 @@ def test_push_fetch_in_multiple_threads
wallet = home.create_wallet(Zold::Id::ROOT)
base = "http://localhost:#{port}"
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code }
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
cycles = 50
cycles.times do
wallet.sub(Zold::Amount.new(zents: 10), "NOPREFIX@#{Zold::Id.new}", key)
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(IO.read(wallet.path))
assert_equal('200', Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.code)
assert_equal(200, Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status)
end
assert_equal_wait(-10 * cycles) do
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}/balance").get.body.to_i
Expand Down
18 changes: 9 additions & 9 deletions test/test_http.rb 100644 → 100755
Expand Up @@ -38,38 +38,38 @@ class TestHttp < Zold::Test
def test_pings_broken_uri
stub_request(:get, 'http://bad-host/').to_return(status: 500)
res = Zold::Http.new(uri: 'http://bad-host/').get
assert_equal('500', res.code)
assert_equal(500, res.status)
assert_equal('', res.body)
end

def test_pings_with_exception
stub_request(:get, 'http://exception/').to_return { raise 'Intentionally' }
res = Zold::Http.new(uri: 'http://exception/').get
assert_equal('599', res.code)
assert_equal(599, res.status)
assert(res.body.include?('Intentionally'))
assert(!res.header['nothing'])
assert(!res.headers['nothing'])
end

def test_pings_live_uri
stub_request(:get, 'http://good-host/').to_return(status: 200)
res = Zold::Http.new(uri: 'http://good-host/').get
assert_equal('200', res.code)
assert_equal(200, res.status)
end

def test_sends_valid_network_header
stub_request(:get, 'http://some-host-1/')
.with(headers: { 'X-Zold-Network' => 'xyz' })
.to_return(status: 200)
res = Zold::Http.new(uri: 'http://some-host-1/', network: 'xyz').get
assert_equal('200', res.code)
assert_equal(200, res.status)
end

def test_sends_valid_protocol_header
stub_request(:get, 'http://some-host-2/')
.with(headers: { 'X-Zold-Protocol' => Zold::PROTOCOL })
.to_return(status: 200)
res = Zold::Http.new(uri: 'http://some-host-2/').get
assert_equal('200', res.code)
assert_equal(200, res.status)
end

def test_doesnt_terminate_on_long_call
Expand All @@ -87,7 +87,7 @@ def test_doesnt_terminate_on_long_call
end
sleep 0.25
res = Zold::Http.new(uri: "http://127.0.0.1:#{port}/").get(timeout: 2)
assert_equal('200', res.code, res)
assert_equal(200, res.status, res)
thread.kill
thread.join
end
Expand All @@ -105,7 +105,7 @@ def test_terminates_on_timeout
end
sleep 0.25
res = Zold::Http.new(uri: "http://127.0.0.1:#{port}/").get(timeout: 0.1)
assert_equal('599', res.code, res)
assert_equal(599, res.status, res)
thread.kill
thread.join
end
Expand All @@ -116,6 +116,6 @@ def test_sends_valid_version_header
.with(headers: { 'X-Zold-Version' => Zold::VERSION })
.to_return(status: 200)
res = Zold::Http.new(uri: 'http://some-host-3/').get
assert_equal('200', res.code, res)
assert_equal(200, res.status, res)
end
end
1 change: 1 addition & 0 deletions zold.gemspec
Expand Up @@ -81,6 +81,7 @@ and suggests a different architecture for digital wallet maintenance.'
s.add_development_dependency 'codecov', '0.1.13'
s.add_development_dependency 'minitest', '5.11.3'
s.add_development_dependency 'minitest-hooks', '1.5.0'
s.add_development_dependency 'patron', '0.13.1'
s.add_development_dependency 'random-port', '0.3.1'
s.add_development_dependency 'rdoc', '4.3.0'
s.add_development_dependency 'rspec-rails', '3.8.1'
Expand Down

0 comments on commit 800a6cb

Please sign in to comment.