zold 0.31.8 → 0.31.9

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 (196) hide show
  1. checksums.yaml +4 -4
  2. data/.0pdd.yml +20 -0
  3. data/.github/workflows/actionlint.yml +41 -0
  4. data/.github/workflows/codecov.yml +23 -4
  5. data/.github/workflows/copyrights.yml +30 -0
  6. data/.github/workflows/pdd.yml +26 -3
  7. data/.github/workflows/rake.yml +24 -2
  8. data/.github/workflows/xcop.yml +21 -2
  9. data/.github/workflows/yamllint.yml +34 -0
  10. data/.gitignore +2 -1
  11. data/.rubocop.yml +21 -0
  12. data/.ruby-version +1 -1
  13. data/.rultor.yml +35 -5
  14. data/.simplecov +1 -1
  15. data/Dockerfile +29 -3
  16. data/Gemfile +10 -10
  17. data/Gemfile.lock +340 -0
  18. data/LICENSE.txt +1 -1
  19. data/Rakefile +9 -12
  20. data/bin/zold +1 -1
  21. data/cucumber.yml +20 -0
  22. data/deploy.sh +20 -0
  23. data/features/step_definitions/steps.rb +1 -1
  24. data/features/support/env.rb +1 -1
  25. data/fixtures/merge/asserts.rb +1 -1
  26. data/fixtures/merge/into_no_wallet/assert.rb +1 -1
  27. data/fixtures/merge/legacy_negatives_stay/assert.rb +1 -1
  28. data/fixtures/merge/missed_wallets/assert.rb +1 -1
  29. data/fixtures/merge/negative_overwriting/assert.rb +1 -1
  30. data/fixtures/merge/negatives_in_between/assert.rb +1 -1
  31. data/fixtures/merge/random_expenses/assert.rb +1 -1
  32. data/fixtures/merge/simple_case/assert.rb +1 -1
  33. data/fixtures/merge/unconfirmed_income/assert.rb +1 -1
  34. data/fixtures/scripts/_head.sh +21 -1
  35. data/fixtures/scripts/calculate-scores.sh +19 -0
  36. data/fixtures/scripts/distribute-wallet.sh +19 -0
  37. data/fixtures/scripts/print-helps.sh +19 -0
  38. data/fixtures/scripts/pull-on-start.sh +19 -0
  39. data/fixtures/scripts/push-and-pull.sh +19 -0
  40. data/fixtures/scripts/redeploy-on-upgrade.sh +19 -0
  41. data/fixtures/scripts/spread-wallets.sh +19 -0
  42. data/lib/zold/age.rb +2 -2
  43. data/lib/zold/amount.rb +2 -2
  44. data/lib/zold/cached_wallets.rb +3 -3
  45. data/lib/zold/commands/alias.rb +20 -0
  46. data/lib/zold/commands/args.rb +2 -2
  47. data/lib/zold/commands/calculate.rb +2 -2
  48. data/lib/zold/commands/clean.rb +2 -2
  49. data/lib/zold/commands/create.rb +2 -2
  50. data/lib/zold/commands/diff.rb +2 -2
  51. data/lib/zold/commands/fetch.rb +2 -2
  52. data/lib/zold/commands/invoice.rb +2 -2
  53. data/lib/zold/commands/list.rb +2 -2
  54. data/lib/zold/commands/merge.rb +2 -2
  55. data/lib/zold/commands/next.rb +2 -2
  56. data/lib/zold/commands/node.rb +2 -2
  57. data/lib/zold/commands/pay.rb +2 -2
  58. data/lib/zold/commands/propagate.rb +2 -2
  59. data/lib/zold/commands/pull.rb +2 -2
  60. data/lib/zold/commands/push.rb +2 -2
  61. data/lib/zold/commands/remote.rb +2 -2
  62. data/lib/zold/commands/remove.rb +2 -2
  63. data/lib/zold/commands/routines/audit.rb +2 -2
  64. data/lib/zold/commands/routines/gc.rb +2 -2
  65. data/lib/zold/commands/routines/reconcile.rb +2 -2
  66. data/lib/zold/commands/routines/reconnect.rb +2 -2
  67. data/lib/zold/commands/routines/retire.rb +2 -2
  68. data/lib/zold/commands/routines/spread.rb +2 -2
  69. data/lib/zold/commands/routines.rb +2 -2
  70. data/lib/zold/commands/show.rb +2 -2
  71. data/lib/zold/commands/taxes.rb +2 -2
  72. data/lib/zold/commands/thread_badge.rb +3 -3
  73. data/lib/zold/copies.rb +2 -2
  74. data/lib/zold/dir_items.rb +2 -2
  75. data/lib/zold/endless.rb +2 -2
  76. data/lib/zold/gem.rb +2 -2
  77. data/lib/zold/hands.rb +2 -2
  78. data/lib/zold/head.rb +3 -3
  79. data/lib/zold/hexnum.rb +2 -2
  80. data/lib/zold/http.rb +3 -3
  81. data/lib/zold/hungry_wallets.rb +2 -2
  82. data/lib/zold/id.rb +2 -2
  83. data/lib/zold/json_page.rb +2 -2
  84. data/lib/zold/key.rb +2 -2
  85. data/lib/zold/log.rb +2 -2
  86. data/lib/zold/metronome.rb +2 -2
  87. data/lib/zold/node/async_entrance.rb +2 -2
  88. data/lib/zold/node/entrance.rb +2 -2
  89. data/lib/zold/node/farm.rb +2 -2
  90. data/lib/zold/node/farmers.rb +2 -2
  91. data/lib/zold/node/front.rb +3 -3
  92. data/lib/zold/node/journaled_pipeline.rb +2 -2
  93. data/lib/zold/node/nodup_entrance.rb +2 -2
  94. data/lib/zold/node/nospam_entrance.rb +2 -2
  95. data/lib/zold/node/pipeline.rb +2 -2
  96. data/lib/zold/node/safe_entrance.rb +2 -2
  97. data/lib/zold/node/soft_error.rb +2 -2
  98. data/lib/zold/node/spread_entrance.rb +2 -2
  99. data/lib/zold/node/sync_entrance.rb +2 -2
  100. data/lib/zold/node/trace.rb +2 -2
  101. data/lib/zold/patch.rb +2 -2
  102. data/lib/zold/prefixes.rb +2 -2
  103. data/lib/zold/remotes.rb +2 -2
  104. data/lib/zold/signature.rb +2 -2
  105. data/lib/zold/size.rb +2 -2
  106. data/lib/zold/sync_wallets.rb +2 -2
  107. data/lib/zold/tax.rb +2 -2
  108. data/lib/zold/thread_pool.rb +2 -2
  109. data/lib/zold/tree_wallets.rb +2 -2
  110. data/lib/zold/txn.rb +2 -2
  111. data/lib/zold/txns.rb +3 -3
  112. data/lib/zold/upgrades.rb +1 -1
  113. data/lib/zold/verbose_thread.rb +2 -2
  114. data/lib/zold/version.rb +3 -3
  115. data/lib/zold/version_file.rb +1 -1
  116. data/lib/zold/wallet.rb +2 -2
  117. data/lib/zold/wallets.rb +2 -2
  118. data/lib/zold.rb +2 -2
  119. data/test/commands/routines/test_audit.rb +4 -4
  120. data/test/commands/routines/test_gc.rb +8 -8
  121. data/test/commands/routines/test_reconcile.rb +4 -4
  122. data/test/commands/routines/test_reconnect.rb +3 -3
  123. data/test/commands/routines/test_retire.rb +3 -3
  124. data/test/commands/test_alias.rb +26 -6
  125. data/test/commands/test_calculate.rb +3 -3
  126. data/test/commands/test_clean.rb +10 -10
  127. data/test/commands/test_create.rb +3 -3
  128. data/test/commands/test_diff.rb +5 -5
  129. data/test/commands/test_fetch.rb +9 -9
  130. data/test/commands/test_invoice.rb +3 -3
  131. data/test/commands/test_list.rb +3 -3
  132. data/test/commands/test_merge.rb +12 -12
  133. data/test/commands/test_node.rb +6 -6
  134. data/test/commands/test_pay.rb +19 -19
  135. data/test/commands/test_propagate.rb +5 -5
  136. data/test/commands/test_pull.rb +6 -6
  137. data/test/commands/test_push.rb +9 -9
  138. data/test/commands/test_remote.rb +11 -11
  139. data/test/commands/test_remove.rb +10 -10
  140. data/test/commands/test_show.rb +3 -3
  141. data/test/commands/test_taxes.rb +4 -4
  142. data/test/fake_home.rb +2 -2
  143. data/test/node/fake_entrance.rb +2 -2
  144. data/test/node/fake_node.rb +57 -40
  145. data/test/node/test_async_entrance.rb +10 -10
  146. data/test/node/test_entrance.rb +8 -8
  147. data/test/node/test_farm.rb +11 -11
  148. data/test/node/test_farmers.rb +5 -5
  149. data/test/node/test_front.rb +29 -28
  150. data/test/node/test_nodup_entrance.rb +4 -4
  151. data/test/node/test_nospam_entrance.rb +3 -3
  152. data/test/node/test_safe_entrance.rb +4 -4
  153. data/test/node/test_spread_entrance.rb +8 -8
  154. data/test/node/test_sync_entrance.rb +4 -4
  155. data/test/node/test_trace.rb +2 -2
  156. data/test/test__helper.rb +4 -4
  157. data/test/test_age.rb +2 -2
  158. data/test/test_amount.rb +2 -2
  159. data/test/test_cached_wallets.rb +2 -2
  160. data/test/test_copies.rb +12 -12
  161. data/test/test_dir_items.rb +4 -4
  162. data/test/test_gem.rb +20 -0
  163. data/test/test_hands.rb +2 -2
  164. data/test/test_hexnum.rb +2 -2
  165. data/test/test_http.rb +8 -8
  166. data/test/test_hungry_wallets.rb +11 -11
  167. data/test/test_id.rb +2 -2
  168. data/test/test_json_page.rb +2 -2
  169. data/test/test_key.rb +2 -2
  170. data/test/test_log.rb +5 -5
  171. data/test/test_metronome.rb +6 -6
  172. data/test/test_patch.rb +14 -14
  173. data/test/test_prefixes.rb +3 -3
  174. data/test/test_remotes.rb +9 -9
  175. data/test/test_signature.rb +2 -2
  176. data/test/test_size.rb +2 -2
  177. data/test/test_sync_wallets.rb +3 -3
  178. data/test/test_tax.rb +9 -9
  179. data/test/test_thread_pool.rb +8 -8
  180. data/test/test_tree_wallets.rb +2 -2
  181. data/test/test_txn.rb +2 -2
  182. data/test/test_upgrades.rb +2 -2
  183. data/test/test_verbose_thread.rb +2 -2
  184. data/test/test_version.rb +20 -0
  185. data/test/test_wallet.rb +22 -22
  186. data/test/test_wallets.rb +5 -5
  187. data/test/test_zold.rb +5 -5
  188. data/test/upgrades/test_delete_banned_wallets.rb +4 -4
  189. data/test/upgrades/test_protocol_up.rb +4 -4
  190. data/upgrades/2.rb +1 -1
  191. data/upgrades/delete_banned_wallets.rb +1 -1
  192. data/upgrades/move_wallets_into_tree.rb +1 -1
  193. data/upgrades/protocol_up.rb +1 -1
  194. data/upgrades/rename_foreign_wallets.rb +1 -1
  195. data/zold.gemspec +23 -23
  196. metadata +7 -3
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -34,11 +34,11 @@ require_relative '../../lib/zold/commands/taxes'
34
34
 
35
35
  # TAXES test.
36
36
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
37
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
37
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
38
38
  # License:: MIT
39
39
  class TestTaxes < Zold::Test
40
40
  def test_pays_taxes
41
- FakeHome.new(log: test_log).run do |home|
41
+ FakeHome.new(log: fake_log).run do |home|
42
42
  wallets = home.wallets
43
43
  wallet = home.create_wallet
44
44
  fund = Zold::Amount.new(zld: 19.99)
@@ -65,7 +65,7 @@ class TestTaxes < Zold::Test
65
65
  before = wallet.balance
66
66
  tax = Zold::Tax.new(wallet, ignore_score_weakness: true)
67
67
  debt = tax.debt
68
- Zold::Taxes.new(wallets: wallets, remotes: remotes, log: test_log).run(
68
+ Zold::Taxes.new(wallets: wallets, remotes: remotes, log: fake_log).run(
69
69
  ['taxes', '--private-key=fixtures/id_rsa', '--ignore-score-weakness', 'pay', wallet.id.to_s]
70
70
  )
71
71
  wallet.flush
data/test/fake_home.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -33,7 +33,7 @@ require_relative '../lib/zold/remotes'
33
33
 
34
34
  # Fake home dir.
35
35
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
36
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
36
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
37
37
  # License:: MIT
38
38
  class FakeHome
39
39
  attr_reader :dir
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -22,7 +22,7 @@
22
22
 
23
23
  # Fake entrance.
24
24
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
25
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
25
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
26
26
  # License:: MIT
27
27
  class FakeEntrance
28
28
  def initialize
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -31,58 +31,75 @@ require_relative '../../lib/zold/node/front'
31
31
 
32
32
  # Fake node.
33
33
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
34
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
34
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
35
35
  # License:: MIT
36
36
  class FakeNode
37
37
  def initialize(log: Zold::Log::NULL)
38
38
  @log = log
39
39
  end
40
40
 
41
+ # This is a pretty weird situation: we have to acquire a single port
42
+ # number an reuse it for all tests. If we use different port numbers,
43
+ # acquiring them for each instance of FakeNode, we get port collisions,
44
+ # sometimes. Maybe this can be fixed sometimes.
45
+ # rubocop:disable Style/ClassVars
46
+ @@port = RandomPort::Pool::SINGLETON.acquire
47
+ # rubocop:enable Style/ClassVars
48
+
41
49
  def run(args = ['--standalone', '--no-metronome'])
42
50
  WebMock.allow_net_connect!
43
51
  FakeHome.new(log: @log).run do |home|
44
- RandomPort::Pool::SINGLETON.acquire do |port|
45
- node = Thread.new do
46
- Thread.current.name = 'fake_node'
47
- Thread.current.abort_on_exception = true
48
- Zold::VerboseThread.new(@log).run do
49
- require_relative '../../lib/zold/commands/node'
50
- Zold::Node.new(wallets: home.wallets, remotes: home.remotes, copies: home.copies.root, log: @log).run(
51
- [
52
- '--home', home.dir,
53
- '--network=test',
54
- '--port', port.to_s,
55
- '--host=localhost',
56
- '--bind-port', port.to_s,
57
- '--threads=1',
58
- '--dump-errors',
59
- '--strength=2',
60
- '--halt-code=test',
61
- '--routine-immediately',
62
- '--invoice=NOPREFIX@ffffffffffffffff'
63
- ] + args
64
- )
65
- end
52
+ node = Thread.new do
53
+ Thread.current.name = 'fake_node'
54
+ Thread.current.abort_on_exception = false
55
+ Zold::VerboseThread.new(@log).run do
56
+ require_relative '../../lib/zold/commands/node'
57
+ Zold::Node.new(wallets: home.wallets, remotes: home.remotes, copies: home.copies.root, log: @log).run(
58
+ [
59
+ '--home', home.dir,
60
+ '--network=test',
61
+ '--port', @@port.to_s,
62
+ '--host=localhost',
63
+ '--bind-port', @@port.to_s,
64
+ '--threads=1',
65
+ '--dump-errors',
66
+ '--strength=2',
67
+ '--halt-code=test',
68
+ '--routine-immediately',
69
+ '--invoice=NOPREFIX@ffffffffffffffff'
70
+ ] + args
71
+ )
72
+ end
73
+ end
74
+ uri = "http://localhost:#{@@port}/"
75
+ attempt = 0
76
+ loop do
77
+ ping = Zold::Http.new(uri: uri).get
78
+ unless ping.status == 599 && node.alive?
79
+ @log.debug("The URL #{uri} is probably alive, after #{attempt} attempts")
80
+ break
66
81
  end
67
- uri = "http://localhost:#{port}/"
68
- attempt = 0
69
- loop do
70
- ping = Zold::Http.new(uri: uri).get
71
- break unless ping.status == 599 && node.alive?
72
- @log.info("Waiting for #{uri} (attempt no.#{attempt}): ##{ping.status}...")
73
- sleep 0.5
74
- attempt += 1
75
- break if attempt > 10
82
+ unless node.alive?
83
+ @log.debug("The URL #{uri} is dead, after #{attempt} attempts")
84
+ break
76
85
  end
77
- raise "The node is dead at #{uri}" unless node.alive?
78
- begin
79
- yield port
80
- ensure
81
- Zold::Http.new(uri: "#{uri}?halt=test").get
82
- node.join
83
- sleep 0.1 # stupid sleep to make sure all threads are terminated
86
+ @log.debug("Waiting for #{uri} (attempt no.#{attempt}): ##{ping.status}...")
87
+ sleep 0.5
88
+ attempt += 1
89
+ if attempt > 10
90
+ @log.error("Waiting for too long for #{uri} (#{attempt} attempts)")
91
+ break
84
92
  end
85
93
  end
94
+ raise "The node is dead at #{uri}" unless node.alive?
95
+ begin
96
+ yield @@port
97
+ ensure
98
+ Zold::Http.new(uri: "#{uri}?halt=test").get
99
+ node.join
100
+ sleep 0.1 # stupid sleep to make sure all threads are terminated
101
+ end
102
+ @log.debug("Thread with fake node stopped: #{node.alive?}")
86
103
  end
87
104
  end
88
105
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -30,25 +30,25 @@ require_relative 'fake_entrance'
30
30
 
31
31
  # AsyncEntrance test.
32
32
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
33
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
33
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
34
34
  # License:: MIT
35
35
  class TestAsyncEntrance < Zold::Test
36
36
  def test_renders_json
37
- FakeHome.new(log: test_log).run do |home|
38
- Zold::AsyncEntrance.new(FakeEntrance.new, home.dir, log: test_log).start do |e|
37
+ FakeHome.new(log: fake_log).run do |home|
38
+ Zold::AsyncEntrance.new(FakeEntrance.new, home.dir, log: fake_log).start do |e|
39
39
  assert_equal(0, e.to_json[:queue])
40
40
  end
41
41
  end
42
42
  end
43
43
 
44
44
  def test_sends_through_once
45
- FakeHome.new(log: test_log).run do |home|
45
+ FakeHome.new(log: fake_log).run do |home|
46
46
  wallet = home.create_wallet
47
47
  amount = Zold::Amount.new(zld: 39.99)
48
48
  key = Zold::Key.new(file: 'fixtures/id_rsa')
49
49
  wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
50
50
  basic = CountingEntrance.new
51
- Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log).start do |e|
51
+ Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: fake_log).start do |e|
52
52
  e.push(wallet.id, File.read(wallet.path))
53
53
  assert_equal_wait(1) { basic.count }
54
54
  end
@@ -56,9 +56,9 @@ class TestAsyncEntrance < Zold::Test
56
56
  end
57
57
 
58
58
  def test_sends_through
59
- FakeHome.new(log: test_log).run do |home|
59
+ FakeHome.new(log: fake_log).run do |home|
60
60
  basic = CountingEntrance.new
61
- Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log, queue_limit: 1000).start do |e|
61
+ Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: fake_log, queue_limit: 1000).start do |e|
62
62
  Threads.new(20).assert do
63
63
  wallet = home.create_wallet
64
64
  amount = Zold::Amount.new(zld: 39.99)
@@ -72,11 +72,11 @@ class TestAsyncEntrance < Zold::Test
72
72
  end
73
73
 
74
74
  def test_handles_broken_entrance_gracefully
75
- FakeHome.new(log: test_log).run do |home|
75
+ FakeHome.new(log: fake_log).run do |home|
76
76
  wallet = home.create_wallet
77
77
  id = wallet.id
78
78
  body = File.read(wallet.path)
79
- Zold::AsyncEntrance.new(BrokenEntrance.new, home.dir, log: test_log).start do |e|
79
+ Zold::AsyncEntrance.new(BrokenEntrance.new, home.dir, log: fake_log).start do |e|
80
80
  e.push(id, body)
81
81
  end
82
82
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -34,16 +34,16 @@ require_relative '../../lib/zold/commands/pay'
34
34
 
35
35
  # ENTRANCE test.
36
36
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
37
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
37
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
38
38
  # License:: MIT
39
39
  class TestEntrance < Zold::Test
40
40
  def test_pushes_wallet
41
41
  sid = Zold::Id::ROOT
42
42
  tid = Zold::Id.new
43
- body = FakeHome.new(log: test_log).run do |home|
43
+ body = FakeHome.new(log: fake_log).run do |home|
44
44
  source = home.create_wallet(sid)
45
45
  target = home.create_wallet(tid)
46
- Zold::Pay.new(wallets: home.wallets, copies: home.dir, remotes: home.remotes, log: test_log).run(
46
+ Zold::Pay.new(wallets: home.wallets, copies: home.dir, remotes: home.remotes, log: fake_log).run(
47
47
  [
48
48
  'pay', '--force', '--private-key=fixtures/id_rsa',
49
49
  source.id.to_s, target.id.to_s, '19.99', 'testing'
@@ -51,14 +51,14 @@ class TestEntrance < Zold::Test
51
51
  )
52
52
  File.read(source.path)
53
53
  end
54
- FakeHome.new(log: test_log).run do |home|
54
+ FakeHome.new(log: fake_log).run do |home|
55
55
  source = home.create_wallet(sid)
56
56
  target = home.create_wallet(tid)
57
57
  ledger = File.join(home.dir, 'ledger.csv')
58
58
  e = Zold::Entrance.new(
59
59
  home.wallets,
60
60
  Zold::Pipeline.new(home.remotes, home.copies(source).root, 'x', ledger: ledger),
61
- log: test_log
61
+ log: fake_log
62
62
  )
63
63
  modified = e.push(source.id, body)
64
64
  assert_equal(2, modified.count)
@@ -71,9 +71,9 @@ class TestEntrance < Zold::Test
71
71
  end
72
72
 
73
73
  def test_renders_json
74
- FakeHome.new(log: test_log).run do |home|
74
+ FakeHome.new(log: fake_log).run do |home|
75
75
  wallet = home.create_wallet
76
- e = Zold::Entrance.new(home.wallets, Zold::Pipeline.new(home.remotes, home.copies.root, 'x'), log: test_log)
76
+ e = Zold::Entrance.new(home.wallets, Zold::Pipeline.new(home.remotes, home.copies.root, 'x'), log: fake_log)
77
77
  e.push(wallet.id, File.read(wallet.path))
78
78
  assert(e.to_json[:history].include?(wallet.id.to_s))
79
79
  assert(!e.to_json[:speed].negative?)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -30,7 +30,7 @@ require_relative '../../lib/zold/node/farm'
30
30
  class FarmTest < Zold::Test
31
31
  def test_renders_in_json
32
32
  Dir.mktmpdir do |dir|
33
- farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 2)
33
+ farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 2)
34
34
  farm.start('localhost', 80, threads: 2) do
35
35
  assert_wait { !farm.best.empty? && !farm.best[0].value.zero? }
36
36
  count = 0
@@ -42,7 +42,7 @@ class FarmTest < Zold::Test
42
42
 
43
43
  def test_renders_in_text
44
44
  Dir.mktmpdir do |dir|
45
- farm = Zold::Farm.new('NOPREFIX7@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 1)
45
+ farm = Zold::Farm.new('NOPREFIX7@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 1)
46
46
  farm.start('localhost', 80, threads: 2) do
47
47
  assert(!farm.to_text.nil?)
48
48
  end
@@ -52,7 +52,7 @@ class FarmTest < Zold::Test
52
52
  def test_makes_many_scores
53
53
  Dir.mktmpdir do |dir|
54
54
  farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'),
55
- log: test_log, lifetime: 10, farmer: Zold::Farmers::Plain.new, strength: 1)
55
+ log: fake_log, lifetime: 10, farmer: Zold::Farmers::Plain.new, strength: 1)
56
56
  farm.start('localhost', 80, threads: 4) do
57
57
  assert_wait { farm.best.length == 4 }
58
58
  end
@@ -67,7 +67,7 @@ class FarmTest < Zold::Test
67
67
  # that it's usually a few microseconds, but sometimes over 200ms.
68
68
  def test_reads_scores_at_high_speed
69
69
  Dir.mktmpdir do |dir|
70
- farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 4)
70
+ farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 4)
71
71
  farm.start('localhost', 80, threads: 4) do
72
72
  assert_wait { !farm.best.empty? && !farm.best[0].value.zero? }
73
73
  cycles = 100
@@ -76,14 +76,14 @@ class FarmTest < Zold::Test
76
76
  farm.best
77
77
  Time.now - start
78
78
  end.inject(&:+) / cycles
79
- test_log.info("Average speed is #{(speed * 1000).round(2)}ms in #{cycles} cycles")
79
+ fake_log.info("Average speed is #{(speed * 1000).round(2)}ms in #{cycles} cycles")
80
80
  end
81
81
  end
82
82
  end
83
83
 
84
84
  def test_makes_best_score_in_background
85
85
  Dir.mktmpdir do |dir|
86
- farm = Zold::Farm.new('NOPREFIX1@ffffffffffffffff', File.join(dir, 'f'), log: test_log, strength: 3)
86
+ farm = Zold::Farm.new('NOPREFIX1@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 3)
87
87
  farm.start('localhost', 80, threads: 1) do
88
88
  assert_wait { !farm.best.empty? && farm.best[0].value >= 3 }
89
89
  score = farm.best[0]
@@ -95,7 +95,7 @@ class FarmTest < Zold::Test
95
95
 
96
96
  def test_correct_score_from_empty_farm
97
97
  Dir.mktmpdir do |dir|
98
- farm = Zold::Farm.new('NOPREFIX2@cccccccccccccccc', File.join(dir, 'f'), log: test_log, strength: 1)
98
+ farm = Zold::Farm.new('NOPREFIX2@cccccccccccccccc', File.join(dir, 'f'), log: fake_log, strength: 1)
99
99
  farm.start('example.com', 8080, threads: 0) do
100
100
  score = farm.best[0]
101
101
  assert(!score.expired?)
@@ -109,7 +109,7 @@ class FarmTest < Zold::Test
109
109
  def test_pre_loads_history
110
110
  Dir.mktmpdir do |dir|
111
111
  cache = File.join(dir, 'a/b/c/cache')
112
- farm = Zold::Farm.new('NOPREFIX3@cccccccccccccccc', cache, log: test_log, strength: 1)
112
+ farm = Zold::Farm.new('NOPREFIX3@cccccccccccccccc', cache, log: fake_log, strength: 1)
113
113
  farm.start('example.com', 8080, threads: 0) do
114
114
  score = farm.best[0]
115
115
  assert(!score.nil?, 'The list of best scores can\'t be empty!')
@@ -132,7 +132,7 @@ class FarmTest < Zold::Test
132
132
  strength: 6
133
133
  )
134
134
  File.write(cache, score.to_s)
135
- farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: test_log, strength: score.strength)
135
+ farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: fake_log, strength: score.strength)
136
136
  farm.start(score.host, score.port, threads: 1) do
137
137
  100.times do
138
138
  sleep(0.1)
@@ -170,7 +170,7 @@ class FarmTest < Zold::Test
170
170
  end
171
171
 
172
172
  def test_terminates_farm_entirely
173
- Zold::Farm.new('NOPREFIX4@ffffffffffffffff', log: test_log, strength: 10).start('localhost', 4096, threads: 1) do
173
+ Zold::Farm.new('NOPREFIX4@ffffffffffffffff', log: fake_log, strength: 10).start('localhost', 4096, threads: 1) do
174
174
  sleep 1
175
175
  end
176
176
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -38,7 +38,7 @@ class FarmersTest < Zold::Test
38
38
  def test_calculates_next_score
39
39
  before = Zold::Score.new(host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 3)
40
40
  TYPES.each do |farmer_class|
41
- farmer = farmer_class.new(log: test_log)
41
+ farmer = farmer_class.new(log: fake_log)
42
42
  after = farmer.up(before)
43
43
  assert_equal(1, after.value)
44
44
  assert(!after.expired?)
@@ -49,7 +49,7 @@ class FarmersTest < Zold::Test
49
49
 
50
50
  def test_calculates_large_score
51
51
  TYPES.each do |type|
52
- log = TestLogger.new(test_log)
52
+ log = TestLogger.new(fake_log)
53
53
  thread = Thread.start do
54
54
  farmer = type.new(log: log)
55
55
  farmer.up(Zold::Score.new(host: 'a', port: 1, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 20))
@@ -62,9 +62,9 @@ class FarmersTest < Zold::Test
62
62
 
63
63
  def test_kills_farmer
64
64
  TYPES.each do |type|
65
- farmer = type.new(log: test_log)
65
+ farmer = type.new(log: fake_log)
66
66
  thread = Thread.start do
67
- Zold::VerboseThread.new(test_log).run do
67
+ Zold::VerboseThread.new(fake_log).run do
68
68
  farmer.up(Zold::Score.new(host: 'some-host', invoice: 'NOPREFIX4@ffffffffffffffff', strength: 32))
69
69
  end
70
70
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -45,7 +45,7 @@ class FrontTest < Zold::Test
45
45
  def test_memory_leakage
46
46
  skip
47
47
  report = MemoryProfiler.report(top: 10) do
48
- FakeNode.new(log: test_log).run(opts('--network=foo')) do |port|
48
+ FakeNode.new(log: fake_log).run(opts('--network=foo')) do |port|
49
49
  100.times do
50
50
  Zold::Http.new(uri: "http://localhost:#{port}/", network: 'foo').get
51
51
  end
@@ -55,7 +55,7 @@ class FrontTest < Zold::Test
55
55
  end
56
56
 
57
57
  def test_renders_front_json
58
- FakeNode.new(log: test_log).run(opts('--network=foo')) do |port|
58
+ FakeNode.new(log: fake_log).run(opts('--network=foo')) do |port|
59
59
  res = Zold::Http.new(uri: "http://localhost:#{port}/", network: 'foo').get
60
60
  json = JSON.parse(res.body)
61
61
  assert_equal(Zold::VERSION, json['version'])
@@ -74,7 +74,7 @@ class FrontTest < Zold::Test
74
74
  end
75
75
 
76
76
  def test_renders_public_pages
77
- FakeNode.new(log: test_log).run(opts) do |port|
77
+ FakeNode.new(log: fake_log).run(opts) do |port|
78
78
  {
79
79
  200 => [
80
80
  '/robots.txt',
@@ -117,7 +117,7 @@ class FrontTest < Zold::Test
117
117
  end
118
118
 
119
119
  def test_updates_list_of_remotes
120
- FakeNode.new(log: test_log).run(['--no-metronome', '--ignore-score-weakness', '--no-cache']) do |port|
120
+ FakeNode.new(log: fake_log).run(['--no-metronome', '--ignore-score-weakness', '--no-cache']) do |port|
121
121
  (Zold::Remotes::MAX_NODES + 5).times do |i|
122
122
  score = Zold::Score.new(
123
123
  host: 'localhost', port: i + 1, invoice: 'NOPREFIX@ffffffffffffffff', strength: 1
@@ -138,9 +138,9 @@ class FrontTest < Zold::Test
138
138
  end
139
139
 
140
140
  def test_increments_score
141
- FakeNode.new(log: test_log).run(opts('--threads=1')) do |port|
141
+ FakeNode.new(log: fake_log).run(opts('--threads=1')) do |port|
142
142
  3.times do |i|
143
- assert_equal_wait(true, max: 60) do
143
+ assert_equal_wait(true, max: 120) do
144
144
  response = Zold::Http.new(uri: "http://localhost:#{port}/").get
145
145
  assert_equal(200, response.status, response.body)
146
146
  score = Zold::Score.parse_json(Zold::JsonPage.new(response.body).to_hash['score'])
@@ -159,8 +159,8 @@ class FrontTest < Zold::Test
159
159
  ].each do |p|
160
160
  method = "test_wallet_page_#{p.gsub(/[^a-z]/, '_')}"
161
161
  define_method(method) do
162
- FakeHome.new(log: test_log).run do |home|
163
- FakeNode.new(log: test_log).run(opts) do |port|
162
+ FakeHome.new(log: fake_log).run do |home|
163
+ FakeNode.new(log: fake_log).run(opts) do |port|
164
164
  wallet = home.create_wallet(txns: 2)
165
165
  base = "http://localhost:#{port}"
166
166
  response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
@@ -173,8 +173,8 @@ class FrontTest < Zold::Test
173
173
  end
174
174
 
175
175
  def test_renders_wallets_page
176
- FakeHome.new(log: test_log).run do |home|
177
- FakeNode.new(log: test_log).run(opts) do |port|
176
+ FakeHome.new(log: fake_log).run do |home|
177
+ FakeNode.new(log: fake_log).run(opts) do |port|
178
178
  wallet = home.create_wallet(txns: 2)
179
179
  base = "http://localhost:#{port}"
180
180
  response = Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
@@ -188,8 +188,8 @@ class FrontTest < Zold::Test
188
188
  end
189
189
 
190
190
  def test_fetch_in_multiple_threads
191
- FakeNode.new(log: test_log).run(opts) do |port|
192
- FakeHome.new(log: test_log).run do |home|
191
+ FakeNode.new(log: fake_log).run(opts) do |port|
192
+ FakeHome.new(log: fake_log).run do |home|
193
193
  wallet = home.create_wallet
194
194
  base = "http://localhost:#{port}"
195
195
  Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
@@ -209,8 +209,8 @@ class FrontTest < Zold::Test
209
209
  end
210
210
 
211
211
  def test_pushes_twice
212
- FakeNode.new(log: test_log).run(opts) do |port|
213
- FakeHome.new(log: test_log).run do |home|
212
+ FakeNode.new(log: fake_log).run(opts) do |port|
213
+ FakeHome.new(log: fake_log).run do |home|
214
214
  wallet = home.create_wallet
215
215
  base = "http://localhost:#{port}"
216
216
  assert_equal(
@@ -227,9 +227,9 @@ class FrontTest < Zold::Test
227
227
  end
228
228
 
229
229
  def test_pushes_many_wallets
230
- FakeNode.new(log: test_log).run(opts) do |port|
230
+ FakeNode.new(log: fake_log).run(opts) do |port|
231
231
  base = "http://localhost:#{port}"
232
- FakeHome.new(log: test_log).run do |home|
232
+ FakeHome.new(log: fake_log).run do |home|
233
233
  Threads.new(5).assert do
234
234
  wallet = home.create_wallet
235
235
  Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
@@ -273,7 +273,7 @@ class FrontTest < Zold::Test
273
273
  end
274
274
 
275
275
  def test_gzip
276
- FakeNode.new(log: test_log).run(opts) do |port|
276
+ FakeNode.new(log: fake_log).run(opts) do |port|
277
277
  response = Zold::Http.new(uri: URI("http://localhost:#{port}/version")).get
278
278
  assert_equal(200, response.status, response)
279
279
  assert_operator(300, :>, response.body.length.to_i, 'Expected the content to be small')
@@ -282,7 +282,7 @@ class FrontTest < Zold::Test
282
282
 
283
283
  def test_performance
284
284
  times = Queue.new
285
- FakeNode.new(log: test_log).run(opts('--threads=4', '--strength=6')) do |port|
285
+ FakeNode.new(log: fake_log).run(opts('--threads=4', '--strength=6')) do |port|
286
286
  Threads.new(10).assert(100) do
287
287
  start = Time.now
288
288
  Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
@@ -291,7 +291,7 @@ class FrontTest < Zold::Test
291
291
  end
292
292
  all = []
293
293
  all << times.pop(true) until times.empty?
294
- test_log.info("Average response time is #{all.inject(&:+) / all.count}")
294
+ fake_log.info("Average response time is #{all.inject(&:+) / all.count}")
295
295
  end
296
296
 
297
297
  # The score exposed via the HTTP header must be reduced to the value of 16.
@@ -299,7 +299,7 @@ class FrontTest < Zold::Test
299
299
  # HTTP request. This value is enough to identify a valueable node, and filter
300
300
  # out those that are too weak.
301
301
  def test_score_is_reduced
302
- FakeNode.new(log: test_log).run(opts('--threads=1', '--strength=1', '--farmer=plain')) do |port|
302
+ FakeNode.new(log: fake_log).run(opts('--threads=1', '--strength=1', '--farmer=plain')) do |port|
303
303
  scores = []
304
304
  50.times do
305
305
  res = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
@@ -311,7 +311,7 @@ class FrontTest < Zold::Test
311
311
  end
312
312
 
313
313
  def test_headers_are_being_set_correctly
314
- FakeNode.new(log: test_log).run(opts('--expose-version=9.9.9')) do |port|
314
+ FakeNode.new(log: fake_log).run(opts('--expose-version=9.9.9')) do |port|
315
315
  response = Zold::Http.new(uri: URI("http://localhost:#{port}/")).get
316
316
  assert_equal('no-cache', response.headers['Cache-Control'])
317
317
  assert_equal('close', response.headers['Connection'])
@@ -325,7 +325,7 @@ class FrontTest < Zold::Test
325
325
 
326
326
  def test_alias_parameter
327
327
  name = SecureRandom.hex(4)
328
- FakeNode.new(log: test_log).run(opts("--alias=#{name}")) do |port|
328
+ FakeNode.new(log: fake_log).run(opts("--alias=#{name}")) do |port|
329
329
  uri = URI("http://localhost:#{port}/")
330
330
  response = Zold::Http.new(uri: uri).get
331
331
  assert_match(
@@ -337,7 +337,7 @@ class FrontTest < Zold::Test
337
337
  end
338
338
 
339
339
  def test_default_alias_parameter
340
- FakeNode.new(log: test_log).run(opts) do |port|
340
+ FakeNode.new(log: fake_log).run(opts) do |port|
341
341
  uri = URI("http://localhost:#{port}/")
342
342
  response = Zold::Http.new(uri: uri).get
343
343
  assert_match(
@@ -349,8 +349,9 @@ class FrontTest < Zold::Test
349
349
  end
350
350
 
351
351
  def test_invalid_alias
352
+ skip
352
353
  exception = assert_raises RuntimeError do
353
- FakeNode.new(log: test_log).run(opts('--alias=invalid-alias')) do |port|
354
+ FakeNode.new(log: fake_log).run(opts('--alias=invalid-alias')) do |port|
354
355
  uri = URI("http://localhost:#{port}/")
355
356
  Zold::Http.new(uri: uri).get
356
357
  end
@@ -360,8 +361,8 @@ class FrontTest < Zold::Test
360
361
 
361
362
  def test_push_fetch_in_multiple_threads
362
363
  key = Zold::Key.new(text: File.read('fixtures/id_rsa'))
363
- FakeNode.new(log: test_log).run(opts) do |port|
364
- FakeHome.new(log: test_log).run do |home|
364
+ FakeNode.new(log: fake_log).run(opts) do |port|
365
+ FakeHome.new(log: fake_log).run do |home|
365
366
  wallet = home.create_wallet(Zold::Id::ROOT)
366
367
  base = "http://localhost:#{port}"
367
368
  Zold::Http.new(uri: "#{base}/wallet/#{wallet.id}").put(wallet.path)
@@ -380,7 +381,7 @@ class FrontTest < Zold::Test
380
381
  end
381
382
 
382
383
  def test_checksum_in_json
383
- FakeNode.new(log: test_log).run(opts) do |port|
384
+ FakeNode.new(log: fake_log).run(opts) do |port|
384
385
  uri = URI("http://localhost:#{port}/")
385
386
  response = Zold::Http.new(uri: uri).get
386
387
  assert(
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (c) 2018-2023 Zerocracy
3
+ # Copyright (c) 2018-2024 Zerocracy
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the 'Software'), to deal
@@ -29,13 +29,13 @@ require_relative 'fake_entrance'
29
29
 
30
30
  # NoDupEntrance test.
31
31
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
32
- # Copyright:: Copyright (c) 2018 Yegor Bugayenko
32
+ # Copyright:: Copyright (c) 2018-2024 Zerocracy
33
33
  # License:: MIT
34
34
  class TestNoDupEntrance < Zold::Test
35
35
  def test_ignores_dup
36
- FakeHome.new(log: test_log).run do |home|
36
+ FakeHome.new(log: fake_log).run do |home|
37
37
  wallet = home.create_wallet
38
- Zold::NoDupEntrance.new(RealEntrance.new, home.wallets, log: test_log).start do |e|
38
+ Zold::NoDupEntrance.new(RealEntrance.new, home.wallets, log: fake_log).start do |e|
39
39
  assert(e.push(wallet.id, File.read(wallet.path)).empty?)
40
40
  end
41
41
  end