zold 0.19.0 → 0.19.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b6e5a80a2216feaeb4ac83bafc229c711bb981df2c1c7fa73a828f9620580c5
4
- data.tar.gz: 9cb90c56a015453a5ababcabed994a119ae44b734d557bf00f3fabebe9a06660
3
+ metadata.gz: 4a31487e8700a8c5b7c346e82df8f142931e471a37292df407067320a6a095e9
4
+ data.tar.gz: ffb06dbf75783b9be9c7b02271bdb5a1a1a70a74b61909cb52f82b24d7ac6ab3
5
5
  SHA512:
6
- metadata.gz: cbd48e9a0ac951f438964c39e98d3e5942d41665b1bb8f61d7a5ef1942947566fd6be97eea8871a317a47004812ba56cccf4a7fafd2bd552112026189158aada
7
- data.tar.gz: c661f88c9fe2de378dd2bb1107f5b7cd12ca0ab2cb2fd3465070da1b7be5105c0c3627257e0cb7eb4eb9e4680f58cb8d2044ae55069ef6deeaa8158ba17e335f
6
+ metadata.gz: 78ded3b0ff00af5ccf51e31d68e5e8593f3a1c0ee5851a3b051ee77b29e9abad1b672f9daca870bcc6805f0089db89c12c92b791d6cdbecc393db0ac9dc607bc
7
+ data.tar.gz: b7e0bcdf1b27eaefe1ddb141538f0b01a001cdfe3128056c1620c7f8201d6e72e21f0623a7d3c044a08bc1d8ec64e5a8ed067ef9d2267372ebd226d9fa86fd5b
@@ -4,7 +4,7 @@ function start_node {
4
4
  port=$(reserve_port)
5
5
  mkdir ${port}
6
6
  cd ${port}
7
- zold node --trace --invoice=DISTRWALLET@ffffffffffffffff --tolerate-edges \
7
+ zold node --trace --invoice=DISTRWALLET@ffffffffffffffff --tolerate-edges --tolerate-quorum=1 \
8
8
  --host=127.0.0.1 --port=${port} --bind-port=${port} \
9
9
  --threads=0 --routine-immediately --never-reboot > log.txt 2>&1 &
10
10
  pid=$!
@@ -36,7 +36,7 @@ zold --public-key=id_rsa.pub create 0000000000000000
36
36
  zold pay --private-key=id_rsa 0000000000000000 NOPREFIX@aaaabbbbccccdddd 4.95 'For the book'
37
37
  zold remote clean
38
38
  zold remote add 127.0.0.1 ${first}
39
- zold push 0000000000000000 --tolerate-edges
39
+ zold push 0000000000000000 --tolerate-edges --tolerate-quorum=1
40
40
  zold remote clean
41
41
  zold remote add 127.0.0.1 ${second}
42
42
 
@@ -45,7 +45,7 @@ zold remote add 127.0.0.1 ${second}
45
45
  # delay between them, in order to give the first node a chance to distribute
46
46
  # the wallet.
47
47
  i=0
48
- until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges; do
48
+ until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges --tolerate-quorum=1; do
49
49
  echo 'Failed to fetch, let us try again'
50
50
  ((i++)) || sleep 0
51
51
  if ((i==5)); then
@@ -73,7 +73,7 @@ fi
73
73
  # have the wallet very soon.
74
74
  rm -f ${second}/**/*.z
75
75
  i=0
76
- until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges; do
76
+ until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges --tolerate-quorum=1; do
77
77
  echo 'Failed to fetch, let us try again'
78
78
  ((i++)) || sleep 0
79
79
  if ((i==5)); then
@@ -4,7 +4,7 @@ port=$(reserve_port)
4
4
  mkdir server
5
5
  cd server
6
6
  zold remote clean
7
- zold node --trace --invoice=PULLONSTART@ffffffffffffffff --no-metronome --tolerate-edges \
7
+ zold node --trace --invoice=PULLONSTART@ffffffffffffffff --no-metronome --tolerate-edges --tolerate-quorum=1 \
8
8
  --host=127.0.0.1 --port=${port} --bind-port=${port} \
9
9
  --threads=0 --standalone --pretty=full 2>&1 &
10
10
  cd ..
@@ -15,16 +15,16 @@ zold remote clean
15
15
  zold remote add 127.0.0.1 ${port}
16
16
 
17
17
  zold --public-key=id_rsa.pub create abcdabcdabcdabcd
18
- zold push abcdabcdabcdabcd --tolerate-edges
18
+ zold push abcdabcdabcdabcd --tolerate-edges --tolerate-quorum=1
19
19
  zold remove abcdabcdabcdabcd
20
- zold invoice abcdabcdabcdabcd --tolerate-edges
20
+ zold invoice abcdabcdabcdabcd --tolerate-edges --tolerate-quorum=1
21
21
 
22
22
  second_port=$(reserve_port)
23
23
  mkdir second
24
24
  cd second
25
25
  zold remote clean
26
26
  zold remote add 127.0.0.1 ${port}
27
- zold node --trace --invoice=abcdabcdabcdabcd --no-metronome --tolerate-edges \
27
+ zold node --trace --invoice=abcdabcdabcdabcd --no-metronome --tolerate-edges --tolerate-quorum=1 \
28
28
  --host=127.0.0.1 --port=${second_port} --bind-port=${second_port} \
29
29
  --threads=0 &
30
30
 
@@ -4,7 +4,7 @@ port=$(reserve_port)
4
4
 
5
5
  mkdir server
6
6
  cd server
7
- zold node --trace --invoice=PUSHNPULL@ffffffffffffffff --tolerate-edges \
7
+ zold node --trace --invoice=PUSHNPULL@ffffffffffffffff --tolerate-edges --tolerate-quorum=1 \
8
8
  --host=127.0.0.1 --port=${port} --bind-port=${port} \
9
9
  --threads=0 --standalone 2>&1 &
10
10
  pid=$!
@@ -29,13 +29,13 @@ zold show 0000000000000000
29
29
  zold taxes debt 0000000000000000
30
30
 
31
31
  zold remote show
32
- zold push --tolerate-edges
33
- zold push 0000000000000000 --tolerate-edges
34
- until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges; do
32
+ zold push --tolerate-edges --tolerate-quorum=1
33
+ zold push 0000000000000000 --tolerate-edges --tolerate-quorum=1
34
+ until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges --tolerate-quorum=1; do
35
35
  echo 'Failed to fetch, let us try again'
36
36
  sleep 1
37
37
  done
38
- zold fetch --tolerate-edges
38
+ zold fetch --tolerate-edges --tolerate-quorum=1
39
39
  zold diff 0000000000000000
40
40
  zold merge
41
41
  zold merge 0000000000000000
@@ -5,7 +5,7 @@ function start_node {
5
5
  cd $1
6
6
  zold remote clean
7
7
  zold node $3 --nohup --nohup-command='touch restarted' --nohup-log=log --nohup-max-cycles=0 --nohup-log-truncate=10240 \
8
- --expose-version=$2 --save-pid=pid --routine-immediately --tolerate-edges \
8
+ --expose-version=$2 --save-pid=pid --routine-immediately --tolerate-edges --tolerate-quorum=1 \
9
9
  --verbose --trace --invoice=REDEPLOY@ffffffffffffffff \
10
10
  --host=127.0.0.1 --port=$1 --bind-port=$1 --threads=1 --strength=20 > /dev/null 2>&1
11
11
  wait_for_port $1
@@ -5,7 +5,7 @@ function start_node {
5
5
  mkdir ${port}
6
6
  cd ${port}
7
7
  zold remote clean
8
- zold node --trace --invoice=SPREADWALLETS@ffffffffffffffff --tolerate-edges \
8
+ zold node --trace --invoice=SPREADWALLETS@ffffffffffffffff --tolerate-edges --tolerate-quorum=1 \
9
9
  --host=127.0.0.1 --port=${port} --bind-port=${port} \
10
10
  --threads=0 > log.txt 2>&1 &
11
11
  pid=$!
@@ -26,12 +26,12 @@ zold --public-key=id_rsa.pub create 0000000000000000
26
26
  zold pay --private-key=id_rsa 0000000000000000 NOPREFIX@aaaabbbbccccdddd 4.95 'To help you, dude!'
27
27
  zold remote clean
28
28
  zold remote add 127.0.0.1 ${first}
29
- zold push 0000000000000000 --tolerate-edges
29
+ zold push 0000000000000000 --tolerate-edges --tolerate-quorum=1
30
30
  zold remote clean
31
31
  zold remote add 127.0.0.1 ${second}
32
32
 
33
33
  i=0
34
- until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges; do
34
+ until zold fetch 0000000000000000 --ignore-score-weakness --tolerate-edges --tolerate-quorum=1; do
35
35
  echo 'Failed to fetch, let us try again'
36
36
  ((i++)) || sleep 0
37
37
  if ((i==5)); then
@@ -49,6 +49,12 @@ module Zold
49
49
  class Fetch
50
50
  prepend ThreadBadge
51
51
 
52
+ # Raises when there are only edge nodes and not a single master one.
53
+ class EdgesOnly < StandardError; end
54
+
55
+ # Raises when there are not enough successful nodes.
56
+ class NoQuorum < StandardError; end
57
+
52
58
  def initialize(wallets:, remotes:, copies:, log: Log::NULL)
53
59
  @wallets = wallets
54
60
  @remotes = remotes
@@ -69,6 +75,9 @@ Available options:"
69
75
  o.bool '--tolerate-edges',
70
76
  'Don\'t fail if only "edge" (not "master" ones) nodes accepted the wallet',
71
77
  default: false
78
+ o.integer '--tolerate-quorum',
79
+ 'The minimum number of nodes required for a successful fetch (default: 4)',
80
+ default: 4
72
81
  o.bool '--quiet-if-absent',
73
82
  'Don\'t fail if the wallet is absent in all remote nodes',
74
83
  default: false
@@ -105,7 +114,10 @@ Available options:"
105
114
  unless opts['quiet-if-absent']
106
115
  raise "No nodes out of #{nodes.value} have the wallet #{id}" if done.value.zero?
107
116
  if masters.value.zero? && !opts['tolerate-edges']
108
- raise "There are only edge nodes, run 'zold remote reset' or use --tolerate-edges"
117
+ raise EdgesOnly, "There are only edge nodes, run 'zold remote reset' or use --tolerate-edges"
118
+ end
119
+ if nodes.value < opts['tolerate-quorum']
120
+ raise NoQuorum, "There were not enough nodes, run 'zold remote reset' or use --tolerate-quorum=1"
109
121
  end
110
122
  end
111
123
  @log.info("#{done.value} copies of #{id} fetched in #{Age.new(start)} with the total score of \
@@ -54,6 +54,9 @@ Available options:"
54
54
  o.bool '--tolerate-edges',
55
55
  'Don\'t fail if only "edge" (not "master" ones) nodes have the wallet',
56
56
  default: false
57
+ o.integer '--tolerate-quorum',
58
+ 'The minimum number of nodes required for a successful fetch (default: 4)',
59
+ default: 4
57
60
  o.string '--network',
58
61
  'The name of the network we work in',
59
62
  default: 'test'
@@ -70,7 +73,7 @@ Available options:"
70
73
  unless @wallets.acq(id, &:exists?)
71
74
  require_relative 'pull'
72
75
  Pull.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(
73
- ['pull', id.to_s, "--network=#{opts['network']}"] +
76
+ ['pull', id.to_s, "--network=#{opts['network']}", "--tolerate-quorum=#{opts['tolerate-quorum']}"] +
74
77
  (opts['tolerate-edges'] ? ['--tolerate-edges'] : [])
75
78
  )
76
79
  end
@@ -100,6 +100,9 @@ module Zold
100
100
  o.bool '--tolerate-edges',
101
101
  'Don\'t fail if only "edge" (not "master" ones) nodes accepted/have the wallet',
102
102
  default: false
103
+ o.integer '--tolerate-quorum',
104
+ 'The minimum number of nodes required for a successful fetch (default: 4)',
105
+ default: 4
103
106
  o.boolean '--nohup',
104
107
  'Run it in background, rebooting when a higher version is available in the network',
105
108
  default: false
@@ -136,8 +139,8 @@ module Zold
136
139
  'Skip Out Of Memory check and never exit, no matter how much RAM is consumed',
137
140
  default: false
138
141
  o.integer '--oom-limit',
139
- 'Maximum amount of memory we can consume, quit if we take more than that, in Mb (default: 512)',
140
- default: 512
142
+ 'Maximum amount of memory we can consume, quit if we take more than that, in Mb (default: 256)',
143
+ default: 256
141
144
  o.integer '--queue-limit',
142
145
  'The maximum number of wallets to be accepted via PUSH and stored in the queue (default: 256)',
143
146
  default: 256
@@ -287,7 +290,7 @@ module Zold
287
290
  unless invoice.include?('@')
288
291
  require_relative 'invoice'
289
292
  invoice = Invoice.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(
290
- ['invoice', invoice, "--network=#{opts['network']}"] +
293
+ ['invoice', invoice, "--network=#{opts['network']}", "--tolerate-quorum=#{opts['tolerate-quorum']}"] +
291
294
  (opts['tolerate-edges'] ? ['--tolerate-edges'] : [])
292
295
  )
293
296
  end
@@ -45,6 +45,12 @@ module Zold
45
45
  class Push
46
46
  prepend ThreadBadge
47
47
 
48
+ # Raises when there are only edge nodes and not a single master one.
49
+ class EdgesOnly < StandardError; end
50
+
51
+ # Raises when there are not enough successful nodes.
52
+ class NoQuorum < StandardError; end
53
+
48
54
  def initialize(wallets:, remotes:, log: Log::NULL)
49
55
  @wallets = wallets
50
56
  @remotes = remotes
@@ -61,6 +67,9 @@ Available options:"
61
67
  o.bool '--tolerate-edges',
62
68
  'Don\'t fail if only "edge" (not "master" ones) nodes accepted the wallet',
63
69
  default: false
70
+ o.integer '--tolerate-quorum',
71
+ 'The minimum number of nodes required for a successful fetch (default: 4)',
72
+ default: 4
64
73
  o.bool '--quiet-if-missed',
65
74
  'Don\'t fail if the wallet wasn\'t delivered to any remotes',
66
75
  default: false
@@ -97,7 +106,10 @@ Available options:"
97
106
  unless opts['quiet-if-missed']
98
107
  raise "No nodes out of #{nodes} accepted the wallet #{id}" if done.value.zero?
99
108
  if masters.value.zero? && !opts['tolerate-edges']
100
- raise "There are only edge nodes, run 'zold remote reset' or use --tolerate-edges"
109
+ raise EdgesOnly, "There are only edge nodes, run 'zold remote reset' or use --tolerate-edges"
110
+ end
111
+ if nodes.value < opts['tolerate-quorum']
112
+ raise NoQuorum, "There were not enough nodes, run 'zold remote reset' or use --tolerate-quorum=1"
101
113
  end
102
114
  end
103
115
  @log.info("Push finished to #{done.value} nodes (#{masters.value} master nodes) \
@@ -48,6 +48,8 @@ module Zold
48
48
  Pull.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(
49
49
  ['pull', id.to_s, "--network=#{@network}"]
50
50
  )
51
+ rescue Pull::EdgesOnly => e
52
+ @log.error("Can't hungry-pull #{id}: #{e.message}")
51
53
  end
52
54
  end
53
55
  super(wallets)
@@ -55,7 +57,13 @@ module Zold
55
57
 
56
58
  def acq(id, exclusive: false)
57
59
  @wallets.acq(id, exclusive: exclusive) do |wallet|
58
- @queue << id unless wallet.exists?
60
+ unless wallet.exists?
61
+ if @queue.size > 256
62
+ @log.error("Hungry queue is full with #{@queue.size} wallets, can't add #{id}")
63
+ else
64
+ @queue << id
65
+ end
66
+ end
59
67
  yield wallet
60
68
  end
61
69
  end
@@ -76,7 +76,7 @@ module Zold
76
76
  else
77
77
  Thread.current.thread_variable_set(:wallet, id.to_s)
78
78
  Push.new(wallets: @wallets, remotes: @remotes, log: @log).run(
79
- ['push', "--ignore-node=#{@address}", id.to_s] +
79
+ ['push', "--ignore-node=#{@address}", id.to_s, '--tolerate-quorum=1'] +
80
80
  (@ignore_score_weakeness ? ['--ignore-score-weakness'] : []) +
81
81
  (@tolerate_edges ? ['--tolerate-edges'] : [])
82
82
  )
@@ -25,7 +25,7 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.19.0'
28
+ VERSION = '0.19.1'
29
29
  PROTOCOL = 2
30
30
  REPO = 'zold-io/zold'
31
31
  end
@@ -59,15 +59,9 @@ class TestFetch < Zold::Test
59
59
  remotes.add('localhost', 4096)
60
60
  remotes.add('localhost', 81)
61
61
  copies = home.copies(wallet)
62
- begin
63
- retries ||= 0
64
- Zold::Fetch.new(wallets: home.wallets, copies: copies.root, remotes: remotes, log: test_log).run(
65
- ['fetch', '--ignore-score-weakness', wallet.id.to_s]
66
- )
67
- rescue StandardError => _
68
- sleep 1
69
- retry if (retries += 1) < 3
70
- end
62
+ Zold::Fetch.new(wallets: home.wallets, copies: copies.root, remotes: remotes, log: test_log).run(
63
+ ['fetch', '--tolerate-edges', '--tolerate-quorum=1', '--ignore-score-weakness', wallet.id.to_s]
64
+ )
71
65
  assert_equal(1, copies.all.count)
72
66
  assert_equal('1', copies.all[0][:name])
73
67
  assert_equal(0, copies.all[0][:score])
@@ -103,15 +97,12 @@ class TestFetch < Zold::Test
103
97
  remotes.add('localhost', 4096)
104
98
  copies_a = home.copies(wallet_a)
105
99
  copies_b = home.copies(wallet_b)
106
- begin
107
- retries ||= 0
108
- Zold::Fetch.new(wallets: home.wallets, copies: copies_a.root, remotes: remotes, log: log).run(
109
- ['fetch', '--ignore-score-weakness', '--threads 2', wallet_a.id.to_s, wallet_b.id.to_s]
110
- )
111
- rescue StandardError => _
112
- sleep 1
113
- retry if (retries += 1) < 3
114
- end
100
+ Zold::Fetch.new(wallets: home.wallets, copies: copies_a.root, remotes: remotes, log: log).run(
101
+ [
102
+ 'fetch', '--tolerate-edges', '--tolerate-quorum=1', '--ignore-score-weakness',
103
+ '--threads 2', wallet_a.id.to_s, wallet_b.id.to_s
104
+ ]
105
+ )
115
106
  assert_equal(1, copies_a.all.count)
116
107
  assert_equal('1', copies_a.all[0][:name])
117
108
  assert_equal(0, copies_a.all[0][:score])
@@ -120,4 +111,52 @@ class TestFetch < Zold::Test
120
111
  assert_equal(0, copies_b.all[0][:score])
121
112
  end
122
113
  end
114
+
115
+ def test_fails_when_only_edge_nodes
116
+ FakeHome.new(log: test_log).run do |home|
117
+ wallet = home.create_wallet
118
+ stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}/size")
119
+ .to_return(status: 200, body: wallet.size.to_s)
120
+ stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}").to_return(
121
+ status: 200,
122
+ body: {
123
+ 'score': Zold::Score::ZERO.to_h,
124
+ 'body': IO.read(wallet.path),
125
+ 'mtime': Time.now.utc.iso8601
126
+ }.to_json
127
+ )
128
+ remotes = home.remotes
129
+ remotes.add('localhost', 4096)
130
+ copies = home.copies(wallet)
131
+ assert_raises Zold::Fetch::EdgesOnly do
132
+ Zold::Fetch.new(wallets: home.wallets, copies: copies.root, remotes: remotes, log: test_log).run(
133
+ ['fetch', '--ignore-score-weakness', wallet.id.to_s]
134
+ )
135
+ end
136
+ end
137
+ end
138
+
139
+ def test_fails_when_only_one_node
140
+ FakeHome.new(log: test_log).run do |home|
141
+ wallet = home.create_wallet
142
+ stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}/size")
143
+ .to_return(status: 200, body: wallet.size.to_s)
144
+ stub_request(:get, "http://localhost:4096/wallet/#{wallet.id}").to_return(
145
+ status: 200,
146
+ body: {
147
+ 'score': Zold::Score::ZERO.to_h,
148
+ 'body': IO.read(wallet.path),
149
+ 'mtime': Time.now.utc.iso8601
150
+ }.to_json
151
+ )
152
+ remotes = home.remotes
153
+ remotes.add('localhost', 4096)
154
+ copies = home.copies(wallet)
155
+ assert_raises Zold::Fetch::NoQuorum do
156
+ Zold::Fetch.new(wallets: home.wallets, copies: copies.root, remotes: remotes, log: test_log).run(
157
+ ['fetch', '--tolerate-edges', '--ignore-score-weakness', wallet.id.to_s]
158
+ )
159
+ end
160
+ end
161
+ end
123
162
  end
@@ -47,7 +47,7 @@ class TestNode < Zold::Test
47
47
  remotes = home.remotes
48
48
  remotes.add('localhost', port)
49
49
  Zold::Push.new(wallets: wallets, remotes: remotes, log: test_log).run(
50
- ['push', '--ignore-score-weakness', '--tolerate-edges']
50
+ ['push', '--ignore-score-weakness', '--tolerate-edges', '--tolerate-quorum=1']
51
51
  )
52
52
  copies = home.copies(wallet)
53
53
  begin
@@ -55,7 +55,7 @@ class TestNode < Zold::Test
55
55
  Zold::Fetch.new(
56
56
  wallets: wallets, copies: copies.root,
57
57
  remotes: remotes, log: test_log
58
- ).run(['fetch', '--ignore-score-weakness', '--tolerate-edges'])
58
+ ).run(['fetch', '--ignore-score-weakness', '--tolerate-edges', '--tolerate-quorum=1'])
59
59
  rescue StandardError => _
60
60
  sleep 1
61
61
  retry if (retries += 1) < 3
@@ -42,11 +42,27 @@ class TestPull < Zold::Test
42
42
  stub_request(:get, "http://localhost:4096/wallet/#{id}/size").to_return(status: 200, body: '10000')
43
43
  stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 200, body: json)
44
44
  Zold::Pull.new(wallets: home.wallets, remotes: remotes, copies: home.copies.root.to_s, log: test_log).run(
45
- ['--ignore-this-stupid-option', 'pull', id.to_s, '--tolerate-edges']
45
+ ['--ignore-this-stupid-option', 'pull', id.to_s, '--tolerate-edges', '--tolerate-quorum=1']
46
46
  )
47
47
  home.wallets.acq(Zold::Id.new(id)) do |wallet|
48
48
  assert(wallet.exists?)
49
49
  end
50
50
  end
51
51
  end
52
+
53
+ def test_fails_when_only_edge_nodes
54
+ FakeHome.new(log: test_log).run do |home|
55
+ remotes = home.remotes
56
+ remotes.add('localhost', 4096)
57
+ json = home.create_wallet_json
58
+ id = Zold::JsonPage.new(json).to_hash['id']
59
+ stub_request(:get, "http://localhost:4096/wallet/#{id}/size").to_return(status: 200, body: '10000')
60
+ stub_request(:get, "http://localhost:4096/wallet/#{id}").to_return(status: 200, body: json)
61
+ assert_raises Zold::Fetch::EdgesOnly do
62
+ Zold::Pull.new(wallets: home.wallets, remotes: remotes, copies: home.copies.root.to_s, log: test_log).run(
63
+ ['--ignore-this-stupid-option', 'pull', id.to_s]
64
+ )
65
+ end
66
+ end
67
+ end
52
68
  end
@@ -43,7 +43,7 @@ class TestPush < Zold::Test
43
43
  remotes.add('localhost', 80)
44
44
  stub_request(:put, "http://localhost:80/wallet/#{wallet.id}").to_return(status: 304)
45
45
  Zold::Push.new(wallets: home.wallets, remotes: remotes, log: test_log).run(
46
- ['--ignore-this-stupid-option', 'push', wallet.id.to_s, '--tolerate-edges']
46
+ ['--ignore-this-stupid-option', 'push', wallet.id.to_s, '--tolerate-edges', '--tolerate-quorum=1']
47
47
  )
48
48
  end
49
49
  end
@@ -58,8 +58,36 @@ class TestPush < Zold::Test
58
58
  stub_request(:put, "http://localhost:80/wallet/#{wallet_a.id}").to_return(status: 304)
59
59
  stub_request(:put, "http://localhost:80/wallet/#{wallet_b.id}").to_return(status: 304)
60
60
  Zold::Push.new(wallets: home.wallets, remotes: remotes, log: log).run(
61
- ['--tolerate-edges', '--threads=2', 'push', wallet_a.id.to_s, wallet_b.id.to_s]
61
+ ['--tolerate-edges', '--tolerate-quorum=1', '--threads=2', 'push', wallet_a.id.to_s, wallet_b.id.to_s]
62
62
  )
63
63
  end
64
64
  end
65
+
66
+ def test_fails_when_only_edge_nodes
67
+ FakeHome.new(log: test_log).run do |home|
68
+ wallet = home.create_wallet
69
+ remotes = home.remotes
70
+ remotes.add('localhost', 80)
71
+ stub_request(:put, "http://localhost:80/wallet/#{wallet.id}").to_return(status: 304)
72
+ assert_raises Zold::Push::EdgesOnly do
73
+ Zold::Push.new(wallets: home.wallets, remotes: remotes, log: test_log).run(
74
+ ['push', wallet.id.to_s]
75
+ )
76
+ end
77
+ end
78
+ end
79
+
80
+ def test_fails_when_only_one_node
81
+ FakeHome.new(log: test_log).run do |home|
82
+ wallet = home.create_wallet
83
+ remotes = home.remotes
84
+ remotes.add('localhost', 80)
85
+ stub_request(:put, "http://localhost:80/wallet/#{wallet.id}").to_return(status: 304)
86
+ assert_raises Zold::Push::NoQuorum do
87
+ Zold::Push.new(wallets: home.wallets, remotes: remotes, log: test_log).run(
88
+ ['push', wallet.id.to_s, '--tolerate-edges']
89
+ )
90
+ end
91
+ end
92
+ end
65
93
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-17 00:00:00.000000000 Z
11
+ date: 2018-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -690,7 +690,7 @@ licenses:
690
690
  - MIT
691
691
  metadata: {}
692
692
  post_install_message: |-
693
- Thanks for installing Zold 0.19.0!
693
+ Thanks for installing Zold 0.19.1!
694
694
  Study our White Paper: https://papers.zold.io/wp.pdf
695
695
  Read our blog posts: https://blog.zold.io
696
696
  Try online wallet at: https://wts.zold.io