couchbase-jruby-client 0.1.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +203 -0
- data/README.md +347 -0
- data/Rakefile +10 -0
- data/couchbase-jruby-client.gemspec +30 -0
- data/lib/couchbase/async/callback.rb +19 -0
- data/lib/couchbase/async/queue.rb +26 -0
- data/lib/couchbase/async.rb +139 -0
- data/lib/couchbase/bucket.rb +663 -0
- data/lib/couchbase/cluster.rb +105 -0
- data/lib/couchbase/constants.rb +12 -0
- data/lib/couchbase/error.rb +28 -0
- data/lib/couchbase/jruby/couchbase_client.rb +22 -0
- data/lib/couchbase/jruby/future.rb +8 -0
- data/lib/couchbase/operations/arithmetic.rb +301 -0
- data/lib/couchbase/operations/delete.rb +104 -0
- data/lib/couchbase/operations/get.rb +298 -0
- data/lib/couchbase/operations/stats.rb +16 -0
- data/lib/couchbase/operations/store.rb +468 -0
- data/lib/couchbase/operations/touch.rb +123 -0
- data/lib/couchbase/operations/utils.rb +49 -0
- data/lib/couchbase/operations.rb +23 -0
- data/lib/couchbase/result.rb +43 -0
- data/lib/couchbase/transcoder.rb +83 -0
- data/lib/couchbase/utils.rb +62 -0
- data/lib/couchbase/version.rb +3 -0
- data/lib/couchbase/view.rb +506 -0
- data/lib/couchbase/view_row.rb +272 -0
- data/lib/couchbase.rb +177 -0
- data/lib/jars/commons-codec-1.5.jar +0 -0
- data/lib/jars/couchbase-client-1.2.0-javadoc.jar +0 -0
- data/lib/jars/couchbase-client-1.2.0-sources.jar +0 -0
- data/lib/jars/couchbase-client-1.2.0.jar +0 -0
- data/lib/jars/httpcore-4.1.1.jar +0 -0
- data/lib/jars/httpcore-nio-4.1.1.jar +0 -0
- data/lib/jars/jettison-1.1.jar +0 -0
- data/lib/jars/netty-3.5.5.Final.jar +0 -0
- data/lib/jars/spymemcached-2.10.0-javadoc.jar +0 -0
- data/lib/jars/spymemcached-2.10.0-sources.jar +0 -0
- data/lib/jars/spymemcached-2.10.0.jar +0 -0
- data/test/profile/.gitignore +1 -0
- data/test/profile/Gemfile +6 -0
- data/test/profile/benchmark.rb +195 -0
- data/test/setup.rb +201 -0
- data/test/test_arithmetic.rb +177 -0
- data/test/test_async.rb +324 -0
- data/test/test_bucket.rb +213 -0
- data/test/test_cas.rb +78 -0
- data/test/test_couchbase.rb +29 -0
- data/test/test_couchbase_rails_cache_store.rb +341 -0
- data/test/test_delete.rb +125 -0
- data/test/test_errors.rb +82 -0
- data/test/test_format.rb +161 -0
- data/test/test_get.rb +417 -0
- data/test/test_stats.rb +57 -0
- data/test/test_store.rb +216 -0
- data/test/test_timer.rb +42 -0
- data/test/test_touch.rb +97 -0
- data/test/test_unlock.rb +119 -0
- data/test/test_utils.rb +58 -0
- data/test/test_version.rb +52 -0
- metadata +226 -0
data/test/test_get.rb
ADDED
@@ -0,0 +1,417 @@
|
|
1
|
+
# Author:: Couchbase <info@couchbase.com>
|
2
|
+
# Copyright:: 2011, 2012 Couchbase, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), 'setup')
|
19
|
+
|
20
|
+
class TestGet < MiniTest::Test
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@mock = start_mock
|
24
|
+
end
|
25
|
+
|
26
|
+
def teardown
|
27
|
+
stop_mock(@mock)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_trivial_get
|
31
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
32
|
+
connection.set(uniq_id, "bar")
|
33
|
+
val = connection.get(uniq_id)
|
34
|
+
assert_equal "bar", val
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_extended_get
|
38
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
39
|
+
|
40
|
+
orig_cas = connection.set(uniq_id, "bar")
|
41
|
+
val, flags, cas = connection.get(uniq_id, :extended => true)
|
42
|
+
assert_equal "bar", val
|
43
|
+
#assert_equal 0x0, flags
|
44
|
+
assert_equal orig_cas, cas
|
45
|
+
|
46
|
+
orig_cas = connection.set(uniq_id, "bar", :flags => 0x1000)
|
47
|
+
val, flags, cas = connection.get(uniq_id, :extended => true)
|
48
|
+
assert_equal "bar", val
|
49
|
+
#assert_equal 0x1000, flags
|
50
|
+
assert_equal orig_cas, cas
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_multi_get
|
54
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
55
|
+
|
56
|
+
connection.set(uniq_id(1), "foo1")
|
57
|
+
connection.set(uniq_id(2), "foo2")
|
58
|
+
|
59
|
+
val1, val2 = connection.get(uniq_id(1), uniq_id(2))
|
60
|
+
assert_equal "foo1", val1
|
61
|
+
assert_equal "foo2", val2
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_multi_get_extended
|
65
|
+
skip 'Looking like Java client doesnt support multi_get_extended'
|
66
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
67
|
+
|
68
|
+
cas1 = connection.set(uniq_id(1), "foo1")
|
69
|
+
cas2 = connection.set(uniq_id(2), "foo2")
|
70
|
+
|
71
|
+
results = connection.get(uniq_id(1), uniq_id(2), :extended => true)
|
72
|
+
assert_equal ["foo1", nil, cas1], results[uniq_id(1)]
|
73
|
+
assert_equal ["foo2", nil, cas2], results[uniq_id(2)]
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_multi_get_and_touch
|
77
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
78
|
+
connection.set(uniq_id(1), "foo1")
|
79
|
+
connection.set(uniq_id(2), "foo2")
|
80
|
+
|
81
|
+
results = connection.get(uniq_id(1) => 1, uniq_id(2) => 1)
|
82
|
+
assert results.is_a?(Hash)
|
83
|
+
assert_equal "foo1", results[uniq_id(1)]
|
84
|
+
assert_equal "foo2", results[uniq_id(2)]
|
85
|
+
sleep(2)
|
86
|
+
assert_raises(Couchbase::Error::NotFound) do
|
87
|
+
connection.get(uniq_id(1), uniq_id(2))
|
88
|
+
end
|
89
|
+
assert connection.get(uniq_id(1), uniq_id(2), :quiet => true).compact.empty?
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_multi_get_and_touch_extended
|
93
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
94
|
+
|
95
|
+
cas1 = connection.set(uniq_id(1), "foo1")
|
96
|
+
cas2 = connection.set(uniq_id(2), "foo2")
|
97
|
+
|
98
|
+
results = connection.get({uniq_id(1) => 1, uniq_id(2) => 1}, :extended => true)
|
99
|
+
assert_equal ["foo1", nil, cas1], results[uniq_id(1)]
|
100
|
+
assert_equal ["foo2", nil, cas2], results[uniq_id(2)]
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_multi_get_and_touch_with_single_key
|
104
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
105
|
+
connection.set(uniq_id, "foo1")
|
106
|
+
|
107
|
+
results = connection.get(uniq_id => 1)
|
108
|
+
assert results.is_a?(Hash)
|
109
|
+
assert_equal "foo1", results[uniq_id]
|
110
|
+
sleep(2)
|
111
|
+
assert_raises(Couchbase::Error::NotFound) do
|
112
|
+
connection.get(uniq_id)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_missing_in_quiet_mode
|
117
|
+
skip
|
118
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
|
119
|
+
cas1 = connection.set(uniq_id(1), "foo1")
|
120
|
+
cas2 = connection.set(uniq_id(2), "foo2")
|
121
|
+
|
122
|
+
val = connection.get(uniq_id(:missing))
|
123
|
+
refute(val)
|
124
|
+
val = connection.get(uniq_id(:missing), :extended => true)
|
125
|
+
refute(val)
|
126
|
+
|
127
|
+
val1, missing, val2 = connection.get(uniq_id(1), uniq_id(:missing), uniq_id(2))
|
128
|
+
assert_equal "foo1", val1
|
129
|
+
refute missing
|
130
|
+
assert_equal "foo2", val2
|
131
|
+
|
132
|
+
# TODO: multi get with cas
|
133
|
+
# results = connection.get(uniq_id(1), uniq_id(:missing), uniq_id(2), :extended => true)
|
134
|
+
# assert_equal ["foo1", nil, cas1], results[uniq_id(1)]
|
135
|
+
# refute results[uniq_id(:missing)]
|
136
|
+
# assert_equal ["foo2", nil, cas2], results[uniq_id(2)]
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_it_allows_temporary_quiet_flag
|
140
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => false)
|
141
|
+
assert_raises(Couchbase::Error::NotFound) do
|
142
|
+
connection.get(uniq_id(:missing))
|
143
|
+
end
|
144
|
+
refute connection.get(uniq_id(:missing), :quiet => true)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_missing_in_verbose_mode
|
148
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => false)
|
149
|
+
connection.set(uniq_id(1), "foo1")
|
150
|
+
connection.set(uniq_id(2), "foo2")
|
151
|
+
|
152
|
+
assert_raises(Couchbase::Error::NotFound) do
|
153
|
+
connection.get(uniq_id(:missing))
|
154
|
+
end
|
155
|
+
|
156
|
+
assert_raises(Couchbase::Error::NotFound) do
|
157
|
+
connection.get(uniq_id(:missing), :extended => true)
|
158
|
+
end
|
159
|
+
|
160
|
+
assert_raises(Couchbase::Error::NotFound) do
|
161
|
+
connection.get(uniq_id(1), uniq_id(:missing), uniq_id(2))
|
162
|
+
end
|
163
|
+
|
164
|
+
assert_raises(Couchbase::Error::NotFound) do
|
165
|
+
connection.get(uniq_id(1), uniq_id(:missing), uniq_id(2), :extended => true)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_asynchronous_get
|
170
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
171
|
+
cas = connection.set(uniq_id, "foo")
|
172
|
+
res = []
|
173
|
+
|
174
|
+
suite = lambda do |conn|
|
175
|
+
res.clear
|
176
|
+
conn.get(uniq_id) # ignore result
|
177
|
+
conn.get(uniq_id) {|ret| res << ret}
|
178
|
+
handler = lambda {|ret| res << ret}
|
179
|
+
conn.get(uniq_id, &handler)
|
180
|
+
end
|
181
|
+
|
182
|
+
checks = lambda do
|
183
|
+
res.each do |r|
|
184
|
+
assert r.is_a?(Couchbase::Result)
|
185
|
+
assert r.success?
|
186
|
+
assert_equal uniq_id, r.key
|
187
|
+
assert_equal "foo", r.value
|
188
|
+
# assert_equal cas, r.cas TODO: GetFuture does not hold CAS
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
connection.run(&suite)
|
193
|
+
checks.call
|
194
|
+
|
195
|
+
connection.run{ suite.call(connection) }
|
196
|
+
checks.call
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_asynchronous_multi_get
|
200
|
+
skip
|
201
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
202
|
+
connection.set(uniq_id(1), "foo")
|
203
|
+
connection.set(uniq_id(2), "bar")
|
204
|
+
|
205
|
+
res = {}
|
206
|
+
connection.run do |conn|
|
207
|
+
conn.get(uniq_id(1), uniq_id(2)) {|ret| res[ret.key] = ret.value}
|
208
|
+
end
|
209
|
+
|
210
|
+
assert res[uniq_id(1)]
|
211
|
+
assert_equal "foo", res[uniq_id(1)]
|
212
|
+
assert res[uniq_id(2)]
|
213
|
+
assert_equal "bar", res[uniq_id(2)]
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_asynchronous_get_missing
|
217
|
+
skip
|
218
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
219
|
+
connection.set(uniq_id, "foo")
|
220
|
+
res = {}
|
221
|
+
missing = []
|
222
|
+
|
223
|
+
get_handler = lambda do |ret|
|
224
|
+
assert_equal :get, ret.operation
|
225
|
+
if ret.success?
|
226
|
+
res[ret.key] = ret.value
|
227
|
+
else
|
228
|
+
if ret.error.is_a?(Couchbase::Error::NotFound)
|
229
|
+
missing << ret.key
|
230
|
+
else
|
231
|
+
raise ret.error
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
suite = lambda do |conn|
|
237
|
+
res.clear
|
238
|
+
missing.clear
|
239
|
+
conn.get(uniq_id(:missing1), &get_handler)
|
240
|
+
conn.get(uniq_id, uniq_id(:missing2), &get_handler)
|
241
|
+
end
|
242
|
+
|
243
|
+
connection.run(&suite)
|
244
|
+
refute res.has_key?(uniq_id(:missing1))
|
245
|
+
refute res.has_key?(uniq_id(:missing2))
|
246
|
+
assert_equal [uniq_id(:missing1), uniq_id(:missing2)], missing.sort
|
247
|
+
assert_equal "foo", res[uniq_id]
|
248
|
+
|
249
|
+
connection.quiet = true
|
250
|
+
connection.run(&suite)
|
251
|
+
assert_equal "foo", res[uniq_id]
|
252
|
+
assert res.has_key?(uniq_id(:missing1)) # handler was called with nil
|
253
|
+
refute res[uniq_id(:missing1)]
|
254
|
+
assert res.has_key?(uniq_id(:missing2))
|
255
|
+
refute res[uniq_id(:missing2)]
|
256
|
+
assert_empty missing
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_get_using_brackets
|
260
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
261
|
+
|
262
|
+
orig_cas = connection.set(uniq_id, "foo", :flags => 0x1100)
|
263
|
+
|
264
|
+
val = connection[uniq_id]
|
265
|
+
assert_equal "foo", val
|
266
|
+
|
267
|
+
if RUBY_VERSION =~ /^1\.9/
|
268
|
+
eval <<-EOC
|
269
|
+
val, flags, cas = connection[uniq_id, :extended => true]
|
270
|
+
assert_equal "foo", val
|
271
|
+
#assert_equal 0x1100, flags
|
272
|
+
assert_equal orig_cas, cas
|
273
|
+
EOC
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_it_allows_to_store_nil
|
278
|
+
skip "TODO: figure out nil storage"
|
279
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
280
|
+
|
281
|
+
orig_cas = connection.set(uniq_id, nil)
|
282
|
+
assert orig_cas.is_a?(Numeric)
|
283
|
+
|
284
|
+
refute connection.get(uniq_id)
|
285
|
+
# doesn't raise NotFound exception
|
286
|
+
refute connection.get(uniq_id, :quiet => false)
|
287
|
+
# returns CAS
|
288
|
+
value, flags, cas = connection.get(uniq_id, :extended => true)
|
289
|
+
refute value
|
290
|
+
#assert_equal 0x00, flags
|
291
|
+
assert_equal orig_cas, cas
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_zero_length_string_is_not_nil
|
295
|
+
skip("zero length string")
|
296
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
297
|
+
|
298
|
+
connection.set(uniq_id, "", :format => :document)
|
299
|
+
assert_equal "", connection.get(uniq_id)
|
300
|
+
|
301
|
+
connection.set(uniq_id, "", :format => :plain)
|
302
|
+
assert_equal "", connection.get(uniq_id)
|
303
|
+
|
304
|
+
connection.set(uniq_id, "", :format => :marshal)
|
305
|
+
assert_equal "", connection.get(uniq_id)
|
306
|
+
|
307
|
+
connection.set(uniq_id, nil, :format => :document)
|
308
|
+
assert_equal nil, connection.get(uniq_id, :quiet => false)
|
309
|
+
|
310
|
+
assert_raises Couchbase::Error::ValueFormat do
|
311
|
+
connection.set(uniq_id, nil, :format => :plain)
|
312
|
+
end
|
313
|
+
|
314
|
+
connection.set(uniq_id, nil, :format => :marshal)
|
315
|
+
assert_equal nil, connection.get(uniq_id, :quiet => false)
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_format_forcing
|
319
|
+
skip("format forcing")
|
320
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
321
|
+
|
322
|
+
connection.set(uniq_id, '{"foo":"bar"}', :format => :plain)
|
323
|
+
value, flags, _ = connection.get(uniq_id, :extended => true)
|
324
|
+
assert_equal '{"foo":"bar"}', value
|
325
|
+
assert_equal 0x02, flags
|
326
|
+
|
327
|
+
value, flags, _ = connection.get(uniq_id, :extended => true, :format => :document)
|
328
|
+
expected = {"foo" => "bar"}
|
329
|
+
assert_equal expected, value
|
330
|
+
assert_equal 0x02, flags
|
331
|
+
|
332
|
+
connection.prepend(uniq_id, "NOT-A-JSON")
|
333
|
+
assert_raises Couchbase::Error::ValueFormat do
|
334
|
+
connection.get(uniq_id, :format => :document)
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
# http://www.couchbase.com/issues/browse/RCBC-31
|
339
|
+
def test_consistent_behaviour_for_arrays
|
340
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
341
|
+
|
342
|
+
cas = connection.set(uniq_id("foo"), "foo")
|
343
|
+
connection.set(uniq_id("bar"), "bar")
|
344
|
+
|
345
|
+
assert_equal "foo", connection.get(uniq_id("foo"))
|
346
|
+
assert_equal ["foo"], connection.get([uniq_id("foo")])
|
347
|
+
assert_equal ["foo", "bar"], connection.get([uniq_id("foo"), uniq_id("bar")])
|
348
|
+
assert_equal ["foo", "bar"], connection.get(uniq_id("foo"), uniq_id("bar"))
|
349
|
+
# expected = {uniq_id("foo") => ["foo", nil, cas]}
|
350
|
+
# assert_equal expected, connection.get([uniq_id("foo")], :extended => true)
|
351
|
+
assert_raises TypeError do
|
352
|
+
connection.get([uniq_id("foo"), uniq_id("bar")], [uniq_id("foo")])
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_get_with_lock_trivial
|
357
|
+
if @mock.real?
|
358
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
359
|
+
connection.set(uniq_id, "foo")
|
360
|
+
|
361
|
+
assert_equal "foo", connection.get(uniq_id, :lock => 1)
|
362
|
+
assert_raises Couchbase::Error::KeyExists do
|
363
|
+
connection.set(uniq_id, "bar")
|
364
|
+
end
|
365
|
+
sleep(2)
|
366
|
+
connection.set(uniq_id, "bar")
|
367
|
+
else
|
368
|
+
skip("implement GETL in CouchbaseMock.jar")
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
def test_multi_get_with_lock
|
373
|
+
skip("multi_get_with_lock")
|
374
|
+
if @mock.real?
|
375
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
376
|
+
connection.set(uniq_id(1), "foo1")
|
377
|
+
connection.set(uniq_id(2), "foo2")
|
378
|
+
assert_equal ["foo1", "foo2"], connection.get([uniq_id(1), uniq_id(2)], :lock => 1)
|
379
|
+
assert_raises Couchbase::Error::KeyExists do
|
380
|
+
connection.set(uniq_id(1), "bar")
|
381
|
+
end
|
382
|
+
assert_raises Couchbase::Error::KeyExists do
|
383
|
+
connection.set(uniq_id(2), "bar")
|
384
|
+
end
|
385
|
+
else
|
386
|
+
skip("implement GETL in CouchbaseMock.jar")
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
def test_multi_get_with_custom_locks
|
391
|
+
skip("multi_get_with_custom_locks")
|
392
|
+
if @mock.real?
|
393
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
394
|
+
connection.set(uniq_id(1), "foo1")
|
395
|
+
connection.set(uniq_id(2), "foo2")
|
396
|
+
expected = {uniq_id(1) => "foo1", uniq_id(2) => "foo2"}
|
397
|
+
assert_equal expected, connection.get({uniq_id(1) => 1, uniq_id(2) => 2}, :lock => true)
|
398
|
+
assert_raises Couchbase::Error::KeyExists do
|
399
|
+
connection.set(uniq_id(1), "foo")
|
400
|
+
end
|
401
|
+
assert_raises Couchbase::Error::KeyExists do
|
402
|
+
connection.set(uniq_id(2), "foo")
|
403
|
+
end
|
404
|
+
else
|
405
|
+
skip("implement GETL in CouchbaseMock.jar")
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
def test_multi_get_result_hash_assembling
|
410
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
411
|
+
connection.set(uniq_id(1), "foo")
|
412
|
+
connection.set(uniq_id(2), "bar")
|
413
|
+
|
414
|
+
expected = {uniq_id(1) => "foo", uniq_id(2) => "bar"}
|
415
|
+
assert_equal expected, connection.get(uniq_id(1), uniq_id(2), :assemble_hash => true)
|
416
|
+
end
|
417
|
+
end
|
data/test/test_stats.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Author:: Couchbase <info@couchbase.com>
|
2
|
+
# Copyright:: 2011, 2012 Couchbase, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), 'setup')
|
19
|
+
|
20
|
+
class TestStats < MiniTest::Test
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@mock = start_mock(:num_nodes => 4)
|
24
|
+
end
|
25
|
+
|
26
|
+
def teardown
|
27
|
+
stop_mock(@mock)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_trivial_stats_without_argument
|
31
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
32
|
+
stats = connection.stats
|
33
|
+
assert stats.is_a?(Hash)
|
34
|
+
assert stats.has_key?("pid")
|
35
|
+
key, info = stats.first
|
36
|
+
assert key.is_a?(String)
|
37
|
+
assert info.is_a?(Hash)
|
38
|
+
assert_equal @mock.num_nodes, info.size
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_stats_with_argument
|
42
|
+
if @mock.real?
|
43
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
44
|
+
stats = connection.stats("memory")
|
45
|
+
assert stats.is_a?(Hash)
|
46
|
+
assert stats.has_key?("mem_used")
|
47
|
+
key, info = stats.first
|
48
|
+
assert key.is_a?(String)
|
49
|
+
assert info.is_a?(Hash)
|
50
|
+
assert_equal @mock.num_nodes, info.size
|
51
|
+
else
|
52
|
+
# FIXME
|
53
|
+
skip("make CouchbaseMock.jar STATS more real-life")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
data/test/test_store.rb
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
# Author:: Couchbase <info@couchbase.com>
|
2
|
+
# Copyright:: 2011, 2012 Couchbase, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), 'setup')
|
19
|
+
|
20
|
+
class TestStore < MiniTest::Test
|
21
|
+
|
22
|
+
def setup
|
23
|
+
@mock = start_mock
|
24
|
+
end
|
25
|
+
|
26
|
+
def teardown
|
27
|
+
stop_mock(@mock)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_trivial_set
|
31
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
32
|
+
cas = connection.set(uniq_id, "bar")
|
33
|
+
assert(cas > 0)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_set_with_cas
|
37
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
38
|
+
|
39
|
+
cas1 = connection.set(uniq_id, "bar1")
|
40
|
+
assert cas1 > 0
|
41
|
+
|
42
|
+
assert_raises(Couchbase::Error::KeyExists) do
|
43
|
+
connection.set(uniq_id, "bar2", :cas => cas1+1)
|
44
|
+
end
|
45
|
+
|
46
|
+
cas2 = connection.set(uniq_id, "bar2", :cas => cas1)
|
47
|
+
assert cas2 > 0
|
48
|
+
refute_equal cas2, cas1
|
49
|
+
|
50
|
+
cas3 = connection.set(uniq_id, "bar3")
|
51
|
+
assert cas3 > 0
|
52
|
+
refute_equal cas3, cas2
|
53
|
+
refute_equal cas3, cas1
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_add
|
57
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
58
|
+
|
59
|
+
cas1 = connection.add(uniq_id, "bar")
|
60
|
+
assert cas1 > 0
|
61
|
+
|
62
|
+
assert_raises(Couchbase::Error::KeyExists) do
|
63
|
+
connection.add(uniq_id, "bar")
|
64
|
+
end
|
65
|
+
|
66
|
+
assert_raises(Couchbase::Error::KeyExists) do
|
67
|
+
connection.add(uniq_id, "bar", :cas => cas1)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_replace
|
72
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
73
|
+
|
74
|
+
assert_raises(Couchbase::Error::NotFound) do
|
75
|
+
connection.replace(uniq_id, "bar")
|
76
|
+
end
|
77
|
+
|
78
|
+
cas1 = connection.set(uniq_id, "bar")
|
79
|
+
assert cas1 > 0
|
80
|
+
|
81
|
+
connection.replace(uniq_id, "bar")
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_acceptable_keys
|
85
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
86
|
+
|
87
|
+
cas = connection.set(uniq_id.to_sym, "bar")
|
88
|
+
assert cas > 0
|
89
|
+
|
90
|
+
cas = connection.set(uniq_id.to_s, "bar")
|
91
|
+
assert cas > 0
|
92
|
+
|
93
|
+
assert_raises(TypeError) do
|
94
|
+
connection.set(nil, "bar")
|
95
|
+
end
|
96
|
+
|
97
|
+
obj = {:foo => "bar", :baz => 1}
|
98
|
+
assert_raises(TypeError) do
|
99
|
+
connection.set(obj, "bar")
|
100
|
+
end
|
101
|
+
|
102
|
+
class << obj
|
103
|
+
alias :to_str :to_s
|
104
|
+
end
|
105
|
+
|
106
|
+
connection.set(obj, "bar")
|
107
|
+
assert cas > 0
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_asynchronous_set
|
111
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
112
|
+
ret = nil
|
113
|
+
connection.run do |conn|
|
114
|
+
conn.set(uniq_id("1"), "foo1") {|res| ret = res}
|
115
|
+
conn.set(uniq_id("2"), "foo2") # ignore result
|
116
|
+
end
|
117
|
+
|
118
|
+
assert ret.is_a?(Couchbase::Result)
|
119
|
+
assert ret.success?
|
120
|
+
assert_equal uniq_id("1"), ret.key
|
121
|
+
assert_equal :set, ret.operation
|
122
|
+
assert ret.cas.is_a?(Numeric)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_it_raises_error_when_appending_or_prepending_to_missing_key
|
126
|
+
skip
|
127
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
128
|
+
|
129
|
+
assert_raises(Couchbase::Error::NotStored) do
|
130
|
+
connection.append(uniq_id(:missing), "foo")
|
131
|
+
end
|
132
|
+
|
133
|
+
assert_raises(Couchbase::Error::NotStored) do
|
134
|
+
connection.prepend(uniq_id(:missing), "foo")
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_append
|
139
|
+
skip
|
140
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :default_format => :plain)
|
141
|
+
|
142
|
+
cas1 = connection.set(uniq_id, "foo")
|
143
|
+
assert cas1 > 0
|
144
|
+
cas2 = connection.append(uniq_id, "bar")
|
145
|
+
assert cas2 > 0
|
146
|
+
refute_equal cas2, cas1
|
147
|
+
|
148
|
+
val = connection.get(uniq_id)
|
149
|
+
assert_equal "foobar", val
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_prepend
|
153
|
+
skip
|
154
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :default_format => :plain)
|
155
|
+
|
156
|
+
cas1 = connection.set(uniq_id, "foo")
|
157
|
+
assert cas1 > 0
|
158
|
+
cas2 = connection.prepend(uniq_id, "bar")
|
159
|
+
assert cas2 > 0
|
160
|
+
refute_equal cas2, cas1
|
161
|
+
|
162
|
+
val = connection.get(uniq_id)
|
163
|
+
assert_equal "barfoo", val
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_set_with_prefix
|
167
|
+
skip
|
168
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :key_prefix => "prefix:")
|
169
|
+
connection.set(uniq_id(:foo), "bar")
|
170
|
+
assert_equal "bar", connection.get(uniq_id(:foo))
|
171
|
+
expected = {uniq_id(:foo) => "bar"}
|
172
|
+
assert_equal expected, connection.get(uniq_id(:foo), :assemble_hash => true)
|
173
|
+
|
174
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :key_prefix => nil)
|
175
|
+
expected = {"prefix:#{uniq_id(:foo)}" => "bar"}
|
176
|
+
assert_equal expected, connection.get("prefix:#{uniq_id(:foo)}", :assemble_hash => true)
|
177
|
+
end
|
178
|
+
|
179
|
+
ArbitraryData = Struct.new(:baz)
|
180
|
+
|
181
|
+
def test_set_using_brackets
|
182
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
183
|
+
|
184
|
+
connection[uniq_id(1)] = "foo"
|
185
|
+
val = connection.get(uniq_id(1))
|
186
|
+
assert_equal "foo", val
|
187
|
+
|
188
|
+
# if RUBY_VERSION =~ /^1\.9/
|
189
|
+
# eval <<-EOC
|
190
|
+
# connection[uniq_id(3), :format => :marshal] = ArbitraryData.new("thing")
|
191
|
+
# val = connection.get(uniq_id(3))
|
192
|
+
# assert val.is_a?(ArbitraryData)
|
193
|
+
# assert_equal "thing", val.baz
|
194
|
+
# EOC
|
195
|
+
# end
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_multi_store
|
199
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :default_format => :plain)
|
200
|
+
connection.add(uniq_id(:a) => "bbb", uniq_id(:z) => "yyy")
|
201
|
+
assert_equal ["bbb", "yyy"], connection.get(uniq_id(:a), uniq_id(:z))
|
202
|
+
|
203
|
+
# connection.prepend(uniq_id(:a) => "aaa", uniq_id(:z) => "xxx")
|
204
|
+
# assert_equal ["aaabbb", "xxxyyy"], connection.get(uniq_id(:a), uniq_id(:z))
|
205
|
+
|
206
|
+
# connection.append(uniq_id(:a) => "ccc", uniq_id(:z) => "zzz")
|
207
|
+
# assert_equal ["aaabbbccc", "xxxyyyzzz"], connection.get(uniq_id(:a), uniq_id(:z))
|
208
|
+
|
209
|
+
# connection.replace(uniq_id(:a) => "foo", uniq_id(:z) => "bar")
|
210
|
+
# assert_equal ["foo", "bar"], connection.get(uniq_id(:a), uniq_id(:z))
|
211
|
+
|
212
|
+
res = connection.set(uniq_id(:a) => "bar", uniq_id(:z) => "foo")
|
213
|
+
assert_equal ["bar", "foo"], connection.get(uniq_id(:a), uniq_id(:z))
|
214
|
+
assert res.is_a?(Hash)
|
215
|
+
end
|
216
|
+
end
|