lacquer 0.4.0 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -20
- data/.travis.yml +3 -0
- data/Gemfile +2 -7
- data/README.md +260 -0
- data/Rakefile +11 -33
- data/init.rb +1 -1
- data/lacquer.gemspec +19 -69
- data/lib/generators/lacquer/install_generator.rb +5 -1
- data/lib/generators/lacquer/templates/initializer.rb +15 -3
- data/lib/generators/lacquer/templates/{varnish.sample.vcl → varnish.vcl.erb} +27 -27
- data/lib/generators/lacquer/templates/varnishd.yml +31 -0
- data/lib/lacquer/cache_control.rb +75 -0
- data/lib/lacquer/cache_utils.rb +14 -12
- data/lib/lacquer/capistrano/v2/hooks.rb +21 -0
- data/lib/lacquer/capistrano/v3/tasks/lacquer.rake +24 -0
- data/lib/lacquer/capistrano.rb +7 -0
- data/lib/lacquer/configuration.rb +12 -0
- data/lib/lacquer/delayed_job_job.rb +2 -2
- data/lib/lacquer/railtie.rb +9 -0
- data/lib/lacquer/recipes.rb +62 -0
- data/lib/lacquer/resque_job.rb +2 -2
- data/lib/lacquer/sidekiq_worker.rb +11 -0
- data/lib/lacquer/tasks.rb +48 -0
- data/lib/lacquer/varnish.rb +35 -4
- data/lib/lacquer/varnishd.rb +152 -0
- data/lib/lacquer/version.rb +3 -0
- data/lib/lacquer.rb +9 -0
- data/rails/init.rb +1 -1
- data/recipes/lacquer.rb +1 -0
- data/spec/config/generate.vcl.erb +15 -0
- data/spec/config/varnish.vcl +15 -0
- data/spec/config/varnishd.yml +12 -0
- data/spec/lacquer/cache_control_spec.rb +74 -0
- data/spec/lacquer/cache_utils_spec.rb +20 -8
- data/spec/lacquer/delayed_job_job_spec.rb +4 -2
- data/spec/lacquer/resque_job_spec.rb +4 -2
- data/spec/lacquer/sidekiq_worker_spec.rb +15 -0
- data/spec/lacquer/varnish_spec.rb +62 -18
- data/spec/lacquer/varnishd_spec.rb +122 -0
- data/spec/spec_helper.rb +13 -1
- data/tasks/lacquer.rake +1 -0
- metadata +135 -66
- data/.bundle/config +0 -2
- data/Gemfile.lock +0 -39
- data/README.rdoc +0 -83
- data/VERSION +0 -1
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
2
|
+
require 'lacquer/cache_control'
|
3
|
+
|
4
|
+
describe Lacquer::CacheControl do
|
5
|
+
describe "#register" do
|
6
|
+
it "persists cache settings for url" do
|
7
|
+
cache_control = described_class.new
|
8
|
+
cache_control.register :class_section, :url => "^/sv/class_sections/%s.*$", :args => "[0-9]+"
|
9
|
+
cache_control.store.first[:group].should == :class_section
|
10
|
+
cache_control.store.first[:url].should == "^/sv/class_sections/%s.*$"
|
11
|
+
cache_control.store.first[:args].should == ["[0-9]+"]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#urls_for" do
|
16
|
+
it "returns urls to expire for object" do
|
17
|
+
cache_control = described_class.new
|
18
|
+
cache_control.register :class_section, :url => "^/sv/class_sections/%s.*$", :args => "[0-9]+"
|
19
|
+
cache_control.urls_for(:class_section, double("ClassSection", :to_param => 1)).should == ["^/sv/class_sections/1.*$"]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "vcl" do
|
24
|
+
it "returns all urls as vcl conditions" do
|
25
|
+
cache_control = described_class.new
|
26
|
+
cache_control.register :class_section, :url => "^/sv/class_sections/%s.*$", :args => "[0-9]+"
|
27
|
+
cache_control.register :class_section, :url => "^/sv/info_screens/%s.*$", :args => "[0-9]+"
|
28
|
+
|
29
|
+
conditions = cache_control.to_vcl_conditions
|
30
|
+
conditions.should include("req.url ~ \"^/sv/class_sections/[0-9]+.*$\"")
|
31
|
+
conditions.should include("||")
|
32
|
+
conditions.should include("req.url ~ \"^/sv/info_screens/[0-9]+.*$\"")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns vcl for pass urls" do
|
36
|
+
cache_control = described_class.new
|
37
|
+
cache_control.register :pass, :url => "^/admin"
|
38
|
+
pass_urls = cache_control.to_vcl_pass_urls
|
39
|
+
pass_urls.should include('if(req.url ~ "^/admin")')
|
40
|
+
pass_urls.should include('return(pass)')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "returns vcl for pipe urls" do
|
44
|
+
cache_control = described_class.new
|
45
|
+
cache_control.register :pipe, :url => "*.mp4$"
|
46
|
+
pass_urls = cache_control.to_vcl_pipe_urls
|
47
|
+
pass_urls.should include('if(req.url ~ "*.mp4$")')
|
48
|
+
pass_urls.should include('return(pipe)')
|
49
|
+
end
|
50
|
+
|
51
|
+
it "returns vcl for override ttl on beresp" do
|
52
|
+
cache_control = described_class.new
|
53
|
+
cache_control.register :class_section, :url => "^/sv/competitions$", :expires_in => "7d"
|
54
|
+
override_ttl = cache_control.to_vcl_override_ttl_urls
|
55
|
+
override_ttl.should include('if(req.url ~ "^/sv/competitions$")')
|
56
|
+
override_ttl.should include('unset beresp.http.Set-Cookie')
|
57
|
+
override_ttl.should include('return(deliver)')
|
58
|
+
end
|
59
|
+
|
60
|
+
it "group by expires in" do
|
61
|
+
cache_control = described_class.new
|
62
|
+
cache_control.register :class_section, :url => "^/sv/competitions$", :expires_in => "1d"
|
63
|
+
cache_control.register :class_section, :url => "^/sv/competitions/%s$", :args => "[0-9]+", :expires_in => "2d"
|
64
|
+
cache_control.register :class_section, :url => "^/sv/competitions/%s/info_screen$", :args => "[0-9]+"
|
65
|
+
|
66
|
+
override_ttl = cache_control.to_vcl_override_ttl_urls
|
67
|
+
override_ttl.should include('if(req.url ~ "^/sv/competitions$")')
|
68
|
+
override_ttl.should include('set beresp.ttl = 1d')
|
69
|
+
override_ttl.should include('if(req.url ~ "^/sv/competitions/[0-9]+$")')
|
70
|
+
override_ttl.should include('set beresp.ttl = 2d')
|
71
|
+
override_ttl.should_not include('info_screen')
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
2
|
+
require 'lacquer/delayed_job_job'
|
3
|
+
require 'lacquer/resque_job'
|
4
|
+
require 'lacquer/sidekiq_worker'
|
2
5
|
|
3
6
|
describe "Lacquer" do
|
4
7
|
before(:each) do
|
@@ -7,8 +10,8 @@ describe "Lacquer" do
|
|
7
10
|
|
8
11
|
describe "talking to varnish" do
|
9
12
|
before(:each) do
|
10
|
-
@varnish_stub =
|
11
|
-
Lacquer::Varnish.stub
|
13
|
+
@varnish_stub = double('varnish')
|
14
|
+
Lacquer::Varnish.stub(:new).and_return(@varnish_stub)
|
12
15
|
end
|
13
16
|
|
14
17
|
describe "when backend is :none" do
|
@@ -17,7 +20,7 @@ describe "Lacquer" do
|
|
17
20
|
end
|
18
21
|
|
19
22
|
it "sends commands to varnish instantly" do
|
20
|
-
@varnish_stub.should_receive(:purge).
|
23
|
+
@varnish_stub.should_receive(:purge).with('/', '/blog/posts').once
|
21
24
|
@controller.clear_cache_for('/', '/blog/posts')
|
22
25
|
end
|
23
26
|
|
@@ -30,8 +33,8 @@ describe "Lacquer" do
|
|
30
33
|
describe "when backend is :delayed_job" do
|
31
34
|
it "sends commands to a delayed_job queue" do
|
32
35
|
Lacquer.configuration.job_backend = :delayed_job
|
33
|
-
|
34
|
-
Delayed::Job.should_receive(:enqueue).
|
36
|
+
Lacquer::DelayedJobJob.should_receive(:new).with(['/', '/blog/posts'])
|
37
|
+
Delayed::Job.should_receive(:enqueue).once
|
35
38
|
@controller.clear_cache_for('/', '/blog/posts')
|
36
39
|
end
|
37
40
|
end
|
@@ -40,7 +43,16 @@ describe "Lacquer" do
|
|
40
43
|
it "sends commands to a resque queue" do
|
41
44
|
Lacquer.configuration.job_backend = :resque
|
42
45
|
|
43
|
-
Resque.should_receive(:enqueue).
|
46
|
+
Resque.should_receive(:enqueue).once
|
47
|
+
@controller.clear_cache_for('/', '/blog/posts')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "when backend is :sidekiq" do
|
52
|
+
it "sends commands to a sidekiq queue" do
|
53
|
+
Lacquer.configuration.job_backend = :sidekiq
|
54
|
+
|
55
|
+
Lacquer::SidekiqWorker.should_receive(:perform_async).once
|
44
56
|
@controller.clear_cache_for('/', '/blog/posts')
|
45
57
|
end
|
46
58
|
end
|
@@ -70,8 +82,8 @@ describe "Lacquer" do
|
|
70
82
|
end
|
71
83
|
|
72
84
|
it "should allow purge by non-controller sweepers" do
|
73
|
-
@varnish_stub =
|
74
|
-
Lacquer::Varnish.stub
|
85
|
+
@varnish_stub = double('varnish')
|
86
|
+
Lacquer::Varnish.stub(:new).and_return(@varnish_stub)
|
75
87
|
|
76
88
|
@sweeper = SweeperClass.new
|
77
89
|
|
@@ -3,8 +3,10 @@ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
|
3
3
|
describe "DelayedJobJob" do
|
4
4
|
describe "perform" do
|
5
5
|
it "should purge the parameter" do
|
6
|
-
|
7
|
-
|
6
|
+
require File.expand_path('lib/lacquer/delayed_job_job')
|
7
|
+
|
8
|
+
@varnish_mock = double('varnish')
|
9
|
+
Lacquer::Varnish.stub(:new).and_return(@varnish_mock)
|
8
10
|
|
9
11
|
@varnish_mock.should_receive(:purge).with('/').exactly(1).times
|
10
12
|
Lacquer::DelayedJobJob.new('/').perform
|
@@ -3,8 +3,10 @@ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
|
3
3
|
describe "ResqueJob" do
|
4
4
|
describe "perform" do
|
5
5
|
it "should purge the parameter" do
|
6
|
-
|
7
|
-
|
6
|
+
require File.expand_path('lib/lacquer/resque_job')
|
7
|
+
|
8
|
+
@varnish_mock = double('varnish')
|
9
|
+
Lacquer::Varnish.stub(:new).and_return(@varnish_mock)
|
8
10
|
|
9
11
|
@varnish_mock.should_receive(:purge).with('/').exactly(1).times
|
10
12
|
Lacquer::ResqueJob.perform('/')
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
2
|
+
|
3
|
+
describe "SidekiqWorker" do
|
4
|
+
describe "perform" do
|
5
|
+
it "should purge the parameter" do
|
6
|
+
require File.expand_path('lib/lacquer/sidekiq_worker')
|
7
|
+
|
8
|
+
@varnish_mock = double('varnish')
|
9
|
+
Lacquer::Varnish.stub(:new).and_return(@varnish_mock)
|
10
|
+
|
11
|
+
@varnish_mock.should_receive(:purge).with('/').exactly(1).times
|
12
|
+
Lacquer::SidekiqWorker.new.perform('/')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -2,30 +2,30 @@ require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
|
2
2
|
|
3
3
|
describe "Varnish" do
|
4
4
|
before(:each) do
|
5
|
-
@telnet_mock =
|
6
|
-
Net::Telnet.stub
|
7
|
-
@telnet_mock.stub
|
8
|
-
@telnet_mock.stub
|
9
|
-
@telnet_mock.stub
|
10
|
-
@telnet_mock.stub
|
5
|
+
@telnet_mock = double('Net::Telnet')
|
6
|
+
Net::Telnet.stub(:new).and_return(@telnet_mock)
|
7
|
+
@telnet_mock.stub(:close)
|
8
|
+
@telnet_mock.stub(:cmd)
|
9
|
+
@telnet_mock.stub(:puts)
|
10
|
+
@telnet_mock.stub(:waitfor)
|
11
11
|
Lacquer.configuration.retries.should == 5
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "with any command" do
|
15
15
|
describe "when connection is unsuccessful" do
|
16
16
|
it "should raise a Lacquer::VarnishError" do
|
17
|
-
@telnet_mock.stub
|
18
|
-
|
17
|
+
@telnet_mock.stub(:cmd).and_raise(Timeout::Error)
|
18
|
+
expect {
|
19
19
|
Lacquer::Varnish.new.purge('/')
|
20
|
-
}.
|
20
|
+
}.to raise_error(Lacquer::VarnishError)
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should retry on failure before erroring" do
|
24
|
-
@telnet_mock.stub
|
24
|
+
@telnet_mock.stub(:cmd).and_raise(Timeout::Error)
|
25
25
|
Net::Telnet.should_receive(:new).exactly(5).times
|
26
|
-
|
26
|
+
expect {
|
27
27
|
Lacquer::Varnish.new.purge('/')
|
28
|
-
}.
|
28
|
+
}.to raise_error(Lacquer::VarnishError)
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should close the connection afterwards" do
|
@@ -34,23 +34,67 @@ describe "Varnish" do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
describe "when using authentication" do
|
38
|
+
after(:each) do
|
39
|
+
Lacquer.configuration.varnish_servers.first[:secret] = nil
|
40
|
+
end
|
41
|
+
describe "with correct secret" do
|
42
|
+
before(:each) do
|
43
|
+
Lacquer.configuration.varnish_servers.first[:secret] = "the real secret"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return successfully when using correct secret" do
|
47
|
+
@telnet_mock.stub(:waitfor).with("Match" => /^107/).and_yield("107 59 \nhaalpffwlcvblmdrinpnjwigwsbiiigq\n\nAuthentication required.\n\n")
|
48
|
+
@telnet_mock.stub(:cmd).with("String" => "auth a4aefcde4b0ee27268af1c9ed613e3220601276b48f9ae5914f801db6c8ef612", "Match" => /\d{3}/).and_yield('200')
|
49
|
+
@telnet_mock.stub(:cmd).with("String" => "url.purge /", "Match" => /\n\n/).and_yield('200')
|
50
|
+
|
51
|
+
expect {
|
52
|
+
Lacquer::Varnish.new.purge('/')
|
53
|
+
}.not_to raise_error
|
54
|
+
end
|
55
|
+
|
56
|
+
after(:each) do
|
57
|
+
Lacquer.configuration.varnish_servers.first[:secret] = nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "with wrong secret" do
|
62
|
+
before(:each) do
|
63
|
+
Lacquer.configuration.varnish_servers.first[:secret] = "the wrong secret"
|
64
|
+
end
|
65
|
+
it "should raise Lacquer::AuthenticationError when using wrong secret" do
|
66
|
+
@telnet_mock.stub(:waitfor).with("Match" => /^107/).and_yield("107 59 \nhaalpffwlcvblmdrinpnjwigwsbiiigq\n\nAuthentication required.\n\n")
|
67
|
+
@telnet_mock.stub(:cmd).with("String" => "auth 767dc6ec9eca6e4155d20c8479d3a1a10cf88d92c3846388a830d7fd966d58f9", "Match" => /\d{3}/).and_yield('107')
|
68
|
+
@telnet_mock.stub(:cmd).with("url.purge /").and_yield('200')
|
69
|
+
|
70
|
+
expect {
|
71
|
+
Lacquer::Varnish.new.purge('/')
|
72
|
+
}.to raise_error(Lacquer::AuthenticationError)
|
73
|
+
end
|
74
|
+
after(:each) do
|
75
|
+
Lacquer.configuration.varnish_servers.first[:secret] = nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
37
80
|
describe "when connection is unsuccessful and an error handler is set" do
|
38
81
|
before(:each) do
|
39
|
-
Lacquer.configuration.command_error_handler =
|
82
|
+
Lacquer.configuration.command_error_handler = double("command_error_handler")
|
40
83
|
end
|
41
84
|
it "should call handler on error" do
|
42
|
-
@telnet_mock.stub
|
85
|
+
@telnet_mock.stub(:cmd).and_raise(Timeout::Error)
|
43
86
|
Lacquer.configuration.command_error_handler.should_receive(:call).exactly(1).times
|
44
|
-
|
87
|
+
expect {
|
45
88
|
Lacquer::Varnish.new.purge('/')
|
46
|
-
}.
|
89
|
+
}.not_to raise_error
|
47
90
|
end
|
48
91
|
end
|
92
|
+
|
49
93
|
end
|
50
94
|
|
51
95
|
describe "when sending a stats command" do
|
52
96
|
it "should return an array of stats" do
|
53
|
-
@telnet_mock.stub
|
97
|
+
@telnet_mock.stub(:cmd).and_yield(%Q[
|
54
98
|
200 2023
|
55
99
|
6263596 Client connections accepted
|
56
100
|
6260911 Client requests received
|
@@ -125,7 +169,7 @@ Closing CLI connection
|
|
125
169
|
|
126
170
|
describe "when sending a purge command" do
|
127
171
|
it "should return successfully" do
|
128
|
-
@telnet_mock.stub
|
172
|
+
@telnet_mock.stub(:cmd).with("String" => "url.purge /", "Match" => /\n\n/).and_yield('200')
|
129
173
|
Lacquer::Varnish.new.purge('/').should be(true)
|
130
174
|
end
|
131
175
|
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '../../spec_helper')
|
2
|
+
|
3
|
+
describe "Varnishd" do
|
4
|
+
before do
|
5
|
+
spec_root = Pathname.new(__FILE__).dirname.join('..').expand_path
|
6
|
+
Lacquer::Varnishd.stub(:started_check_delay).and_return(0)
|
7
|
+
Lacquer::Varnishd.stub(:env).and_return('test')
|
8
|
+
Lacquer::Varnishd.stub(:root_path).and_return(spec_root)
|
9
|
+
end
|
10
|
+
|
11
|
+
def executes_with(regexp)
|
12
|
+
new_method = Lacquer::Varnishd.method(:new)
|
13
|
+
Lacquer::Varnishd.stub(:new).and_return do |*args|
|
14
|
+
varnishd = new_method.call(*args)
|
15
|
+
varnishd.should_receive(:execute).with(regexp)
|
16
|
+
varnishd.stub(:log)
|
17
|
+
varnishd
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "passes settings in the initailizer" do
|
22
|
+
Lacquer::Varnishd.new("listen" => ":80").listen.should == ":80"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "loads settings from varnish_config" do
|
26
|
+
Lacquer::Varnishd.config.should have_key("listen")
|
27
|
+
Lacquer::Varnishd.config.should have_key("telnet")
|
28
|
+
Lacquer::Varnishd.config.should have_key("sbin_path")
|
29
|
+
Lacquer::Varnishd.config.should have_key("bin_path")
|
30
|
+
Lacquer::Varnishd.config.should have_key("storage")
|
31
|
+
Lacquer::Varnishd.config.should have_key("use_sudo")
|
32
|
+
Lacquer::Varnishd.config["params"].should have_key('overflow_max')
|
33
|
+
end
|
34
|
+
|
35
|
+
it "returns full path to varnishd" do
|
36
|
+
executes_with(%r[/opt/varnishd/sbin/varnishd])
|
37
|
+
Lacquer::Varnishd.new("sbin_path" => "/opt/varnishd/sbin").start
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns full path to varnishd using sudo" do
|
41
|
+
executes_with(%r[sudo /opt/varnishd/sbin/varnishd])
|
42
|
+
Lacquer::Varnishd.new("sbin_path" => "/opt/varnishd/sbin", "use_sudo" => true).start
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns pid file" do
|
46
|
+
executes_with(/log\/varnishd.test.pid/)
|
47
|
+
Lacquer::Varnishd.new("sbin_path" => "/opt/varnishd/sbin").start
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns pid file with custom path" do
|
51
|
+
executes_with(/pid\/varnishd.test.pid/)
|
52
|
+
Lacquer::Varnishd.new("sbin_path" => "/opt/varnishd/sbin", "pid_path" => "pid/").start
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns params as string" do
|
56
|
+
Lacquer::Varnishd.new("params" => { "max" => 2000, "add" => 2 }).params_args.should == "-p max=2000 -p add=2"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns listen arg as string" do
|
60
|
+
Lacquer::Varnishd.new("listen" => ":80").args.should include("-a :80")
|
61
|
+
end
|
62
|
+
|
63
|
+
it "starts varnishd with args and params" do
|
64
|
+
executes_with(%r[/opt/varnishd/sbin.*-P.*log/varnishd.test.pid])
|
65
|
+
Lacquer::Varnishd.new("sbin_path" => "/opt/varnishd/sbin", "params" => { "overflow_max" => 2000 }).start
|
66
|
+
end
|
67
|
+
|
68
|
+
it "raises error if vcl_script_file is not present" do
|
69
|
+
Lacquer::Varnishd.stub(:vcl_script_filename).and_return("config/file_not_found.vcl")
|
70
|
+
expect {
|
71
|
+
Lacquer::Varnishd.new.vcl_script_path
|
72
|
+
}.to raise_error
|
73
|
+
end
|
74
|
+
|
75
|
+
it "renders vcl file when erb is present" do
|
76
|
+
Lacquer::Varnishd.stub(:vcl_script_filename).and_return("config/generate.vcl")
|
77
|
+
result = Lacquer::Varnishd.new.render_vcl
|
78
|
+
result.should include('.host = "0.0.0.0"')
|
79
|
+
result.should include('.port = "3000"')
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#reload' do
|
83
|
+
def expect_reload_cmd(attributes)
|
84
|
+
Time.stub(:now).and_return Time.parse('October 6th, 1984')
|
85
|
+
varnishadm_cmd = "#{attributes['bin_path']}/varnishadm -T #{attributes['telnet']}"
|
86
|
+
reload_id = "reload#{Time.now.usec}"
|
87
|
+
load_cmd = "#{varnishadm_cmd} vcl.load #{reload_id} config/generate.vcl"
|
88
|
+
use_cmd = "#{varnishadm_cmd} vcl.use #{reload_id}"
|
89
|
+
|
90
|
+
executes_with "#{load_cmd} && #{use_cmd}"
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'given varnishd is running' do
|
94
|
+
before do
|
95
|
+
attributes = { "sbin_path" => "/opt/varnishd/sbin", "bin_path" => "/opt/bin", "telnet" => "localhost:6082" }
|
96
|
+
expect_reload_cmd attributes
|
97
|
+
@varnishd = Lacquer::Varnishd.new attributes
|
98
|
+
@varnishd.stub(:vcl_script_filename).and_return("config/generate.vcl")
|
99
|
+
@varnishd.stub(:running?).and_return true
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'executes the varnishadm reload commands' do
|
103
|
+
@varnishd.should_receive :generate_vcl
|
104
|
+
end
|
105
|
+
|
106
|
+
after do
|
107
|
+
@varnishd.reload
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'given varnishd is not running' do
|
112
|
+
before do
|
113
|
+
executes_with(%r[/opt/varnishd/sbin/varnishd])
|
114
|
+
@varnishd = Lacquer::Varnishd.new("sbin_path" => "/opt/varnishd/sbin")
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'starts varnishd' do
|
118
|
+
@varnishd.reload
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,6 +21,18 @@ end
|
|
21
21
|
|
22
22
|
module Resque; end
|
23
23
|
|
24
|
+
module Sidekiq
|
25
|
+
module Worker
|
26
|
+
module ClassMethods
|
27
|
+
def sidekiq_options(options); end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(base)
|
31
|
+
base.extend(ClassMethods)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
24
36
|
Lacquer.configure do |config|
|
25
37
|
config.enable_cache = true
|
26
38
|
config.default_ttl = 1.week
|
@@ -28,6 +40,6 @@ Lacquer.configure do |config|
|
|
28
40
|
config.varnish_servers << { :host => "0.0.0.0", :port => 6082 }
|
29
41
|
end
|
30
42
|
|
31
|
-
|
43
|
+
RSpec.configure do |c|
|
32
44
|
c.mock_with :rspec
|
33
45
|
end
|
data/tasks/lacquer.rake
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
load File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'lacquer', 'tasks.rb'))
|