zold 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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