2
2
3
3
module CacheStoreCoderBehavior
4
4
class SpyCoder
5
- attr_reader :dumped_entries , :loaded_entries
5
+ attr_reader :dumped_entries , :loaded_entries , :dump_compressed_entries
6
6
7
7
def initialize
8
8
@dumped_entries = [ ]
9
9
@loaded_entries = [ ]
10
+ @dump_compressed_entries = [ ]
10
11
end
11
12
12
13
def dump ( entry )
@@ -19,6 +20,15 @@ def load(payload)
19
20
@loaded_entries << entry
20
21
entry
21
22
end
23
+
24
+ def dump_compressed ( entry , threshold )
25
+ if threshold == 0
26
+ @dump_compressed_entries << entry
27
+ Marshal . dump ( entry )
28
+ else
29
+ dump ( entry )
30
+ end
31
+ end
22
32
end
23
33
24
34
def test_coder_receive_the_entry_on_write
@@ -83,4 +93,28 @@ def test_nil_coder_bypasses_serialization
83
93
entry = ActiveSupport ::Cache ::Entry . new ( "value" )
84
94
assert_same entry , @store . send ( :serialize_entry , entry )
85
95
end
96
+
97
+ def test_coder_is_used_during_handle_expired_entry_when_expired
98
+ coder = SpyCoder . new
99
+ @store = lookup_store ( coder : coder )
100
+ @store . write ( "foo" , "bar" , expires_in : 1 . second )
101
+ assert_equal 0 , coder . loaded_entries . size
102
+ assert_equal 1 , coder . dumped_entries . size
103
+
104
+ travel_to ( 2 . seconds . from_now ) do
105
+ val = @store . fetch (
106
+ "foo" ,
107
+ race_condition_ttl : 5 ,
108
+ compress : true ,
109
+ compress_threshold : 0
110
+ ) { "baz" }
111
+ assert_equal "baz" , val
112
+ assert_equal 1 , coder . loaded_entries . size # 1 read in fetch
113
+ assert_equal "bar" , coder . loaded_entries . first . value
114
+ assert_equal 1 , coder . dumped_entries . size # did not change from original write
115
+ assert_equal 2 , coder . dump_compressed_entries . size # 1 write the expired entry handler, 1 in fetch
116
+ assert_equal "bar" , coder . dump_compressed_entries . first . value
117
+ assert_equal "baz" , coder . dump_compressed_entries . last . value
118
+ end
119
+ end
86
120
end
0 commit comments