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

5
class CacheKeyTest < ActiveSupport::TestCase
6
  def test_expand_cache_key
B
Brian Durand 已提交
7
    assert_equal '1/2/true', ActiveSupport::Cache.expand_cache_key([1, '2', true])
8 9 10 11
    assert_equal 'name/1/2/true', ActiveSupport::Cache.expand_cache_key([1, '2', true], :name)
  end
end

12
class CacheStoreSettingTest < ActiveSupport::TestCase
13 14 15 16 17
  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
18

19
  def test_mem_cache_fragment_cache_store
20
    MemCache.expects(:new).with(%w[localhost], {})
21 22
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost"
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
23 24 25 26 27 28 29
  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)
30
  end
31

32 33
  def test_mem_cache_fragment_cache_store_with_given_mem_cache_like_object
    MemCache.expects(:new).never
34 35 36
    memcache = Object.new
    def memcache.get() true end
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, memcache
37 38 39
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
  end

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

46
  def test_mem_cache_fragment_cache_store_with_options
B
Brian Durand 已提交
47 48
    MemCache.expects(:new).with(%w[localhost 192.168.1.1], { :timeout => 10 })
    store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost", '192.168.1.1', :namespace => 'foo', :timeout => 10
49
    assert_kind_of(ActiveSupport::Cache::MemCacheStore, store)
B
Brian Durand 已提交
50
    assert_equal 'foo', store.options[:namespace]
51
  end
52 53 54 55 56 57 58

  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
59

B
Brian Durand 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
class CacheStoreNamespaceTest < ActiveSupport::TestCase
  def test_static_namespace
    cache = ActiveSupport::Cache.lookup_store(:memory_store, :namespace => "tester")
    cache.write("foo", "bar")
    assert_equal "bar", cache.read("foo")
    assert_equal "bar", cache.instance_variable_get(:@data)["tester:foo"].value
  end

  def test_proc_namespace
    test_val = "tester"
    proc = lambda{test_val}
    cache = ActiveSupport::Cache.lookup_store(:memory_store, :namespace => proc)
    cache.write("foo", "bar")
    assert_equal "bar", cache.read("foo")
    assert_equal "bar", cache.instance_variable_get(:@data)["tester:foo"].value
  end

  def test_delete_matched_key_start
    cache = ActiveSupport::Cache.lookup_store(:memory_store, :namespace => "tester")
    cache.write("foo", "bar")
    cache.write("fu", "baz")
    cache.delete_matched(/^fo/)
    assert_equal false, cache.exist?("foo")
    assert_equal true, cache.exist?("fu")
  end

  def test_delete_matched_key
    cache = ActiveSupport::Cache.lookup_store(:memory_store, :namespace => "foo")
    cache.write("foo", "bar")
    cache.write("fu", "baz")
    cache.delete_matched(/OO/i)
    assert_equal false, cache.exist?("foo")
    assert_equal true, cache.exist?("fu")
  end
end

# Tests the base functionality that should be identical across all cache stores.
module CacheStoreBehavior
  def test_should_read_and_write_strings
    assert_equal true, @cache.write('foo', 'bar')
    assert_equal 'bar', @cache.read('foo')
  end

  def test_should_overwrite
    @cache.write('foo', 'bar')
    @cache.write('foo', 'baz')
    assert_equal 'baz', @cache.read('foo')
107
  end
108

109
  def test_fetch_without_cache_miss
B
Brian Durand 已提交
110
    @cache.write('foo', 'bar')
111 112 113
    @cache.expects(:write).never
    assert_equal 'bar', @cache.fetch('foo') { 'baz' }
  end
114

115
  def test_fetch_with_cache_miss
B
Brian Durand 已提交
116
    @cache.expects(:write).with('foo', 'baz', @cache.options)
117 118
    assert_equal 'baz', @cache.fetch('foo') { 'baz' }
  end
119

120
  def test_fetch_with_forced_cache_miss
B
Brian Durand 已提交
121
    @cache.write('foo', 'bar')
122
    @cache.expects(:read).never
B
Brian Durand 已提交
123
    @cache.expects(:write).with('foo', 'bar', @cache.options.merge(:force => true))
124
    @cache.fetch('foo', :force => true) { 'bar' }
125
  end
J
Joshua Peek 已提交
126

B
Brian Durand 已提交
127 128 129 130
  def test_fetch_with_cached_nil
    @cache.write('foo', nil)
    @cache.expects(:write).never
    assert_nil @cache.fetch('foo') { 'baz' }
J
Joshua Peek 已提交
131 132 133
  end

  def test_should_read_and_write_hash
B
Brian Durand 已提交
134
    assert_equal true, @cache.write('foo', {:a => "b"})
J
Joshua Peek 已提交
135 136 137
    assert_equal({:a => "b"}, @cache.read('foo'))
  end

138
  def test_should_read_and_write_integer
B
Brian Durand 已提交
139
    assert_equal true, @cache.write('foo', 1)
140 141 142
    assert_equal 1, @cache.read('foo')
  end

J
Joshua Peek 已提交
143
  def test_should_read_and_write_nil
B
Brian Durand 已提交
144
    assert_equal true, @cache.write('foo', nil)
J
Joshua Peek 已提交
145
    assert_equal nil, @cache.read('foo')
146 147
  end

B
Brian Durand 已提交
148
  def test_read_multi
149
    @cache.write('foo', 'bar')
B
Brian Durand 已提交
150 151 152
    @cache.write('fu', 'baz')
    @cache.write('fud', 'biz')
    assert_equal({"foo" => "bar", "fu" => "baz"}, @cache.read_multi('foo', 'fu'))
153 154
  end

B
Brian Durand 已提交
155 156 157 158 159
  def test_read_and_write_compressed_small_data
    @cache.write('foo', 'bar', :compress => true)
    raw_value = @cache.send(:read_entry, 'foo', {}).raw_value
    assert_equal 'bar', @cache.read('foo')
    assert_equal 'bar', raw_value
160 161
  end

B
Brian Durand 已提交
162 163 164 165 166
  def test_read_and_write_compressed_large_data
    @cache.write('foo', 'bar', :compress => true, :compress_threshold => 2)
    raw_value = @cache.send(:read_entry, 'foo', {}).raw_value
    assert_equal 'bar', @cache.read('foo')
    assert_equal 'bar', Marshal.load(Zlib::Inflate.inflate(raw_value))
167
  end
168

B
Brian Durand 已提交
169 170 171
  def test_read_and_write_compressed_nil
    @cache.write('foo', nil, :compress => true)
    assert_nil @cache.read('foo')
172 173
  end

B
Brian Durand 已提交
174 175 176 177 178 179 180
  def test_cache_key
    obj = Object.new
    def obj.cache_key
      :foo
    end
    @cache.write(obj, "bar")
    assert_equal "bar", @cache.read("foo")
181
  end
182

B
Brian Durand 已提交
183 184 185 186 187 188 189
  def test_param_as_cache_key
    obj = Object.new
    def obj.to_param
      "foo"
    end
    @cache.write(obj, "bar")
    assert_equal "bar", @cache.read("foo")
190
  end
191

B
Brian Durand 已提交
192 193 194
  def test_array_as_cache_key
    @cache.write([:fu, "foo"], "bar")
    assert_equal "bar", @cache.read("fu/foo")
195 196
  end

B
Brian Durand 已提交
197 198 199
  def test_hash_as_cache_key
    @cache.write({:foo => 1, :fu => 2}, "bar")
    assert_equal "bar", @cache.read("foo=1/fu=2")
200 201
  end

B
Brian Durand 已提交
202 203 204 205
  def test_keys_are_case_sensitive
    @cache.write("foo", "bar")
    assert_nil @cache.read("FOO")
  end
206

B
Brian Durand 已提交
207
  def test_exist
208
    @cache.write('foo', 'bar')
B
Brian Durand 已提交
209 210
    assert_equal true, @cache.exist?('foo')
    assert_equal false, @cache.exist?('bar')
211
  end
212

B
Brian Durand 已提交
213 214 215
  def test_nil_exist
    @cache.write('foo', nil)
    assert_equal true, @cache.exist?('foo')
216 217
  end

B
Brian Durand 已提交
218 219 220 221 222 223
  def test_delete
    @cache.write('foo', 'bar')
    assert @cache.exist?('foo')
    assert_equal true, @cache.delete('foo')
    assert !@cache.exist?('foo')
  end
224

225 226 227 228 229
  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
230 231 232 233 234 235

  def test_original_store_objects_should_not_be_immutable
    bar = 'bar'
    @cache.write('foo', bar)
    assert_nothing_raised { bar.gsub!(/.*/, 'baz') }
  end
236

B
Brian Durand 已提交
237 238 239 240 241 242 243 244 245 246 247 248
  def test_expires_in
    time = Time.local(2008, 4, 24)
    Time.stubs(:now).returns(time)

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

    Time.stubs(:now).returns(time + 30)
    assert_equal 'bar', @cache.read('foo')

    Time.stubs(:now).returns(time + 61)
    assert_nil @cache.read('foo')
249
  end
250

B
Brian Durand 已提交
251 252 253 254 255 256 257
  def test_race_condition_protection
    time = Time.now
    @cache.write('foo', 'bar', :expires_in => 60)
    Time.stubs(:now).returns(time + 61)
    result = @cache.fetch('foo', :race_condition_ttl => 10) do
      assert_equal 'bar', @cache.read('foo')
      "baz"
258
    end
B
Brian Durand 已提交
259 260
    assert_equal "baz", result
  end
261

B
Brian Durand 已提交
262 263 264 265 266 267 268 269 270 271
  def test_race_condition_protection_is_limited
    time = Time.now
    @cache.write('foo', 'bar', :expires_in => 60)
    Time.stubs(:now).returns(time + 71)
    result = @cache.fetch('foo', :race_condition_ttl => 10) do
      assert_equal nil, @cache.read('foo')
      "baz"
    end
    assert_equal "baz", result
  end
272

B
Brian Durand 已提交
273 274 275 276 277 278
  def test_race_condition_protection_is_safe
    time = Time.now
    @cache.write('foo', 'bar', :expires_in => 60)
    Time.stubs(:now).returns(time + 61)
    begin
      @cache.fetch('foo', :race_condition_ttl => 10) do
279
        assert_equal 'bar', @cache.read('foo')
B
Brian Durand 已提交
280
        raise ArgumentError.new
281
      end
S
Santiago Pastorino 已提交
282
    rescue ArgumentError
283
    end
B
Brian Durand 已提交
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
    assert_equal "bar", @cache.read('foo')
    Time.stubs(:now).returns(time + 71)
    assert_nil @cache.read('foo')
  end

  def test_crazy_key_characters
    crazy_key = "#/:*(<+=> )&$%@?;'\"\'`~-"
    assert_equal true, @cache.write(crazy_key, "1", :raw => true)
    assert_equal "1", @cache.read(crazy_key)
    assert_equal "1", @cache.fetch(crazy_key)
    assert_equal true, @cache.delete(crazy_key)
    assert_equal "2", @cache.fetch(crazy_key, :raw => true) { "2" }
    assert_equal 3, @cache.increment(crazy_key)
    assert_equal 2, @cache.decrement(crazy_key)
  end

  def test_really_long_keys
    key = ""
    1000.times{key << "x"}
    assert_equal true, @cache.write(key, "bar")
    assert_equal "bar", @cache.read(key)
    assert_equal "bar", @cache.fetch(key)
    assert_nil @cache.read("#{key}x")
    assert_equal({key => "bar"}, @cache.read_multi(key))
    assert_equal true, @cache.delete(key)
  end
end
311

B
Brian Durand 已提交
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
module CacheDeleteMatchedBehavior
  def test_delete_matched
    @cache.write("foo", "bar")
    @cache.write("fu", "baz")
    @cache.delete_matched(/oo/)
    assert_equal false, @cache.exist?("foo")
    assert_equal true, @cache.exist?("fu")
  end
end

module CacheIncrementDecrementBehavior
  def test_increment
    @cache.write('foo', 1, :raw => true)
    assert_equal 1, @cache.read('foo').to_i
    assert_equal 2, @cache.increment('foo')
    assert_equal 2, @cache.read('foo').to_i
    assert_equal 3, @cache.increment('foo')
    assert_equal 3, @cache.read('foo').to_i
  end

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

module LocalCacheBehavior
  def test_local_writes_are_persistent_on_the_remote_cache
    retval = @cache.with_local_cache do
      @cache.write('foo', 'bar')
346
    end
B
Brian Durand 已提交
347 348 349
    assert_equal true, retval
    assert_equal 'bar', @cache.read('foo')
  end
350

B
Brian Durand 已提交
351 352 353 354 355
  def test_clear_also_clears_local_cache
    @cache.with_local_cache do
      @cache.write('foo', 'bar')
      @cache.clear
      assert_nil @cache.read('foo')
356 357
    end

B
Brian Durand 已提交
358 359
    assert_nil @cache.read('foo')
  end
360

B
Brian Durand 已提交
361 362 363 364
  def test_local_cache_of_write
    @cache.with_local_cache do
      @cache.write('foo', 'bar')
      @peek.delete('foo')
365 366
      assert_equal 'bar', @cache.read('foo')
    end
B
Brian Durand 已提交
367
  end
368

B
Brian Durand 已提交
369 370 371 372
  def test_local_cache_of_read
    @cache.write('foo', 'bar')
    @cache.with_local_cache do
      assert_equal 'bar', @cache.read('foo')
373
    end
B
Brian Durand 已提交
374
  end
375

B
Brian Durand 已提交
376 377
  def test_local_cache_of_write_nil
    @cache.with_local_cache do
378
      assert @cache.write('foo', nil)
B
Brian Durand 已提交
379 380 381
      assert_nil @cache.read('foo')
      @peek.write('foo', 'bar')
      assert_nil @cache.read('foo')
382
    end
B
Brian Durand 已提交
383
  end
384

B
Brian Durand 已提交
385 386 387 388 389
  def test_local_cache_of_delete
    @cache.with_local_cache do
      @cache.write('foo', 'bar')
      @cache.delete('foo')
      assert_nil @cache.read('foo')
390
    end
B
Brian Durand 已提交
391
  end
392

B
Brian Durand 已提交
393 394 395 396
  def test_local_cache_of_exist
    @cache.with_local_cache do
      @cache.write('foo', 'bar')
      @peek.delete('foo')
397
      assert @cache.exist?('foo')
398
    end
B
Brian Durand 已提交
399
  end
400

B
Brian Durand 已提交
401 402 403 404 405 406
  def test_local_cache_of_increment
    @cache.with_local_cache do
      @cache.write('foo', 1, :raw => true)
      @peek.write('foo', 2, :raw => true)
      @cache.increment('foo')
      assert_equal 3, @cache.read('foo')
407
    end
B
Brian Durand 已提交
408
  end
409

B
Brian Durand 已提交
410 411 412 413 414 415
  def test_local_cache_of_decrement
    @cache.with_local_cache do
      @cache.write('foo', 1, :raw => true)
      @peek.write('foo', 3, :raw => true)
      @cache.decrement('foo')
      assert_equal 2, @cache.read('foo')
416
    end
B
Brian Durand 已提交
417
  end
418

B
Brian Durand 已提交
419 420 421 422 423 424 425 426 427 428
  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
end
429

B
Brian Durand 已提交
430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
class FileStoreTest < ActiveSupport::TestCase
  def setup
    Dir.mkdir(cache_dir) unless File.exist?(cache_dir)
    @cache = ActiveSupport::Cache.lookup_store(:file_store, cache_dir, :expires_in => 60)
    @peek = ActiveSupport::Cache.lookup_store(:file_store, cache_dir, :expires_in => 60)
  end

  def teardown
    FileUtils.rm_r(cache_dir)
  end

  def cache_dir
    File.join(Dir.pwd, 'tmp_cache')
  end

  include CacheStoreBehavior
  include LocalCacheBehavior
  include CacheDeleteMatchedBehavior
  include CacheIncrementDecrementBehavior

  def test_deprecated_expires_in_on_read
    ActiveSupport::Deprecation.silence do
      old_cache = ActiveSupport::Cache.lookup_store(:file_store, cache_dir)

      time = Time.local(2008, 4, 24)
      Time.stubs(:now).returns(time)

      old_cache.write("foo", "bar")
      assert_equal 'bar', old_cache.read('foo', :expires_in => 60)

      Time.stubs(:now).returns(time + 30)
      assert_equal 'bar', old_cache.read('foo', :expires_in => 60)

      Time.stubs(:now).returns(time + 61)
      assert_equal 'bar', old_cache.read('foo')
      assert_nil old_cache.read('foo', :expires_in => 60)
      assert_nil old_cache.read('foo')
467
    end
B
Brian Durand 已提交
468 469
  end
end
470

B
Brian Durand 已提交
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
class MemoryStoreTest < ActiveSupport::TestCase
  def setup
    @cache = ActiveSupport::Cache.lookup_store(:memory_store, :expires_in => 60, :size => 100)
  end

  include CacheStoreBehavior
  include CacheDeleteMatchedBehavior
  include CacheIncrementDecrementBehavior

  def test_prune_size
    @cache.write(1, "aaaaaaaaaa") && sleep(0.001)
    @cache.write(2, "bbbbbbbbbb") && sleep(0.001)
    @cache.write(3, "cccccccccc") && sleep(0.001)
    @cache.write(4, "dddddddddd") && sleep(0.001)
    @cache.write(5, "eeeeeeeeee") && sleep(0.001)
    @cache.read(2) && sleep(0.001)
    @cache.read(4)
    @cache.prune(30)
    assert_equal true, @cache.exist?(5)
    assert_equal true, @cache.exist?(4)
    assert_equal false, @cache.exist?(3)
    assert_equal true, @cache.exist?(2)
    assert_equal false, @cache.exist?(1)
  end

  def test_prune_size_on_write
    @cache.write(1, "aaaaaaaaaa") && sleep(0.001)
    @cache.write(2, "bbbbbbbbbb") && sleep(0.001)
    @cache.write(3, "cccccccccc") && sleep(0.001)
    @cache.write(4, "dddddddddd") && sleep(0.001)
    @cache.write(5, "eeeeeeeeee") && sleep(0.001)
    @cache.write(6, "ffffffffff") && sleep(0.001)
    @cache.write(7, "gggggggggg") && sleep(0.001)
    @cache.write(8, "hhhhhhhhhh") && sleep(0.001)
    @cache.write(9, "iiiiiiiiii") && sleep(0.001)
    @cache.write(10, "kkkkkkkkkk") && sleep(0.001)
    @cache.read(2) && sleep(0.001)
    @cache.read(4) && sleep(0.001)
    @cache.write(11, "llllllllll")
    assert_equal true, @cache.exist?(11)
    assert_equal true, @cache.exist?(10)
    assert_equal true, @cache.exist?(9)
    assert_equal true, @cache.exist?(8)
    assert_equal true, @cache.exist?(7)
    assert_equal false, @cache.exist?(6)
    assert_equal false, @cache.exist?(5)
    assert_equal true, @cache.exist?(4)
    assert_equal false, @cache.exist?(3)
    assert_equal true, @cache.exist?(2)
    assert_equal false, @cache.exist?(1)
  end

  def test_pruning_is_capped_at_a_max_time
    def @cache.delete_entry (*args)
      sleep(0.01)
      super
527
    end
B
Brian Durand 已提交
528 529 530 531 532 533 534 535 536 537 538 539 540
    @cache.write(1, "aaaaaaaaaa") && sleep(0.001)
    @cache.write(2, "bbbbbbbbbb") && sleep(0.001)
    @cache.write(3, "cccccccccc") && sleep(0.001)
    @cache.write(4, "dddddddddd") && sleep(0.001)
    @cache.write(5, "eeeeeeeeee") && sleep(0.001)
    @cache.prune(30, 0.001)
    assert_equal true, @cache.exist?(5)
    assert_equal true, @cache.exist?(4)
    assert_equal true, @cache.exist?(3)
    assert_equal true, @cache.exist?(2)
    assert_equal false, @cache.exist?(1)
  end
end
541

B
Brian Durand 已提交
542 543 544 545
class SynchronizedStoreTest < ActiveSupport::TestCase
  def setup
    ActiveSupport::Deprecation.silence do
      @cache = ActiveSupport::Cache.lookup_store(:memory_store, :expires_in => 60)
546
    end
B
Brian Durand 已提交
547
  end
548

B
Brian Durand 已提交
549 550 551 552 553 554 555 556 557 558 559 560 561 562
  include CacheStoreBehavior
  include CacheDeleteMatchedBehavior
  include CacheIncrementDecrementBehavior
end

uses_memcached 'memcached backed store' do
  class MemCacheStoreTest < ActiveSupport::TestCase
    def setup
      @cache = ActiveSupport::Cache.lookup_store(:mem_cache_store, :expires_in => 60)
      @peek = ActiveSupport::Cache.lookup_store(:mem_cache_store)
      @data = @cache.instance_variable_get(:@data)
      @cache.clear
      @cache.silence!
      @cache.logger = Logger.new("/dev/null")
563 564
    end

B
Brian Durand 已提交
565 566 567 568 569 570 571 572 573
    include CacheStoreBehavior
    include LocalCacheBehavior
    include CacheIncrementDecrementBehavior

    def test_raw_values
      cache = ActiveSupport::Cache.lookup_store(:mem_cache_store, :raw => true)
      cache.clear
      cache.write("foo", 2)
      assert_equal "2", cache.read("foo")
574
    end
575

B
Brian Durand 已提交
576 577 578 579 580 581 582
    def test_local_cache_raw_values
      cache = ActiveSupport::Cache.lookup_store(:mem_cache_store, :raw => true)
      cache.clear
      cache.with_local_cache do
        cache.write("foo", 2)
        assert_equal "2", cache.read("foo")
      end
583
    end
584 585
  end

586
  class CompressedMemCacheStore < ActiveSupport::TestCase
587
    def setup
B
Brian Durand 已提交
588 589 590 591
      ActiveSupport::Deprecation.silence do
        @cache = ActiveSupport::Cache.lookup_store(:compressed_mem_cache_store, :expires_in => 60)
        @cache.clear
      end
592
    end
593

594
    include CacheStoreBehavior
B
Brian Durand 已提交
595
    include CacheIncrementDecrementBehavior
596
  end
597
end
598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616

class CacheStoreLoggerTest < ActiveSupport::TestCase
  def setup
    @cache = ActiveSupport::Cache.lookup_store(:memory_store)

    @buffer = StringIO.new
    @cache.logger = Logger.new(@buffer)
  end

  def test_logging
    @cache.fetch('foo') { 'bar' }
    assert @buffer.string.present?
  end

  def test_mute_logging
    @cache.mute { @cache.fetch('foo') { 'bar' } }
    assert @buffer.string.blank?
  end
end
B
Brian Durand 已提交
617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651

class CacheEntryTest < ActiveSupport::TestCase
  def test_create_raw_entry
    time = Time.now
    entry = ActiveSupport::Cache::Entry.create("raw", time, :compress => false, :expires_in => 300)
    assert_equal "raw", entry.raw_value
    assert_equal time.to_f, entry.created_at
    assert_equal false, entry.compressed?
    assert_equal 300, entry.expires_in
  end

  def test_expired
    entry = ActiveSupport::Cache::Entry.new("value")
    assert_equal false, entry.expired?
    entry = ActiveSupport::Cache::Entry.new("value", :expires_in => 60)
    assert_equal false, entry.expired?
    time = Time.now + 61
    Time.stubs(:now).returns(time)
    assert_equal true, entry.expired?
  end

  def test_compress_values
    entry = ActiveSupport::Cache::Entry.new("value", :compress => true, :compress_threshold => 1)
    assert_equal "value", entry.value
    assert_equal true, entry.compressed?
    assert_equal "value", Marshal.load(Zlib::Inflate.inflate(entry.raw_value))
  end

  def test_non_compress_values
    entry = ActiveSupport::Cache::Entry.new("value")
    assert_equal "value", entry.value
    assert_equal "value", entry.raw_value
    assert_equal false, entry.compressed?
  end
end