caching_test.rb 9.0 KB
Newer Older
1
require 'abstract_unit'
J
Jeremy Kemper 已提交
2
require 'active_support/cache'
3

4
class CacheKeyTest < ActiveSupport::TestCase
5 6 7 8 9
  def test_expand_cache_key
    assert_equal 'name/1/2/true', ActiveSupport::Cache.expand_cache_key([1, '2', true], :name)
  end
end

10
class CacheStoreSettingTest < ActiveSupport::TestCase
11 12 13 14 15
  def test_file_fragment_cache_store
    store = ActiveSupport::Cache.lookup_store :file_store, "/path/to/cache/directory"
    assert_kind_of(ActiveSupport::Cache::FileStore, store)
    assert_equal "/path/to/cache/directory", store.cache_path
  end
16

17
  def test_mem_cache_fragment_cache_store
18
    MemCache.expects(:new).with(%w[localhost], {})
19 20
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost"
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
21 22 23 24 25 26 27
  end

  def test_mem_cache_fragment_cache_store_with_given_mem_cache
    mem_cache = MemCache.new
    MemCache.expects(:new).never
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, mem_cache
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
28
  end
29

30 31 32 33 34 35
  def test_mem_cache_fragment_cache_store_with_given_mem_cache_like_object
    MemCache.expects(:new).never
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, stub("memcache", :get => true)
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
  end

36
  def test_mem_cache_fragment_cache_store_with_multiple_servers
37
    MemCache.expects(:new).with(%w[localhost 192.168.1.1], {})
38 39 40
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost", '192.168.1.1'
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
  end
41

42
  def test_mem_cache_fragment_cache_store_with_options
43
    MemCache.expects(:new).with(%w[localhost 192.168.1.1], { :namespace => "foo" })
44 45 46
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost", '192.168.1.1', :namespace => 'foo'
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
  end
47 48 49 50 51 52 53

  def test_object_assigned_fragment_cache_store
    store = ActiveSupport::Cache.lookup_store ActiveSupport::Cache::FileStore.new("/path/to/cache/directory")
    assert_kind_of(ActiveSupport::Cache::FileStore, store)
    assert_equal "/path/to/cache/directory", store.cache_path
  end
end
54

55
class CacheStoreTest < ActiveSupport::TestCase
56 57 58
  def setup
    @cache = ActiveSupport::Cache.lookup_store(:memory_store)
  end
59

60 61 62 63 64
  def test_fetch_without_cache_miss
    @cache.stubs(:read).with('foo', {}).returns('bar')
    @cache.expects(:write).never
    assert_equal 'bar', @cache.fetch('foo') { 'baz' }
  end
65

66 67 68 69 70
  def test_fetch_with_cache_miss
    @cache.stubs(:read).with('foo', {}).returns(nil)
    @cache.expects(:write).with('foo', 'baz', {})
    assert_equal 'baz', @cache.fetch('foo') { 'baz' }
  end
71

72 73 74 75
  def test_fetch_with_forced_cache_miss
    @cache.expects(:read).never
    @cache.expects(:write).with('foo', 'bar', :force => true)
    @cache.fetch('foo', :force => true) { 'bar' }
76 77
  end
end
J
Joshua Peek 已提交
78

79 80
# Tests the base functionality that should be identical across all cache stores.
module CacheStoreBehavior
J
Joshua Peek 已提交
81 82 83 84 85 86 87 88 89 90
  def test_should_read_and_write_strings
    @cache.write('foo', 'bar')
    assert_equal 'bar', @cache.read('foo')
  end

  def test_should_read_and_write_hash
    @cache.write('foo', {:a => "b"})
    assert_equal({:a => "b"}, @cache.read('foo'))
  end

91 92 93 94 95
  def test_should_read_and_write_integer
    @cache.write('foo', 1)
    assert_equal 1, @cache.read('foo')
  end

J
Joshua Peek 已提交
96 97 98
  def test_should_read_and_write_nil
    @cache.write('foo', nil)
    assert_equal nil, @cache.read('foo')
99 100 101 102 103 104 105 106 107 108 109 110 111 112
  end

  def test_fetch_without_cache_miss
    @cache.write('foo', 'bar')
    assert_equal 'bar', @cache.fetch('foo') { 'baz' }
  end

  def test_fetch_with_cache_miss
    assert_equal 'baz', @cache.fetch('foo') { 'baz' }
  end

  def test_fetch_with_forced_cache_miss
    @cache.fetch('foo', :force => true) { 'bar' }
  end
113

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
  def test_increment
    @cache.write('foo', 1, :raw => true)
    assert_equal 1, @cache.read('foo', :raw => true).to_i
    assert_equal 2, @cache.increment('foo')
    assert_equal 2, @cache.read('foo', :raw => true).to_i
    assert_equal 3, @cache.increment('foo')
    assert_equal 3, @cache.read('foo', :raw => true).to_i
  end

  def test_decrement
    @cache.write('foo', 3, :raw => true)
    assert_equal 3, @cache.read('foo', :raw => true).to_i
    assert_equal 2, @cache.decrement('foo')
    assert_equal 2, @cache.read('foo', :raw => true).to_i
    assert_equal 1, @cache.decrement('foo')
    assert_equal 1, @cache.read('foo', :raw => true).to_i
  end
131 132 133 134 135 136

  def test_exist
    @cache.write('foo', 'bar')
    assert @cache.exist?('foo')
    assert !@cache.exist?('bar')
  end
137 138
end

139
class FileStoreTest < ActiveSupport::TestCase
140 141 142 143 144 145 146 147 148
  def setup
    @cache = ActiveSupport::Cache.lookup_store(:file_store, Dir.pwd)
  end

  def teardown
    File.delete("foo.cache")
  end

  include CacheStoreBehavior
149 150 151 152 153 154 155 156 157 158

  def test_expires_in
    @cache.write('foo', 'bar')
    cache_read = lambda { @cache.read('foo', :expires_in => 2) }
    assert_equal 'bar', cache_read.call
    sleep(1)
    assert_equal 'bar', cache_read.call
    sleep(1)
    assert_nil cache_read.call
  end
159 160
end

161
class MemoryStoreTest < ActiveSupport::TestCase
162 163 164 165 166 167
  def setup
    @cache = ActiveSupport::Cache.lookup_store(:memory_store)
  end

  include CacheStoreBehavior

168 169 170 171 172
  def test_store_objects_should_be_immutable
    @cache.write('foo', 'bar')
    assert_raise(ActiveSupport::FrozenObjectError) { @cache.read('foo').gsub!(/.*/, 'baz') }
    assert_equal 'bar', @cache.read('foo')
  end
173
end
174

175
uses_memcached 'memcached backed store' do
176
  class MemCacheStoreTest < ActiveSupport::TestCase
177 178
    def setup
      @cache = ActiveSupport::Cache.lookup_store(:mem_cache_store)
179
      @data = @cache.instance_variable_get(:@data)
180 181
      @cache.clear
    end
182

183
    include CacheStoreBehavior
184

185
    def test_store_objects_should_be_immutable
186
      @cache.with_local_cache do
187 188 189 190
        @cache.write('foo', 'bar')
        @cache.read('foo').gsub!(/.*/, 'baz')
        assert_equal 'bar', @cache.read('foo')
      end
191
    end
192

193 194 195 196 197 198 199 200 201
    def test_stored_objects_should_not_be_frozen
      @cache.with_local_cache do
        @cache.write('foo', 'bar')
      end
      @cache.with_local_cache do
        assert !@cache.read('foo').frozen?
      end
    end

202
    def test_write_should_return_true_on_success
203
      @cache.with_local_cache do
204 205 206 207 208 209 210
        result = @cache.write('foo', 'bar')
        assert_equal 'bar', @cache.read('foo') # make sure 'foo' was written
        assert result
      end
    end

    def test_local_writes_are_persistent_on_the_remote_cache
211
      @cache.with_local_cache do
212 213 214 215 216 217 218
        @cache.write('foo', 'bar')
      end

      assert_equal 'bar', @cache.read('foo')
    end

    def test_clear_also_clears_local_cache
219
      @cache.with_local_cache do
220 221 222 223
        @cache.write('foo', 'bar')
        @cache.clear
        assert_nil @cache.read('foo')
      end
224
    end
225 226

    def test_local_cache_of_read_and_write
227
      @cache.with_local_cache do
228 229 230 231 232 233
        @cache.write('foo', 'bar')
        @data.flush_all # Clear remote cache
        assert_equal 'bar', @cache.read('foo')
      end
    end

234 235 236 237 238 239 240
    def test_local_cache_should_read_and_write_integer
      @cache.with_local_cache do
        @cache.write('foo', 1)
        assert_equal 1, @cache.read('foo')
      end
    end

241
    def test_local_cache_of_delete
242
      @cache.with_local_cache do
243 244 245 246 247 248 249 250
        @cache.write('foo', 'bar')
        @cache.delete('foo')
        @data.flush_all # Clear remote cache
        assert_nil @cache.read('foo')
      end
    end

    def test_local_cache_of_exist
251
      @cache.with_local_cache do
252 253 254 255 256 257 258 259
        @cache.write('foo', 'bar')
        @cache.instance_variable_set(:@data, nil)
        @data.flush_all # Clear remote cache
        assert @cache.exist?('foo')
      end
    end

    def test_local_cache_of_increment
260
      @cache.with_local_cache do
261 262 263 264 265 266 267 268
        @cache.write('foo', 1, :raw => true)
        @cache.increment('foo')
        @data.flush_all # Clear remote cache
        assert_equal 2, @cache.read('foo', :raw => true).to_i
      end
    end

    def test_local_cache_of_decrement
269
      @cache.with_local_cache do
270 271 272 273 274 275 276 277
        @cache.write('foo', 1, :raw => true)
        @cache.decrement('foo')
        @data.flush_all # Clear remote cache
        assert_equal 0, @cache.read('foo', :raw => true).to_i
      end
    end

    def test_exist_with_nulls_cached_locally
278
      @cache.with_local_cache do
279 280 281 282 283 284
        @cache.write('foo', 'bar')
        @cache.delete('foo')
        assert !@cache.exist?('foo')
      end
    end

285 286 287 288 289 290 291 292 293
    def test_multi_get
      @cache.with_local_cache do
        @cache.write('foo', 1)
        @cache.write('goo', 2)
        result = @cache.read_multi('foo', 'goo')
        assert_equal({'foo' => 1, 'goo' => 2}, result)
      end
    end

294 295 296 297 298 299 300 301 302
    def test_middleware
      app = lambda { |env|
        result = @cache.write('foo', 'bar')
        assert_equal 'bar', @cache.read('foo') # make sure 'foo' was written
        assert result
      }
      app = @cache.middleware.new(app)
      app.call({})
    end
303 304
  end

305
  class CompressedMemCacheStore < ActiveSupport::TestCase
306 307 308 309
    def setup
      @cache = ActiveSupport::Cache.lookup_store(:compressed_mem_cache_store)
      @cache.clear
    end
310

311 312
    include CacheStoreBehavior
  end
313
end