-
Notifications
You must be signed in to change notification settings - Fork 126
/
entitystore_test.rb
229 lines (199 loc) · 6.38 KB
/
entitystore_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# coding: utf-8
require "#{File.dirname(__FILE__)}/spec_setup"
require 'rack/cache/entitystore'
class Object
def sha_like?
length == 40 && self =~ /^[0-9a-z]+$/
end
end
shared 'A Rack::Cache::EntityStore Implementation' do
it 'responds to all required messages' do
%w[read open write exist?].each do |message|
@store.should.respond_to message
end
end
it 'stores bodies with #write' do
key, size = @store.write(['My wild love went riding,'])
key.should.not.be.nil
key.should.be.sha_like
data = @store.read(key)
data.should.equal 'My wild love went riding,'
end
it 'correctly determines whether cached body exists for key with #exist?' do
key, size = @store.write(['She rode to the devil,'])
@store.should.exist key
@store.should.not.exist '938jasddj83jasdh4438021ksdfjsdfjsdsf'
end
it 'can read data written with #write' do
key, size = @store.write(['And asked him to pay.'])
data = @store.read(key)
data.should.equal 'And asked him to pay.'
end
it 'gives a 40 character SHA1 hex digest from #write' do
key, size = @store.write(['she rode to the sea;'])
key.should.not.be.nil
key.length.should.equal 40
key.should.be =~ /^[0-9a-z]+$/
key.should.equal '90a4c84d51a277f3dafc34693ca264531b9f51b6'
end
it 'returns the entire body as a String from #read' do
key, size = @store.write(['She gathered together'])
@store.read(key).should.equal 'She gathered together'
end
it 'returns nil from #read when key does not exist' do
@store.read('87fe0a1ae82a518592f6b12b0183e950b4541c62').should.be.nil
end
it 'returns a Rack compatible body from #open' do
key, size = @store.write(['Some shells for her hair.'])
body = @store.open(key)
body.should.respond_to :each
buf = ''
body.each { |part| buf << part }
buf.should.equal 'Some shells for her hair.'
end
it 'returns nil from #open when key does not exist' do
@store.open('87fe0a1ae82a518592f6b12b0183e950b4541c62').should.be.nil
end
it 'can store largish bodies with binary data' do
pony = File.open(File.dirname(__FILE__) + '/pony.jpg', 'rb') { |f| f.read }
key, size = @store.write([pony])
key.should.equal 'd0f30d8659b4d268c5c64385d9790024c2d78deb'
data = @store.read(key)
data.length.should.equal pony.length
data.hash.should.equal pony.hash
end
it 'deletes stored entries with #purge' do
key, size = @store.write(['My wild love went riding,'])
@store.purge(key).should.be.nil
@store.read(key).should.be.nil
end
end
describe 'Rack::Cache::EntityStore' do
describe 'Heap' do
before { @store = Rack::Cache::EntityStore::Heap.new }
behaves_like 'A Rack::Cache::EntityStore Implementation'
it 'takes a Hash to ::new' do
@store = Rack::Cache::EntityStore::Heap.new('foo' => ['bar'])
@store.read('foo').should.equal 'bar'
end
it 'uses its own Hash with no args to ::new' do
@store.read('foo').should.be.nil
end
end
describe 'Disk' do
before do
@temp_dir = create_temp_directory
@store = Rack::Cache::EntityStore::Disk.new(@temp_dir)
end
after do
@store = nil
remove_entry_secure @temp_dir
end
behaves_like 'A Rack::Cache::EntityStore Implementation'
it 'takes a path to ::new and creates the directory' do
path = @temp_dir + '/foo'
@store = Rack::Cache::EntityStore::Disk.new(path)
File.should.be.a.directory path
end
it 'produces a body that responds to #to_path' do
key, size = @store.write(['Some shells for her hair.'])
body = @store.open(key)
body.should.respond_to :to_path
path = "#{@temp_dir}/#{key[0..1]}/#{key[2..-1]}"
body.to_path.should.equal path
end
it 'spreads data over a 36² hash radius' do
(<<-PROSE).each_line { |line| @store.write([line]).first.should.be.sha_like }
My wild love went riding,
She rode all the day;
She rode to the devil,
And asked him to pay.
The devil was wiser
It's time to repent;
He asked her to give back
The money she spent
My wild love went riding,
She rode to sea;
She gathered together
Some shells for her hair
She rode on to Christmas,
She rode to the farm;
She rode to Japan
And re-entered a town
My wild love is crazy
She screams like a bird;
She moans like a cat
When she wants to be heard
She rode and she rode on
She rode for a while,
Then stopped for an evening
And laid her head down
By this time the weather
Had changed one degree,
She asked for the people
To let her go free
My wild love went riding,
She rode for an hour;
She rode and she rested,
And then she rode on
My wild love went riding,
PROSE
subdirs = Dir["#{@temp_dir}/*"]
subdirs.each do |subdir|
File.basename(subdir).should.be =~ /^[0-9a-z]{2}$/
files = Dir["#{subdir}/*"]
files.each do |filename|
File.basename(filename).should.be =~ /^[0-9a-z]{38}$/
end
files.length.should.be > 0
end
subdirs.length.should.equal 28
end
end
need_memcached 'entity store tests' do
describe 'MemCached' do
before do
@store = Rack::Cache::EntityStore::MemCached.new($memcached)
end
after do
@store = nil
end
behaves_like 'A Rack::Cache::EntityStore Implementation'
end
end
need_dalli 'entity store tests' do
describe 'Dalli' do
before do
$dalli.flush_all
@store = Rack::Cache::EntityStore::Dalli.new($dalli)
end
after do
@store = nil
end
behaves_like 'A Rack::Cache::EntityStore Implementation'
end
end
need_java 'entity store testing' do
module Rack::Cache::AppEngine
module MC
class << (Service = {})
def contains(key); include?(key); end
def get(key); self[key]; end;
def put(key, value, ttl = nil)
self[key] = value
end
end
end
end
describe 'GAEStore' do
before do
puts Rack::Cache::AppEngine::MC::Service.inspect
@store = Rack::Cache::EntityStore::GAEStore.new
end
after do
@store = nil
end
behaves_like 'A Rack::Cache::EntityStore Implementation'
end
end
end