big_brother 0.6.8 → 0.8.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,44 @@ require 'spec_helper'
2
2
 
3
3
  describe BigBrother::Configuration do
4
4
  describe 'self.from_file' do
5
- it 'maintain a collection of clusters' do
5
+ context 'loading invalid config' do
6
+ before do
7
+ @config_file = Tempfile.new('config.yml')
8
+ File.open(@config_file, 'w') do |f|
9
+ f.puts(<<-EOF)
10
+ ---
11
+ clusters:
12
+ - cluster_name: 1
13
+ check_interval: ""
14
+ scheduler: wrr
15
+ fwmark: 1
16
+ nodes:
17
+ - address: 127.0.0
18
+ port: 9001
19
+ path: /test/valid
20
+ EOF
21
+ end
22
+ end
23
+
24
+ it 'fails' do
25
+ BigBrother.configure(@config_file.path)
26
+
27
+ BigBrother.clusters.size.should be_zero
28
+ end
29
+
30
+ it 'logs errors' do
31
+ errors = ["- [/clusters/0/cluster_name] '1': not a string.", "- [/clusters/0/check_interval] '': not a integer.", "- [/clusters/0/nodes/0/address] '127.0.0': not matched to pattern /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/."]
32
+
33
+ BigBrother.logger = NullLogger.new([])
34
+ BigBrother::Configuration.from_file(@config_file.path)
35
+
36
+ BigBrother.logger.messages.should == errors
37
+
38
+ BigBrother.logger = NullLogger.new
39
+ end
40
+ end
41
+
42
+ it 'maintains a collection of clusters' do
6
43
  clusters = BigBrother::Configuration.from_file(TEST_CONFIG)
7
44
 
8
45
  clusters['test1'].check_interval.should == 1
@@ -17,11 +54,16 @@ describe BigBrother::Configuration do
17
54
  clusters['test2'].check_interval.should == 2
18
55
  clusters['test2'].scheduler.should == 'wrr'
19
56
  clusters['test2'].fwmark.should == 2
20
- clusters['test2'].ramp_up_time.should == 60
21
57
 
22
58
  clusters['test3'].check_interval.should == 1
23
59
  clusters['test3'].scheduler.should == 'wrr'
24
60
  clusters['test3'].fwmark.should == 3
61
+
62
+ clusters['test4'].backend_mode.should == 'active_active'
63
+ clusters['test4'].offset.should == 10000
64
+ clusters['test4'].max_down_ticks.should == 100
65
+ clusters['test4'].ramp_up_time.should == 60
66
+ clusters['test4'].non_egress_locations.should == ['test']
25
67
  end
26
68
 
27
69
  it 'populates a clusters nodes' do
@@ -29,13 +71,15 @@ describe BigBrother::Configuration do
29
71
 
30
72
  clusters['test1'].nodes.length.should == 2
31
73
 
32
- clusters['test1'].nodes[0].address == '127.0.0.1'
33
- clusters['test1'].nodes[0].port == '9001'
34
- clusters['test1'].nodes[0].path == '/test/valid'
74
+ clusters['test1'].nodes[0].address.should == '127.0.0.1'
75
+ clusters['test1'].nodes[0].port.should == 9001
76
+ clusters['test1'].nodes[0].path.should == '/test/valid'
35
77
 
36
- clusters['test1'].nodes[1].address == '127.0.0.1'
37
- clusters['test1'].nodes[1].port == '9002'
38
- clusters['test1'].nodes[1].path == '/test/valid'
78
+ clusters['test1'].nodes[1].address.should == '127.0.0.1'
79
+ clusters['test1'].nodes[1].port.should == 9002
80
+ clusters['test1'].nodes[1].path.should == '/test/valid'
81
+
82
+ clusters['test4'].interpol_node.should be_interpol
39
83
  end
40
84
 
41
85
  it 'allows a default cluster configuration under the global config key' do
@@ -45,28 +89,29 @@ describe BigBrother::Configuration do
45
89
  ---
46
90
  _big_brother:
47
91
  check_interval: 2
48
- scheduler: wrr
49
92
  nagios:
50
93
  server: 127.0.0.2
51
94
  host: ha-services
52
- test_without_overrides:
53
- fwmark: 2
54
- nagios:
55
- check: test_check
56
- nodes:
57
- - address: 127.0.0.1
58
- port: 9001
59
- path: /test/invalid
60
- test_with_overrides:
61
- fwmark: 3
62
- scheduler: wlc
63
- nagios:
64
- host: override-host
65
- check: test_overrides_check
66
- nodes:
67
- - address: 127.0.0.1
68
- port: 9001
69
- path: /test/invalid
95
+ clusters:
96
+ - cluster_name: test_without_overrides
97
+ scheduler: wrr
98
+ fwmark: 2
99
+ nagios:
100
+ check: test_check
101
+ nodes:
102
+ - address: 127.0.0.1
103
+ port: 9001
104
+ path: /test/invalid
105
+ - cluster_name: test_with_overrides
106
+ fwmark: 3
107
+ scheduler: wlc
108
+ nagios:
109
+ host: override-host
110
+ check: test_overrides_check
111
+ nodes:
112
+ - address: 127.0.0.1
113
+ port: 9001
114
+ path: /test/invalid
70
115
  EOF
71
116
  end
72
117
 
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe BigBrother::HealthFetcher do
4
- describe "#current_health" do
5
- run_in_reactor
4
+ run_in_reactor
6
5
 
6
+ describe "#current_health" do
7
7
  it "returns its health" do
8
8
  StubServer.new(<<-HTTP)
9
9
  HTTP/1.0 200 OK
@@ -48,4 +48,49 @@ HTTP
48
48
  end
49
49
  end
50
50
 
51
+ describe "#interpol_status" do
52
+ it "returns nodes as a list" do
53
+ StubServer.new(<<-HTTP)
54
+ HTTP/1.0 200 OK
55
+ Connection: close
56
+
57
+ [{"aggregated_health":0,"count":1,"lb_ip_address":"load1.stq","lb_url":"http://load1.stq:80/lvs.json","health":0}]
58
+ HTTP
59
+ BigBrother::HealthFetcher.interpol_status(Factory.node(:address => "127.0.0.1", :port => 8081, :interpol => true, :path => '/fwmark'), 'test').should == [
60
+ {"aggregated_health" => 0,"count" => 1,"lb_ip_address" => "load1.stq","lb_url" => "http://load1.stq:80/lvs.json","health" => 0}
61
+ ]
62
+ end
63
+
64
+ it "returns an empty list when HTTP status code is not 200" do
65
+ StubServer.new(<<-HTTP)
66
+ HTTP/1.0 503 OK
67
+ Connection: close
68
+
69
+ HTTP
70
+ BigBrother::HealthFetcher.interpol_status(Factory.node(:address => "127.0.0.1", :port => 8081, :interpol => true, :path => '/fwmark'), 'test').should == []
71
+ end
72
+
73
+ it "returns an empty list for an unknown service" do
74
+ StubServer.new(<<-HTTP)
75
+ HTTP/1.0 503 Service Unavailable
76
+ Connection: close
77
+ HTTP
78
+ BigBrother::HealthFetcher.interpol_status(Factory.node(:address => "127.0.0.1", :port => 8081, :interpol => true, :path => '/fwmark'), 'test').should == []
79
+ end
80
+
81
+ it "returns 0 for an unknown DNS entry" do
82
+ BigBrother::HealthFetcher.interpol_status(Factory.node(:address => "junk.local", :port => 8081, :interpol => true, :path => '/fwmark'), 'test').should == []
83
+ end
84
+
85
+ it "returns empty list for an unparseable response body" do
86
+ StubServer.new(<<-HTTP)
87
+ HTTP/1.0 200 OK
88
+ Connection: close
89
+
90
+ This part is for people.
91
+ HTTP
92
+ BigBrother::HealthFetcher.interpol_status(Factory.node(:address => "127.0.0.1", :port => 8081, :interpol => true, :path => '/fwmark'), 'test').should == []
93
+ end
94
+ end
95
+
51
96
  end
@@ -3,108 +3,49 @@ require 'spec_helper'
3
3
  describe BigBrother::Node do
4
4
 
5
5
  describe "#monitor" do
6
- it "updates the weight for the node" do
7
- BigBrother::HealthFetcher.stub(:current_health).and_return(56)
8
- node = Factory.node(:address => '127.0.0.1')
9
- cluster = Factory.cluster(:fwmark => 100, :nodes => [node])
10
- cluster.start_monitoring!
11
- @stub_executor.commands.clear
12
-
13
- node.monitor(cluster)
14
-
15
- @stub_executor.commands.should include("ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 56")
16
- end
17
-
18
6
  it "a node's health should increase linearly over the specified ramp up time" do
19
7
  BigBrother::HealthFetcher.stub(:current_health).and_return(100)
20
8
  Time.stub(:now).and_return(1345043600)
21
9
 
22
10
  node = Factory.node(:address => '127.0.0.1')
23
11
  cluster = Factory.cluster(:ramp_up_time => 60, :fwmark => 100, :nodes => [node])
24
- cluster.start_monitoring!
25
12
 
26
13
  Time.stub(:now).and_return(1345043630)
27
- node.monitor(cluster)
28
- @stub_executor.commands.last.should == "ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 50"
14
+ node.monitor(cluster).should == 50
29
15
 
30
16
  Time.stub(:now).and_return(1345043645)
31
- node.monitor(cluster)
32
- @stub_executor.commands.last.should == "ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 75"
17
+ node.monitor(cluster).should == 75
33
18
 
34
19
  Time.stub(:now).and_return(1345043720)
35
- node.monitor(cluster)
36
- @stub_executor.commands.last.should == "ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 100"
20
+ node.monitor(cluster).should == 100
37
21
  end
38
22
 
39
23
  it "sets the weight to 100 for each node if an up file exists" do
40
24
  BigBrother::HealthFetcher.stub(:current_health).and_return(56)
41
25
  node = Factory.node(:address => '127.0.0.1', :weight => 10)
42
26
  cluster = Factory.cluster(:fwmark => 100, :nodes => [node])
43
- cluster.start_monitoring!
44
- @stub_executor.commands.clear
45
27
 
46
28
  BigBrother::StatusFile.new('up', 'test').create('Up for testing')
47
29
 
48
- node.monitor(cluster)
49
-
50
- @stub_executor.commands.should include("ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 100")
30
+ node.monitor(cluster).should == 100
51
31
  end
52
32
 
53
33
  it "sets the weight to 0 for each node if a down file exists" do
54
34
  BigBrother::HealthFetcher.stub(:current_health).and_return(56)
55
35
  node = Factory.node(:address => '127.0.0.1')
56
36
  cluster = Factory.cluster(:fwmark => 100, :nodes => [node])
57
- cluster.start_monitoring!
58
- @stub_executor.commands.clear
59
37
 
60
38
  BigBrother::StatusFile.new('down', 'test').create('Down for testing')
61
39
 
62
- node.monitor(cluster)
63
-
64
- @stub_executor.commands.should include("ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 0")
65
- end
66
-
67
- it "does not run multiple ipvsadm commands if the health does not change" do
68
- BigBrother::HealthFetcher.stub(:current_health).and_return(56)
69
- node = Factory.node(:address => '127.0.0.1')
70
- cluster = Factory.cluster(:fwmark => 100, :nodes => [node])
71
- cluster.start_monitoring!
72
- @stub_executor.commands.clear
73
-
74
- node.monitor(cluster)
75
- node.monitor(cluster)
76
-
77
- @stub_executor.commands.should == ["ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 56"]
78
- end
79
-
80
- it "will run multiple ipvsadm commands if the health does change" do
81
- BigBrother::HealthFetcher.stub(:current_health).and_return(56)
82
- node = Factory.node(:address => '127.0.0.1')
83
- cluster = Factory.cluster(:fwmark => 100, :nodes => [node])
84
- cluster.start_monitoring!
85
- @stub_executor.commands.clear
86
-
87
- node.monitor(cluster)
88
- node.monitor(cluster)
89
- BigBrother::HealthFetcher.stub(:current_health).and_return(41)
90
- node.monitor(cluster)
91
-
92
- @stub_executor.commands.should == [
93
- "ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 56",
94
- "ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 41"
95
- ]
40
+ node.monitor(cluster).should == 0
96
41
  end
97
42
 
98
- it "does not update the weight if the cluster is no longer monitored" do
99
- BigBrother::HealthFetcher.stub(:current_health).and_return(56)
100
- node = Factory.node(:address => '127.0.0.1')
43
+ it "caps the weight of a node to the max_weight configured" do
44
+ BigBrother::HealthFetcher.stub(:current_health).and_return(100)
45
+ node = Factory.node(:address => '127.0.0.1', :max_weight => 10)
101
46
  cluster = Factory.cluster(:fwmark => 100, :nodes => [node])
102
- cluster.stop_monitoring!
103
-
104
- @stub_executor.commands.clear
105
- node.monitor(cluster)
106
47
 
107
- @stub_executor.commands.should == []
48
+ node.monitor(cluster).should == 10
108
49
  end
109
50
  end
110
51
 
@@ -122,6 +63,39 @@ describe BigBrother::Node do
122
63
  end
123
64
  end
124
65
 
66
+ describe "<=>" do
67
+ it "returns 1 when compared to a node with a nil weight" do
68
+ node1 = Factory.node(:address => "127.0.0.1", :port => "8000", :priority => 1, :weight => 0)
69
+ node2 = Factory.node(:address => "127.0.0.2", :port => "8000", :priority => 2, :weight => nil)
70
+ (node1 <=> node2).should == 1
71
+ end
72
+
73
+ it "returns 1 for comparison of an unhealthy node to an healthy one" do
74
+ node1 = Factory.node(:address => "127.0.0.1", :port => "8000", :priority => 1, :weight => 0)
75
+ node2 = Factory.node(:address => "127.0.0.2", :port => "8000", :priority => 2, :weight => 90)
76
+ (node1 <=> node2).should == 1
77
+ end
78
+
79
+ it "returns -1 for a node with lower priority" do
80
+ node1 = Factory.node(:address => "127.0.0.1", :port => "8000", :priority => 1)
81
+ node2 = Factory.node(:address => "127.0.0.2", :port => "8000", :priority => 2)
82
+ (node1 <=> node2).should == -1
83
+ end
84
+
85
+ it "returns 1 for a node with higher priority" do
86
+ node1 = Factory.node(:address => "127.0.0.1", :port => "8000", :priority => 1)
87
+ node2 = Factory.node(:address => "127.0.0.2", :port => "8000", :priority => 2)
88
+ (node2 <=> node1).should == 1
89
+ end
90
+
91
+ it "uses ip address for comparison if the priorities are the same" do
92
+ node1 = Factory.node(:address => "127.0.0.1", :port => "8000", :priority => 1)
93
+ node2 = Factory.node(:address => "127.0.0.2", :port => "8000", :priority => 1)
94
+ (node2 <=> node1).should == 1
95
+ (node1 <=> node2).should == -1
96
+ end
97
+ end
98
+
125
99
  describe "age" do
126
100
  it "is the time in seconds since the node started" do
127
101
  Time.stub(:now).and_return(1345043612)
@@ -23,9 +23,10 @@ describe BigBrother::Ticker do
23
23
  Factory.node(:address => public_ip_address, :port => 8082)
24
24
  ]
25
25
  )
26
- BigBrother.clusters['test'].start_monitoring!
26
+ BigBrother.clusters['test'].instance_variable_set(:@monitored, true)
27
27
  @stub_executor.commands.clear
28
28
 
29
+ BigBrother::Ticker.instance_variable_set(:@outstanding_ticks, 0)
29
30
  BigBrother::Ticker.tick
30
31
 
31
32
  @stub_executor.commands.should include("ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 74")
@@ -37,9 +38,10 @@ describe BigBrother::Ticker do
37
38
  :fwmark => 100,
38
39
  :nodes => [Factory.node(:address => '127.0.0.1', :port => 8081)]
39
40
  )
40
- BigBrother.clusters['test'].start_monitoring!
41
+ BigBrother.clusters['test'].instance_variable_set(:@monitored, true)
41
42
  @stub_executor.commands.clear
42
43
 
44
+ BigBrother::Ticker.instance_variable_set(:@outstanding_ticks, 0)
43
45
  BigBrother::Ticker.tick
44
46
  BigBrother::Ticker.tick
45
47
 
@@ -48,12 +50,14 @@ describe BigBrother::Ticker do
48
50
  end
49
51
 
50
52
  it "monitors clusters requiring monitoring" do
53
+ BigBrother::HealthFetcher.stub(:current_health)
51
54
  BigBrother.clusters['one'] = Factory.cluster
52
55
  BigBrother.clusters['two'] = Factory.cluster
53
56
  BigBrother.clusters['two'].start_monitoring!
54
57
 
55
58
  BigBrother.clusters['two'].should_receive(:monitor_nodes)
56
59
 
60
+ BigBrother::Ticker.instance_variable_set(:@outstanding_ticks, 0)
57
61
  BigBrother::Ticker.tick
58
62
  end
59
63
  end
@@ -1,10 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe BigBrother do
4
+ describe '.monitor_nodes' do
5
+ it "updates the weight for all the nodes in a cluster" do
6
+ BigBrother::HealthFetcher.stub(:current_health).and_return(76)
7
+ node1 = Factory.node(:address => '127.0.0.1', :weight => 90)
8
+ node2 = Factory.node(:address => '127.0.0.2', :weight => 30)
9
+ cluster = Factory.cluster(:fwmark => 100, :nodes => [node1, node2])
10
+ cluster.start_monitoring!
11
+ @stub_executor.commands.clear
12
+
13
+ BigBrother::HealthFetcher.stub(:current_health).and_return(56)
14
+ cluster.monitor_nodes
15
+
16
+ cluster.nodes.map(&:weight).uniq.should == [56]
17
+ @stub_executor.commands.should include("ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.1 --ipip --weight 56")
18
+ @stub_executor.commands.should include("ipvsadm --edit-server --fwmark-service 100 --real-server 127.0.0.2 --ipip --weight 56")
19
+ end
20
+
21
+ end
22
+
4
23
  describe '.configure' do
5
24
  it "reads the configuration file" do
6
25
  BigBrother.configure(TEST_CONFIG)
7
- BigBrother.clusters.size.should == 3
26
+ BigBrother.clusters.size.should == 4
8
27
  end
9
28
  end
10
29
 
@@ -27,14 +46,15 @@ HTTP
27
46
  File.open(config_file, 'w') do |f|
28
47
  f.puts(<<-EOF)
29
48
  ---
30
- test1:
31
- check_interval: 1
32
- scheduler: wrr
33
- fwmark: 1
34
- nodes:
35
- - address: 127.0.0.1
36
- port: 9001
37
- path: /test/valid
49
+ clusters:
50
+ - cluster_name: test1
51
+ check_interval: 1
52
+ scheduler: wrr
53
+ fwmark: 1
54
+ nodes:
55
+ - address: 127.0.0.1
56
+ port: 9001
57
+ path: /test/valid
38
58
  EOF
39
59
  end
40
60
  BigBrother.configure(config_file)
@@ -44,17 +64,24 @@ EOF
44
64
  File.open(config_file, 'w') do |f|
45
65
  f.puts(<<-EOF)
46
66
  ---
47
- test1:
48
- check_interval: 1
49
- scheduler: wrr
50
- fwmark: 1
51
- nodes:
52
- - address: 127.0.0.1
53
- port: 9001
54
- path: /test/another/path
67
+ clusters:
68
+ - cluster_name: test1
69
+ check_interval: 1
70
+ scheduler: wrr
71
+ backend_mode: 'active_active'
72
+ fwmark: 1
73
+ nodes:
74
+ - address: 127.0.0.1
75
+ port: 9001
76
+ path: /test/another/path
77
+ - address: 127.0.0.9
78
+ port: 9000
79
+ path: /fwmark
80
+ interpol: true
55
81
  EOF
56
82
  end
57
83
  BigBrother.reconfigure
84
+ BigBrother.clusters['test1'].class.should == BigBrother::ActiveActiveCluster
58
85
  BigBrother.clusters['test1'].nodes.first.path.should == "/test/another/path"
59
86
  end
60
87
 
@@ -64,14 +91,15 @@ EOF
64
91
  File.open(config_file, 'w') do |f|
65
92
  f.puts(<<-EOF)
66
93
  ---
67
- test1:
68
- check_interval: 1
69
- scheduler: wrr
70
- fwmark: 1
71
- nodes:
72
- - address: 127.0.0.1
73
- port: 9001
74
- path: /test/valid
94
+ clusters:
95
+ - cluster_name: test1
96
+ check_interval: 1
97
+ scheduler: wrr
98
+ fwmark: 1
99
+ nodes:
100
+ - address: 127.0.0.1
101
+ port: 9001
102
+ path: /test/valid
75
103
  EOF
76
104
  end
77
105
  BigBrother.configure(config_file)
@@ -84,17 +112,18 @@ EOF
84
112
  File.open(config_file, 'w') do |f|
85
113
  f.puts(<<-EOF)
86
114
  ---
87
- test1:
88
- check_interval: 1
89
- scheduler: wrr
90
- fwmark: 1
91
- nodes:
92
- - address: 127.0.0.1
93
- port: 9001
94
- path: /test/valid
95
- - address: 127.0.0.2
96
- port: 9001
97
- path: /test/valid
115
+ clusters:
116
+ - cluster_name: test1
117
+ check_interval: 1
118
+ scheduler: wrr
119
+ fwmark: 1
120
+ nodes:
121
+ - address: 127.0.0.1
122
+ port: 9001
123
+ path: /test/valid
124
+ - address: 127.0.0.2
125
+ port: 9001
126
+ path: /test/valid
98
127
  EOF
99
128
  end
100
129
  BigBrother.reconfigure
@@ -109,20 +138,20 @@ EOF
109
138
  File.open(config_file, 'w') do |f|
110
139
  f.puts(<<-EOF)
111
140
  ---
112
- test1:
113
- check_interval: 1
114
- scheduler: wrr
115
- fwmark: 1
116
- ramp_up_time: 0
117
- nodes:
118
- - address: 127.0.0.1
119
- port: 9001
120
- path: /test/valid
141
+ clusters:
142
+ - cluster_name: test1
143
+ check_interval: 1
144
+ scheduler: wrr
145
+ fwmark: 1
146
+ ramp_up_time: 0
147
+ nodes:
148
+ - address: 127.0.0.1
149
+ port: 9001
150
+ path: /test/valid
121
151
  EOF
122
152
  end
123
153
  BigBrother.configure(config_file)
124
154
  BigBrother.clusters['test1'].start_monitoring!
125
- @stub_executor.commands.clear
126
155
 
127
156
  BigBrother.start_ticker!
128
157
 
@@ -131,20 +160,21 @@ EOF
131
160
  File.open(config_file, 'w') do |f|
132
161
  f.puts(<<-EOF)
133
162
  ---
134
- test1:
135
- check_interval: 1
136
- scheduler: wrr
137
- fwmark: 1
138
- nodes:
139
- - address: 127.0.0.1
140
- port: 9001
141
- path: /test/another/path
163
+ clusters:
164
+ - cluster_name: test1
165
+ check_interval: 1
166
+ scheduler: wrr
167
+ fwmark: 1
168
+ nodes:
169
+ - address: 127.0.0.1
170
+ port: 9001
171
+ path: /test/another/path
142
172
  EOF
143
173
  end
144
174
  BigBrother.reconfigure
145
175
  BigBrother.clusters['test1'].nodes.first.path.should == "/test/another/path"
146
176
 
147
- @stub_executor.commands.first.should include("--weight 50")
177
+ @stub_executor.commands.last.should include("--weight 50")
148
178
  end
149
179
  end
150
180
  end