zold 0.20.4 → 0.21.0
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 +4 -4
- data/bin/zold +1 -0
- data/lib/zold/commands/fetch.rb +4 -6
- data/lib/zold/commands/push.rb +8 -6
- data/lib/zold/http.rb +68 -46
- data/lib/zold/node/front.rb +2 -21
- data/lib/zold/version.rb +1 -1
- data/test/commands/test_fetch.rb +16 -16
- data/test/commands/test_pay.rb +3 -2
- data/test/commands/test_pull.rb +6 -4
- data/test/fake_home.rb +1 -0
- data/test/node/test_front.rb +7 -10
- data/test/test_http.rb +64 -2
- data/test/test_hungry_wallets.rb +1 -1
- data/zold.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08d854cecafd7b1690e4d00d3f10ab81e93c1a6ddc80691b7bd706a34e3914d6'
|
4
|
+
data.tar.gz: e8d569ab7b6d48f7293e98b55bb2fe52be904dc83a9039dde605be1a306692c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 916db3539dfeb1a9307cb291192f10c30e2b10e566d2c222951b83bf0a1ff3db97488af147c926b924288abb899d2ac8b98845963f85ee2f1684293aa92b2091
|
7
|
+
data.tar.gz: a874b08ca61533b78daec42dac0437195c1ab10360c83bdfe5469b893a04526e744d5e3ecbcb951b9e662fece172788e40d44097124afbe0f9b1fcf338d1968e
|
data/bin/zold
CHANGED
data/lib/zold/commands/fetch.rb
CHANGED
@@ -139,17 +139,15 @@ run 'zold remote update' or use --tolerate-quorum=1"
|
|
139
139
|
return 0
|
140
140
|
end
|
141
141
|
uri = "/wallet/#{id}"
|
142
|
-
|
143
|
-
r.assert_code(200,
|
144
|
-
|
145
|
-
r.assert_code(200, res)
|
146
|
-
json = JsonPage.new(res.body, uri).to_hash
|
142
|
+
head = r.http(uri).get
|
143
|
+
r.assert_code(200, head)
|
144
|
+
json = JsonPage.new(head.body, uri).to_hash
|
147
145
|
score = Score.parse_json(json['score'])
|
148
146
|
r.assert_valid_score(score)
|
149
147
|
r.assert_score_ownership(score)
|
150
148
|
r.assert_score_strength(score) unless opts['ignore-score-weakness']
|
151
149
|
Tempfile.open(['', Wallet::EXT]) do |f|
|
152
|
-
|
150
|
+
r.http(uri + '.bin').get_file(f)
|
153
151
|
wallet = Wallet.new(f.path)
|
154
152
|
wallet.refurbish
|
155
153
|
if wallet.protocol != Zold::PROTOCOL
|
data/lib/zold/commands/push.rb
CHANGED
@@ -105,7 +105,7 @@ Available options:"
|
|
105
105
|
end
|
106
106
|
unless opts['quiet-if-missed']
|
107
107
|
if done.value.zero?
|
108
|
-
raise "No nodes out of #{nodes} accepted the wallet #{id}; run 'zold remote update' and try again"
|
108
|
+
raise "No nodes out of #{nodes.value} accepted the wallet #{id}; run 'zold remote update' and try again"
|
109
109
|
end
|
110
110
|
if masters.value.zero? && !opts['tolerate-edges']
|
111
111
|
raise EdgesOnly, "There are only edge nodes, run 'zold remote update' or use --tolerate-edges"
|
@@ -125,12 +125,14 @@ out of #{nodes.value} in #{Age.new(start)}, total score for #{id} is #{total.val
|
|
125
125
|
return 0
|
126
126
|
end
|
127
127
|
start = Time.now
|
128
|
-
content = @wallets.acq(id) do |wallet|
|
129
|
-
raise "The wallet #{id} is absent" unless wallet.exists?
|
130
|
-
IO.read(wallet.path)
|
131
|
-
end
|
132
128
|
uri = "/wallet/#{id}"
|
133
|
-
response =
|
129
|
+
response = Tempfile.open do |f|
|
130
|
+
@wallets.acq(id) do |wallet|
|
131
|
+
raise "The wallet #{id} is absent" unless wallet.exists?
|
132
|
+
FileUtils.copy_file(wallet.path, f.path)
|
133
|
+
end
|
134
|
+
r.http(uri).put(f)
|
135
|
+
end
|
134
136
|
@wallets.acq(id) do |wallet|
|
135
137
|
if response.status == 304
|
136
138
|
@log.info("#{r}: same version of #{wallet.mnemo} there, in #{Age.new(start, limit: 0.5)}")
|
data/lib/zold/http.rb
CHANGED
@@ -32,6 +32,44 @@ require_relative 'version'
|
|
32
32
|
# Copyright:: Copyright (c) 2018 Yegor Bugayenko
|
33
33
|
# License:: MIT
|
34
34
|
module Zold
|
35
|
+
# Some clients waits for status method in response
|
36
|
+
class HttpResponse < SimpleDelegator
|
37
|
+
def status
|
38
|
+
code.zero? ? 599 : code
|
39
|
+
end
|
40
|
+
|
41
|
+
def status_line
|
42
|
+
status_message || ''
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
"#{status}: #{status_line}\n#{body}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# The error, if connection fails
|
51
|
+
class HttpError < HttpResponse
|
52
|
+
def initialize(ex)
|
53
|
+
@ex = ex
|
54
|
+
end
|
55
|
+
|
56
|
+
def body
|
57
|
+
Backtrace.new(@ex).to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
def status
|
61
|
+
599
|
62
|
+
end
|
63
|
+
|
64
|
+
def status_line
|
65
|
+
@ex.message || ''
|
66
|
+
end
|
67
|
+
|
68
|
+
def headers
|
69
|
+
{}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
35
73
|
# Http page
|
36
74
|
class Http
|
37
75
|
# HTTP header we add to each HTTP request, in order to inform
|
@@ -68,7 +106,7 @@ module Zold
|
|
68
106
|
end
|
69
107
|
|
70
108
|
def get(timeout: READ_TIMEOUT)
|
71
|
-
|
109
|
+
HttpResponse.new(
|
72
110
|
Typhoeus::Request.get(
|
73
111
|
@uri,
|
74
112
|
accept_encoding: 'gzip',
|
@@ -78,64 +116,48 @@ module Zold
|
|
78
116
|
)
|
79
117
|
)
|
80
118
|
rescue StandardError => e
|
81
|
-
|
119
|
+
HttpError.new(e)
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_file(file)
|
123
|
+
File.open(file, 'w') do |f|
|
124
|
+
request = Typhoeus::Request.new(
|
125
|
+
@uri,
|
126
|
+
accept_encoding: 'gzip',
|
127
|
+
headers: headers,
|
128
|
+
connecttimeout: CONNECT_TIMEOUT
|
129
|
+
)
|
130
|
+
request.on_body do |chunk|
|
131
|
+
f.write(chunk)
|
132
|
+
end
|
133
|
+
request.run
|
134
|
+
response = new HttpResponse(request)
|
135
|
+
raise "Invalid response code #{response.status}" unless response.status == 200
|
136
|
+
response
|
137
|
+
end
|
138
|
+
rescue StandardError => e
|
139
|
+
HttpError.new(e)
|
82
140
|
end
|
83
141
|
|
84
|
-
def put(
|
85
|
-
|
142
|
+
def put(file)
|
143
|
+
HttpResponse.new(
|
86
144
|
Typhoeus::Request.put(
|
87
145
|
@uri,
|
88
146
|
accept_encoding: 'gzip',
|
89
|
-
body:
|
90
|
-
headers: headers.merge(
|
147
|
+
body: IO.read(file),
|
148
|
+
headers: headers.merge(
|
149
|
+
'Content-Type': 'text/plain'
|
150
|
+
),
|
91
151
|
connecttimeout: CONNECT_TIMEOUT,
|
92
|
-
timeout:
|
152
|
+
timeout: 2 + File.size(file) * 0.01 / 1024
|
93
153
|
)
|
94
154
|
)
|
95
155
|
rescue StandardError => e
|
96
|
-
|
156
|
+
HttpError.new(e)
|
97
157
|
end
|
98
158
|
|
99
159
|
private
|
100
160
|
|
101
|
-
# Some clients waits for status method in response
|
102
|
-
class Response < SimpleDelegator
|
103
|
-
def status
|
104
|
-
code.zero? ? 599 : code
|
105
|
-
end
|
106
|
-
|
107
|
-
def status_line
|
108
|
-
status_message || ''
|
109
|
-
end
|
110
|
-
|
111
|
-
def to_s
|
112
|
-
"#{status}: #{status_line}\n#{body}"
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
# The error, if connection fails
|
117
|
-
class Error < Response
|
118
|
-
def initialize(ex)
|
119
|
-
@ex = ex
|
120
|
-
end
|
121
|
-
|
122
|
-
def body
|
123
|
-
Backtrace.new(@ex).to_s
|
124
|
-
end
|
125
|
-
|
126
|
-
def status
|
127
|
-
599
|
128
|
-
end
|
129
|
-
|
130
|
-
def status_line
|
131
|
-
@ex.message || ''
|
132
|
-
end
|
133
|
-
|
134
|
-
def headers
|
135
|
-
{}
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
161
|
def headers
|
140
162
|
headers = {
|
141
163
|
'User-Agent': "Zold #{VERSION}",
|
data/lib/zold/node/front.rb
CHANGED
@@ -249,26 +249,7 @@ this is not a normal behavior, you may want to report a bug to our GitHub reposi
|
|
249
249
|
size: wallet.size,
|
250
250
|
digest: wallet.digest,
|
251
251
|
copies: Copies.new(File.join(settings.copies, wallet.id)).all.count,
|
252
|
-
balance: wallet.balance.to_i
|
253
|
-
body: IO.read(wallet.path)
|
254
|
-
)
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
get %r{/wallet/(?<id>[A-Fa-f0-9]{16}).json} do
|
259
|
-
fetch('application/json') do |wallet|
|
260
|
-
pretty(
|
261
|
-
version: settings.opts['expose-version'],
|
262
|
-
alias: settings.node_alias,
|
263
|
-
protocol: settings.protocol,
|
264
|
-
id: wallet.id.to_s,
|
265
|
-
score: score.to_h,
|
266
|
-
wallets: total_wallets,
|
267
|
-
key: wallet.key.to_pub,
|
268
|
-
mtime: wallet.mtime.utc.iso8601,
|
269
|
-
digest: wallet.digest,
|
270
|
-
balance: wallet.balance.to_i,
|
271
|
-
txns: wallet.txns.count
|
252
|
+
balance: wallet.balance.to_i
|
272
253
|
)
|
273
254
|
end
|
274
255
|
end
|
@@ -339,7 +320,7 @@ this is not a normal behavior, you may want to report a bug to our GitHub reposi
|
|
339
320
|
end
|
340
321
|
|
341
322
|
get %r{/wallet/(?<id>[A-Fa-f0-9]{16})\.bin} do
|
342
|
-
fetch { |w|
|
323
|
+
fetch { |w| send_file(w.path) }
|
343
324
|
end
|
344
325
|
|
345
326
|
get %r{/wallet/(?<id>[A-Fa-f0-9]{16})/copies} do
|
data/lib/zold/version.rb
CHANGED
data/test/commands/test_fetch.rb
CHANGED
@@ -44,17 +44,17 @@ class TestFetch < Zold::Test
|
|
44
44
|
def test_fetches_wallet
|
45
45
|
FakeHome.new(log: test_log).run do |home|
|
46
46
|
wallet = home.create_wallet
|
47
|
-
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}/size")
|
48
|
-
.to_return(status: 200, body: wallet.size.to_s)
|
49
47
|
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}").to_return(
|
50
48
|
status: 200,
|
51
49
|
body: {
|
52
50
|
'score': Zold::Score::ZERO.to_h,
|
53
|
-
'
|
51
|
+
'size': 10_000,
|
54
52
|
'mtime': Time.now.utc.iso8601
|
55
53
|
}.to_json
|
56
54
|
)
|
57
|
-
stub_request(:get, "http://localhost:
|
55
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}.bin")
|
56
|
+
.to_return(status: 200, body: IO.read(wallet.path))
|
57
|
+
stub_request(:get, "http://localhost:81/wallet/#{wallet.id}").to_return(status: 404)
|
58
58
|
remotes = home.remotes
|
59
59
|
remotes.add('localhost', 4096)
|
60
60
|
remotes.add('localhost', 81)
|
@@ -72,27 +72,27 @@ class TestFetch < Zold::Test
|
|
72
72
|
log = TestLogger.new(test_log)
|
73
73
|
FakeHome.new(log: log).run do |home|
|
74
74
|
wallet_a = home.create_wallet
|
75
|
-
stub_request(:get, "http://localhost:4096/wallet/#{wallet_a.id}/size")
|
76
|
-
.to_return(status: 200, body: wallet_a.size.to_s)
|
77
75
|
stub_request(:get, "http://localhost:4096/wallet/#{wallet_a.id}").to_return(
|
78
76
|
status: 200,
|
79
77
|
body: {
|
80
78
|
'score': Zold::Score::ZERO.to_h,
|
81
|
-
'
|
79
|
+
'size': 10_000,
|
82
80
|
'mtime': Time.now.utc.iso8601
|
83
81
|
}.to_json
|
84
82
|
)
|
83
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet_a.id}.bin")
|
84
|
+
.to_return(status: 200, body: IO.read(wallet_a.path))
|
85
85
|
wallet_b = home.create_wallet
|
86
|
-
stub_request(:get, "http://localhost:4096/wallet/#{wallet_b.id}/size")
|
87
|
-
.to_return(status: 200, body: wallet_b.size.to_s)
|
88
86
|
stub_request(:get, "http://localhost:4096/wallet/#{wallet_b.id}").to_return(
|
89
87
|
status: 200,
|
90
88
|
body: {
|
91
89
|
'score': Zold::Score::ZERO.to_h,
|
92
|
-
'
|
90
|
+
'size': 10_000,
|
93
91
|
'mtime': Time.now.utc.iso8601
|
94
92
|
}.to_json
|
95
93
|
)
|
94
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet_b.id}.bin")
|
95
|
+
.to_return(status: 200, body: IO.read(wallet_b.path))
|
96
96
|
remotes = home.remotes
|
97
97
|
remotes.add('localhost', 4096)
|
98
98
|
copies_a = home.copies(wallet_a)
|
@@ -115,16 +115,16 @@ class TestFetch < Zold::Test
|
|
115
115
|
def test_fails_when_only_edge_nodes
|
116
116
|
FakeHome.new(log: test_log).run do |home|
|
117
117
|
wallet = home.create_wallet
|
118
|
-
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}/size")
|
119
|
-
.to_return(status: 200, body: wallet.size.to_s)
|
120
118
|
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}").to_return(
|
121
119
|
status: 200,
|
122
120
|
body: {
|
123
121
|
'score': Zold::Score::ZERO.to_h,
|
124
|
-
'
|
122
|
+
'size': 10_000,
|
125
123
|
'mtime': Time.now.utc.iso8601
|
126
124
|
}.to_json
|
127
125
|
)
|
126
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}.bin")
|
127
|
+
.to_return(status: 200, body: IO.read(wallet.path))
|
128
128
|
remotes = home.remotes
|
129
129
|
remotes.add('localhost', 4096)
|
130
130
|
copies = home.copies(wallet)
|
@@ -139,16 +139,16 @@ class TestFetch < Zold::Test
|
|
139
139
|
def test_fails_when_only_one_node
|
140
140
|
FakeHome.new(log: test_log).run do |home|
|
141
141
|
wallet = home.create_wallet
|
142
|
-
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}/size")
|
143
|
-
.to_return(status: 200, body: wallet.size.to_s)
|
144
142
|
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}").to_return(
|
145
143
|
status: 200,
|
146
144
|
body: {
|
147
145
|
'score': Zold::Score::ZERO.to_h,
|
148
|
-
'
|
146
|
+
'size': 10_000,
|
149
147
|
'mtime': Time.now.utc.iso8601
|
150
148
|
}.to_json
|
151
149
|
)
|
150
|
+
stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}.bin")
|
151
|
+
.to_return(status: 200, body: IO.read(wallet.path))
|
152
152
|
remotes = home.remotes
|
153
153
|
remotes.add('localhost', 4096)
|
154
154
|
copies = home.copies(wallet)
|
data/test/commands/test_pay.rb
CHANGED
@@ -57,9 +57,10 @@ class TestPay < Zold::Test
|
|
57
57
|
remotes = home.remotes
|
58
58
|
remotes.add('localhost', 4096)
|
59
59
|
json = home.create_wallet_json
|
60
|
-
|
61
|
-
|
60
|
+
hash = Zold::JsonPage.new(json).to_hash
|
61
|
+
id = hash['id']
|
62
62
|
stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 200, body: json)
|
63
|
+
stub_request(:get, "http://localhost:4096/wallet/#{id}.bin").to_return(status: 200, body: hash['body'])
|
63
64
|
home.wallets.acq(Zold::Id.new(id)) { |w| File.delete(w.path) }
|
64
65
|
source = home.create_wallet
|
65
66
|
amount = Zold::Amount.new(zld: 14.95)
|
data/test/commands/test_pull.rb
CHANGED
@@ -38,9 +38,10 @@ class TestPull < Zold::Test
|
|
38
38
|
remotes = home.remotes
|
39
39
|
remotes.add('localhost', 4096)
|
40
40
|
json = home.create_wallet_json
|
41
|
-
|
42
|
-
|
41
|
+
hash = Zold::JsonPage.new(json).to_hash
|
42
|
+
id = hash['id']
|
43
43
|
stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 200, body: json)
|
44
|
+
stub_request(:get, "http://localhost:4096/wallet/#{id}.bin").to_return(status: 200, body: hash['body'])
|
44
45
|
Zold::Pull.new(wallets: home.wallets, remotes: remotes, copies: home.copies.root.to_s, log: test_log).run(
|
45
46
|
['--ignore-this-stupid-option', 'pull', id.to_s, '--tolerate-edges', '--tolerate-quorum=1']
|
46
47
|
)
|
@@ -55,9 +56,10 @@ class TestPull < Zold::Test
|
|
55
56
|
remotes = home.remotes
|
56
57
|
remotes.add('localhost', 4096)
|
57
58
|
json = home.create_wallet_json
|
58
|
-
|
59
|
-
|
59
|
+
hash = Zold::JsonPage.new(json).to_hash
|
60
|
+
id = hash['id']
|
60
61
|
stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 200, body: json)
|
62
|
+
stub_request(:get, "http://localhost:4096/wallet/#{id}.bin").to_return(status: 200, body: hash['body'])
|
61
63
|
assert_raises Zold::Fetch::EdgesOnly do
|
62
64
|
Zold::Pull.new(wallets: home.wallets, remotes: remotes, copies: home.copies.root.to_s, log: test_log).run(
|
63
65
|
['--ignore-this-stupid-option', 'pull', id.to_s]
|
data/test/fake_home.rb
CHANGED
data/test/node/test_front.rb
CHANGED
@@ -93,7 +93,6 @@ class FrontTest < Zold::Test
|
|
93
93
|
'/this-is-absent',
|
94
94
|
'/wallet/ffffeeeeddddcccc',
|
95
95
|
'/wallet/ffffeeeeddddcccc.bin',
|
96
|
-
'/wallet/ffffeeeeddddcccc.json',
|
97
96
|
'/wallet/ffffeeeeddddcccc.txt',
|
98
97
|
'/wallet/ffffeeeeddddcccc/balance',
|
99
98
|
'/wallet/ffffeeeeddddcccc/key',
|
@@ -147,12 +146,11 @@ class FrontTest < Zold::Test
|
|
147
146
|
FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--standalone']) do |port|
|
148
147
|
wallet = home.create_wallet(txns: 2)
|
149
148
|
base = "http://localhost:#{port}"
|
150
|
-
response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(
|
149
|
+
response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
|
151
150
|
assert_equal(200, response.status, response.body)
|
152
151
|
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
|
153
152
|
[
|
154
153
|
"/wallet/#{wallet.id}.txt",
|
155
|
-
"/wallet/#{wallet.id}.json",
|
156
154
|
"/wallet/#{wallet.id}/balance",
|
157
155
|
"/wallet/#{wallet.id}/key",
|
158
156
|
"/wallet/#{wallet.id}/mtime",
|
@@ -177,7 +175,7 @@ class FrontTest < Zold::Test
|
|
177
175
|
FakeHome.new(log: test_log).run do |home|
|
178
176
|
wallet = home.create_wallet
|
179
177
|
base = "http://localhost:#{port}"
|
180
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(
|
178
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
|
181
179
|
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
|
182
180
|
threads = []
|
183
181
|
mutex = Mutex.new
|
@@ -200,12 +198,11 @@ class FrontTest < Zold::Test
|
|
200
198
|
base = "http://localhost:#{port}"
|
201
199
|
assert_equal(
|
202
200
|
200,
|
203
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(
|
201
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path).status
|
204
202
|
)
|
205
203
|
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
|
206
204
|
3.times do
|
207
|
-
r = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}")
|
208
|
-
.put(IO.read(wallet.path))
|
205
|
+
r = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
|
209
206
|
assert_equal(304, r.status, r.body)
|
210
207
|
end
|
211
208
|
end
|
@@ -218,7 +215,7 @@ class FrontTest < Zold::Test
|
|
218
215
|
FakeHome.new(log: test_log).run do |home|
|
219
216
|
Threads.new(5).assert do
|
220
217
|
wallet = home.create_wallet
|
221
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(
|
218
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
|
222
219
|
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
|
223
220
|
end
|
224
221
|
end
|
@@ -350,12 +347,12 @@ class FrontTest < Zold::Test
|
|
350
347
|
FakeHome.new(log: test_log).run do |home|
|
351
348
|
wallet = home.create_wallet(Zold::Id::ROOT)
|
352
349
|
base = "http://localhost:#{port}"
|
353
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(
|
350
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
|
354
351
|
assert_equal_wait(200) { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status }
|
355
352
|
cycles = 50
|
356
353
|
cycles.times do
|
357
354
|
wallet.sub(Zold::Amount.new(zents: 10), "NOPREFIX@#{Zold::Id.new}", key)
|
358
|
-
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(
|
355
|
+
Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
|
359
356
|
assert_equal(200, Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").get.status)
|
360
357
|
end
|
361
358
|
assert_equal_wait(-10 * cycles) do
|
data/test/test_http.rb
CHANGED
@@ -98,7 +98,7 @@ class TestHttp < Zold::Test
|
|
98
98
|
Zold::VerboseThread.new(test_log).run do
|
99
99
|
server = TCPServer.new(port)
|
100
100
|
client = server.accept
|
101
|
-
client.puts("HTTP/1.1 200 OK\nContent-Length: 4\n\n")
|
101
|
+
client.puts("HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\n")
|
102
102
|
sleep 1
|
103
103
|
client.puts('Good')
|
104
104
|
client.close
|
@@ -139,7 +139,10 @@ class TestHttp < Zold::Test
|
|
139
139
|
socket.close
|
140
140
|
end
|
141
141
|
end
|
142
|
-
res =
|
142
|
+
res = Tempfile.open do |f|
|
143
|
+
IO.write(f, 'How are you?')
|
144
|
+
Zold::Http.new(uri: "http://127.0.0.1:#{port}/").put(f)
|
145
|
+
end
|
143
146
|
assert_equal(200, res.status, res)
|
144
147
|
assert(body.include?('Content-Length: 12'), body)
|
145
148
|
assert(body.include?('Content-Type: text/plain'))
|
@@ -157,4 +160,63 @@ class TestHttp < Zold::Test
|
|
157
160
|
res = Zold::Http.new(uri: 'http://some-host-3/').get
|
158
161
|
assert_equal(200, res.status, res)
|
159
162
|
end
|
163
|
+
|
164
|
+
def test_uploads_file
|
165
|
+
WebMock.allow_net_connect!
|
166
|
+
RandomPort::Pool::SINGLETON.acquire do |port|
|
167
|
+
thread = Thread.start do
|
168
|
+
Zold::VerboseThread.new(test_log).run do
|
169
|
+
server = TCPServer.new(port)
|
170
|
+
socket = server.accept
|
171
|
+
body = ''
|
172
|
+
stops = 0
|
173
|
+
loop do
|
174
|
+
part = socket.read_nonblock(5, exception: false)
|
175
|
+
if part == :wait_readable
|
176
|
+
break if stops > 5
|
177
|
+
stops += 1
|
178
|
+
sleep 0.001
|
179
|
+
else
|
180
|
+
body += part
|
181
|
+
stops = 0
|
182
|
+
end
|
183
|
+
end
|
184
|
+
socket.close_read
|
185
|
+
socket.print("HTTP/1.1 200 OK\nContent-Length: #{body.length}\n\n#{body}")
|
186
|
+
socket.close_write
|
187
|
+
end
|
188
|
+
end
|
189
|
+
content = "how are you\nmy friend"
|
190
|
+
res = Tempfile.open do |f|
|
191
|
+
IO.write(f, content)
|
192
|
+
Zold::Http.new(uri: "http://localhost:#{port}/").put(f)
|
193
|
+
end
|
194
|
+
assert_equal(200, res.status, res)
|
195
|
+
assert(res.body.include?(content), res)
|
196
|
+
thread.kill
|
197
|
+
thread.join
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_downloads_file
|
202
|
+
WebMock.allow_net_connect!
|
203
|
+
RandomPort::Pool::SINGLETON.acquire do |port|
|
204
|
+
content = "how are you\nmy friend" * 1000
|
205
|
+
thread = Thread.start do
|
206
|
+
Zold::VerboseThread.new(test_log).run do
|
207
|
+
server = TCPServer.new(port)
|
208
|
+
socket = server.accept
|
209
|
+
socket.print("HTTP/1.1 200 OK\nContent-Length: #{content.length}\n\n#{content}")
|
210
|
+
socket.close_write
|
211
|
+
end
|
212
|
+
end
|
213
|
+
body = Tempfile.open do |f|
|
214
|
+
Zold::Http.new(uri: "http://localhost:#{port}/").get_file(f)
|
215
|
+
IO.read(f)
|
216
|
+
end
|
217
|
+
assert(body.include?(content), body)
|
218
|
+
thread.kill
|
219
|
+
thread.join
|
220
|
+
end
|
221
|
+
end
|
160
222
|
end
|
data/test/test_hungry_wallets.rb
CHANGED
@@ -37,7 +37,7 @@ class TestHungryWallets < Zold::Test
|
|
37
37
|
def test_pulls_wallet
|
38
38
|
FakeHome.new(log: test_log).run do |home|
|
39
39
|
id = Zold::Id.new
|
40
|
-
get = stub_request(:get, "http://localhost:4096/wallet/#{id}
|
40
|
+
get = stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 404)
|
41
41
|
remotes = home.remotes
|
42
42
|
remotes.add('localhost', 4096)
|
43
43
|
pool = Zold::ThreadPool.new('test', log: test_log)
|
data/zold.gemspec
CHANGED
@@ -69,6 +69,7 @@ and suggests a different architecture for digital wallet maintenance.'
|
|
69
69
|
s.add_runtime_dependency 'get_process_mem', '~>0.2'
|
70
70
|
s.add_runtime_dependency 'json', '2.1.0'
|
71
71
|
s.add_runtime_dependency 'memory_profiler', '0.9.12'
|
72
|
+
s.add_runtime_dependency 'mimic', '0.4.2'
|
72
73
|
s.add_runtime_dependency 'openssl', '2.1.2'
|
73
74
|
s.add_runtime_dependency 'rainbow', '3.0.0'
|
74
75
|
s.add_runtime_dependency 'rake', '12.3.1' # has to stay here for Heroku
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.21.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 0.9.12
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: mimic
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - '='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.4.2
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - '='
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.4.2
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: openssl
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -692,7 +706,7 @@ licenses:
|
|
692
706
|
- MIT
|
693
707
|
metadata: {}
|
694
708
|
post_install_message: |-
|
695
|
-
Thanks for installing Zold 0.
|
709
|
+
Thanks for installing Zold 0.21.0!
|
696
710
|
Study our White Paper: https://papers.zold.io/wp.pdf
|
697
711
|
Read our blog posts: https://blog.zold.io
|
698
712
|
Try online wallet at: https://wts.zold.io
|