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
@@ -22,6 +22,7 @@
22
22
 
23
23
  require 'minitest/autorun'
24
24
  require 'time'
25
+ require 'threads'
25
26
  require_relative '../fake_home'
26
27
  require_relative '../test__helper'
27
28
  require_relative '../../lib/zold/copies'
@@ -33,7 +34,7 @@ require_relative '../../lib/zold/commands/clean'
33
34
  # License:: MIT
34
35
  class TestClean < Minitest::Test
35
36
  def test_cleans_copies
36
- FakeHome.new.run do |home|
37
+ FakeHome.new(log: test_log).run do |home|
37
38
  wallet = home.create_wallet
38
39
  copies = home.copies(wallet)
39
40
  copies.add('a1', 'host-1', 80, 1, Time.now - 26 * 60 * 60)
@@ -42,4 +43,16 @@ class TestClean < Minitest::Test
42
43
  assert(copies.all.empty?)
43
44
  end
44
45
  end
46
+
47
+ def test_cleans_copies_in_threads
48
+ FakeHome.new(log: test_log).run do |home|
49
+ wallet = home.create_wallet
50
+ copies = home.copies(wallet)
51
+ copies.add(IO.read(wallet.path), 'host-2', 80, 2, Time.now)
52
+ Threads.new(20).assert do
53
+ Zold::Clean.new(wallets: home.wallets, copies: copies.root, log: test_log).run(['clean'])
54
+ end
55
+ assert_equal(1, copies.all.count)
56
+ end
57
+ end
45
58
  end
@@ -41,8 +41,8 @@ class TestCreate < Minitest::Test
41
41
  wallets.find(id) do |wallet|
42
42
  assert(wallet.balance.zero?)
43
43
  assert(
44
- File.exist?(File.join(dir, "#{wallet.id}#{Zold::Wallet::EXTENSION}")),
45
- "Wallet file not found: #{wallet.id}#{Zold::Wallet::EXTENSION}"
44
+ File.exist?(File.join(dir, "#{wallet.id}#{Zold::Wallet::EXT}")),
45
+ "Wallet file not found: #{wallet.id}#{Zold::Wallet::EXT}"
46
46
  )
47
47
  end
48
48
  end
@@ -40,18 +40,18 @@ require_relative '../../lib/zold/commands/diff'
40
40
  # License:: MIT
41
41
  class TestDiff < Minitest::Test
42
42
  def test_diff_with_copies
43
- FakeHome.new.run do |home|
43
+ FakeHome.new(log: test_log).run do |home|
44
44
  wallet = home.create_wallet
45
45
  first = home.create_wallet
46
- File.write(first.path, File.read(wallet.path))
46
+ IO.write(first.path, IO.read(wallet.path))
47
47
  second = home.create_wallet
48
- File.write(second.path, File.read(wallet.path))
48
+ IO.write(second.path, IO.read(wallet.path))
49
49
  Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: test_log).run(
50
50
  ['pay', wallet.id.to_s, "NOPREFIX@#{Zold::Id.new}", '14.95', '--force', '--private-key=fixtures/id_rsa']
51
51
  )
52
52
  copies = home.copies(wallet)
53
- copies.add(File.read(first.path), 'host-1', 80, 5)
54
- copies.add(File.read(second.path), 'host-2', 80, 5)
53
+ copies.add(IO.read(first.path), 'host-1', 80, 5)
54
+ copies.add(IO.read(second.path), 'host-2', 80, 5)
55
55
  diff = Zold::Diff.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
56
56
  ['diff', wallet.id.to_s]
57
57
  )
@@ -42,13 +42,13 @@ require_relative '../../lib/zold/commands/fetch'
42
42
  # License:: MIT
43
43
  class TestFetch < Minitest::Test
44
44
  def test_fetches_wallet
45
- FakeHome.new.run do |home|
45
+ FakeHome.new(log: test_log).run do |home|
46
46
  wallet = home.create_wallet
47
47
  stub_request(:get, "http://localhost:80/wallet/#{wallet.id}").to_return(
48
48
  status: 200,
49
49
  body: {
50
50
  'score': Zold::Score::ZERO.to_h,
51
- 'body': File.read(wallet.path),
51
+ 'body': IO.read(wallet.path),
52
52
  'mtime': Time.now.utc.iso8601
53
53
  }.to_json
54
54
  )
@@ -42,18 +42,18 @@ require_relative '../../lib/zold/commands/pay'
42
42
  # License:: MIT
43
43
  class TestMerge < Minitest::Test
44
44
  def test_merges_wallet
45
- FakeHome.new.run do |home|
45
+ FakeHome.new(log: test_log).run do |home|
46
46
  wallet = home.create_wallet
47
47
  first = home.create_wallet
48
- File.write(first.path, File.read(wallet.path))
48
+ IO.write(first.path, IO.read(wallet.path))
49
49
  second = home.create_wallet
50
- File.write(second.path, File.read(wallet.path))
50
+ IO.write(second.path, IO.read(wallet.path))
51
51
  Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: test_log).run(
52
52
  ['pay', wallet.id.to_s, "NOPREFIX@#{Zold::Id.new}", '14.95', '--force', '--private-key=fixtures/id_rsa']
53
53
  )
54
54
  copies = home.copies(wallet)
55
- copies.add(File.read(first.path), 'host-1', 80, 5)
56
- copies.add(File.read(second.path), 'host-2', 80, 5)
55
+ copies.add(IO.read(first.path), 'host-1', 80, 5)
56
+ copies.add(IO.read(second.path), 'host-2', 80, 5)
57
57
  modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
58
58
  ['merge', wallet.id.to_s]
59
59
  )
@@ -63,18 +63,18 @@ class TestMerge < Minitest::Test
63
63
  end
64
64
 
65
65
  def test_merges_into_empty_wallet
66
- FakeHome.new.run do |home|
66
+ FakeHome.new(log: test_log).run do |home|
67
67
  wallet = home.create_wallet
68
68
  first = home.create_wallet
69
- File.write(first.path, File.read(wallet.path))
69
+ IO.write(first.path, IO.read(wallet.path))
70
70
  second = home.create_wallet
71
- File.write(second.path, File.read(wallet.path))
71
+ IO.write(second.path, IO.read(wallet.path))
72
72
  Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: test_log).run(
73
73
  ['pay', wallet.id.to_s, "NOPREFIX@#{Zold::Id.new}", '14.95', '--force', '--private-key=fixtures/id_rsa']
74
74
  )
75
75
  copies = home.copies(wallet)
76
- copies.add(File.read(first.path), 'host-1', 80, 5)
77
- copies.add(File.read(second.path), 'host-2', 80, 5)
76
+ copies.add(IO.read(first.path), 'host-1', 80, 5)
77
+ copies.add(IO.read(second.path), 'host-2', 80, 5)
78
78
  modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
79
79
  ['merge', wallet.id.to_s]
80
80
  )
@@ -84,10 +84,10 @@ class TestMerge < Minitest::Test
84
84
  end
85
85
 
86
86
  def test_merges_with_a_broken_copy
87
- FakeHome.new.run do |home|
87
+ FakeHome.new(log: test_log).run do |home|
88
88
  wallet = home.create_wallet
89
89
  copies = home.copies(wallet)
90
- copies.add(File.read(wallet.path), 'good-host', 80, 5)
90
+ copies.add(IO.read(wallet.path), 'good-host', 80, 5)
91
91
  copies.add('some garbage', 'bad-host', 80, 5)
92
92
  modified = Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
93
93
  ['merge', wallet.id.to_s]
@@ -97,10 +97,10 @@ class TestMerge < Minitest::Test
97
97
  end
98
98
 
99
99
  def test_merges_a_copy_on_top
100
- FakeHome.new.run do |home|
100
+ FakeHome.new(log: test_log).run do |home|
101
101
  wallet = home.create_wallet(Zold::Id::ROOT)
102
102
  copies = home.copies(wallet)
103
- copies.add(File.read(wallet.path), 'good-host', 80, 5)
103
+ copies.add(IO.read(wallet.path), 'good-host', 80, 5)
104
104
  key = Zold::Key.new(file: 'fixtures/id_rsa')
105
105
  wallet.sub(Zold::Amount.new(zld: 9.99), "NOPREFIX@#{Zold::Id.new}", key)
106
106
  Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
@@ -111,13 +111,13 @@ class TestMerge < Minitest::Test
111
111
  end
112
112
 
113
113
  def test_rejects_fake_positives_in_new_wallet
114
- FakeHome.new.run do |home|
114
+ FakeHome.new(log: test_log).run do |home|
115
115
  main = home.create_wallet
116
116
  remote = home.create_wallet
117
- File.write(remote.path, File.read(main.path))
117
+ IO.write(remote.path, IO.read(main.path))
118
118
  remote.add(Zold::Txn.new(1, Time.now, Zold::Amount.new(zld: 11.0), 'NOPREFIX', Zold::Id.new, 'fake'))
119
119
  copies = home.copies(main)
120
- copies.add(File.read(remote.path), 'fake-host', 80, 0)
120
+ copies.add(IO.read(remote.path), 'fake-host', 80, 0)
121
121
  Zold::Merge.new(wallets: home.wallets, copies: copies.root, log: test_log).run(
122
122
  ['merge', main.id.to_s, '--no-baseline']
123
123
  )
@@ -126,7 +126,7 @@ class TestMerge < Minitest::Test
126
126
  end
127
127
 
128
128
  def test_removes_negative_fakes
129
- FakeHome.new.run do |home|
129
+ FakeHome.new(log: test_log).run do |home|
130
130
  wallet = home.create_wallet
131
131
  key = Zold::Key.new(file: 'fixtures/id_rsa')
132
132
  wallet.sub(Zold::Amount.new(zld: 9.99), "NOPREFIX@#{Zold::Id.new}", key)
@@ -143,7 +143,7 @@ class TestMerge < Minitest::Test
143
143
  Dir.mktmpdir do |dir|
144
144
  FileUtils.cp_r(File.join('fixtures/merge', "#{f}/."), dir)
145
145
  scores = File.join(dir, "copies/0123456789abcdef/scores#{Zold::Copies::EXT}")
146
- File.write(scores, File.read(scores).gsub(/NOW/, Time.now.utc.iso8601))
146
+ IO.write(scores, IO.read(scores).gsub(/NOW/, Time.now.utc.iso8601))
147
147
  FileUtils.cp('fixtures/merge/asserts.rb', dir)
148
148
  wallets = Zold::Wallets.new(dir)
149
149
  copies = File.join(dir, 'copies')
@@ -44,7 +44,7 @@ class TestNode < Minitest::Test
44
44
  # are always working
45
45
  def test_push_and_fetch
46
46
  skip
47
- FakeHome.new.run do |home|
47
+ FakeHome.new(log: test_log).run do |home|
48
48
  FakeNode.new(log: test_log).run do |port|
49
49
  wallets = home.wallets
50
50
  wallet = home.create_wallet
@@ -21,6 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'minitest/autorun'
24
+ require 'threads'
24
25
  require_relative '../test__helper'
25
26
  require_relative '../fake_home'
26
27
  require_relative '../../lib/zold/wallets'
@@ -35,7 +36,7 @@ require_relative '../../lib/zold/commands/pay'
35
36
  # License:: MIT
36
37
  class TestPay < Minitest::Test
37
38
  def test_sends_from_wallet_to_wallet
38
- FakeHome.new.run do |home|
39
+ FakeHome.new(log: test_log).run do |home|
39
40
  source = home.create_wallet
40
41
  target = home.create_wallet
41
42
  amount = Zold::Amount.new(zld: 14.95)
@@ -50,10 +51,10 @@ class TestPay < Minitest::Test
50
51
  end
51
52
 
52
53
  def test_pay_in_many_threads
53
- FakeHome.new.run do |home|
54
+ FakeHome.new(log: test_log).run do |home|
54
55
  wallet = home.create_wallet
55
56
  amount = Zold::Amount.new(zld: 2.0)
56
- assert_in_threads(threads: 10) do
57
+ Threads.new(10).assert do
57
58
  Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: test_log).run(
58
59
  [
59
60
  'pay', '--force', '--private-key=fixtures/id_rsa',
@@ -66,7 +67,7 @@ class TestPay < Minitest::Test
66
67
  end
67
68
 
68
69
  def test_sends_from_root_wallet
69
- FakeHome.new.run do |home|
70
+ FakeHome.new(log: test_log).run do |home|
70
71
  source = home.create_wallet(Zold::Id::ROOT)
71
72
  target = home.create_wallet
72
73
  amount = Zold::Amount.new(zld: 14.95)
@@ -81,7 +82,7 @@ class TestPay < Minitest::Test
81
82
  end
82
83
 
83
84
  def test_sends_from_normal_wallet
84
- FakeHome.new.run do |home|
85
+ FakeHome.new(log: test_log).run do |home|
85
86
  source = home.create_wallet
86
87
  target = home.create_wallet
87
88
  amount = Zold::Amount.new(zld: 14.95)
@@ -102,7 +103,7 @@ class TestPay < Minitest::Test
102
103
  end
103
104
 
104
105
  def test_notifies_about_tax_status
105
- FakeHome.new.run do |home|
106
+ FakeHome.new(log: test_log).run do |home|
106
107
  source = home.create_wallet
107
108
  target = home.create_wallet
108
109
  amount = Zold::Amount.new(zld: 14.95)
@@ -33,7 +33,7 @@ require_relative '../../lib/zold/commands/pay'
33
33
  # License:: MIT
34
34
  class TestPropagate < Minitest::Test
35
35
  def test_propagates_wallet
36
- FakeHome.new.run do |home|
36
+ FakeHome.new(log: test_log).run do |home|
37
37
  wallet = home.create_wallet
38
38
  friend = home.create_wallet
39
39
  amount = Zold::Amount.new(zld: 14.95)
@@ -44,6 +44,7 @@ class TestPropagate < Minitest::Test
44
44
  ['merge', wallet.id.to_s]
45
45
  )
46
46
  assert(amount, friend.balance)
47
+ assert(1, friend.txns.count)
47
48
  assert('', friend.txns[0].sign)
48
49
  end
49
50
  end
@@ -34,7 +34,7 @@ require_relative '../../lib/zold/commands/pull'
34
34
  # License:: MIT
35
35
  class TestPull < Minitest::Test
36
36
  def test_pull_wallet
37
- FakeHome.new.run do |home|
37
+ FakeHome.new(log: test_log).run do |home|
38
38
  remotes = home.remotes
39
39
  remotes.add('localhost', 80)
40
40
  json = home.create_wallet_json
@@ -37,7 +37,7 @@ require_relative '../../lib/zold/commands/push'
37
37
  # License:: MIT
38
38
  class TestPush < Minitest::Test
39
39
  def test_pushes_wallet
40
- FakeHome.new.run do |home|
40
+ FakeHome.new(log: test_log).run do |home|
41
41
  wallet = home.create_wallet
42
42
  remotes = home.remotes
43
43
  remotes.add('localhost', 80)
@@ -0,0 +1,57 @@
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_relative '../fake_home'
25
+ require_relative '../test__helper'
26
+ require_relative '../../lib/zold/commands/remove'
27
+
28
+ # REMOVE test.
29
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
31
+ # License:: MIT
32
+ class TestRemove < Minitest::Test
33
+ def test_removes_one_wallet
34
+ FakeHome.new(log: test_log).run do |home|
35
+ wallet = home.create_wallet
36
+ assert_equal(1, home.wallets.all.count)
37
+ Zold::Remove.new(wallets: home.wallets, log: test_log).run(['remove', wallet.id.to_s])
38
+ assert(home.wallets.all.empty?)
39
+ end
40
+ end
41
+
42
+ def test_removes_wallets
43
+ FakeHome.new(log: test_log).run do |home|
44
+ home.create_wallet
45
+ home.create_wallet
46
+ Zold::Remove.new(wallets: home.wallets, log: test_log).run(['remove'])
47
+ assert(home.wallets.all.empty?)
48
+ end
49
+ end
50
+
51
+ def test_removes_no_wallets
52
+ FakeHome.new(log: test_log).run do |home|
53
+ Zold::Remove.new(wallets: home.wallets, log: test_log).run(['remove'])
54
+ assert(home.wallets.all.empty?)
55
+ end
56
+ end
57
+ end
@@ -38,7 +38,7 @@ require_relative '../../lib/zold/commands/taxes'
38
38
  # License:: MIT
39
39
  class TestTaxes < Minitest::Test
40
40
  def test_pays_taxes
41
- FakeHome.new.run do |home|
41
+ FakeHome.new(log: test_log).run do |home|
42
42
  wallets = home.wallets
43
43
  wallet = home.create_wallet
44
44
  wallet.add(
data/test/fake_home.rb CHANGED
@@ -21,10 +21,12 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'tmpdir'
24
+ require_relative '../lib/zold/log'
24
25
  require_relative '../lib/zold/id'
25
26
  require_relative '../lib/zold/wallet'
26
27
  require_relative '../lib/zold/wallets'
27
28
  require_relative '../lib/zold/sync_wallets'
29
+ require_relative '../lib/zold/cached_wallets'
28
30
  require_relative '../lib/zold/key'
29
31
  require_relative '../lib/zold/version'
30
32
  require_relative '../lib/zold/remotes'
@@ -35,26 +37,27 @@ require_relative '../lib/zold/remotes'
35
37
  # License:: MIT
36
38
  class FakeHome
37
39
  attr_reader :dir
38
- def initialize(dir = __dir__)
40
+ def initialize(dir = __dir__, log: Zold::Log::Quiet.new)
39
41
  @dir = dir
42
+ @log = log
40
43
  end
41
44
 
42
45
  def run
43
46
  Dir.mktmpdir do |dir|
44
- FileUtils.copy(File.join(__dir__, '../fixtures/id_rsa'), File.join(dir, 'id_rsa'))
45
- yield FakeHome.new(dir)
47
+ FileUtils.copy(File.expand_path(File.join(__dir__, '../fixtures/id_rsa')), File.join(dir, 'id_rsa'))
48
+ yield FakeHome.new(dir, log: @log)
46
49
  end
47
50
  end
48
51
 
49
52
  def wallets
50
- Zold::SyncWallets.new(Zold::Wallets.new(@dir), File.join(@dir, 'locks'))
53
+ Zold::SyncWallets.new(Zold::CachedWallets.new(Zold::Wallets.new(@dir)), log: @log)
51
54
  end
52
55
 
53
56
  def create_wallet(id = Zold::Id.new, dir = @dir)
54
- target = Zold::Wallet.new(File.join(dir, id.to_s))
57
+ target = Zold::Wallet.new(File.join(dir, id.to_s + Zold::Wallet::EXT))
55
58
  wallets.find(id) do |w|
56
- w.init(id, Zold::Key.new(file: File.join(__dir__, '../fixtures/id_rsa.pub')))
57
- File.write(target.path, File.read(w.path))
59
+ w.init(id, Zold::Key.new(file: File.expand_path(File.join(__dir__, '../fixtures/id_rsa.pub'))))
60
+ IO.write(target.path, IO.read(w.path))
58
61
  end
59
62
  target
60
63
  end
@@ -73,7 +76,7 @@ class FakeHome
73
76
  mtime: wallet.mtime.utc.iso8601,
74
77
  digest: wallet.digest,
75
78
  balance: wallet.balance.to_i,
76
- body: File.read(wallet.path)
79
+ body: IO.read(wallet.path)
77
80
  }.to_json
78
81
  end
79
82
  end
@@ -38,9 +38,9 @@ class FakeNode
38
38
  @log = log
39
39
  end
40
40
 
41
- def run(args = ['--standalone'])
41
+ def run(args = ['--standalone', '--no-metronome'])
42
42
  WebMock.allow_net_connect!
43
- FakeHome.new.run do |home|
43
+ FakeHome.new(log: @log).run do |home|
44
44
  RandomPort::Pool::SINGLETON.acquire do |port|
45
45
  node = Thread.new do
46
46
  Zold::VerboseThread.new(@log).run do
@@ -21,6 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'minitest/autorun'
24
+ require 'threads'
24
25
  require_relative '../fake_home'
25
26
  require_relative '../test__helper'
26
27
  require_relative '../../lib/zold/id'
@@ -33,33 +34,48 @@ require_relative 'fake_entrance'
33
34
  # License:: MIT
34
35
  class TestAsyncEntrance < Minitest::Test
35
36
  def test_renders_json
36
- FakeHome.new.run do |home|
37
+ FakeHome.new(log: test_log).run do |home|
37
38
  Zold::AsyncEntrance.new(FakeEntrance.new, home.dir, log: test_log).start do |e|
38
39
  assert_equal(true, e.to_json[:'pool.running'])
39
40
  end
40
41
  end
41
42
  end
42
43
 
43
- def test_sends_through
44
- FakeHome.new.run do |home|
44
+ def test_sends_through_once
45
+ FakeHome.new(log: test_log).run do |home|
45
46
  wallet = home.create_wallet
46
47
  amount = Zold::Amount.new(zld: 39.99)
47
48
  key = Zold::Key.new(file: 'fixtures/id_rsa')
48
49
  wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
49
50
  basic = CountingEntrance.new
50
51
  Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log).start do |e|
51
- 5.times { e.push(wallet.id, File.read(wallet.path)) }
52
- assert_equal_wait(false) { basic.count.zero? }
53
- assert(!basic.count.zero?)
52
+ e.push(wallet.id, IO.read(wallet.path))
53
+ assert_equal_wait(1) { basic.count }
54
+ end
55
+ end
56
+ end
57
+
58
+ def test_sends_through
59
+ FakeHome.new(log: test_log).run do |home|
60
+ basic = CountingEntrance.new
61
+ Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log).start do |e|
62
+ Threads.new(20).assert do
63
+ wallet = home.create_wallet
64
+ amount = Zold::Amount.new(zld: 39.99)
65
+ key = Zold::Key.new(file: 'fixtures/id_rsa')
66
+ wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
67
+ 5.times { e.push(wallet.id, IO.read(wallet.path)) }
68
+ end
54
69
  end
70
+ assert_equal_wait(true) { basic.count >= 20 }
55
71
  end
56
72
  end
57
73
 
58
74
  def test_handles_broken_entrance_gracefully
59
- FakeHome.new.run do |home|
75
+ FakeHome.new(log: test_log).run do |home|
60
76
  wallet = home.create_wallet
61
77
  Zold::AsyncEntrance.new(BrokenEntrance.new, home.dir, log: test_log).start do |e|
62
- e.push(wallet.id, File.read(wallet.path))
78
+ e.push(wallet.id, IO.read(wallet.path))
63
79
  end
64
80
  end
65
81
  end