Skip to content

Commit

Permalink
Merge pull request #37210 from jonhyman/feature-fix-36956-rebased
Browse files Browse the repository at this point in the history
Fixes #36956 by dup'ing the value and entry object returned from MemoryStore.
  • Loading branch information
rafaelfranca committed Sep 16, 2019
1 parent 2ec8752 commit 4d2d0a5
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
2 changes: 2 additions & 0 deletions activesupport/lib/active_support/cache/memory_store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ def read_entry(key, options)
entry = @data[key]
synchronize do
if entry
entry = entry.dup
entry.dup_value!
@key_access[key] = Time.now.to_f
else
@key_access.delete(key)
Expand Down
30 changes: 30 additions & 0 deletions activesupport/test/cache/stores/memory_store_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,36 @@ def @cache.delete_entry(*args)
assert_not @cache.exist?(1)
end

def test_cache_not_mutated
item = { "foo" => "bar" }
key = "test_key"
@cache.write(key, item)

read_item = @cache.read(key)
read_item["foo"] = "xyz"
assert_equal item, @cache.read(key)
end

def test_cache_different_object_ids_hash
item = { "foo" => "bar" }
key = "test_key"
@cache.write(key, item)

read_item = @cache.read(key)
assert_not_equal item.object_id, read_item.object_id
assert_not_equal read_item.object_id, @cache.read(key).object_id
end

def test_cache_different_object_ids_string
item = "my_string"
key = "test_key"
@cache.write(key, item)

read_item = @cache.read(key)
assert_not_equal item.object_id, read_item.object_id
assert_not_equal read_item.object_id, @cache.read(key).object_id
end

def test_write_with_unless_exist
assert_equal true, @cache.write(1, "aaaaaaaaaa")
assert_equal false, @cache.write(1, "aaaaaaaaaa", unless_exist: true)
Expand Down

0 comments on commit 4d2d0a5

Please sign in to comment.