big_brother 0.6.8 → 0.8.7

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.
@@ -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