8 @locks_mutex = Cache.instance_variable_set("@locks_mutex", Mutex.new)
9 @cache_locks = Cache.instance_variable_set("@cache_locks", {})
10 @cache = Cache.instance_variable_set("@cache", {})
13 describe "#check_cache!" do
14 it "should correctly check for valid caches" do
15 Cache.expects(:has_cache?).with("rspec").returns(true)
16 Cache.expects(:has_cache?).with("fail").returns(false)
18 Cache.check_cache!("rspec")
19 expect { Cache.check_cache!("fail") }.to raise_code("Could not find a cache called '%{cache_name}'", :cache_name => "fail")
24 it "should use a mutex to manage access to the cache" do
25 @locks_mutex.expects(:synchronize).yields
26 Cache.setup("x").should == true
27 @cache.should == {"x" => {:max_age => 300.0}}
30 it "should correctly setup a new cache" do
31 @locks_mutex.expects(:synchronize).twice.yields
32 Cache.setup("rspec1", 300)
33 @cache["rspec1"].should == {:max_age => 300.0}
36 @cache["rspec2"].should == {:max_age => 300.0}
40 describe "#has_cache?" do
41 it "should correctly report presense of a cache" do
43 Cache.has_cache?("rspec").should == true
44 Cache.has_cache?("fail").should == false
48 describe "#delete!" do
49 it "should delete the cache and return true" do
50 Cache.expects(:check_cache!).with("rspec")
53 Cache.delete!("rspec").should == true
58 it "should write to the cache" do
60 Time.expects(:now).returns(time)
61 Cache.expects(:check_cache!).with("rspec")
64 Cache.write("rspec", :key, :val).should == :val
66 @cache["rspec"][:key][:value].should == :val
67 @cache["rspec"][:key][:cache_create_time].should == time
72 it "should read a written entry correctly" do
74 Cache.write("rspec", :key, :val)
76 Cache.expects(:check_cache!).with("rspec")
77 Cache.expects(:ttl).with("rspec", :key).returns(1)
79 Cache.read("rspec", :key).should == :val
82 it "should raise on expired reads" do
84 Cache.write("rspec", :key, :val)
86 Cache.expects(:ttl).returns(0)
88 Cache.expects(:check_cache!).with("rspec")
90 expect { Cache.read("rspec", :key) }.to raise_code("Cache expired on '%{cache_name}' key '%{item}'", :cache_name => "rspec", :item => :key)
94 describe "#invalidate!" do
95 it "should return false for unknown keys" do
96 Cache.expects(:check_cache!).with("rspec")
98 @locks_mutex.expects(:synchronize).yields
101 Cache.invalidate!("rspec", "no_such_key").should == false
104 it "should delete the key" do
106 Cache.write("rspec", "valid_key", "rspec")
108 Cache.expects(:check_cache!).with("rspec")
109 @cache["rspec"].expects(:delete).with("valid_key")
111 Cache.invalidate!("rspec", "valid_key")
116 it "should detect invalid key names" do
117 Cache.expects(:check_cache!).with("rspec")
118 Cache.setup("rspec", 300)
119 expect { Cache.ttl("rspec", :key) }.to raise_code("No item called '%{item}' for cache '%{cache_name}'", :cache_name => "rspec", :item => :key)
122 it "should return >0 for valid" do
123 Cache.setup("rspec", 300)
124 Cache.write("rspec", :key, :val)
126 Cache.expects(:check_cache!).with("rspec")
127 Cache.ttl("rspec", :key).should >= 0
130 it "should return <0 for expired messages" do
131 Cache.setup("rspec", 300)
132 Cache.write("rspec", :key, :val)
134 time = Time.now + 600
135 Time.expects(:now).returns(time)
137 Cache.expects(:check_cache!).with("rspec")
138 Cache.ttl("rspec", :key).should <= 0
142 describe "#synchronize" do
143 it "should use the correct mutex" do
144 Cache.expects(:check_cache!).with("rspec")
147 rspec_lock = @cache_locks["rspec"]
148 rspec_lock.expects(:synchronize).yields
150 @cache_locks.expects("[]").with("rspec").returns(rspec_lock)
153 Cache.synchronize("rspec") do