zold 0.15.0 → 0.16.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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/bin/zold +9 -6
  4. data/features/gem_package.feature +1 -1
  5. data/features/step_definitions/steps.rb +2 -2
  6. data/fixtures/merge/into-no-wallet/assert.rb +1 -1
  7. data/fixtures/merge/random-expenses/assert.rb +1 -1
  8. data/fixtures/merge/simple-case/assert.rb +1 -1
  9. data/lib/zold/age.rb +16 -8
  10. data/lib/zold/amount.rb +4 -2
  11. data/lib/zold/cached_wallets.rb +5 -6
  12. data/lib/zold/commands/clean.rb +15 -8
  13. data/lib/zold/commands/diff.rb +3 -3
  14. data/lib/zold/commands/fetch.rb +4 -4
  15. data/lib/zold/commands/list.rb +5 -4
  16. data/lib/zold/commands/merge.rb +2 -1
  17. data/lib/zold/commands/node.rb +14 -12
  18. data/lib/zold/commands/propagate.rb +2 -2
  19. data/lib/zold/commands/push.rb +3 -3
  20. data/lib/zold/commands/remove.rb +4 -1
  21. data/lib/zold/commands/routines/reconnect.rb +1 -0
  22. data/lib/zold/copies.rb +13 -14
  23. data/lib/zold/dir_items.rb +44 -0
  24. data/lib/zold/head.rb +1 -1
  25. data/lib/zold/key.rb +2 -2
  26. data/lib/zold/log.rb +2 -0
  27. data/lib/zold/node/async_entrance.rb +38 -28
  28. data/lib/zold/node/entrance.rb +4 -11
  29. data/lib/zold/node/farm.rb +9 -9
  30. data/lib/zold/node/front.rb +40 -25
  31. data/lib/zold/node/nodup_entrance.rb +4 -4
  32. data/lib/zold/node/safe_entrance.rb +2 -2
  33. data/lib/zold/node/spread_entrance.rb +5 -9
  34. data/lib/zold/node/sync_entrance.rb +2 -23
  35. data/lib/zold/patch.rb +2 -2
  36. data/lib/zold/remotes.rb +10 -6
  37. data/lib/zold/sync_wallets.rb +3 -22
  38. data/lib/zold/tree_wallets.rb +11 -6
  39. data/lib/zold/txns.rb +1 -1
  40. data/lib/zold/version.rb +1 -1
  41. data/lib/zold/wallet.rb +14 -5
  42. data/lib/zold/wallets.rb +5 -4
  43. data/test/commands/routines/test_spread.rb +1 -1
  44. data/test/commands/test_alias.rb +4 -4
  45. data/test/commands/test_clean.rb +14 -1
  46. data/test/commands/test_create.rb +2 -2
  47. data/test/commands/test_diff.rb +5 -5
  48. data/test/commands/test_fetch.rb +2 -2
  49. data/test/commands/test_merge.rb +19 -19
  50. data/test/commands/test_node.rb +1 -1
  51. data/test/commands/test_pay.rb +7 -6
  52. data/test/commands/test_propagate.rb +2 -1
  53. data/test/commands/test_pull.rb +1 -1
  54. data/test/commands/test_push.rb +1 -1
  55. data/test/commands/test_remove.rb +57 -0
  56. data/test/commands/test_taxes.rb +1 -1
  57. data/test/fake_home.rb +11 -8
  58. data/test/node/fake_node.rb +2 -2
  59. data/test/node/test_async_entrance.rb +24 -8
  60. data/test/node/test_emission.rb +2 -2
  61. data/test/node/test_entrance.rb +8 -6
  62. data/test/node/test_farm.rb +1 -1
  63. data/test/node/test_front.rb +42 -33
  64. data/test/node/test_nodup_entrance.rb +2 -2
  65. data/test/node/test_safe_entrance.rb +5 -5
  66. data/test/node/test_spread_entrance.rb +3 -3
  67. data/test/node/test_sync_entrance.rb +1 -1
  68. data/test/test__helper.rb +3 -29
  69. data/test/test_cached_wallets.rb +1 -1
  70. data/test/test_copies.rb +4 -2
  71. data/test/test_dir_items.rb +88 -0
  72. data/test/test_key.rb +2 -2
  73. data/test/test_log.rb +38 -0
  74. data/test/test_patch.rb +11 -11
  75. data/test/test_prefixes.rb +1 -1
  76. data/test/test_remotes.rb +12 -6
  77. data/test/test_sync_wallets.rb +6 -6
  78. data/test/test_tax.rb +4 -4
  79. data/test/test_tree_wallets.rb +16 -2
  80. data/test/test_wallet.rb +26 -26
  81. data/test/test_wallets.rb +5 -2
  82. data/test/test_zold.rb +2 -2
  83. data/test/upgrades/test_protocol_up.rb +1 -1
  84. data/upgrades/move_wallets_into_tree.rb +1 -1
  85. data/upgrades/protocol_up.rb +3 -3
  86. data/upgrades/rename_foreign_wallets.rb +1 -1
  87. data/zold.gemspec +27 -25
  88. metadata +91 -56
@@ -29,7 +29,7 @@ require_relative '../../lib/zold/amount'
29
29
  class EmissionTest < Minitest::Test
30
30
  def test_emission
31
31
  (1..10).each do |year|
32
- FakeHome.new.run do |home|
32
+ FakeHome.new(log: test_log).run do |home|
33
33
  wallet = home.create_wallet
34
34
  wallet.add(
35
35
  Zold::Txn.new(
@@ -45,7 +45,7 @@ Limit: #{Zold::Emission.new(wallet).limit}")
45
45
  end
46
46
 
47
47
  def test_emission_passes
48
- FakeHome.new.run do |home|
48
+ FakeHome.new(log: test_log).run do |home|
49
49
  wallet = home.create_wallet(Zold::Id::ROOT)
50
50
  wallet.add(
51
51
  Zold::Txn.new(
@@ -39,7 +39,7 @@ class TestEntrance < Minitest::Test
39
39
  def test_pushes_wallet
40
40
  sid = Zold::Id::ROOT
41
41
  tid = Zold::Id.new
42
- body = FakeHome.new.run do |home|
42
+ body = FakeHome.new(log: test_log).run do |home|
43
43
  source = home.create_wallet(sid)
44
44
  target = home.create_wallet(tid)
45
45
  Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: test_log).run(
@@ -48,13 +48,15 @@ class TestEntrance < Minitest::Test
48
48
  source.id.to_s, target.id.to_s, '19.99', 'testing'
49
49
  ]
50
50
  )
51
- File.read(source.path)
51
+ IO.read(source.path)
52
52
  end
53
- FakeHome.new.run do |home|
53
+ FakeHome.new(log: test_log).run do |home|
54
54
  source = home.create_wallet(sid)
55
- home.create_wallet(tid)
55
+ target = home.create_wallet(tid)
56
56
  e = Zold::Entrance.new(home.wallets, home.remotes, home.copies(source).root, 'x', log: test_log)
57
57
  modified = e.push(source.id, body)
58
+ assert_equal(Zold::Amount.new(zld: -19.99), source.balance)
59
+ assert_equal(Zold::Amount.new(zld: 19.99), target.balance)
58
60
  assert_equal(2, modified.count)
59
61
  assert(modified.include?(sid))
60
62
  assert(modified.include?(tid))
@@ -62,10 +64,10 @@ class TestEntrance < Minitest::Test
62
64
  end
63
65
 
64
66
  def test_renders_json
65
- FakeHome.new.run do |home|
67
+ FakeHome.new(log: test_log).run do |home|
66
68
  wallet = home.create_wallet
67
69
  e = Zold::Entrance.new(home.wallets, home.remotes, home.copies.root, 'x', log: test_log)
68
- e.push(wallet.id, File.read(wallet.path))
70
+ e.push(wallet.id, IO.read(wallet.path))
69
71
  assert(e.to_json[:history].include?(wallet.id.to_s))
70
72
  assert(!e.to_json[:speed].negative?)
71
73
  end
@@ -106,7 +106,7 @@ class FarmTest < Minitest::Test
106
106
  suffixes: %w[13f7f01 b2b32b 4ade7e],
107
107
  strength: 6
108
108
  )
109
- File.write(cache, score.to_s)
109
+ IO.write(cache, score.to_s)
110
110
  farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: test_log)
111
111
  farm.start(score.host, score.port, threads: 1, strength: score.strength) do
112
112
  100.times do
@@ -24,6 +24,7 @@ require 'minitest/autorun'
24
24
  require 'json'
25
25
  require 'time'
26
26
  require 'securerandom'
27
+ require 'threads'
27
28
  require_relative '../test__helper'
28
29
  require_relative 'fake_node'
29
30
  require_relative '../fake_home'
@@ -33,6 +34,10 @@ require_relative '../../lib/zold/json_page'
33
34
  require_relative '../../lib/zold/score'
34
35
 
35
36
  class FrontTest < Minitest::Test
37
+ def app
38
+ Zold::Front
39
+ end
40
+
36
41
  def test_renders_front_json
37
42
  FakeNode.new(log: test_log).run(['--no-metronome', '--network=foo', '--threads=0']) do |port|
38
43
  res = Zold::Http.new(uri: "http://localhost:#{port}/", network: 'foo', score: nil).get
@@ -51,7 +56,7 @@ class FrontTest < Minitest::Test
51
56
  end
52
57
 
53
58
  def test_renders_public_pages
54
- FakeNode.new(log: test_log).run(['--ignore-score-weakness']) do |port|
59
+ FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--no-metronome', '--threads=0']) do |port|
55
60
  {
56
61
  '200' => [
57
62
  '/robots.txt',
@@ -66,7 +71,14 @@ class FrontTest < Minitest::Test
66
71
  ],
67
72
  '404' => [
68
73
  '/this-is-absent',
69
- '/wallet/ffffeeeeddddcccc'
74
+ '/wallet/ffffeeeeddddcccc',
75
+ '/wallet/ffffeeeeddddcccc.bin',
76
+ '/wallet/ffffeeeeddddcccc.json',
77
+ '/wallet/ffffeeeeddddcccc.txt',
78
+ '/wallet/ffffeeeeddddcccc/balance',
79
+ '/wallet/ffffeeeeddddcccc/key',
80
+ '/wallet/ffffeeeeddddcccc/mtime',
81
+ '/wallet/ffffeeeeddddcccc/digest'
70
82
  ]
71
83
  }.each do |code, paths|
72
84
  paths.each do |p|
@@ -98,12 +110,12 @@ class FrontTest < Minitest::Test
98
110
  end
99
111
 
100
112
  def test_renders_wallet_pages
101
- FakeHome.new.run do |home|
113
+ FakeHome.new(log: test_log).run do |home|
102
114
  FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--standalone']) do |port|
103
115
  wallet = home.create_wallet
104
116
  base = "http://localhost:#{port}"
105
117
  response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil)
106
- .put(File.read(wallet.path))
118
+ .put(IO.read(wallet.path))
107
119
  assert_equal('200', response.code, response.body)
108
120
  assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get.code }
109
121
  [
@@ -123,15 +135,15 @@ class FrontTest < Minitest::Test
123
135
  end
124
136
 
125
137
  def test_fetch_in_multiple_threads
126
- FakeNode.new(log: test_log).run(['--no-metronome']) do |port|
127
- FakeHome.new.run do |home|
138
+ FakeNode.new(log: test_log).run(['--no-metronome', '--threads=0', '--standalone']) do |port|
139
+ FakeHome.new(log: test_log).run do |home|
128
140
  wallet = home.create_wallet
129
141
  base = "http://localhost:#{port}"
130
- Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(File.read(wallet.path))
142
+ Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(IO.read(wallet.path))
131
143
  assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get.code }
132
144
  threads = []
133
145
  mutex = Mutex.new
134
- assert_in_threads(loops: 100) do
146
+ Threads.new(6).assert(100) do
135
147
  assert_equal_wait('200') do
136
148
  res = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get
137
149
  mutex.synchronize { threads << res.header['X-Zold-Thread'] }
@@ -144,18 +156,18 @@ class FrontTest < Minitest::Test
144
156
  end
145
157
 
146
158
  def test_pushes_twice
147
- FakeNode.new(log: test_log).run do |port|
148
- FakeHome.new.run do |home|
159
+ FakeNode.new(log: test_log).run(['--no-metronome', '--threads=0', '--standalone']) do |port|
160
+ FakeHome.new(log: test_log).run do |home|
149
161
  wallet = home.create_wallet
150
162
  base = "http://localhost:#{port}"
151
163
  assert_equal(
152
164
  '200',
153
- Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(File.read(wallet.path)).code
165
+ Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(IO.read(wallet.path)).code
154
166
  )
155
167
  assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get.code }
156
168
  3.times do
157
169
  r = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil)
158
- .put(File.read(wallet.path))
170
+ .put(IO.read(wallet.path))
159
171
  assert_equal('304', r.code, r.body)
160
172
  end
161
173
  end
@@ -163,12 +175,12 @@ class FrontTest < Minitest::Test
163
175
  end
164
176
 
165
177
  def test_pushes_many_wallets
166
- FakeNode.new(log: test_log).run do |port|
178
+ FakeNode.new(log: test_log).run(['--no-metronome', '--threads=0', '--standalone']) do |port|
167
179
  base = "http://localhost:#{port}"
168
- FakeHome.new.run do |home|
169
- assert_in_threads(threads: 20) do
180
+ FakeHome.new(log: test_log).run do |home|
181
+ Threads.new(5).assert do
170
182
  wallet = home.create_wallet
171
- Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(File.read(wallet.path))
183
+ Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(IO.read(wallet.path))
172
184
  assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get.code }
173
185
  end
174
186
  end
@@ -181,7 +193,6 @@ class FrontTest < Minitest::Test
181
193
  '4' => 'https://www.zold.io/images/logo-orange.png',
182
194
  '16' => 'https://www.zold.io/images/logo-green.png'
183
195
  }.each do |num, path|
184
- test_log.info("Calculating score #{num}...")
185
196
  score = Zold::Score.new(
186
197
  time: Time.now, host: 'localhost', port: 999,
187
198
  invoice: 'NOPREFIX@ffffffffffffffff',
@@ -190,7 +201,6 @@ class FrontTest < Minitest::Test
190
201
  num.to_i.times do
191
202
  score = score.next
192
203
  end
193
- test_log.info("Score #{num} calculated.")
194
204
  if score.value >= 16
195
205
  assert_equal(
196
206
  path, 'https://www.zold.io/images/logo-green.png',
@@ -225,23 +235,22 @@ class FrontTest < Minitest::Test
225
235
  end
226
236
 
227
237
  def test_performance
228
- start = Time.now
229
- total = 50
238
+ times = Queue.new
230
239
  FakeNode.new(log: test_log).run(['--threads=4', '--strength=6', '--no-metronome']) do |port|
231
- total.times do
240
+ Threads.new(10).assert(100) do
241
+ start = Time.now
232
242
  Zold::Http.new(uri: URI("http://localhost:#{port}/"), score: nil).get
243
+ times << Time.now - start
233
244
  end
234
245
  end
235
- test_log.info("Average response time is #{Zold::Age.new(start)}")
236
- end
237
-
238
- def app
239
- Zold::Front
246
+ all = []
247
+ all << times.pop(true) until times.empty?
248
+ test_log.info("Average response time is #{all.inject(&:+) / all.count}")
240
249
  end
241
250
 
242
251
  def test_headers_are_being_set_correctly
243
252
  Time.stub :now, Time.at(0) do
244
- FakeNode.new(log: test_log).run(['--ignore-score-weakness']) do |port|
253
+ FakeNode.new(log: test_log).run(['--no-metronome', '--threads=0', '--ignore-score-weakness']) do |port|
245
254
  response = Zold::Http.new(uri: URI("http://localhost:#{port}/"), score: nil).get
246
255
  assert_equal('no-cache', response.header['Cache-Control'])
247
256
  assert_equal('close', response.header['Connection'])
@@ -273,7 +282,7 @@ class FrontTest < Minitest::Test
273
282
  end
274
283
 
275
284
  def test_default_alias_parameter
276
- FakeNode.new(log: test_log).run(['--ignore-score-weakness']) do |port|
285
+ FakeNode.new(log: test_log).run(['--ignore-score-weakness', '--no-metronome']) do |port|
277
286
  uri = URI("http://localhost:#{port}/")
278
287
  response = Zold::Http.new(uri: uri, score: nil).get
279
288
  assert_match(
@@ -295,17 +304,17 @@ class FrontTest < Minitest::Test
295
304
  end
296
305
 
297
306
  def test_push_fetch_in_multiple_threads
298
- key = Zold::Key.new(text: File.read('fixtures/id_rsa'))
299
- FakeNode.new(log: test_log).run do |port|
300
- FakeHome.new.run do |home|
307
+ key = Zold::Key.new(text: IO.read('fixtures/id_rsa'))
308
+ FakeNode.new(log: test_log).run(['--no-metronome', '--threads=0', '--standalone']) do |port|
309
+ FakeHome.new(log: test_log).run do |home|
301
310
  wallet = home.create_wallet(Zold::Id::ROOT)
302
311
  base = "http://localhost:#{port}"
303
- Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(File.read(wallet.path))
312
+ Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(IO.read(wallet.path))
304
313
  assert_equal_wait('200') { Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get.code }
305
314
  cycles = 50
306
315
  cycles.times do
307
316
  wallet.sub(Zold::Amount.new(coins: 10), "NOPREFIX@#{Zold::Id.new}", key)
308
- Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(File.read(wallet.path))
317
+ Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).put(IO.read(wallet.path))
309
318
  assert_equal('200', Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}", score: nil).get.code)
310
319
  end
311
320
  assert_equal_wait(-10 * cycles) do
@@ -33,10 +33,10 @@ require_relative 'fake_entrance'
33
33
  # License:: MIT
34
34
  class TestAsyncEntrance < Minitest::Test
35
35
  def test_ignores_dup
36
- FakeHome.new.run do |home|
36
+ FakeHome.new(log: test_log).run do |home|
37
37
  wallet = home.create_wallet
38
38
  Zold::NoDupEntrance.new(RealEntrance.new, home.wallets, log: test_log).start do |e|
39
- assert(e.push(wallet.id, File.read(wallet.path)).empty?)
39
+ assert(e.push(wallet.id, IO.read(wallet.path)).empty?)
40
40
  end
41
41
  end
42
42
  end
@@ -35,23 +35,23 @@ require_relative 'fake_entrance'
35
35
  # License:: MIT
36
36
  class TestSafeEntrance < Minitest::Test
37
37
  def test_rejects_wallet_with_negative_balance
38
- FakeHome.new.run do |home|
38
+ FakeHome.new(log: test_log).run do |home|
39
39
  wallet = home.create_wallet
40
40
  amount = Zold::Amount.new(zld: 39.99)
41
41
  key = Zold::Key.new(file: 'fixtures/id_rsa')
42
42
  wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
43
43
  assert_raises StandardError do
44
- Zold::SafeEntrance.new(FakeEntrance.new).push(wallet.id, File.read(wallet.path))
44
+ Zold::SafeEntrance.new(FakeEntrance.new).push(wallet.id, IO.read(wallet.path))
45
45
  end
46
46
  end
47
47
  end
48
48
 
49
49
  def test_rejects_wallet_with_wrong_network
50
- FakeHome.new.run do |home|
51
- wallet = Zold::Wallet.new(File.join(home.dir, 'wallet'))
50
+ FakeHome.new(log: test_log).run do |home|
51
+ wallet = Zold::Wallet.new(File.join(home.dir, 'wallet.z'))
52
52
  wallet.init(Zold::Id.new, Zold::Key.new(file: 'fixtures/id_rsa.pub'), network: 'someothernetwork')
53
53
  assert_raises StandardError do
54
- Zold::SafeEntrance.new(FakeEntrance.new).push(wallet.id, File.read(wallet.path))
54
+ Zold::SafeEntrance.new(FakeEntrance.new).push(wallet.id, IO.read(wallet.path))
55
55
  end
56
56
  end
57
57
  end
@@ -35,7 +35,7 @@ require_relative 'fake_entrance'
35
35
  # License:: MIT
36
36
  class TestSpreadEntrance < Minitest::Test
37
37
  def test_renders_json
38
- FakeHome.new.run do |home|
38
+ FakeHome.new(log: test_log).run do |home|
39
39
  wallet = home.create_wallet(Zold::Id.new)
40
40
  Zold::SpreadEntrance.new(
41
41
  Zold::Entrance.new(home.wallets, home.remotes, home.copies(wallet).root, 'x', log: test_log),
@@ -47,13 +47,13 @@ class TestSpreadEntrance < Minitest::Test
47
47
  end
48
48
 
49
49
  def test_ignores_duplicates
50
- FakeHome.new.run do |home|
50
+ FakeHome.new(log: test_log).run do |home|
51
51
  FakeNode.new(log: test_log).run(['--ignore-score-weakness']) do |port|
52
52
  wallet = home.create_wallet
53
53
  remotes = home.remotes
54
54
  remotes.add('localhost', port)
55
55
  Zold::SpreadEntrance.new(FakeEntrance.new, home.wallets, remotes, 'x', log: test_log).start do |e|
56
- 8.times { e.push(wallet.id, File.read(wallet.path)) }
56
+ 8.times { e.push(wallet.id, IO.read(wallet.path)) }
57
57
  assert(e.to_json[:modified] < 2, "It's too big: #{e.to_json[:modified]}")
58
58
  end
59
59
  end
@@ -32,7 +32,7 @@ require_relative 'fake_entrance'
32
32
  # License:: MIT
33
33
  class TestSyncEntrance < Minitest::Test
34
34
  def test_renders_json
35
- FakeHome.new.run do
35
+ FakeHome.new(log: test_log).run do
36
36
  Zold::SyncEntrance.new(FakeEntrance.new, log: test_log).start do |e|
37
37
  assert(!e.to_json.nil?)
38
38
  end
data/test/test__helper.rb CHANGED
@@ -53,40 +53,14 @@ module Minitest
53
53
  end
54
54
  sleep 1
55
55
  sec = Time.now - start
56
- raise "'#{actual}' is not equal to '#{expected}' even after #{Age.new(start)} of waiting" if sec > max
56
+ require_relative '../lib/zold/age'
57
+ raise "'#{actual}' is not equal to '#{expected}' even after #{Zold::Age.new(start)} of waiting" if sec > max
57
58
  end
58
59
  end
59
60
 
60
- def assert_in_threads(threads: Concurrent.processor_count * 8, loops: 0)
61
- done = Concurrent::AtomicFixnum.new
62
- cycles = Concurrent::AtomicFixnum.new
63
- pool = Concurrent::FixedThreadPool.new(threads)
64
- latch = Concurrent::CountDownLatch.new(1)
65
- threads.times do |t|
66
- pool.post do
67
- Thread.current.name = "assert-thread-#{t}"
68
- latch.wait(10)
69
- loop do
70
- Zold::VerboseThread.new(test_log).run(true) do
71
- yield t
72
- end
73
- cycles.increment
74
- break if cycles.value > loops
75
- end
76
- done.increment
77
- end
78
- end
79
- latch.count_down
80
- pool.shutdown
81
- pool.kill unless pool.wait_for_termination(10)
82
- assert_equal(threads, done.value)
83
- end
84
-
85
61
  def test_log
86
62
  require_relative '../lib/zold/log'
87
- @test_log = Zold::Log::Verbose.new
88
- @test_log = Zold::Log::Quiet.new if ENV['TEST_QUIET_LOG']
89
- Zold::Log::Sync.new(@test_log)
63
+ @test_log ||= Zold::Log::Sync.new(ENV['TEST_QUIET_LOG'] ? Zold::Log::Quiet.new : Zold::Log::Verbose.new)
90
64
  end
91
65
 
92
66
  class TestLogger
@@ -35,7 +35,7 @@ require_relative '../lib/zold/amount'
35
35
  # License:: MIT
36
36
  class TestCachedWallets < Minitest::Test
37
37
  def test_adds_wallet
38
- FakeHome.new.run do |home|
38
+ FakeHome.new(log: test_log).run do |home|
39
39
  wallets = Zold::CachedWallets.new(home.wallets)
40
40
  id = Zold::Id.new
41
41
  first = nil
data/test/test_copies.rb CHANGED
@@ -26,7 +26,9 @@ require 'time'
26
26
  require_relative 'fake_home'
27
27
  require_relative 'test__helper'
28
28
  require_relative '../lib/zold/id'
29
+ require_relative '../lib/zold/age'
29
30
  require_relative '../lib/zold/copies'
31
+ require_relative '../lib/zold/dir_items'
30
32
  require_relative '../lib/zold/wallet'
31
33
 
32
34
  # Copies test.
@@ -121,12 +123,12 @@ class TestCopies < Minitest::Test
121
123
 
122
124
  def content(text)
123
125
  id = Zold::Id.new('aaaabbbbccccdddd')
124
- FakeHome.new.run do |home|
126
+ FakeHome.new(log: test_log).run do |home|
125
127
  wallet = home.create_wallet(id)
126
128
  amount = Zold::Amount.new(zld: 1.99)
127
129
  key = Zold::Key.new(file: 'fixtures/id_rsa')
128
130
  wallet.sub(amount, 'NOPREFIX@0000111122223333', key, text, time: Time.parse('2018-01-01T01:01:01Z'))
129
- File.read(wallet.path)
131
+ IO.read(wallet.path)
130
132
  end
131
133
  end
132
134
  end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018 Yegor Bugayenko
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'minitest/autorun'
24
+ require 'tmpdir'
25
+ require 'threads'
26
+ require_relative 'test__helper'
27
+ require_relative '../lib/zold/age'
28
+ require_relative '../lib/zold/dir_items'
29
+
30
+ # DirItems test.
31
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
32
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
33
+ # License:: MIT
34
+ class TestDirItems < Minitest::Test
35
+ def test_intensive_write_in_threads
36
+ Dir.mktmpdir do |dir|
37
+ file = File.join(dir, 'hey.txt')
38
+ Thread.start do
39
+ loop do
40
+ Zold::DirItems.new(dir).fetch
41
+ end
42
+ end
43
+ Threads.new(100).assert do
44
+ start = Time.now
45
+ File.open(file, 'w+') do |f|
46
+ f.write('test')
47
+ end
48
+ test_log.debug("Saved in #{Zold::Age.new(start)}")
49
+ sleep 1
50
+ end
51
+ end
52
+ end
53
+
54
+ def test_lists_empty_dir
55
+ Dir.mktmpdir do |dir|
56
+ assert_equal(0, Zold::DirItems.new(File.join(dir, 'a/b/c')).fetch.count)
57
+ end
58
+ end
59
+
60
+ def test_lists_recursively
61
+ Dir.mktmpdir do |dir|
62
+ files = ['test1.txt', 'a/b/c/text', 'd/e/f/text', 'a/b/c/zz/text.1.2.3']
63
+ files.each do |f|
64
+ path = File.join(dir, f)
65
+ FileUtils.mkdir_p(File.dirname(path))
66
+ FileUtils.touch(path)
67
+ end
68
+ found = Zold::DirItems.new(dir).fetch
69
+ assert_equal(files.count, found.count)
70
+ files.each do |f|
71
+ assert(found.include?(f), f)
72
+ end
73
+ end
74
+ end
75
+
76
+ def test_lists_non_recursively
77
+ Dir.mktmpdir do |dir|
78
+ files = ['1.txt', 'a/1.txt', 'a/b/1.txt', 'a/b/c/1.txt']
79
+ files.each do |f|
80
+ path = File.join(dir, f)
81
+ FileUtils.mkdir_p(File.dirname(path))
82
+ FileUtils.touch(path)
83
+ end
84
+ found = Zold::DirItems.new(dir).fetch(recursive: false)
85
+ assert_equal(1, found.count)
86
+ end
87
+ end
88
+ end