couchbase 1.1.5-x86-mingw32 → 1.2.0.beta-x86-mingw32

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.
Files changed (52) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +12 -1
  3. data/HISTORY.markdown +112 -1
  4. data/README.markdown +149 -6
  5. data/couchbase.gemspec +5 -1
  6. data/ext/couchbase_ext/.gitignore +4 -0
  7. data/ext/couchbase_ext/arguments.c +973 -0
  8. data/ext/couchbase_ext/arithmetic.c +322 -0
  9. data/ext/couchbase_ext/bucket.c +1092 -0
  10. data/ext/couchbase_ext/couchbase_ext.c +618 -3247
  11. data/ext/couchbase_ext/couchbase_ext.h +519 -0
  12. data/ext/couchbase_ext/delete.c +167 -0
  13. data/ext/couchbase_ext/extconf.rb +24 -5
  14. data/ext/couchbase_ext/get.c +301 -0
  15. data/ext/couchbase_ext/gethrtime.c +124 -0
  16. data/ext/couchbase_ext/http.c +402 -0
  17. data/ext/couchbase_ext/observe.c +174 -0
  18. data/ext/couchbase_ext/result.c +126 -0
  19. data/ext/couchbase_ext/stats.c +169 -0
  20. data/ext/couchbase_ext/store.c +522 -0
  21. data/ext/couchbase_ext/timer.c +192 -0
  22. data/ext/couchbase_ext/touch.c +190 -0
  23. data/ext/couchbase_ext/unlock.c +180 -0
  24. data/ext/couchbase_ext/utils.c +471 -0
  25. data/ext/couchbase_ext/version.c +147 -0
  26. data/lib/action_dispatch/middleware/session/couchbase_store.rb +38 -0
  27. data/lib/active_support/cache/couchbase_store.rb +356 -0
  28. data/lib/couchbase.rb +24 -3
  29. data/lib/couchbase/bucket.rb +372 -9
  30. data/lib/couchbase/result.rb +26 -0
  31. data/lib/couchbase/utils.rb +59 -0
  32. data/lib/couchbase/version.rb +1 -1
  33. data/lib/couchbase/view.rb +305 -0
  34. data/lib/couchbase/view_row.rb +230 -0
  35. data/lib/ext/multi_json_fix.rb +47 -0
  36. data/lib/rack/session/couchbase.rb +104 -0
  37. data/tasks/compile.rake +5 -14
  38. data/test/setup.rb +6 -2
  39. data/test/test_arithmetic.rb +32 -2
  40. data/test/test_async.rb +18 -4
  41. data/test/test_bucket.rb +11 -1
  42. data/test/test_cas.rb +13 -3
  43. data/test/test_couchbase_rails_cache_store.rb +294 -0
  44. data/test/test_delete.rb +60 -3
  45. data/test/test_format.rb +28 -17
  46. data/test/test_get.rb +91 -14
  47. data/test/test_store.rb +31 -1
  48. data/test/{test_flush.rb → test_timer.rb} +11 -18
  49. data/test/test_touch.rb +33 -5
  50. data/test/test_unlock.rb +120 -0
  51. data/test/test_utils.rb +26 -0
  52. metadata +102 -12
@@ -31,17 +31,20 @@ class TestStore < MiniTest::Unit::TestCase
31
31
  connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
32
32
  connection.set(uniq_id, "bar")
33
33
  assert connection.delete(uniq_id)
34
- refute connection.delete(uniq_id)
34
+ assert_raises(Couchbase::Error::NotFound) do
35
+ connection.delete(uniq_id)
36
+ end
35
37
  end
36
38
 
37
39
  def test_delete_missing
38
40
  connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
39
- refute connection.delete(uniq_id(:missing))
40
- connection.quiet = false
41
41
  assert_raises(Couchbase::Error::NotFound) do
42
42
  connection.delete(uniq_id(:missing))
43
43
  end
44
44
  refute connection.delete(uniq_id(:missing), :quiet => true)
45
+ refute connection.quiet?
46
+ connection.quiet = true
47
+ refute connection.delete(uniq_id(:missing))
45
48
  end
46
49
 
47
50
  def test_delete_with_cas
@@ -60,4 +63,58 @@ class TestStore < MiniTest::Unit::TestCase
60
63
  assert connection.delete(uniq_id, cas)
61
64
  end
62
65
 
66
+ def test_delete_with_prefix
67
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :key_prefix => "prefix:")
68
+ connection.set(uniq_id(:foo), "bar")
69
+ assert connection.delete(uniq_id(:foo))
70
+ assert_raises(Couchbase::Error::NotFound) do
71
+ connection.get(uniq_id(:foo))
72
+ end
73
+ end
74
+
75
+ def test_simple_multi_delete
76
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
77
+ connection.set(uniq_id(1) => "bar", uniq_id(2) => "foo")
78
+ res = connection.delete(uniq_id(1), uniq_id(2))
79
+ assert res.is_a?(Hash)
80
+ assert res[uniq_id(1)]
81
+ assert res[uniq_id(2)]
82
+ end
83
+
84
+ def test_simple_multi_delete_missing
85
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
86
+ connection.set(uniq_id(1) => "bar", uniq_id(2) => "foo")
87
+ res = connection.delete(uniq_id(1), uniq_id(:missing), :quiet => true)
88
+ assert res.is_a?(Hash)
89
+ assert res[uniq_id(1)]
90
+ refute res[uniq_id(:missing)]
91
+ end
92
+
93
+ def test_multi_delete_with_cas_check
94
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
95
+ cas = connection.set(uniq_id(1) => "bar", uniq_id(2) => "foo")
96
+ res = connection.delete(uniq_id(1) => cas[uniq_id(1)], uniq_id(2) => cas[uniq_id(2)])
97
+ assert res.is_a?(Hash)
98
+ assert res[uniq_id(1)]
99
+ assert res[uniq_id(2)]
100
+ end
101
+
102
+ def test_multi_delete_missing_with_cas_check
103
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
104
+ cas = connection.set(uniq_id(1) => "bar", uniq_id(2) => "foo")
105
+ res = connection.delete(uniq_id(1) => cas[uniq_id(1)], uniq_id(:missing) => cas[uniq_id(2)])
106
+ assert res.is_a?(Hash)
107
+ assert res[uniq_id(1)]
108
+ refute res[uniq_id(:missing)]
109
+ end
110
+
111
+ def test_multi_delete_with_cas_check_mismatch
112
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
113
+ cas = connection.set(uniq_id(1) => "bar", uniq_id(2) => "foo")
114
+
115
+ assert_raises(Couchbase::Error::KeyExists) do
116
+ connection.delete(uniq_id(1) => cas[uniq_id(1)] + 1,
117
+ uniq_id(2) => cas[uniq_id(2)])
118
+ end
119
+ end
63
120
  end
@@ -46,29 +46,31 @@ class TestFormat < MiniTest::Unit::TestCase
46
46
  end
47
47
 
48
48
  def test_it_raises_error_for_document_format_when_neither_to_json_nor_to_s_defined
49
- orig_doc = SkinyClass.new("Twoflower", "The tourist")
50
- refute orig_doc.respond_to?(:to_s)
51
- refute orig_doc.respond_to?(:to_json)
49
+ if (MultiJson.respond_to?(:engine) ? MultiJson.engine : MultiJson.adapter).name =~ /Yajl$/
50
+ orig_doc = SkinyClass.new("Twoflower", "The tourist")
51
+ refute orig_doc.respond_to?(:to_s)
52
+ refute orig_doc.respond_to?(:to_json)
52
53
 
53
- connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :default_format => :document)
54
- assert_raises(Couchbase::Error::ValueFormat) do
55
- connection.set(uniq_id, orig_doc)
56
- end
54
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :default_format => :document)
55
+ assert_raises(Couchbase::Error::ValueFormat) do
56
+ connection.set(uniq_id, orig_doc)
57
+ end
57
58
 
58
- class << orig_doc
59
- def to_json
60
- JSON.dump(:name => name, :role => role)
59
+ class << orig_doc
60
+ def to_json
61
+ MultiJson.dump(:name => name, :role => role)
62
+ end
61
63
  end
62
- end
63
- connection.set(uniq_id, orig_doc) # OK
64
+ connection.set(uniq_id, orig_doc) # OK
64
65
 
65
- class << orig_doc
66
- undef to_json
67
- def to_s
68
- JSON.dump(:name => name, :role => role)
66
+ class << orig_doc
67
+ undef to_json
68
+ def to_s
69
+ MultiJson.dump(:name => name, :role => role)
70
+ end
69
71
  end
72
+ connection.set(uniq_id, orig_doc) # OK
70
73
  end
71
- connection.set(uniq_id, orig_doc) # OK
72
74
  end
73
75
 
74
76
  def test_it_could_dump_arbitrary_class_using_marshal_format
@@ -95,4 +97,13 @@ class TestFormat < MiniTest::Unit::TestCase
95
97
  end
96
98
  end
97
99
 
100
+ def test_bignum_conversion
101
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :default_format => :plain)
102
+ cas = 0xffff_ffff_ffff_ffff
103
+ assert cas.is_a?(Bignum)
104
+ assert_raises(Couchbase::Error::NotFound) do
105
+ connection.delete(uniq_id => cas)
106
+ end
107
+ end
108
+
98
109
  end
@@ -82,7 +82,10 @@ class TestGet < MiniTest::Unit::TestCase
82
82
  assert_equal "foo1", results[uniq_id(1)]
83
83
  assert_equal "foo2", results[uniq_id(2)]
84
84
  sleep(2)
85
- assert connection.get(uniq_id(1), uniq_id(2)).compact.empty?
85
+ assert_raises(Couchbase::Error::NotFound) do
86
+ connection.get(uniq_id(1), uniq_id(2))
87
+ end
88
+ assert connection.get(uniq_id(1), uniq_id(2), :quiet => true).compact.empty?
86
89
  end
87
90
 
88
91
  def test_multi_get_and_touch_extended
@@ -104,11 +107,13 @@ class TestGet < MiniTest::Unit::TestCase
104
107
  assert results.is_a?(Hash)
105
108
  assert_equal "foo1", results[uniq_id]
106
109
  sleep(2)
107
- refute = connection.get(uniq_id)
110
+ assert_raises(Couchbase::Error::NotFound) do
111
+ connection.get(uniq_id)
112
+ end
108
113
  end
109
114
 
110
115
  def test_missing_in_quiet_mode
111
- connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
116
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
112
117
  cas1 = connection.set(uniq_id(1), "foo1")
113
118
  cas2 = connection.set(uniq_id(2), "foo2")
114
119
 
@@ -169,7 +174,6 @@ class TestGet < MiniTest::Unit::TestCase
169
174
  conn.get(uniq_id) {|ret| res << ret}
170
175
  handler = lambda {|ret| res << ret}
171
176
  conn.get(uniq_id, &handler)
172
- assert_equal 3, conn.seqno
173
177
  end
174
178
 
175
179
  checks = lambda do
@@ -198,7 +202,6 @@ class TestGet < MiniTest::Unit::TestCase
198
202
  res = {}
199
203
  connection.run do |conn|
200
204
  conn.get(uniq_id(1), uniq_id(2)) {|ret| res[ret.key] = ret.value}
201
- assert_equal 2, conn.seqno
202
205
  end
203
206
 
204
207
  assert res[uniq_id(1)]
@@ -231,9 +234,15 @@ class TestGet < MiniTest::Unit::TestCase
231
234
  missing.clear
232
235
  conn.get(uniq_id(:missing1), &get_handler)
233
236
  conn.get(uniq_id, uniq_id(:missing2), &get_handler)
234
- assert 3, conn.seqno
235
237
  end
236
238
 
239
+ connection.run(&suite)
240
+ refute res.has_key?(uniq_id(:missing1))
241
+ refute res.has_key?(uniq_id(:missing2))
242
+ assert_equal [uniq_id(:missing1), uniq_id(:missing2)], missing.sort
243
+ assert_equal "foo", res[uniq_id]
244
+
245
+ connection.quiet = true
237
246
  connection.run(&suite)
238
247
  assert_equal "foo", res[uniq_id]
239
248
  assert res.has_key?(uniq_id(:missing1)) # handler was called with nil
@@ -241,14 +250,6 @@ class TestGet < MiniTest::Unit::TestCase
241
250
  assert res.has_key?(uniq_id(:missing2))
242
251
  refute res[uniq_id(:missing2)]
243
252
  assert_empty missing
244
-
245
- connection.quiet = false
246
-
247
- connection.run(&suite)
248
- refute res.has_key?(uniq_id(:missing1))
249
- refute res.has_key?(uniq_id(:missing2))
250
- assert_equal [uniq_id(:missing1), uniq_id(:missing2)], missing.sort
251
- assert_equal "foo", res[uniq_id]
252
253
  end
253
254
 
254
255
  def test_get_using_brackets
@@ -327,4 +328,80 @@ class TestGet < MiniTest::Unit::TestCase
327
328
  end
328
329
  end
329
330
 
331
+ # http://www.couchbase.com/issues/browse/RCBC-31
332
+ def test_consistent_behaviour_for_arrays
333
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
334
+
335
+ cas = connection.set(uniq_id("foo"), "foo")
336
+ connection.set(uniq_id("bar"), "bar")
337
+
338
+ assert_equal "foo", connection.get(uniq_id("foo"))
339
+ assert_equal ["foo"], connection.get([uniq_id("foo")])
340
+ assert_equal ["foo", "bar"], connection.get([uniq_id("foo"), uniq_id("bar")])
341
+ assert_equal ["foo", "bar"], connection.get(uniq_id("foo"), uniq_id("bar"))
342
+ expected = {uniq_id("foo") => ["foo", 0x00, cas]}
343
+ assert_equal expected, connection.get([uniq_id("foo")], :extended => true)
344
+ assert_raises TypeError do
345
+ connection.get([uniq_id("foo"), uniq_id("bar")], [uniq_id("foo")])
346
+ end
347
+ end
348
+
349
+ def test_get_with_lock_trivial
350
+ if @mock.real?
351
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
352
+ connection.set(uniq_id, "foo")
353
+ assert_equal "foo", connection.get(uniq_id, :lock => 1)
354
+ assert_raises Couchbase::Error::KeyExists do
355
+ connection.set(uniq_id, "bar")
356
+ end
357
+ sleep(2)
358
+ connection.set(uniq_id, "bar")
359
+ else
360
+ skip("implement GETL in CouchbaseMock.jar")
361
+ end
362
+ end
363
+
364
+ def test_multi_get_with_lock
365
+ if @mock.real?
366
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
367
+ connection.set(uniq_id(1), "foo1")
368
+ connection.set(uniq_id(2), "foo2")
369
+ assert_equal ["foo1", "foo2"], connection.get([uniq_id(1), uniq_id(2)], :lock => 1)
370
+ assert_raises Couchbase::Error::KeyExists do
371
+ connection.set(uniq_id(1), "bar")
372
+ end
373
+ assert_raises Couchbase::Error::KeyExists do
374
+ connection.set(uniq_id(2), "bar")
375
+ end
376
+ else
377
+ skip("implement GETL in CouchbaseMock.jar")
378
+ end
379
+ end
380
+
381
+ def test_multi_get_with_custom_locks
382
+ if @mock.real?
383
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
384
+ connection.set(uniq_id(1), "foo1")
385
+ connection.set(uniq_id(2), "foo2")
386
+ expected = {uniq_id(1) => "foo1", uniq_id(2) => "foo2"}
387
+ assert_equal expected, connection.get({uniq_id(1) => 1, uniq_id(2) => 2}, :lock => true)
388
+ assert_raises Couchbase::Error::KeyExists do
389
+ connection.set(uniq_id(1), "foo")
390
+ end
391
+ assert_raises Couchbase::Error::KeyExists do
392
+ connection.set(uniq_id(2), "foo")
393
+ end
394
+ else
395
+ skip("implement GETL in CouchbaseMock.jar")
396
+ end
397
+ end
398
+
399
+ def test_multi_get_result_hash_assembling
400
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
401
+ connection.set(uniq_id(1), "foo")
402
+ connection.set(uniq_id(2), "bar")
403
+
404
+ expected = {uniq_id(1) => "foo", uniq_id(2) => "bar"}
405
+ assert_equal expected, connection.get(uniq_id(1), uniq_id(2), :assemble_hash => true)
406
+ end
330
407
  end
@@ -113,7 +113,6 @@ class TestStore < MiniTest::Unit::TestCase
113
113
  connection.run do |conn|
114
114
  conn.set(uniq_id("1"), "foo1") {|res| ret = res}
115
115
  conn.set(uniq_id("2"), "foo2") # ignore result
116
- assert_equal 2, conn.seqno
117
116
  end
118
117
  assert ret.is_a?(Couchbase::Result)
119
118
  assert ret.success?
@@ -160,6 +159,18 @@ class TestStore < MiniTest::Unit::TestCase
160
159
  assert_equal "barfoo", val
161
160
  end
162
161
 
162
+ def test_set_with_prefix
163
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :key_prefix => "prefix:")
164
+ connection.set(uniq_id(:foo), "bar")
165
+ assert_equal "bar", connection.get(uniq_id(:foo))
166
+ expected = {uniq_id(:foo) => "bar"}
167
+ assert_equal expected, connection.get(uniq_id(:foo), :assemble_hash => true)
168
+
169
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :key_prefix => nil)
170
+ expected = {"prefix:#{uniq_id(:foo)}" => "bar"}
171
+ assert_equal expected, connection.get("prefix:#{uniq_id(:foo)}", :assemble_hash => true)
172
+ end
173
+
163
174
  ArbitraryData = Struct.new(:baz)
164
175
 
165
176
  def test_set_using_brackets
@@ -183,4 +194,23 @@ class TestStore < MiniTest::Unit::TestCase
183
194
  EOC
184
195
  end
185
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
186
216
  end
@@ -1,5 +1,5 @@
1
1
  # Author:: Couchbase <info@couchbase.com>
2
- # Copyright:: 2011, 2012 Couchbase, Inc.
2
+ # Copyright:: 2012 Couchbase, Inc.
3
3
  # License:: Apache License, Version 2.0
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,33 +17,26 @@
17
17
 
18
18
  require File.join(File.dirname(__FILE__), 'setup')
19
19
 
20
- class TestFlush < MiniTest::Unit::TestCase
20
+ class TestTimer < MiniTest::Unit::TestCase
21
21
 
22
22
  def setup
23
- @mock = start_mock(:num_nodes => 7)
23
+ @mock = start_mock
24
24
  end
25
25
 
26
26
  def teardown
27
27
  stop_mock(@mock)
28
28
  end
29
29
 
30
- def test_trivial_flush
30
+ def test_initialization
31
31
  connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
32
- assert connection.flush
33
- end
32
+ num = 0
33
+ connection.run do
34
+ assert Couchbase::Timer.new(connection, 100) { num += 1}
35
+ assert connection.create_timer(100) { num += 1}
34
36
 
35
- def test_flush_with_block
36
- connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
37
- flushed = {}
38
- on_node_flush = lambda{|res| flushed[res.node] = res.success?}
39
- connection.run do |conn|
40
- conn.flush(&on_node_flush)
41
- end
42
- assert_equal @mock.num_nodes, flushed.size
43
- flushed.each do |node, res|
44
- assert node.is_a?(String)
45
- assert res
37
+ assert Couchbase::Timer.new(connection, 100, :periodic => true) {|t| num += 1; t.cancel}
38
+ assert connection.create_periodic_timer(100) {|t| num += 1; t.cancel}
46
39
  end
40
+ assert_equal 4, num
47
41
  end
48
-
49
42
  end
@@ -34,7 +34,9 @@ class TestTouch < MiniTest::Unit::TestCase
34
34
  sleep(1)
35
35
  assert connection.get(uniq_id)
36
36
  sleep(2)
37
- refute connection.get(uniq_id)
37
+ assert_raises(Couchbase::Error::NotFound) do
38
+ connection.get(uniq_id)
39
+ end
38
40
  end
39
41
 
40
42
  def test_multi_touch
@@ -45,8 +47,12 @@ class TestTouch < MiniTest::Unit::TestCase
45
47
  assert ret[uniq_id(1)]
46
48
  assert ret[uniq_id(2)]
47
49
  sleep(2)
48
- refute connection.get(uniq_id(1))
49
- refute connection.get(uniq_id(2))
50
+ assert_raises(Couchbase::Error::NotFound) do
51
+ connection.get(uniq_id(1))
52
+ end
53
+ assert_raises(Couchbase::Error::NotFound) do
54
+ connection.get(uniq_id(2))
55
+ end
50
56
  end
51
57
 
52
58
  def test_it_uses_default_ttl_for_touch
@@ -54,7 +60,9 @@ class TestTouch < MiniTest::Unit::TestCase
54
60
  connection.set(uniq_id, "bar", :ttl => 10)
55
61
  connection.touch(uniq_id)
56
62
  sleep(2)
57
- refute connection.get(uniq_id)
63
+ assert_raises(Couchbase::Error::NotFound) do
64
+ connection.get(uniq_id)
65
+ end
58
66
  end
59
67
 
60
68
  def test_it_accepts_ttl_for_get_command
@@ -63,7 +71,27 @@ class TestTouch < MiniTest::Unit::TestCase
63
71
  val = connection.get(uniq_id, :ttl => 1)
64
72
  assert_equal "bar", val
65
73
  sleep(2)
66
- refute connection.get(uniq_id)
74
+ assert_raises(Couchbase::Error::NotFound) do
75
+ connection.get(uniq_id)
76
+ end
77
+ end
78
+
79
+ def test_missing_in_quiet_mode
80
+ connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :quiet => true)
81
+ cas1 = connection.set(uniq_id(1), "foo1")
82
+ cas2 = connection.set(uniq_id(2), "foo2")
83
+
84
+ assert_raises(Couchbase::Error::NotFound) do
85
+ connection.touch(uniq_id(:missing), :quiet => false)
86
+ end
87
+
88
+ val = connection.touch(uniq_id(:missing))
89
+ refute(val)
90
+
91
+ ret = connection.touch(uniq_id(1), uniq_id(:missing), uniq_id(2))
92
+ assert_equal true, ret[uniq_id(1)]
93
+ assert_equal false, ret[uniq_id(:missing)]
94
+ assert_equal true, ret[uniq_id(2)]
67
95
  end
68
96
 
69
97
  end