jsierles-memcache-client 1.5.0.5

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.
@@ -0,0 +1,771 @@
1
+ # encoding: utf-8
2
+ require 'stringio'
3
+ require 'test/unit'
4
+
5
+ $TESTING = true
6
+
7
+ require File.dirname(__FILE__) + '/../lib/memcache'
8
+
9
+ class MemCache
10
+
11
+ attr_writer :namespace
12
+
13
+ end
14
+
15
+ class FakeSocket
16
+
17
+ attr_reader :written, :data
18
+
19
+ def initialize
20
+ @written = StringIO.new
21
+ @data = StringIO.new
22
+ end
23
+
24
+ def write(data)
25
+ @written.write data
26
+ end
27
+
28
+ def gets
29
+ @data.gets
30
+ end
31
+
32
+ def read(arg)
33
+ @data.read arg
34
+ end
35
+
36
+ end
37
+
38
+ class FakeServer
39
+
40
+ attr_reader :host, :port, :socket
41
+
42
+ def initialize(socket = nil)
43
+ @closed = false
44
+ @host = 'example.com'
45
+ @port = 11211
46
+ @socket = socket || FakeSocket.new
47
+ end
48
+
49
+ def close
50
+ @closed = true
51
+ end
52
+
53
+ def alive?
54
+ !@closed
55
+ end
56
+
57
+ end
58
+
59
+ class TestMemCache < Test::Unit::TestCase
60
+
61
+ def setup
62
+ @cache = MemCache.new 'localhost:1', :namespace => 'my_namespace'
63
+ end
64
+
65
+ def test_cache_get
66
+ server = util_setup_fake_server
67
+
68
+ assert_equal "\004\b\"\0170123456789",
69
+ @cache.cache_get(server, 'my_namespace:key')
70
+
71
+ assert_equal "get my_namespace:key\r\n",
72
+ server.socket.written.string
73
+ end
74
+
75
+ def test_cache_get_EOF
76
+ server = util_setup_fake_server
77
+ server.socket.data.string = ''
78
+
79
+ e = assert_raise MemCache::MemCacheError do
80
+ @cache.cache_get server, 'my_namespace:key'
81
+ end
82
+
83
+ assert_equal "lost connection to example.com:11211", e.message
84
+ end
85
+
86
+ def test_cache_get_bad_state
87
+ server = FakeServer.new
88
+
89
+ # Write two messages to the socket to test failover
90
+ server.socket.data.write "bogus response\r\nbogus response\r\n"
91
+ server.socket.data.rewind
92
+
93
+ @cache.servers = []
94
+ @cache.servers << server
95
+
96
+ e = assert_raise MemCache::MemCacheError do
97
+ @cache.cache_get(server, 'my_namespace:key')
98
+ end
99
+
100
+ assert_match /#{Regexp.quote 'unexpected response "bogus response\r\n"'}/, e.message
101
+
102
+ assert !server.alive?
103
+
104
+ assert_match /get my_namespace:key\r\n/, server.socket.written.string
105
+ end
106
+
107
+ def test_cache_get_miss
108
+ socket = FakeSocket.new
109
+ socket.data.write "END\r\n"
110
+ socket.data.rewind
111
+ server = FakeServer.new socket
112
+
113
+ assert_equal nil, @cache.cache_get(server, 'my_namespace:key')
114
+
115
+ assert_equal "get my_namespace:key\r\n",
116
+ socket.written.string
117
+ end
118
+
119
+ def test_cache_get_multi
120
+ server = util_setup_fake_server
121
+ server.socket.data.write "VALUE foo 0 7\r\n"
122
+ server.socket.data.write "\004\b\"\bfoo\r\n"
123
+ server.socket.data.write "VALUE bar 0 7\r\n"
124
+ server.socket.data.write "\004\b\"\bbar\r\n"
125
+ server.socket.data.write "END\r\n"
126
+ server.socket.data.rewind
127
+
128
+ result = @cache.cache_get_multi server, 'foo bar baz'
129
+
130
+ assert_equal 2, result.length
131
+ assert_equal "\004\b\"\bfoo", result['foo']
132
+ assert_equal "\004\b\"\bbar", result['bar']
133
+ end
134
+
135
+ def test_cache_get_multi_EOF
136
+ server = util_setup_fake_server
137
+ server.socket.data.string = ''
138
+
139
+ e = assert_raise MemCache::MemCacheError do
140
+ @cache.cache_get_multi server, 'my_namespace:key'
141
+ end
142
+
143
+ assert_equal "lost connection to example.com:11211", e.message
144
+ end
145
+
146
+ def test_cache_get_multi_bad_state
147
+ server = FakeServer.new
148
+
149
+ # Write two messages to the socket to test failover
150
+ server.socket.data.write "bogus response\r\nbogus response\r\n"
151
+ server.socket.data.rewind
152
+
153
+ @cache.servers = []
154
+ @cache.servers << server
155
+
156
+ e = assert_raise MemCache::MemCacheError do
157
+ @cache.cache_get_multi server, 'my_namespace:key'
158
+ end
159
+
160
+ assert_match /#{Regexp.quote 'unexpected response "bogus response\r\n"'}/, e.message
161
+
162
+ assert !server.alive?
163
+
164
+ assert_match /get my_namespace:key\r\n/, server.socket.written.string
165
+ end
166
+
167
+ def test_initialize
168
+ cache = MemCache.new :namespace => 'my_namespace', :readonly => true
169
+
170
+ assert_equal 'my_namespace', cache.namespace
171
+ assert_equal true, cache.readonly?
172
+ assert_equal true, cache.servers.empty?
173
+ end
174
+
175
+ def test_initialize_compatible
176
+ cache = MemCache.new ['localhost:11211', 'localhost:11212'],
177
+ :namespace => 'my_namespace', :readonly => true
178
+
179
+ assert_equal 'my_namespace', cache.namespace
180
+ assert_equal true, cache.readonly?
181
+ assert_equal false, cache.servers.empty?
182
+ end
183
+
184
+ def test_initialize_compatible_no_hash
185
+ cache = MemCache.new ['localhost:11211', 'localhost:11212']
186
+
187
+ assert_equal nil, cache.namespace
188
+ assert_equal false, cache.readonly?
189
+ assert_equal false, cache.servers.empty?
190
+ end
191
+
192
+ def test_initialize_compatible_one_server
193
+ cache = MemCache.new 'localhost:11211'
194
+
195
+ assert_equal nil, cache.namespace
196
+ assert_equal false, cache.readonly?
197
+ assert_equal false, cache.servers.empty?
198
+ end
199
+
200
+ def test_initialize_compatible_bad_arg
201
+ e = assert_raise ArgumentError do
202
+ cache = MemCache.new Object.new
203
+ end
204
+
205
+ assert_equal 'first argument must be Array, Hash or String', e.message
206
+ end
207
+
208
+ def test_initialize_multiple_servers
209
+ cache = MemCache.new %w[localhost:11211 localhost:11212],
210
+ :namespace => 'my_namespace', :readonly => true
211
+
212
+ assert_equal 'my_namespace', cache.namespace
213
+ assert_equal true, cache.readonly?
214
+ assert_equal false, cache.servers.empty?
215
+ assert !cache.instance_variable_get(:@buckets).empty?
216
+ end
217
+
218
+ def test_initialize_too_many_args
219
+ assert_raises ArgumentError do
220
+ MemCache.new 1, 2, 3
221
+ end
222
+ end
223
+
224
+ def test_decr
225
+ server = FakeServer.new
226
+ server.socket.data.write "5\r\n"
227
+ server.socket.data.rewind
228
+
229
+ @cache.servers = []
230
+ @cache.servers << server
231
+
232
+ value = @cache.decr 'key'
233
+
234
+ assert_equal "decr my_namespace:key 1\r\n",
235
+ @cache.servers.first.socket.written.string
236
+
237
+ assert_equal 5, value
238
+ end
239
+
240
+ def test_decr_not_found
241
+ server = FakeServer.new
242
+ server.socket.data.write "NOT_FOUND\r\n"
243
+ server.socket.data.rewind
244
+
245
+ @cache.servers = []
246
+ @cache.servers << server
247
+
248
+ value = @cache.decr 'key'
249
+
250
+ assert_equal "decr my_namespace:key 1\r\n",
251
+ @cache.servers.first.socket.written.string
252
+
253
+ assert_equal nil, value
254
+ end
255
+
256
+ def test_decr_space_padding
257
+ server = FakeServer.new
258
+ server.socket.data.write "5 \r\n"
259
+ server.socket.data.rewind
260
+
261
+ @cache.servers = []
262
+ @cache.servers << server
263
+
264
+ value = @cache.decr 'key'
265
+
266
+ assert_equal "decr my_namespace:key 1\r\n",
267
+ @cache.servers.first.socket.written.string
268
+
269
+ assert_equal 5, value
270
+ end
271
+
272
+ def test_get
273
+ util_setup_fake_server
274
+
275
+ value = @cache.get 'key'
276
+
277
+ assert_equal "get my_namespace:key\r\n",
278
+ @cache.servers.first.socket.written.string
279
+
280
+ assert_equal '0123456789', value
281
+ end
282
+
283
+ def test_get_bad_key
284
+ util_setup_fake_server
285
+ assert_raise ArgumentError do @cache.get 'k y' end
286
+
287
+ util_setup_fake_server
288
+ assert_raise ArgumentError do @cache.get 'k' * 250 end
289
+ end
290
+
291
+ def test_get_cache_get_IOError
292
+ socket = Object.new
293
+ def socket.write(arg) raise IOError, 'some io error'; end
294
+ server = FakeServer.new socket
295
+
296
+ @cache.servers = []
297
+ @cache.servers << server
298
+
299
+ e = assert_raise MemCache::MemCacheError do
300
+ @cache.get 'my_namespace:key'
301
+ end
302
+
303
+ assert_equal 'some io error', e.message
304
+ end
305
+
306
+ def test_get_cache_get_SystemCallError
307
+ socket = Object.new
308
+ def socket.write(arg) raise SystemCallError, 'some syscall error'; end
309
+ server = FakeServer.new socket
310
+
311
+ @cache.servers = []
312
+ @cache.servers << server
313
+
314
+ e = assert_raise MemCache::MemCacheError do
315
+ @cache.get 'my_namespace:key'
316
+ end
317
+
318
+ assert_equal 'unknown error - some syscall error', e.message
319
+ end
320
+
321
+ def test_get_no_connection
322
+ @cache.servers = 'localhost:1'
323
+ e = assert_raise MemCache::MemCacheError do
324
+ @cache.get 'key'
325
+ end
326
+
327
+ assert_match /^No connection to server/, e.message
328
+ end
329
+
330
+ def test_get_no_servers
331
+ @cache.servers = []
332
+ e = assert_raise MemCache::MemCacheError do
333
+ @cache.get 'key'
334
+ end
335
+
336
+ assert_equal 'No active servers', e.message
337
+ end
338
+
339
+ def test_get_multi
340
+ server = FakeServer.new
341
+ server.socket.data.write "VALUE my_namespace:key 0 14\r\n"
342
+ server.socket.data.write "\004\b\"\0170123456789\r\n"
343
+ server.socket.data.write "VALUE my_namespace:keyb 0 14\r\n"
344
+ server.socket.data.write "\004\b\"\0179876543210\r\n"
345
+ server.socket.data.write "END\r\n"
346
+ server.socket.data.rewind
347
+
348
+ @cache.servers = []
349
+ @cache.servers << server
350
+
351
+ values = @cache.get_multi 'key', 'keyb'
352
+
353
+ assert_equal "get my_namespace:key my_namespace:keyb\r\n",
354
+ server.socket.written.string
355
+
356
+ expected = { 'key' => '0123456789', 'keyb' => '9876543210' }
357
+
358
+ assert_equal expected.sort, values.sort
359
+ end
360
+
361
+ def test_get_raw
362
+ server = FakeServer.new
363
+ server.socket.data.write "VALUE my_namespace:key 0 10\r\n"
364
+ server.socket.data.write "0123456789\r\n"
365
+ server.socket.data.write "END\r\n"
366
+ server.socket.data.rewind
367
+
368
+ @cache.servers = []
369
+ @cache.servers << server
370
+
371
+
372
+ value = @cache.get 'key', true
373
+
374
+ assert_equal "get my_namespace:key\r\n",
375
+ @cache.servers.first.socket.written.string
376
+
377
+ assert_equal '0123456789', value
378
+ end
379
+
380
+ def test_get_server_for_key
381
+ server = @cache.get_server_for_key 'key'
382
+ assert_equal 'localhost', server.host
383
+ assert_equal 1, server.port
384
+ end
385
+
386
+ def test_get_server_for_key_multiple
387
+ s1 = util_setup_server @cache, 'one.example.com', ''
388
+ s2 = util_setup_server @cache, 'two.example.com', ''
389
+ @cache.instance_variable_set :@servers, [s1, s2]
390
+ @cache.instance_variable_set :@buckets, [s1, s2]
391
+
392
+ server = @cache.get_server_for_key 'keya'
393
+ assert_equal 'two.example.com', server.host
394
+ server = @cache.get_server_for_key 'keyb'
395
+ assert_equal 'one.example.com', server.host
396
+ end
397
+
398
+ def test_get_server_for_key_no_servers
399
+ @cache.servers = []
400
+
401
+ e = assert_raise MemCache::MemCacheError do
402
+ @cache.get_server_for_key 'key'
403
+ end
404
+
405
+ assert_equal 'No servers available', e.message
406
+ end
407
+
408
+ def test_get_server_for_key_spaces
409
+ e = assert_raise ArgumentError do
410
+ @cache.get_server_for_key 'space key'
411
+ end
412
+ assert_equal 'illegal character in key "space key"', e.message
413
+ end
414
+
415
+ def test_get_server_for_key_length
416
+ @cache.get_server_for_key 'x' * 250
417
+ long_key = 'x' * 251
418
+ e = assert_raise ArgumentError do
419
+ @cache.get_server_for_key long_key
420
+ end
421
+ assert_equal "key too long #{long_key.inspect}", e.message
422
+ end
423
+
424
+ def test_incr
425
+ server = FakeServer.new
426
+ server.socket.data.write "5\r\n"
427
+ server.socket.data.rewind
428
+
429
+ @cache.servers = []
430
+ @cache.servers << server
431
+
432
+ value = @cache.incr 'key'
433
+
434
+ assert_equal "incr my_namespace:key 1\r\n",
435
+ @cache.servers.first.socket.written.string
436
+
437
+ assert_equal 5, value
438
+ end
439
+
440
+ def test_incr_not_found
441
+ server = FakeServer.new
442
+ server.socket.data.write "NOT_FOUND\r\n"
443
+ server.socket.data.rewind
444
+
445
+ @cache.servers = []
446
+ @cache.servers << server
447
+
448
+ value = @cache.incr 'key'
449
+
450
+ assert_equal "incr my_namespace:key 1\r\n",
451
+ @cache.servers.first.socket.written.string
452
+
453
+ assert_equal nil, value
454
+ end
455
+
456
+ def test_incr_space_padding
457
+ server = FakeServer.new
458
+ server.socket.data.write "5 \r\n"
459
+ server.socket.data.rewind
460
+
461
+ @cache.servers = []
462
+ @cache.servers << server
463
+
464
+ value = @cache.incr 'key'
465
+
466
+ assert_equal "incr my_namespace:key 1\r\n",
467
+ @cache.servers.first.socket.written.string
468
+
469
+ assert_equal 5, value
470
+ end
471
+
472
+ def test_make_cache_key
473
+ assert_equal 'my_namespace:key', @cache.make_cache_key('key')
474
+ @cache.namespace = nil
475
+ assert_equal 'key', @cache.make_cache_key('key')
476
+ end
477
+
478
+ def test_servers
479
+ server = FakeServer.new
480
+ @cache.servers = []
481
+ @cache.servers << server
482
+ assert_equal [server], @cache.servers
483
+ end
484
+
485
+ def test_servers_equals_type_error
486
+ e = assert_raise TypeError do
487
+ @cache.servers = [Object.new]
488
+ end
489
+
490
+ assert_equal 'cannot convert Object into MemCache::Server', e.message
491
+ end
492
+
493
+ def test_set
494
+ server = FakeServer.new
495
+ server.socket.data.write "STORED\r\n"
496
+ server.socket.data.rewind
497
+ @cache.servers = []
498
+ @cache.servers << server
499
+
500
+ @cache.set 'key', 'value'
501
+
502
+ dumped = Marshal.dump('value')
503
+ expected = "set my_namespace:key 0 0 #{dumped.length}\r\n#{dumped}\r\n"
504
+ # expected = "set my_namespace:key 0 0 9\r\n\004\b\"\nvalue\r\n"
505
+ assert_equal expected, server.socket.written.string
506
+ end
507
+
508
+ def test_set_expiry
509
+ server = FakeServer.new
510
+ server.socket.data.write "STORED\r\n"
511
+ server.socket.data.rewind
512
+ @cache.servers = []
513
+ @cache.servers << server
514
+
515
+ @cache.set 'key', 'value', 5
516
+
517
+ dumped = Marshal.dump('value')
518
+ expected = "set my_namespace:key 0 5 #{dumped.length}\r\n#{dumped}\r\n"
519
+ assert_equal expected, server.socket.written.string
520
+ end
521
+
522
+ def test_set_raw
523
+ server = FakeServer.new
524
+ server.socket.data.write "STORED\r\n"
525
+ server.socket.data.rewind
526
+ @cache.servers = []
527
+ @cache.servers << server
528
+
529
+ @cache.set 'key', 'value', 0, true
530
+
531
+ expected = "set my_namespace:key 0 0 5\r\nvalue\r\n"
532
+ assert_equal expected, server.socket.written.string
533
+ end
534
+
535
+ def test_set_readonly
536
+ cache = MemCache.new :readonly => true
537
+
538
+ e = assert_raise MemCache::MemCacheError do
539
+ cache.set 'key', 'value'
540
+ end
541
+
542
+ assert_equal 'Update of readonly cache', e.message
543
+ end
544
+
545
+ def test_set_too_big
546
+ server = FakeServer.new
547
+
548
+ # Write two messages to the socket to test failover
549
+ server.socket.data.write "SERVER_ERROR\r\nSERVER_ERROR object too large for cache\r\n"
550
+ server.socket.data.rewind
551
+
552
+ @cache.servers = []
553
+ @cache.servers << server
554
+
555
+ e = assert_raise MemCache::MemCacheError do
556
+ @cache.set 'key', 'v'
557
+ end
558
+
559
+ assert_match /object too large for cache/, e.message
560
+ end
561
+
562
+ def test_add
563
+ server = FakeServer.new
564
+ server.socket.data.write "STORED\r\n"
565
+ server.socket.data.rewind
566
+ @cache.servers = []
567
+ @cache.servers << server
568
+
569
+ @cache.add 'key', 'value'
570
+
571
+ dumped = Marshal.dump('value')
572
+
573
+ expected = "add my_namespace:key 0 0 #{dumped.length}\r\n#{dumped}\r\n"
574
+ assert_equal expected, server.socket.written.string
575
+ end
576
+
577
+ def test_add_exists
578
+ server = FakeServer.new
579
+ server.socket.data.write "NOT_STORED\r\n"
580
+ server.socket.data.rewind
581
+ @cache.servers = []
582
+ @cache.servers << server
583
+
584
+ @cache.add 'key', 'value'
585
+
586
+ dumped = Marshal.dump('value')
587
+ expected = "add my_namespace:key 0 0 #{dumped.length}\r\n#{dumped}\r\n"
588
+ assert_equal expected, server.socket.written.string
589
+ end
590
+
591
+ def test_add_expiry
592
+ server = FakeServer.new
593
+ server.socket.data.write "STORED\r\n"
594
+ server.socket.data.rewind
595
+ @cache.servers = []
596
+ @cache.servers << server
597
+
598
+ @cache.add 'key', 'value', 5
599
+
600
+ dumped = Marshal.dump('value')
601
+ expected = "add my_namespace:key 0 5 #{dumped.length}\r\n#{dumped}\r\n"
602
+ assert_equal expected, server.socket.written.string
603
+ end
604
+
605
+ def test_add_raw
606
+ server = FakeServer.new
607
+ server.socket.data.write "STORED\r\n"
608
+ server.socket.data.rewind
609
+ @cache.servers = []
610
+ @cache.servers << server
611
+
612
+ @cache.add 'key', 'value', 0, true
613
+
614
+ expected = "add my_namespace:key 0 0 5\r\nvalue\r\n"
615
+ assert_equal expected, server.socket.written.string
616
+ end
617
+
618
+ def test_add_readonly
619
+ cache = MemCache.new :readonly => true
620
+
621
+ e = assert_raise MemCache::MemCacheError do
622
+ cache.add 'key', 'value'
623
+ end
624
+
625
+ assert_equal 'Update of readonly cache', e.message
626
+ end
627
+
628
+ def test_delete
629
+ server = FakeServer.new
630
+ @cache.servers = []
631
+ @cache.servers << server
632
+
633
+ @cache.delete 'key'
634
+
635
+ expected = "delete my_namespace:key 0\r\n"
636
+ assert_equal expected, server.socket.written.string
637
+ end
638
+
639
+ def test_delete_with_expiry
640
+ server = FakeServer.new
641
+ @cache.servers = []
642
+ @cache.servers << server
643
+
644
+ @cache.delete 'key', 300
645
+
646
+ expected = "delete my_namespace:key 300\r\n"
647
+ assert_equal expected, server.socket.written.string
648
+ end
649
+
650
+ def test_flush_all
651
+ @cache.servers = []
652
+ 3.times { @cache.servers << FakeServer.new }
653
+
654
+ @cache.flush_all
655
+
656
+ expected = "flush_all\r\n"
657
+ @cache.servers.each do |server|
658
+ assert_equal expected, server.socket.written.string
659
+ end
660
+ end
661
+
662
+ def test_flush_all_failure
663
+ socket = FakeSocket.new
664
+
665
+ # Write two messages to the socket to test failover
666
+ socket.data.write "ERROR\r\nERROR\r\n"
667
+ socket.data.rewind
668
+
669
+ server = FakeServer.new socket
670
+
671
+ @cache.servers = []
672
+ @cache.servers << server
673
+
674
+ assert_raise MemCache::MemCacheError do
675
+ @cache.flush_all
676
+ end
677
+
678
+ assert_match /flush_all\r\n/, socket.written.string
679
+ end
680
+
681
+ def test_stats
682
+ socket = FakeSocket.new
683
+ socket.data.write "STAT pid 20188\r\nSTAT total_items 32\r\nSTAT version 1.2.3\r\nSTAT rusage_user 1:300\r\nSTAT dummy ok\r\nEND\r\n"
684
+ socket.data.rewind
685
+ server = FakeServer.new socket
686
+ def server.host() 'localhost'; end
687
+ def server.port() 11211; end
688
+
689
+ @cache.servers = []
690
+ @cache.servers << server
691
+
692
+ expected = {
693
+ 'localhost:11211' => {
694
+ 'pid' => 20188, 'total_items' => 32, 'version' => '1.2.3',
695
+ 'rusage_user' => 1.0003, 'dummy' => 'ok'
696
+ }
697
+ }
698
+ assert_equal expected, @cache.stats
699
+
700
+ assert_equal "stats\r\n", socket.written.string
701
+ end
702
+
703
+ def test_basic_threaded_operations_should_work
704
+ cache = MemCache.new :multithread => true,
705
+ :namespace => 'my_namespace',
706
+ :readonly => false
707
+
708
+ server = FakeServer.new
709
+ server.socket.data.write "STORED\r\n"
710
+ server.socket.data.rewind
711
+
712
+ cache.servers = []
713
+ cache.servers << server
714
+
715
+ assert cache.multithread
716
+
717
+ assert_nothing_raised do
718
+ cache.set "test", "test value"
719
+ end
720
+
721
+ # TODO Fails in 1.9
722
+ assert_match /set my_namespace:test.*\r\n.*test value.*\r\n/, server.socket.written.string
723
+ end
724
+
725
+ def test_basic_unthreaded_operations_should_work
726
+ cache = MemCache.new :multithread => false,
727
+ :namespace => 'my_namespace',
728
+ :readonly => false
729
+
730
+ server = FakeServer.new
731
+ server.socket.data.write "STORED\r\n"
732
+ server.socket.data.rewind
733
+
734
+ cache.servers = []
735
+ cache.servers << server
736
+
737
+ assert !cache.multithread
738
+
739
+ assert_nothing_raised do
740
+ cache.set "test", "test value"
741
+ end
742
+
743
+ # TODO Fails in 1.9
744
+ assert_match /set my_namespace:test.*\r\n.*test value\r\n/, server.socket.written.string
745
+ end
746
+
747
+ def util_setup_fake_server
748
+ server = FakeServer.new
749
+ server.socket.data.write "VALUE my_namespace:key 0 14\r\n"
750
+ server.socket.data.write "\004\b\"\0170123456789\r\n"
751
+ server.socket.data.write "END\r\n"
752
+ server.socket.data.rewind
753
+
754
+ @cache.servers = []
755
+ @cache.servers << server
756
+
757
+ return server
758
+ end
759
+
760
+ def util_setup_server(memcache, host, responses)
761
+ server = MemCache::Server.new memcache, host
762
+ server.instance_variable_set :@sock, StringIO.new(responses)
763
+
764
+ @cache.servers = []
765
+ @cache.servers << server
766
+
767
+ return server
768
+ end
769
+
770
+ end
771
+