zold 0.32.0 → 0.32.1

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 (171) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/lib/zold/version.rb +1 -1
  4. data/zold.gemspec +1 -1
  5. metadata +2 -168
  6. data/.0pdd.yml +0 -12
  7. data/.gitattributes +0 -9
  8. data/.github/typos.toml +0 -11
  9. data/.github/workflows/actionlint.yml +0 -25
  10. data/.github/workflows/bashate.yml +0 -25
  11. data/.github/workflows/codecov.yml +0 -27
  12. data/.github/workflows/copyrights.yml +0 -15
  13. data/.github/workflows/hadolint.yml +0 -14
  14. data/.github/workflows/markdown-lint.yml +0 -19
  15. data/.github/workflows/pdd.yml +0 -19
  16. data/.github/workflows/rake.yml +0 -31
  17. data/.github/workflows/reuse.yml +0 -19
  18. data/.github/workflows/shellcheck.yml +0 -19
  19. data/.github/workflows/typos.yml +0 -21
  20. data/.github/workflows/xcop.yml +0 -15
  21. data/.github/workflows/yamllint.yml +0 -19
  22. data/.gitignore +0 -15
  23. data/.pdd +0 -7
  24. data/.rubocop.yml +0 -66
  25. data/.ruby-version +0 -1
  26. data/.rultor.yml +0 -41
  27. data/cucumber.yml +0 -6
  28. data/features/cli.feature +0 -18
  29. data/features/gem_package.feature +0 -28
  30. data/features/step_definitions/steps.rb +0 -67
  31. data/features/support/env.rb +0 -9
  32. data/fixtures/448b451bc62e8e16.z +0 -1005
  33. data/fixtures/id_rsa +0 -51
  34. data/fixtures/id_rsa-2 +0 -51
  35. data/fixtures/id_rsa-2.pub +0 -1
  36. data/fixtures/id_rsa.pub +0 -1
  37. data/fixtures/keys/1.pub +0 -1
  38. data/fixtures/keys/2 +0 -51
  39. data/fixtures/keys/2.pub +0 -1
  40. data/fixtures/merge/asserts.rb +0 -20
  41. data/fixtures/merge/id_rsa +0 -51
  42. data/fixtures/merge/id_rsa.pub +0 -1
  43. data/fixtures/merge/into_no_wallet/assert.rb +0 -8
  44. data/fixtures/merge/into_no_wallet/copies/0123456789abcdef/1.zc +0 -6
  45. data/fixtures/merge/into_no_wallet/copies/0123456789abcdef/scores.zc +0 -1
  46. data/fixtures/merge/into_no_wallet/opts +0 -1
  47. data/fixtures/merge/legacy_negatives_stay/0123456789abcdef.z +0 -6
  48. data/fixtures/merge/legacy_negatives_stay/assert.rb +0 -8
  49. data/fixtures/merge/legacy_negatives_stay/copies/0123456789abcdef/1.zc +0 -6
  50. data/fixtures/merge/legacy_negatives_stay/copies/0123456789abcdef/scores.zc +0 -1
  51. data/fixtures/merge/legacy_negatives_stay/opts +0 -2
  52. data/fixtures/merge/missed_wallets/0000000000000000.z +0 -6
  53. data/fixtures/merge/missed_wallets/0123456789abcdef.z +0 -4
  54. data/fixtures/merge/missed_wallets/assert.rb +0 -8
  55. data/fixtures/merge/missed_wallets/copies/0123456789abcdef/1.zc +0 -8
  56. data/fixtures/merge/missed_wallets/copies/0123456789abcdef/scores.zc +0 -1
  57. data/fixtures/merge/missed_wallets/opts +0 -3
  58. data/fixtures/merge/negative_overwriting/0123456789abcdef.z +0 -6
  59. data/fixtures/merge/negative_overwriting/146b852f2d9ad984.z +0 -6
  60. data/fixtures/merge/negative_overwriting/assert.rb +0 -8
  61. data/fixtures/merge/negative_overwriting/copies/0123456789abcdef/1.zc +0 -6
  62. data/fixtures/merge/negative_overwriting/copies/0123456789abcdef/scores.zc +0 -1
  63. data/fixtures/merge/negative_overwriting/opts +0 -2
  64. data/fixtures/merge/negatives_in_between/0000000000000000.z +0 -6
  65. data/fixtures/merge/negatives_in_between/0123456789abcdef.z +0 -4
  66. data/fixtures/merge/negatives_in_between/assert.rb +0 -8
  67. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/1.zc +0 -6
  68. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/2.zc +0 -6
  69. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/3.zc +0 -6
  70. data/fixtures/merge/negatives_in_between/copies/0123456789abcdef/scores.zc +0 -3
  71. data/fixtures/merge/negatives_in_between/opts +0 -1
  72. data/fixtures/merge/random_expenses/0000000000000000.z +0 -6
  73. data/fixtures/merge/random_expenses/0123456789abcdef.z +0 -6
  74. data/fixtures/merge/random_expenses/assert.rb +0 -8
  75. data/fixtures/merge/random_expenses/copies/0123456789abcdef/1.zc +0 -7
  76. data/fixtures/merge/random_expenses/copies/0123456789abcdef/2.zc +0 -7
  77. data/fixtures/merge/random_expenses/copies/0123456789abcdef/3.zc +0 -7
  78. data/fixtures/merge/random_expenses/copies/0123456789abcdef/4.zc +0 -7
  79. data/fixtures/merge/random_expenses/copies/0123456789abcdef/5.zc +0 -7
  80. data/fixtures/merge/random_expenses/copies/0123456789abcdef/scores.zc +0 -5
  81. data/fixtures/merge/random_expenses/opts +0 -1
  82. data/fixtures/merge/simple_case/0000000000000000.z +0 -6
  83. data/fixtures/merge/simple_case/0123456789abcdef.z +0 -4
  84. data/fixtures/merge/simple_case/assert.rb +0 -8
  85. data/fixtures/merge/simple_case/copies/0123456789abcdef/1.zc +0 -6
  86. data/fixtures/merge/simple_case/copies/0123456789abcdef/scores.zc +0 -1
  87. data/fixtures/merge/simple_case/opts +0 -1
  88. data/fixtures/merge/unconfirmed_income/0123456789abcdef.z +0 -4
  89. data/fixtures/merge/unconfirmed_income/assert.rb +0 -8
  90. data/fixtures/merge/unconfirmed_income/copies/0123456789abcdef/1.zc +0 -6
  91. data/fixtures/merge/unconfirmed_income/copies/0123456789abcdef/scores.zc +0 -1
  92. data/fixtures/merge/unconfirmed_income/opts +0 -3
  93. data/fixtures/scripts/_head.sh +0 -72
  94. data/fixtures/scripts/calculate-scores.sh +0 -5
  95. data/fixtures/scripts/distribute-wallet.sh +0 -88
  96. data/fixtures/scripts/print-helps.sh +0 -9
  97. data/fixtures/scripts/pull-on-start.sh +0 -35
  98. data/fixtures/scripts/push-and-pull.sh +0 -46
  99. data/fixtures/scripts/redeploy-on-upgrade.sh +0 -40
  100. data/fixtures/scripts/spread-wallets.sh +0 -56
  101. data/renovate.json +0 -6
  102. data/test/commands/routines/test_audit.rb +0 -23
  103. data/test/commands/routines/test_gc.rb +0 -52
  104. data/test/commands/routines/test_reconcile.rb +0 -33
  105. data/test/commands/routines/test_reconnect.rb +0 -28
  106. data/test/commands/routines/test_retire.rb +0 -22
  107. data/test/commands/test_alias.rb +0 -58
  108. data/test/commands/test_calculate.rb +0 -22
  109. data/test/commands/test_clean.rb +0 -55
  110. data/test/commands/test_create.rb +0 -32
  111. data/test/commands/test_diff.rb +0 -43
  112. data/test/commands/test_fetch.rb +0 -144
  113. data/test/commands/test_invoice.rb +0 -32
  114. data/test/commands/test_list.rb +0 -29
  115. data/test/commands/test_merge.rb +0 -106
  116. data/test/commands/test_node.rb +0 -50
  117. data/test/commands/test_pay.rb +0 -203
  118. data/test/commands/test_propagate.rb +0 -33
  119. data/test/commands/test_pull.rb +0 -52
  120. data/test/commands/test_push.rb +0 -75
  121. data/test/commands/test_remote.rb +0 -247
  122. data/test/commands/test_remove.rb +0 -48
  123. data/test/commands/test_show.rb +0 -30
  124. data/test/commands/test_taxes.rb +0 -58
  125. data/test/fake_home.rb +0 -87
  126. data/test/node/fake_entrance.rb +0 -26
  127. data/test/node/fake_node.rb +0 -88
  128. data/test/node/test_async_entrance.rb +0 -85
  129. data/test/node/test_entrance.rb +0 -64
  130. data/test/node/test_farm.rb +0 -159
  131. data/test/node/test_farmers.rb +0 -58
  132. data/test/node/test_front.rb +0 -379
  133. data/test/node/test_nodup_entrance.rb +0 -31
  134. data/test/node/test_nospam_entrance.rb +0 -31
  135. data/test/node/test_safe_entrance.rb +0 -41
  136. data/test/node/test_spread_entrance.rb +0 -49
  137. data/test/node/test_sync_entrance.rb +0 -23
  138. data/test/node/test_trace.rb +0 -18
  139. data/test/test__helper.rb +0 -113
  140. data/test/test_age.rb +0 -37
  141. data/test/test_amount.rb +0 -62
  142. data/test/test_cached_wallets.rb +0 -55
  143. data/test/test_copies.rb +0 -127
  144. data/test/test_dir_items.rb +0 -72
  145. data/test/test_gem.rb +0 -23
  146. data/test/test_hands.rb +0 -51
  147. data/test/test_hexnum.rb +0 -18
  148. data/test/test_http.rb +0 -207
  149. data/test/test_hungry_wallets.rb +0 -72
  150. data/test/test_id.rb +0 -61
  151. data/test/test_json_page.rb +0 -29
  152. data/test/test_key.rb +0 -81
  153. data/test/test_metronome.rb +0 -71
  154. data/test/test_patch.rb +0 -160
  155. data/test/test_prefixes.rb +0 -31
  156. data/test/test_remotes.rb +0 -301
  157. data/test/test_signature.rb +0 -31
  158. data/test/test_size.rb +0 -21
  159. data/test/test_sync_wallets.rb +0 -39
  160. data/test/test_tax.rb +0 -153
  161. data/test/test_thread_pool.rb +0 -71
  162. data/test/test_tree_wallets.rb +0 -65
  163. data/test/test_txn.rb +0 -71
  164. data/test/test_upgrades.rb +0 -81
  165. data/test/test_verbose_thread.rb +0 -37
  166. data/test/test_version.rb +0 -17
  167. data/test/test_wallet.rb +0 -300
  168. data/test/test_wallets.rb +0 -67
  169. data/test/test_zold.rb +0 -81
  170. data/test/upgrades/test_delete_banned_wallets.rb +0 -29
  171. data/test/upgrades/test_protocol_up.rb +0 -24
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tmpdir'
7
- require 'webmock/minitest'
8
- require_relative '../test__helper'
9
- require_relative '../fake_home'
10
- require_relative '../../lib/zold/wallets'
11
- require_relative '../../lib/zold/amount'
12
- require_relative '../../lib/zold/key'
13
- require 'loog'
14
- require_relative '../../lib/zold/id'
15
- require_relative '../../lib/zold/commands/taxes'
16
-
17
- # TAXES test.
18
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
19
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
20
- # License:: MIT
21
- class TestTaxes < Zold::Test
22
- def test_pays_taxes
23
- FakeHome.new(log: fake_log).run do |home|
24
- wallets = home.wallets
25
- wallet = home.create_wallet
26
- fund = Zold::Amount.new(zld: 19.99)
27
- 10.times do |i|
28
- wallet.add(
29
- Zold::Txn.new(
30
- i + 1,
31
- Time.now - (24 * 60 * 60 * 365 * 300),
32
- fund,
33
- 'NOPREFIX', Zold::Id.new, '-'
34
- )
35
- )
36
- end
37
- remotes = home.remotes
38
- score = Zold::Score.new(host: 'localhost', port: 80, strength: 1, invoice: 'NOPREFIX@0000000000000000')
39
- 10.times { score = score.next }
40
- remotes.add(score.host, score.port)
41
- stub_request(:get, "http://#{score.host}:#{score.port}/").to_return(
42
- status: 200,
43
- body: {
44
- score: score.to_h
45
- }.to_json
46
- )
47
- before = wallet.balance
48
- tax = Zold::Tax.new(wallet, ignore_score_weakness: true)
49
- debt = tax.debt
50
- Zold::Taxes.new(wallets: wallets, remotes: remotes, log: fake_log).run(
51
- ['taxes', '--private-key=fixtures/id_rsa', '--ignore-score-weakness', 'pay', wallet.id.to_s]
52
- )
53
- wallet.flush
54
- assert_predicate(tax.paid, :positive?, tax.paid)
55
- assert_equal((before - debt).to_zld(6), wallet.balance.to_zld(6))
56
- end
57
- end
58
- end
data/test/fake_home.rb DELETED
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tmpdir'
7
- require 'loog'
8
- require_relative '../lib/zold/id'
9
- require_relative '../lib/zold/wallet'
10
- require_relative '../lib/zold/wallets'
11
- require_relative '../lib/zold/sync_wallets'
12
- require_relative '../lib/zold/cached_wallets'
13
- require_relative '../lib/zold/key'
14
- require_relative '../lib/zold/version'
15
- require_relative '../lib/zold/remotes'
16
-
17
- # Fake home dir.
18
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
19
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
20
- # License:: MIT
21
- class FakeHome
22
- attr_reader :dir
23
-
24
- def initialize(dir = __dir__, log: Loog::NULL)
25
- @dir = dir
26
- @log = log
27
- end
28
-
29
- def run
30
- Dir.mktmpdir do |dir|
31
- FileUtils.copy(File.expand_path(File.join(__dir__, '../fixtures/id_rsa')), File.join(dir, 'id_rsa'))
32
- yield FakeHome.new(dir, log: @log)
33
- end
34
- end
35
-
36
- def wallets
37
- Zold::SyncWallets.new(Zold::CachedWallets.new(Zold::Wallets.new(@dir)), log: @log)
38
- end
39
-
40
- def create_wallet(id = Zold::Id.new, dir = @dir, txns: 0)
41
- target = Zold::Wallet.new(File.join(dir, id.to_s + Zold::Wallet::EXT))
42
- wallets.acq(id, exclusive: true) do |w|
43
- w.init(id, Zold::Key.new(file: File.expand_path(File.join(__dir__, '../fixtures/id_rsa.pub'))))
44
- File.write(target.path, File.read(w.path))
45
- txns.times do |i|
46
- w.add(
47
- Zold::Txn.new(
48
- 1, Time.now,
49
- Zold::Amount.new(zld: (i + 1).to_f),
50
- 'NOPREFIX', Zold::Id.new, '-'
51
- )
52
- )
53
- end
54
- end
55
- target
56
- end
57
-
58
- def create_wallet_json(id = Zold::Id.new)
59
- require 'zold/score'
60
- score = Zold::Score::ZERO
61
- Dir.mktmpdir 'wallets' do |external_dir|
62
- wallet = create_wallet(id, external_dir)
63
- {
64
- version: Zold::VERSION,
65
- protocol: Zold::PROTOCOL,
66
- id: wallet.id.to_s,
67
- score: score.to_h,
68
- size: wallet.size,
69
- wallets: 1,
70
- mtime: wallet.mtime.utc.iso8601,
71
- digest: wallet.digest,
72
- balance: wallet.balance.to_i,
73
- body: File.read(wallet.path)
74
- }.to_json
75
- end
76
- end
77
-
78
- def copies(wallet = create_wallet)
79
- Zold::Copies.new(File.join(@dir, "copies/#{wallet.id}"))
80
- end
81
-
82
- def remotes
83
- remotes = Zold::Remotes.new(file: File.join(@dir, 'secrets/remotes'))
84
- remotes.clean
85
- remotes
86
- end
87
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- # Fake entrance.
7
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
8
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
9
- # License:: MIT
10
- class FakeEntrance
11
- def initialize
12
- # Nothing here
13
- end
14
-
15
- def to_json
16
- {}
17
- end
18
-
19
- def start
20
- yield self
21
- end
22
-
23
- def push(id, _)
24
- [id]
25
- end
26
- end
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tmpdir'
7
- require 'webmock/minitest'
8
- require 'random-port'
9
- require_relative '../fake_home'
10
- require 'loog'
11
- require_relative '../../lib/zold/http'
12
- require_relative '../../lib/zold/verbose_thread'
13
- require_relative '../../lib/zold/node/front'
14
-
15
- # Fake node.
16
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
17
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
18
- # License:: MIT
19
- class FakeNode
20
- def initialize(log: Loog::NULL)
21
- @log = log
22
- end
23
-
24
- # This is a pretty weird situation: we have to acquire a single port
25
- # number an reuse it for all tests. If we use different port numbers,
26
- # acquiring them for each instance of FakeNode, we get port collisions,
27
- # sometimes. Maybe this can be fixed sometimes.
28
- # rubocop:disable Style/ClassVars
29
- @@port = RandomPort::Pool::SINGLETON.acquire
30
- # rubocop:enable Style/ClassVars
31
-
32
- def run(args = ['--standalone', '--no-metronome'])
33
- WebMock.allow_net_connect!
34
- FakeHome.new(log: @log).run do |home|
35
- node = Thread.new do
36
- Thread.current.name = 'fake_node'
37
- Thread.current.abort_on_exception = false
38
- Zold::VerboseThread.new(@log).run do
39
- require_relative '../../lib/zold/commands/node'
40
- Zold::Node.new(wallets: home.wallets, remotes: home.remotes, copies: home.copies.root, log: @log).run(
41
- [
42
- '--home', home.dir,
43
- '--network=test',
44
- '--port', @@port.to_s,
45
- '--host=localhost',
46
- '--bind-port', @@port.to_s,
47
- '--threads=1',
48
- '--dump-errors',
49
- '--strength=2',
50
- '--halt-code=test',
51
- '--routine-immediately',
52
- '--invoice=NOPREFIX@ffffffffffffffff'
53
- ] + args
54
- )
55
- end
56
- end
57
- uri = "http://localhost:#{@@port}/"
58
- attempt = 0
59
- loop do
60
- ping = Zold::Http.new(uri: uri).get
61
- unless ping.status == 599 && node.alive?
62
- @log.debug("The URL #{uri} is probably alive, after #{attempt} attempts")
63
- break
64
- end
65
- unless node.alive?
66
- @log.debug("The URL #{uri} is dead, after #{attempt} attempts")
67
- break
68
- end
69
- @log.debug("Waiting for #{uri} (attempt no.#{attempt}): ##{ping.status}...")
70
- sleep 0.5
71
- attempt += 1
72
- if attempt > 10
73
- @log.error("Waiting for too long for #{uri} (#{attempt} attempts)")
74
- break
75
- end
76
- 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
84
- end
85
- @log.debug("Thread with fake node stopped: #{node.alive?}")
86
- end
87
- end
88
- end
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'threads'
7
- require_relative '../fake_home'
8
- require_relative '../test__helper'
9
- require_relative '../../lib/zold/id'
10
- require_relative '../../lib/zold/node/async_entrance'
11
- require_relative 'fake_entrance'
12
-
13
- # AsyncEntrance test.
14
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
15
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
16
- # License:: MIT
17
- class TestAsyncEntrance < Zold::Test
18
- def test_renders_json
19
- FakeHome.new(log: fake_log).run do |home|
20
- Zold::AsyncEntrance.new(FakeEntrance.new, home.dir, log: fake_log).start do |e|
21
- assert_equal(0, e.to_json[:queue])
22
- end
23
- end
24
- end
25
-
26
- def test_sends_through_once
27
- FakeHome.new(log: fake_log).run do |home|
28
- wallet = home.create_wallet
29
- amount = Zold::Amount.new(zld: 39.99)
30
- key = Zold::Key.new(file: 'fixtures/id_rsa')
31
- wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
32
- basic = CountingEntrance.new
33
- Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: fake_log).start do |e|
34
- e.push(wallet.id, File.read(wallet.path))
35
- assert_equal_wait(1) { basic.count }
36
- end
37
- end
38
- end
39
-
40
- def test_sends_through
41
- FakeHome.new(log: fake_log).run do |home|
42
- basic = CountingEntrance.new
43
- Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: fake_log, queue_limit: 1000).start do |e|
44
- Threads.new(20).assert do
45
- wallet = home.create_wallet
46
- amount = Zold::Amount.new(zld: 39.99)
47
- key = Zold::Key.new(file: 'fixtures/id_rsa')
48
- wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
49
- 5.times { e.push(wallet.id, File.read(wallet.path)) }
50
- end
51
- assert_equal_wait(true) { basic.count >= 20 }
52
- end
53
- end
54
- end
55
-
56
- def test_handles_broken_entrance_gracefully
57
- FakeHome.new(log: fake_log).run do |home|
58
- wallet = home.create_wallet
59
- id = wallet.id
60
- body = File.read(wallet.path)
61
- Zold::AsyncEntrance.new(BrokenEntrance.new, home.dir, log: fake_log).start do |e|
62
- e.push(id, body)
63
- end
64
- end
65
- end
66
-
67
- class CountingEntrance < FakeEntrance
68
- attr_reader :count
69
-
70
- def initialize
71
- super
72
- @count = 0
73
- end
74
-
75
- def push(_, _)
76
- @count += 1
77
- end
78
- end
79
-
80
- class BrokenEntrance < FakeEntrance
81
- def push(_, _)
82
- raise 'It intentionally crashes'
83
- end
84
- end
85
- end
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require_relative '../fake_home'
7
- require_relative '../test__helper'
8
- require_relative '../../lib/zold/wallet'
9
- require_relative '../../lib/zold/wallets'
10
- require_relative '../../lib/zold/remotes'
11
- require_relative '../../lib/zold/id'
12
- require_relative '../../lib/zold/key'
13
- require_relative '../../lib/zold/node/entrance'
14
- require_relative '../../lib/zold/node/pipeline'
15
- require_relative '../../lib/zold/commands/pay'
16
-
17
- # ENTRANCE test.
18
- # Author:: Yegor Bugayenko (yegor256@gmail.com)
19
- # Copyright:: Copyright (c) 2018-2025 Zerocracy
20
- # License:: MIT
21
- class TestEntrance < Zold::Test
22
- def test_pushes_wallet
23
- sid = Zold::Id::ROOT
24
- tid = Zold::Id.new
25
- body = FakeHome.new(log: fake_log).run do |home|
26
- source = home.create_wallet(sid)
27
- target = home.create_wallet(tid)
28
- Zold::Pay.new(wallets: home.wallets, copies: home.dir, remotes: home.remotes, log: fake_log).run(
29
- [
30
- 'pay', '--force', '--private-key=fixtures/id_rsa',
31
- source.id.to_s, target.id.to_s, '19.99', 'testing'
32
- ]
33
- )
34
- File.read(source.path)
35
- end
36
- FakeHome.new(log: fake_log).run do |home|
37
- source = home.create_wallet(sid)
38
- target = home.create_wallet(tid)
39
- ledger = File.join(home.dir, 'ledger.csv')
40
- e = Zold::Entrance.new(
41
- home.wallets,
42
- Zold::Pipeline.new(home.remotes, home.copies(source).root, 'x', ledger: ledger),
43
- log: fake_log
44
- )
45
- modified = e.push(source.id, body)
46
- assert_equal(2, modified.count)
47
- assert_equal(Zold::Amount.new(zld: -19.99), source.balance)
48
- assert_equal(Zold::Amount.new(zld: 19.99), target.balance)
49
- assert_includes(modified, sid)
50
- assert_includes(modified, tid)
51
- assert_equal(1, File.read(ledger).split("\n").count)
52
- end
53
- end
54
-
55
- def test_renders_json
56
- FakeHome.new(log: fake_log).run do |home|
57
- wallet = home.create_wallet
58
- e = Zold::Entrance.new(home.wallets, Zold::Pipeline.new(home.remotes, home.copies.root, 'x'), log: fake_log)
59
- e.push(wallet.id, File.read(wallet.path))
60
- assert_includes(e.to_json[:history], wallet.id.to_s)
61
- refute_predicate(e.to_json[:speed], :negative?)
62
- end
63
- end
64
- end
@@ -1,159 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'rack/test'
7
- require 'tmpdir'
8
- require_relative '../test__helper'
9
- require 'loog'
10
- require_relative '../../lib/zold/node/farm'
11
-
12
- class FarmTest < Zold::Test
13
- def test_renders_in_json
14
- Dir.mktmpdir do |dir|
15
- farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 2)
16
- farm.start('localhost', 80, threads: 2) do
17
- assert_wait { !farm.best.empty? && !farm.best[0].value.zero? }
18
- count = 0
19
- 100.times { count += farm.to_json[:best].length }
20
- assert_predicate(count, :positive?)
21
- end
22
- end
23
- end
24
-
25
- def test_renders_in_text
26
- Dir.mktmpdir do |dir|
27
- farm = Zold::Farm.new('NOPREFIX7@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 1)
28
- farm.start('localhost', 80, threads: 2) do
29
- refute_nil(farm.to_text)
30
- end
31
- end
32
- end
33
-
34
- def test_makes_many_scores
35
- Dir.mktmpdir do |dir|
36
- farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'),
37
- log: fake_log, lifetime: 10, farmer: Zold::Farmers::Plain.new, strength: 1)
38
- farm.start('localhost', 80, threads: 4) do
39
- assert_wait { farm.best.length == 4 }
40
- end
41
- end
42
- end
43
-
44
- # @todo #527:30min This test takes too long. The speed should be less than
45
- # a few milliseconds, however, if you run it a few times, you will see
46
- # that it is over 100ms sometimes. This is way too slow. I can't understand
47
- # what's going on. It seems that IO.read() is taking too long sometimes.
48
- # Try to measure its time of execution in Farm.load() and you will see
49
- # that it's usually a few microseconds, but sometimes over 200ms.
50
- def test_reads_scores_at_high_speed
51
- Dir.mktmpdir do |dir|
52
- farm = Zold::Farm.new('NOPREFIX6@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 4)
53
- farm.start('localhost', 80, threads: 4) do
54
- assert_wait { !farm.best.empty? && !farm.best[0].value.zero? }
55
- cycles = 100
56
- speed = (0..(cycles - 1)).sum do
57
- start = Time.now
58
- farm.best
59
- Time.now - start
60
- end / cycles
61
- fake_log.info("Average speed is #{(speed * 1000).round(2)}ms in #{cycles} cycles")
62
- end
63
- end
64
- end
65
-
66
- def test_makes_best_score_in_background
67
- Dir.mktmpdir do |dir|
68
- farm = Zold::Farm.new('NOPREFIX1@ffffffffffffffff', File.join(dir, 'f'), log: fake_log, strength: 3)
69
- farm.start('localhost', 80, threads: 1) do
70
- assert_wait { !farm.best.empty? && farm.best[0].value >= 3 }
71
- score = farm.best[0]
72
- refute_predicate(score, :expired?)
73
- assert_operator(score.value, :>=, 3)
74
- end
75
- end
76
- end
77
-
78
- def test_correct_score_from_empty_farm
79
- Dir.mktmpdir do |dir|
80
- farm = Zold::Farm.new('NOPREFIX2@cccccccccccccccc', File.join(dir, 'f'), log: fake_log, strength: 1)
81
- farm.start('example.com', 8080, threads: 0) do
82
- score = farm.best[0]
83
- refute_predicate(score, :expired?)
84
- assert_equal(0, score.value)
85
- assert_equal('example.com', score.host)
86
- assert_equal(8080, score.port)
87
- end
88
- end
89
- end
90
-
91
- def test_pre_loads_history
92
- Dir.mktmpdir do |dir|
93
- cache = File.join(dir, 'a/b/c/cache')
94
- farm = Zold::Farm.new('NOPREFIX3@cccccccccccccccc', cache, log: fake_log, strength: 1)
95
- farm.start('example.com', 8080, threads: 0) do
96
- score = farm.best[0]
97
- refute_nil(score, 'The list of best scores can\'t be empty!')
98
- assert_path_exists(cache, 'The cache file has to be created!')
99
- assert_equal(0, score.value)
100
- refute_predicate(score, :expired?)
101
- assert_equal('example.com', score.host)
102
- assert_equal(8080, score.port)
103
- end
104
- end
105
- end
106
-
107
- def test_drops_expired_scores_from_history
108
- Dir.mktmpdir do |dir|
109
- cache = File.join(dir, 'cache')
110
- score = Zold::Score.new(
111
- time: Time.parse('2017-07-19T21:24:51Z'),
112
- host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff',
113
- suffixes: %w[13f7f01 b2b32b 4ade7e],
114
- strength: 6
115
- )
116
- File.write(cache, score.to_s)
117
- farm = Zold::Farm.new('NOPREFIX4@ffffffffffffffff', cache, log: fake_log, strength: score.strength)
118
- farm.start(score.host, score.port, threads: 1) do
119
- 100.times do
120
- sleep(0.1)
121
- b = farm.best[0]
122
- refute_nil(b)
123
- break if b.value.zero?
124
- end
125
- assert_equal(0, farm.best[0].value)
126
- end
127
- end
128
- end
129
-
130
- def test_garbage_farm_file
131
- log = TestLogger.new
132
- Dir.mktmpdir do |dir|
133
- file = File.join(dir, 'corrupted_farm')
134
- [
135
- 'some garbage',
136
- 'some other garbage'
137
- ].each do |score_garbage_line|
138
- valid_score = Zold::Score.new(
139
- time: Time.parse('2017-07-19T21:24:51Z'),
140
- host: 'some-host', port: 9999, invoice: 'NOPREFIX5@ffffffffffffffff',
141
- suffixes: %w[13f7f01 b2b32b 4ade7e], strength: 6
142
- )
143
- File.open(file, 'w') do |f|
144
- f.puts(score_garbage_line)
145
- f.puts(valid_score)
146
- end
147
- farm = Zold::Farm.new('NOPREFIX5@ffffffffffffffff', file, log: log)
148
- assert_equal(1, farm.best.count)
149
- refute_nil(log.msgs.find { |m| m.include?('Invalid score') })
150
- end
151
- end
152
- end
153
-
154
- def test_terminates_farm_entirely
155
- Zold::Farm.new('NOPREFIX4@ffffffffffffffff', log: fake_log, strength: 10).start('localhost', 4096, threads: 1) do
156
- sleep 1
157
- end
158
- end
159
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: Copyright (c) 2018-2025 Zerocracy
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'time'
7
- require 'zold/score'
8
- require_relative '../test__helper'
9
- require_relative '../../lib/zold/node/farmers'
10
- require_relative '../../lib/zold/verbose_thread'
11
-
12
- class FarmersTest < Zold::Test
13
- # Types to test
14
- TYPES = [
15
- Zold::Farmers::Plain,
16
- Zold::Farmers::Spawn,
17
- Zold::Farmers::Fork
18
- ].freeze
19
-
20
- def test_calculates_next_score
21
- before = Zold::Score.new(host: 'some-host', port: 9999, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 3)
22
- TYPES.each do |farmer_class|
23
- farmer = farmer_class.new(log: fake_log)
24
- after = farmer.up(before)
25
- assert_equal(1, after.value)
26
- refute_predicate(after, :expired?)
27
- assert_equal('some-host', after.host)
28
- assert_equal(9999, after.port)
29
- end
30
- end
31
-
32
- def test_calculates_large_score
33
- TYPES.each do |type|
34
- log = TestLogger.new(fake_log)
35
- thread = Thread.start do
36
- farmer = type.new(log: log)
37
- farmer.up(Zold::Score.new(host: 'a', port: 1, invoice: 'NOPREFIX4@ffffffffffffffff', strength: 20))
38
- end
39
- sleep(0.1)
40
- thread.kill
41
- thread.join
42
- end
43
- end
44
-
45
- def test_kills_farmer
46
- TYPES.each do |type|
47
- farmer = type.new(log: fake_log)
48
- thread = Thread.start do
49
- Zold::VerboseThread.new(fake_log).run do
50
- farmer.up(Zold::Score.new(host: 'some-host', invoice: 'NOPREFIX4@ffffffffffffffff', strength: 32))
51
- end
52
- end
53
- sleep(1)
54
- thread.kill
55
- thread.join
56
- end
57
- end
58
- end