forked from fog/fog-core
/
cache_spec.rb
191 lines (146 loc) · 5.71 KB
/
cache_spec.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
require "spec_helper"
require "securerandom"
require "tmpdir"
module Fog
class SubFogTestModel < Fog::Model
identity :id
end
end
module Fog
class SubFogTestService < Fog::Service
class Mock
attr_reader :options
def initialize(opts = {})
@options = opts
end
end
end
end
describe Fog::Cache do
before(:each) do
Fog.mock!
@service = Fog::SubFogTestService.new
Fog::Cache.namespace_prefix = "test-dir"
end
it "has a namespace_prefix configurable" do
Fog::Cache.namespace_prefix = "for-service-user-region-foo"
# Expand path does not downcase. case insensitive platform tests.
example_cache = File.expand_path(Fog::Cache.namespace(Fog::SubFogTestModel, @service)).downcase
expected_namespace = File.expand_path("~/.fog-cache/for-service-user-region-foo").downcase
assert_equal example_cache.include?(expected_namespace), true
end
it "has metadata associated to the namespace that you can save to" do
Fog::Cache.clean!
Fog::Cache.namespace_prefix = "for-service-user-region-foo"
# nothing exists, nothing comes back
assert_equal Fog::Cache.metadata, {}
# write/read
Fog::Cache.write_metadata({:last_dumped => "Tuesday, November 8, 2016"})
assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
# diff namespace, diff metadata
Fog::Cache.namespace_prefix = "different-namespace"
assert_nil Fog::Cache.metadata[:last_dumped]
# still accessible per namespace
Fog::Cache.namespace_prefix = "for-service-user-region-foo"
assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
# can overwrite
Fog::Cache.write_metadata({:last_dumped => "Diff date"})
assert_equal Fog::Cache.metadata[:last_dumped], "Diff date"
# can't write a non-hash/data entry.
assert_raises Fog::Cache::CacheDir do
Fog::Cache.write_metadata("boo")
end
# namespace must be set as well.
assert_raises Fog::Cache::CacheDir do
Fog::Cache.namespace_prefix = nil
Fog::Cache.write_metadata({:a => "b"})
end
end
it "can load cache data from disk" do
path = File.expand_path("~/.fog-cache-test-#{Time.now.to_i}.yml")
data = "--- ok\n...\n"
File.open(path, "w") { |f|
f.write(data)
}
assert_equal "ok", Fog::Cache.load_cache(path)
end
it "load bad cache data - empty file, from disk" do
path = File.expand_path("~/.fog-cache-test-2-#{Time.now.to_i}.yml")
data = ""
File.open(path, "w") { |f|
f.write(data)
}
assert_equal false, Fog::Cache.load_cache(path)
end
it "must have a namespace_prefix configurable" do
Fog::Cache.namespace_prefix = nil
assert_raises Fog::Cache::CacheDir do
Fog::Cache.load(Fog::SubFogTestModel, @service)
end
end
it "can create a namespace" do
Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), false
Fog::Cache.create_namespace(Fog::SubFogTestModel, @service)
assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), true
end
it "will raise if no cache data found" do
Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
assert_raises Fog::Cache::CacheNotFound do
Fog::Cache.load(Fog::SubFogTestModel, @service)
end
end
it "Fog cache ignores bad cache data - empty file, from disk" do
Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
id = SecureRandom.hex
a = Fog::SubFogTestModel.new(:id => id, :service => @service)
a.cache.dump
# input bad data
path_dir = File.expand_path(Fog::Cache.namespace(Fog::SubFogTestModel, @service))
path = File.join(path_dir, "foo.yml")
data = ""
File.open(path, "w") { |f|
f.write(data)
}
assert_equal 1, Fog::Cache.load(Fog::SubFogTestModel, @service).size
end
it "can be dumped and reloaded back in" do
Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
id = SecureRandom.hex
a = Fog::SubFogTestModel.new(:id => id, :service => @service)
assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), false
a.cache.dump
assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), true
instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
assert_equal instances.first.id, a.id
assert_equal instances.first.class, a.class
end
it "dumping two models that have a duplicate identity" do
Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
id = SecureRandom.hex
# security groups on aws for eg can have the same identity group name 'default'.
# there are no restrictions on `identity` fog attributes to be uniq.
a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
a.cache.dump
b.cache.dump
instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
assert_equal instances.size, 2
end
it "dumping two models that have a duplicate identity twice" do
Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
id = SecureRandom.hex
# security groups on aws for eg can have the same identity group name 'default'.
# there are no restrictions on `identity` fog attributes to be uniq.
a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
a.cache.dump
b.cache.dump
# and then again, w/out expiring cache
a.cache.dump
b.cache.dump
instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
# unique-ify based on the attributes...
assert_equal instances.size, 2
end
end