flapjack 0.6.38 → 0.6.39
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +3 -0
- data/.travis.yml +2 -0
- data/README.md +15 -186
- data/Rakefile +11 -7
- data/bin/flapjack +9 -17
- data/bin/flapjack-nagios-receiver +19 -32
- data/bin/flapjack-populator +7 -2
- data/etc/flapjack_config.yaml.example +20 -0
- data/flapjack.gemspec +1 -3
- data/lib/flapjack/api.rb +1 -5
- data/lib/flapjack/coordinator.rb +24 -28
- data/lib/flapjack/data/contact.rb +12 -10
- data/lib/flapjack/data/entity.rb +2 -2
- data/lib/flapjack/data/entity_check.rb +0 -9
- data/lib/flapjack/data/global.rb +25 -0
- data/lib/flapjack/executive.rb +1 -0
- data/lib/flapjack/jabber.rb +11 -19
- data/lib/flapjack/oobetet.rb +34 -32
- data/lib/flapjack/pagerduty.rb +140 -140
- data/lib/flapjack/redis_pool.rb +1 -1
- data/lib/flapjack/version.rb +1 -1
- data/lib/flapjack/web/views/check.haml +1 -1
- data/spec/lib/flapjack/coordinator_spec.rb +162 -5
- data/spec/lib/flapjack/data/contact_spec.rb +34 -2
- data/spec/lib/flapjack/data/entity_spec.rb +25 -11
- data/spec/lib/flapjack/jabber_spec.rb +2 -3
- data/spec/lib/flapjack/oobetet_spec.rb +140 -0
- data/spec/lib/flapjack/pagerduty_spec.rb +177 -0
- data/spec/lib/flapjack/redis_pool_spec.rb +24 -0
- data/spec/spec_helper.rb +3 -0
- metadata +10 -40
- data/doc/CONFIGURING.md +0 -38
- data/doc/DEBUGGING.md +0 -28
- data/doc/DEVELOPING.md +0 -35
- data/doc/GLOSSARY.md +0 -19
- data/doc/INSTALL.md +0 -64
- data/doc/PACKAGING.md +0 -25
@@ -4,12 +4,44 @@ require 'flapjack/data/contact'
|
|
4
4
|
|
5
5
|
describe Flapjack::Data::Contact, :redis => true do
|
6
6
|
|
7
|
+
it "returns a list of all contacts" do
|
8
|
+
Flapjack::Data::Contact.add({'id' => '362',
|
9
|
+
'first_name' => 'John',
|
10
|
+
'last_name' => 'Johnson',
|
11
|
+
'email' => 'johnj@example.com' },
|
12
|
+
:redis => @redis)
|
13
|
+
Flapjack::Data::Contact.add({'id' => '363',
|
14
|
+
'first_name' => 'Jane',
|
15
|
+
'last_name' => 'Janeley',
|
16
|
+
'email' => 'janej@example.com'},
|
17
|
+
:redis => @redis)
|
18
|
+
|
19
|
+
contacts = Flapjack::Data::Contact.all(:redis => @redis)
|
20
|
+
contacts.should_not be_nil
|
21
|
+
contacts.should be_an(Array)
|
22
|
+
contacts.should have(2).contacts
|
23
|
+
contacts[0].id.should == '362'
|
24
|
+
contacts[1].id.should == '363'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "finds a contact by id" do
|
28
|
+
Flapjack::Data::Contact.add({'id' => '362',
|
29
|
+
'first_name' => 'John',
|
30
|
+
'last_name' => 'Johnson',
|
31
|
+
'email' => 'johnj@example.com' },
|
32
|
+
:redis => @redis)
|
33
|
+
|
34
|
+
contact = Flapjack::Data::Contact.find_by_id('362', :redis => @redis)
|
35
|
+
contact.should_not be_nil
|
36
|
+
contact.name.should == "John Johnson"
|
37
|
+
end
|
38
|
+
|
7
39
|
it "finds all contacts for a check on an entity"
|
8
40
|
|
9
41
|
it "deletes all contacts"
|
10
42
|
|
11
|
-
it "adds a contact"
|
12
|
-
|
13
43
|
it "returns pagerduty credentials for a contact"
|
14
44
|
|
45
|
+
it "returns a list of entities for a contact"
|
46
|
+
|
15
47
|
end
|
@@ -6,10 +6,6 @@ describe Flapjack::Data::Entity, :redis => true do
|
|
6
6
|
let(:name) { 'abc-123' }
|
7
7
|
let(:check) { 'ping' }
|
8
8
|
|
9
|
-
it "adds an entity, including contacts"
|
10
|
-
|
11
|
-
it "finds an entity by name"
|
12
|
-
|
13
9
|
it "creates an entity if allowed when it can't find it" do
|
14
10
|
entity = Flapjack::Data::Entity.find_by_name(name, :redis => @redis, :create => true)
|
15
11
|
|
@@ -18,22 +14,40 @@ describe Flapjack::Data::Entity, :redis => true do
|
|
18
14
|
@redis.get("entity_id:#{name}").should == ''
|
19
15
|
end
|
20
16
|
|
21
|
-
it "finds an entity by id"
|
17
|
+
it "finds an entity by id" do
|
18
|
+
Flapjack::Data::Entity.add({'id' => '5000',
|
19
|
+
'name' => name},
|
20
|
+
:redis => @redis)
|
21
|
+
|
22
|
+
entity = Flapjack::Data::Entity.find_by_id('5000', :redis => @redis)
|
23
|
+
entity.should_not be_nil
|
24
|
+
entity.name.should == name
|
25
|
+
end
|
26
|
+
|
27
|
+
it "finds an entity by name" do
|
28
|
+
Flapjack::Data::Entity.add({'id' => '5000',
|
29
|
+
'name' => name},
|
30
|
+
:redis => @redis)
|
31
|
+
|
32
|
+
entity = Flapjack::Data::Entity.find_by_name(name, :redis => @redis)
|
33
|
+
entity.should_not be_nil
|
34
|
+
entity.id.should == '5000'
|
35
|
+
end
|
22
36
|
|
23
37
|
it "returns a list of all entities" do
|
24
|
-
Flapjack::Data::Entity.add({'id'
|
25
|
-
'name'
|
38
|
+
Flapjack::Data::Entity.add({'id' => '5000',
|
39
|
+
'name' => name},
|
26
40
|
:redis => @redis)
|
27
|
-
Flapjack::Data::Entity.add({'id'
|
28
|
-
'name'
|
41
|
+
Flapjack::Data::Entity.add({'id' => '5001',
|
42
|
+
'name' => "z_" + name},
|
29
43
|
:redis => @redis)
|
30
44
|
|
31
45
|
entities = Flapjack::Data::Entity.all(:redis => @redis)
|
32
46
|
entities.should_not be_nil
|
33
47
|
entities.should be_an(Array)
|
34
48
|
entities.should have(2).entities
|
35
|
-
entities[0].id.should == 5000
|
36
|
-
entities[1].id.should == 5001
|
49
|
+
entities[0].id.should == '5000'
|
50
|
+
entities[1].id.should == '5001'
|
37
51
|
end
|
38
52
|
|
39
53
|
it "returns a list of checks for an entity" do
|
@@ -27,8 +27,7 @@ describe Flapjack::Jabber do
|
|
27
27
|
fj.bootstrap(:config => config)
|
28
28
|
fj.should_receive(:build_redis_connection_pool)
|
29
29
|
|
30
|
-
|
31
|
-
EM.should_receive(:synchrony).exactly(4).times.and_yield
|
30
|
+
EventMachine::Synchrony.should_receive(:next_tick).exactly(4).times.and_yield
|
32
31
|
|
33
32
|
fj.should_receive(:register_handler).with(:ready).and_yield(stanza)
|
34
33
|
fj.should_receive(:on_ready).with(stanza)
|
@@ -149,7 +148,7 @@ describe Flapjack::Jabber do
|
|
149
148
|
["jabber_notifications", %q{{"notification_type":"shutdown"}}]
|
150
149
|
)
|
151
150
|
|
152
|
-
|
151
|
+
EventMachine::Synchrony.should_receive(:next_tick).twice.and_yield
|
153
152
|
fj.should_receive(:write).with(an_instance_of(Blather::Stanza::Message))
|
154
153
|
fj.should_receive(:close)
|
155
154
|
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flapjack/oobetet'
|
3
|
+
|
4
|
+
describe Flapjack::Oobetet do
|
5
|
+
|
6
|
+
let(:config) { {'server' => 'example.com',
|
7
|
+
'port' => '5222',
|
8
|
+
'jabberid' => 'flapjack@example.com',
|
9
|
+
'password' => 'password',
|
10
|
+
'alias' => 'flapjack',
|
11
|
+
'watched_check' => 'PING',
|
12
|
+
'watched_entity' => 'foo.bar.net',
|
13
|
+
'rooms' => ['flapjacktest@conference.example.com']
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
let(:stanza) { mock('stanza') }
|
18
|
+
|
19
|
+
it "raises an error if a required config setting is not set" do
|
20
|
+
Socket.should_receive(:gethostname).and_return('thismachine')
|
21
|
+
|
22
|
+
fo = Flapjack::Oobetet.new
|
23
|
+
fo.bootstrap(:config => config.delete('watched_check'))
|
24
|
+
|
25
|
+
lambda {
|
26
|
+
fo.setup
|
27
|
+
}.should raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it "hooks up event handlers to the appropriate methods" do
|
31
|
+
fo = Flapjack::Oobetet.new
|
32
|
+
fo.bootstrap(:config => config)
|
33
|
+
|
34
|
+
EventMachine::Synchrony.should_receive(:next_tick).exactly(3).times.and_yield
|
35
|
+
|
36
|
+
fo.should_receive(:register_handler).with(:ready).and_yield(stanza)
|
37
|
+
fo.should_receive(:on_ready).with(stanza)
|
38
|
+
|
39
|
+
fo.should_receive(:register_handler).with(:message, :groupchat?).and_yield(stanza)
|
40
|
+
fo.should_receive(:on_groupchat).with(stanza)
|
41
|
+
|
42
|
+
fo.should_receive(:register_handler).with(:disconnected).and_yield(stanza)
|
43
|
+
fo.should_receive(:on_disconnect).with(stanza).and_return(true)
|
44
|
+
|
45
|
+
fo.register_handlers
|
46
|
+
end
|
47
|
+
|
48
|
+
it "joins a chat room after connecting" do
|
49
|
+
fo = Flapjack::Oobetet.new
|
50
|
+
fo.bootstrap(:config => config)
|
51
|
+
|
52
|
+
fo.should_receive(:write).with(an_instance_of(Blather::Stanza::Presence))
|
53
|
+
fo.should_receive(:write).with(an_instance_of(Blather::Stanza::Message))
|
54
|
+
|
55
|
+
fo.on_ready(stanza)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "reconnects when disconnected (if not quitting)" do
|
59
|
+
fo = Flapjack::Oobetet.new
|
60
|
+
fo.bootstrap(:config => config)
|
61
|
+
|
62
|
+
EventMachine::Timer.should_receive(:new).with(1).and_yield
|
63
|
+
fo.should_receive(:connect)
|
64
|
+
|
65
|
+
ret = fo.on_disconnect(stanza)
|
66
|
+
ret.should be_true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "records times of a problem status messages" do
|
70
|
+
fo = Flapjack::Oobetet.new
|
71
|
+
fo.bootstrap(:config => config)
|
72
|
+
|
73
|
+
fo.setup
|
74
|
+
|
75
|
+
t = Time.now
|
76
|
+
|
77
|
+
stanza.should_receive(:body).and_return( %q{PROBLEM: "PING" on foo.bar.net} )
|
78
|
+
Time.should_receive(:now).and_return(t)
|
79
|
+
|
80
|
+
fo.on_groupchat(stanza)
|
81
|
+
fo_times = fo.instance_variable_get('@times')
|
82
|
+
fo_times.should_not be_nil
|
83
|
+
fo_times.should have_key(:last_problem)
|
84
|
+
fo_times[:last_problem].should == t.to_i
|
85
|
+
end
|
86
|
+
|
87
|
+
it "records times of a recovery status messages" do
|
88
|
+
fo = Flapjack::Oobetet.new
|
89
|
+
fo.bootstrap(:config => config)
|
90
|
+
|
91
|
+
fo.setup
|
92
|
+
|
93
|
+
t = Time.now
|
94
|
+
|
95
|
+
stanza.should_receive(:body).and_return( %q{RECOVERY: "PING" on foo.bar.net} )
|
96
|
+
Time.should_receive(:now).and_return(t)
|
97
|
+
|
98
|
+
fo.on_groupchat(stanza)
|
99
|
+
fo_times = fo.instance_variable_get('@times')
|
100
|
+
fo_times.should_not be_nil
|
101
|
+
fo_times.should have_key(:last_recovery)
|
102
|
+
fo_times[:last_recovery].should == t.to_i
|
103
|
+
end
|
104
|
+
|
105
|
+
it "records times of an acknowledgement status messages" do
|
106
|
+
fo = Flapjack::Oobetet.new
|
107
|
+
fo.bootstrap(:config => config)
|
108
|
+
|
109
|
+
fo.setup
|
110
|
+
|
111
|
+
t = Time.now
|
112
|
+
|
113
|
+
stanza.should_receive(:body).and_return( %q{ACKNOWLEDGEMENT: "PING" on foo.bar.net} )
|
114
|
+
Time.should_receive(:now).and_return(t)
|
115
|
+
|
116
|
+
fo.on_groupchat(stanza)
|
117
|
+
fo_times = fo.instance_variable_get('@times')
|
118
|
+
fo_times.should_not be_nil
|
119
|
+
fo_times.should have_key(:last_ack)
|
120
|
+
fo_times[:last_ack].should == t.to_i
|
121
|
+
end
|
122
|
+
|
123
|
+
it "runs a loop checking for recorded problems" do
|
124
|
+
timer = mock('timer')
|
125
|
+
timer.should_receive(:cancel)
|
126
|
+
EM::Synchrony.should_receive(:add_periodic_timer).with(60).and_return(timer)
|
127
|
+
|
128
|
+
fo = Flapjack::Oobetet.new
|
129
|
+
fo.bootstrap(:config => config)
|
130
|
+
fo.should_receive(:register_handler).exactly(3).times
|
131
|
+
|
132
|
+
fo.should_receive(:connect)
|
133
|
+
fo.should_receive(:should_quit?).twice.and_return(false, true)
|
134
|
+
|
135
|
+
EM::Synchrony.should_receive(:sleep).with(10)
|
136
|
+
|
137
|
+
fo.main
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'yajl/json_gem'
|
4
|
+
|
5
|
+
require 'flapjack/pagerduty'
|
6
|
+
|
7
|
+
describe Flapjack::Pagerduty, :redis => true do
|
8
|
+
|
9
|
+
let(:config) { {'queue' => 'pagerduty_notifications'} }
|
10
|
+
|
11
|
+
let(:time) { Time.new }
|
12
|
+
|
13
|
+
it "prompts the blocking redis connection to quit" do
|
14
|
+
redis = mock('redis')
|
15
|
+
redis.should_receive(:rpush).with(nil, %q{{"notification_type":"shutdown"}})
|
16
|
+
|
17
|
+
pagerduty = Flapjack::Pagerduty.new
|
18
|
+
pagerduty.bootstrap
|
19
|
+
pagerduty.add_shutdown_event(:redis => redis)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "doesn't look for acknowledgements if this search is already running" do
|
23
|
+
@redis.set(Flapjack::Pagerduty::SEM_PAGERDUTY_ACKS_RUNNING, 'true')
|
24
|
+
|
25
|
+
fp = Flapjack::Pagerduty.new
|
26
|
+
fp.bootstrap(:config => config)
|
27
|
+
fp.instance_variable_set("@redis_timer", @redis)
|
28
|
+
|
29
|
+
fp.should_not_receive(:find_pagerduty_acknowledgements)
|
30
|
+
fp.find_pagerduty_acknowledgements_if_safe
|
31
|
+
end
|
32
|
+
|
33
|
+
it "looks for acknowledgements if the search is not already running" do
|
34
|
+
fp = Flapjack::Pagerduty.new
|
35
|
+
fp.bootstrap(:config => config)
|
36
|
+
fp.instance_variable_set("@redis_timer", @redis)
|
37
|
+
|
38
|
+
fp.should_receive(:find_pagerduty_acknowledgements)
|
39
|
+
fp.find_pagerduty_acknowledgements_if_safe
|
40
|
+
end
|
41
|
+
|
42
|
+
# Testing the private PagerDuty methods separately, it's simpler. May be
|
43
|
+
# an argument for splitting some of them to another module, accessed by this
|
44
|
+
# class, in which case it makes more sense for the methods to be public.
|
45
|
+
|
46
|
+
# NB: needs to run in synchrony block to catch the evented HTTP requests
|
47
|
+
it "looks for acknowledgements via the PagerDuty API" do
|
48
|
+
EM.synchrony do
|
49
|
+
fp = Flapjack::Pagerduty.new
|
50
|
+
fp.bootstrap(:config => config)
|
51
|
+
|
52
|
+
check = 'PING'
|
53
|
+
Time.should_receive(:now).and_return(time)
|
54
|
+
since = (time.utc - (60*60*24*7)).iso8601 # the last week
|
55
|
+
unt = (time.utc + (60*60*24)).iso8601 # 1 day in the future
|
56
|
+
|
57
|
+
response = {"incidents" =>
|
58
|
+
[{"incident_number" => 12,
|
59
|
+
"status" => "acknowledged",
|
60
|
+
"last_status_change_by" => {"id"=>"ABCDEFG", "name"=>"John Smith",
|
61
|
+
"email"=>"johns@example.com",
|
62
|
+
"html_url"=>"http://flpjck.pagerduty.com/users/ABCDEFG"}
|
63
|
+
}
|
64
|
+
],
|
65
|
+
"limit"=>100,
|
66
|
+
"offset"=>0,
|
67
|
+
"total"=>1}
|
68
|
+
|
69
|
+
stub_request(:get, "https://flpjck.pagerduty.com/api/v1/incidents?" +
|
70
|
+
"fields=incident_number,status,last_status_change_by&incident_key=#{check}&" +
|
71
|
+
"since=#{since}&status=acknowledged&until=#{unt}").
|
72
|
+
with(:headers => {'Authorization'=>['flapjack', 'password123']}).
|
73
|
+
to_return(:status => 200, :body => response.to_json, :headers => {})
|
74
|
+
|
75
|
+
result = fp.send(:pagerduty_acknowledged?, 'subdomain' => 'flpjck', 'username' => 'flapjack',
|
76
|
+
'password' => 'password123', 'check' => check)
|
77
|
+
|
78
|
+
result.should be_a(Hash)
|
79
|
+
result.should have_key(:pg_acknowledged_by)
|
80
|
+
result[:pg_acknowledged_by].should be_a(Hash)
|
81
|
+
result[:pg_acknowledged_by].should have_key('id')
|
82
|
+
result[:pg_acknowledged_by]['id'].should == 'ABCDEFG'
|
83
|
+
EM.stop
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "creates acknowledgements when pagerduty acknowledgements are found" do
|
88
|
+
fp = Flapjack::Pagerduty.new
|
89
|
+
fp.bootstrap(:config => config)
|
90
|
+
|
91
|
+
entity_check = mock('entity_check')
|
92
|
+
entity_check.should_receive(:check).and_return('PING')
|
93
|
+
entity_check.should_receive(:pagerduty_credentials).and_return([{
|
94
|
+
'service_key' => '12345678',
|
95
|
+
'subdomain"' => 'flpjck',
|
96
|
+
'username' => 'flapjack',
|
97
|
+
'password' => 'password123'
|
98
|
+
}])
|
99
|
+
entity_check.should_receive(:create_acknowledgement).with('summary' => 'Acknowledged on PagerDuty')
|
100
|
+
|
101
|
+
Flapjack::Data::Global.should_receive(:unacknowledged_failing_checks).and_return([entity_check])
|
102
|
+
|
103
|
+
fp.should_receive(:pagerduty_acknowledged?).and_return({})
|
104
|
+
|
105
|
+
fp.send(:find_pagerduty_acknowledgements)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "runs a blocking loop listening for notifications" do
|
109
|
+
timer = mock('timer')
|
110
|
+
timer.should_receive(:cancel)
|
111
|
+
EM::Synchrony.should_receive(:add_periodic_timer).with(10).and_return(timer)
|
112
|
+
|
113
|
+
redis = mock('redis')
|
114
|
+
redis.should_receive(:del).with('sem_pagerduty_acks_running')
|
115
|
+
redis.should_receive(:empty!)
|
116
|
+
|
117
|
+
fp = Flapjack::Pagerduty.new
|
118
|
+
fp.bootstrap(:config => config)
|
119
|
+
fp.should_receive(:build_redis_connection_pool).and_return(redis)
|
120
|
+
|
121
|
+
fp.should_receive(:should_quit?).exactly(3).times.and_return(false, false, true)
|
122
|
+
redis.should_receive(:blpop).twice.and_return(
|
123
|
+
["pagerduty_notifications", %q{{"notification_type":"problem","event_id":"main-example.com:ping","state":"critical","summary":"!!!"}}],
|
124
|
+
["pagerduty_notifications", %q{{"notification_type":"shutdown"}}]
|
125
|
+
)
|
126
|
+
|
127
|
+
fp.should_receive(:test_pagerduty_connection).and_return(true)
|
128
|
+
fp.should_receive(:send_pagerduty_event)
|
129
|
+
|
130
|
+
fp.main
|
131
|
+
end
|
132
|
+
|
133
|
+
it "tests the pagerduty connection" do
|
134
|
+
EM.synchrony do
|
135
|
+
|
136
|
+
evt = { "service_key" => "11111111111111111111111111111111",
|
137
|
+
"incident_key" => "Flapjack is running a NOOP",
|
138
|
+
"event_type" => "nop",
|
139
|
+
"description" => "I love APIs with noops." }
|
140
|
+
|
141
|
+
body = evt.to_json
|
142
|
+
stub_request(:post, "https://events.pagerduty.com/generic/2010-04-15/create_event.json").
|
143
|
+
with(:body => body).to_return(:status => 200, :body => '{"status":"success"}', :headers => {})
|
144
|
+
|
145
|
+
fp = Flapjack::Pagerduty.new
|
146
|
+
fp.bootstrap(:config => config)
|
147
|
+
|
148
|
+
ret = fp.send(:test_pagerduty_connection)
|
149
|
+
ret.should be_true
|
150
|
+
|
151
|
+
EM.stop
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
it "sends an event to pagerduty" do
|
156
|
+
EM.synchrony do
|
157
|
+
|
158
|
+
evt = {"service_key" => "abcdefg",
|
159
|
+
"incident_key" => "Flapjack test",
|
160
|
+
"event_type" => "nop",
|
161
|
+
"description" => "Not really sent anyway"}
|
162
|
+
body = evt.to_json
|
163
|
+
stub_request(:post, "https://events.pagerduty.com/generic/2010-04-15/create_event.json").
|
164
|
+
with(:body => body).to_return(:status => 200, :body => "", :headers => {})
|
165
|
+
|
166
|
+
fp = Flapjack::Pagerduty.new
|
167
|
+
fp.bootstrap(:config => config)
|
168
|
+
|
169
|
+
ret = fp.send(:send_pagerduty_event, evt)
|
170
|
+
ret.should_not be_nil
|
171
|
+
ret.should == [200, nil]
|
172
|
+
|
173
|
+
EM.stop
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flapjack/redis_pool'
|
3
|
+
|
4
|
+
describe Flapjack::RedisPool do
|
5
|
+
|
6
|
+
it "is initialized, and emptied" do
|
7
|
+
EM.synchrony do
|
8
|
+
redis_count = 3
|
9
|
+
|
10
|
+
redis_conns = redis_count.times.collect {
|
11
|
+
redis = mock('redis')
|
12
|
+
redis.should_receive(:quit)
|
13
|
+
redis
|
14
|
+
}
|
15
|
+
::Redis.should_receive(:new).exactly(redis_count).times.and_return(*redis_conns)
|
16
|
+
|
17
|
+
frp = Flapjack::RedisPool.new(:size => redis_count)
|
18
|
+
frp.empty!
|
19
|
+
|
20
|
+
EM.stop
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|