gdbm 0.9

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,723 @@
1
+ require 'test/unit'
2
+ require 'tmpdir'
3
+
4
+ begin
5
+ require 'gdbm'
6
+ rescue LoadError
7
+ end
8
+
9
+ #This is needed because JRuby does not have it implemented yet,
10
+ #but it's in MRI 1.9 and in the tests below (remove_entry_secure)
11
+ class File::Stat
12
+ def world_writable?
13
+ (self.mode & 0002) != 0
14
+ end
15
+ end
16
+
17
+ if defined? GDBM
18
+ require 'tmpdir'
19
+ require 'fileutils'
20
+
21
+ class TestGDBM < Test::Unit::TestCase
22
+ def TestGDBM.uname_s
23
+ require 'rbconfig'
24
+ case RbConfig::CONFIG['target_os']
25
+ when 'cygwin'
26
+ require 'Win32API'
27
+ uname = Win32API.new('cygwin1', 'uname', 'P', 'I')
28
+ utsname = ' ' * 100
29
+ raise 'cannot get system name' if uname.call(utsname) == -1
30
+
31
+ utsname.unpack('A20' * 5)[0]
32
+ else
33
+ RbConfig::CONFIG['target_os']
34
+ end
35
+ end
36
+ SYSTEM = uname_s
37
+
38
+ def setup
39
+ @tmpdir = Dir.mktmpdir("tmptest_gdbm")
40
+ @prefix = "tmptest_gdbm_#{$$}"
41
+ @path = "#{@tmpdir}/#{@prefix}_"
42
+ assert_instance_of(GDBM, @gdbm = GDBM.new(@path))
43
+
44
+ # prepare to make readonly GDBM file
45
+ GDBM.open("#{@tmpdir}/#{@prefix}_rdonly", 0400) {|gdbm|
46
+ gdbm['foo'] = 'FOO'
47
+ }
48
+ assert_instance_of(GDBM, @gdbm_rdonly = GDBM.new("#{@tmpdir}/#{@prefix}_rdonly", nil))
49
+ end
50
+ def teardown
51
+ assert_nil(@gdbm.close)
52
+ assert_nil(@gdbm_rdonly.close)
53
+ ObjectSpace.each_object(GDBM) do |obj|
54
+ obj.close unless obj.closed?
55
+ end
56
+ FileUtils.remove_entry_secure @tmpdir
57
+ end
58
+
59
+ def check_size(expect, gdbm=@gdbm)
60
+ assert_equal(expect, gdbm.size)
61
+ n = 0
62
+ gdbm.each { n+=1 }
63
+ assert_equal(expect, n)
64
+ if expect == 0
65
+ assert_equal(true, gdbm.empty?)
66
+ else
67
+ assert_equal(false, gdbm.empty?)
68
+ end
69
+ end
70
+
71
+ def have_fork?
72
+ begin
73
+ fork{}
74
+ true
75
+ rescue NotImplementedError
76
+ false
77
+ end
78
+ end
79
+
80
+ def test_s_new_has_no_block
81
+ # GDBM.new ignore the block
82
+ foo = true
83
+ assert_instance_of(GDBM, gdbm = GDBM.new("#{@tmpdir}/#{@prefix}") { foo = false })
84
+ assert_equal(foo, true)
85
+ assert_nil(gdbm.close)
86
+ end
87
+ def test_s_open_create_new
88
+ return if /^CYGWIN_9/ =~ SYSTEM
89
+
90
+ save_mask = File.umask(0)
91
+ begin
92
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}"))
93
+ gdbm.close
94
+ assert_equal(File.stat("#{@tmpdir}/#{@prefix}").mode & 0777, 0666)
95
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}2", 0644))
96
+ gdbm.close
97
+ assert_equal(File.stat("#{@tmpdir}/#{@prefix}2").mode & 0777, 0644)
98
+ ensure
99
+ File.umask save_mask
100
+ end
101
+ end
102
+ def test_s_open_no_create
103
+ assert_nil(gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", nil),
104
+ "this test is failed on libgdbm 1.8.0")
105
+ ensure
106
+ gdbm.close if gdbm
107
+ end
108
+ def test_s_open_3rd_arg
109
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
110
+ GDBM::FAST))
111
+ gdbm.close
112
+
113
+ # gdbm 1.8.0 specific
114
+ if defined? GDBM::SYNC
115
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
116
+ GDBM::SYNC))
117
+ gdbm.close
118
+ end
119
+ # gdbm 1.8.0 specific
120
+ if defined? GDBM::NOLOCK
121
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
122
+ GDBM::NOLOCK))
123
+ gdbm.close
124
+ end
125
+ end
126
+ def test_s_open_with_block
127
+ assert_equal(GDBM.open("#{@tmpdir}/#{@prefix}") { :foo }, :foo)
128
+ end
129
+ def test_s_open_lock
130
+ return unless have_fork? # snip this test
131
+ pid = fork() {
132
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
133
+ sleep 2
134
+ }
135
+ begin
136
+ sleep 1
137
+ assert_raise(Errno::EWOULDBLOCK) {
138
+ begin
139
+ assert_instance_of(GDBM, gdbm2 = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
140
+ rescue Errno::EAGAIN, Errno::EACCES
141
+ raise Errno::EWOULDBLOCK
142
+ end
143
+ }
144
+ ensure
145
+ Process.wait pid
146
+ end
147
+ end
148
+
149
+ =begin
150
+ # Is it guaranteed on many OS?
151
+ def test_s_open_lock_one_process
152
+ # locking on one process
153
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
154
+ assert_raise(Errno::EWOULDBLOCK) {
155
+ begin
156
+ GDBM.open("#{@tmpdir}/#{@prefix}", 0644)
157
+ rescue Errno::EAGAIN
158
+ raise Errno::EWOULDBLOCK
159
+ end
160
+ }
161
+ end
162
+ =end
163
+
164
+ def test_s_open_nolock
165
+ # gdbm 1.8.0 specific
166
+ if not defined? GDBM::NOLOCK
167
+ return
168
+ end
169
+ return unless have_fork? # snip this test
170
+
171
+ pid = fork() {
172
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
173
+ GDBM::NOLOCK))
174
+ sleep 2
175
+ }
176
+ sleep 1
177
+ begin
178
+ gdbm2 = nil
179
+ assert_nothing_raised(Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EACCES) {
180
+ assert_instance_of(GDBM, gdbm2 = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
181
+ }
182
+ ensure
183
+ Process.wait pid
184
+ gdbm2.close if gdbm2
185
+ end
186
+
187
+ p Dir.glob("#{@tmpdir}/#{@prefix}*") if $DEBUG
188
+
189
+ pid = fork() {
190
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0644))
191
+ sleep 2
192
+ }
193
+ begin
194
+ sleep 1
195
+ gdbm2 = nil
196
+ assert_nothing_raised(Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::EACCES) {
197
+ # this test is failed on Cygwin98 (???)
198
+ assert_instance_of(GDBM, gdbm2 = GDBM.open("#{@tmpdir}/#{@prefix}", 0644,
199
+ GDBM::NOLOCK))
200
+ }
201
+ ensure
202
+ Process.wait pid
203
+ gdbm2.close if gdbm2
204
+ end
205
+ end
206
+
207
+ def test_s_open_error
208
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0))
209
+ assert_raise(Errno::EACCES) {
210
+ GDBM.open("#{@tmpdir}/#{@prefix}", 0)
211
+ }
212
+ gdbm.close
213
+ end
214
+
215
+ def test_close
216
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}"))
217
+ assert_nil(gdbm.close)
218
+
219
+ # closed GDBM file
220
+ assert_raise(RuntimeError) { gdbm.close }
221
+ end
222
+
223
+ def test_aref
224
+ assert_equal('bar', @gdbm['foo'] = 'bar')
225
+ assert_equal('bar', @gdbm['foo'])
226
+
227
+ assert_nil(@gdbm['bar'])
228
+ end
229
+
230
+ def test_fetch
231
+ assert_equal('bar', @gdbm['foo']='bar')
232
+ assert_equal('bar', @gdbm.fetch('foo'))
233
+
234
+ # key not found
235
+ assert_raise(IndexError) {
236
+ @gdbm.fetch('bar')
237
+ }
238
+
239
+ # test for `ifnone' arg
240
+ assert_equal('baz', @gdbm.fetch('bar', 'baz'))
241
+
242
+ # test for `ifnone' block
243
+ assert_equal('foobar', @gdbm.fetch('bar') {|key| 'foo' + key })
244
+ end
245
+
246
+ def test_aset
247
+ num = 0
248
+ 2.times {|i|
249
+ assert_equal('foo', @gdbm['foo'] = 'foo')
250
+ assert_equal('foo', @gdbm['foo'])
251
+ assert_equal('bar', @gdbm['foo'] = 'bar')
252
+ assert_equal('bar', @gdbm['foo'])
253
+
254
+ num += 1 if i == 0
255
+ assert_equal(num, @gdbm.size)
256
+
257
+ # assign nil
258
+ assert_equal('', @gdbm['bar'] = '')
259
+ assert_equal('', @gdbm['bar'])
260
+
261
+ num += 1 if i == 0
262
+ assert_equal(num, @gdbm.size)
263
+
264
+ # empty string
265
+ assert_equal('', @gdbm[''] = '')
266
+ assert_equal('', @gdbm[''])
267
+
268
+ num += 1 if i == 0
269
+ assert_equal(num, @gdbm.size)
270
+
271
+ # Fixnum
272
+ assert_equal('200', @gdbm['100'] = '200')
273
+ assert_equal('200', @gdbm['100'])
274
+
275
+ num += 1 if i == 0
276
+ assert_equal(num, @gdbm.size)
277
+
278
+ # Big key and value
279
+ assert_equal('y' * 100, @gdbm['x' * 100] = 'y' * 100)
280
+ assert_equal('y' * 100, @gdbm['x' * 100])
281
+
282
+ num += 1 if i == 0
283
+ assert_equal(num, @gdbm.size)
284
+ }
285
+ end
286
+
287
+ def test_key
288
+ assert_equal('bar', @gdbm['foo'] = 'bar')
289
+ assert_equal('foo', @gdbm.key('bar'))
290
+ assert_nil(@gdbm['bar'])
291
+ end
292
+
293
+ def test_values_at
294
+ keys = %w(foo bar baz)
295
+ values = %w(FOO BAR BAZ)
296
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
297
+ assert_equal(values.reverse, @gdbm.values_at(*keys.reverse))
298
+ end
299
+
300
+ def test_select_with_block
301
+ keys = %w(foo bar baz)
302
+ values = %w(FOO BAR BAZ)
303
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
304
+ ret = @gdbm.select {|k,v|
305
+ assert_equal(k.upcase, v)
306
+ k != "bar"
307
+ }
308
+ assert_equal([['baz', 'BAZ'], ['foo', 'FOO']],
309
+ ret.sort)
310
+ end
311
+
312
+ def test_length
313
+ num = 10
314
+ assert_equal(0, @gdbm.size)
315
+ num.times {|i|
316
+ i = i.to_s
317
+ @gdbm[i] = i
318
+ }
319
+ assert_equal(num, @gdbm.size)
320
+
321
+ @gdbm.shift
322
+
323
+ assert_equal(num - 1, @gdbm.size)
324
+ end
325
+
326
+ def test_empty?
327
+ assert_equal(true, @gdbm.empty?)
328
+ @gdbm['foo'] = 'FOO'
329
+ assert_equal(false, @gdbm.empty?)
330
+ end
331
+
332
+ def test_each_pair
333
+ n = 0
334
+ @gdbm.each_pair { n += 1 }
335
+ assert_equal(0, n)
336
+
337
+ keys = %w(foo bar baz)
338
+ values = %w(FOO BAR BAZ)
339
+
340
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
341
+
342
+ n = 0
343
+ ret = @gdbm.each_pair {|key, val|
344
+ assert_not_nil(i = keys.index(key))
345
+ assert_equal(val, values[i])
346
+
347
+ n += 1
348
+ }
349
+ assert_equal(keys.size, n)
350
+ assert_equal(@gdbm, ret)
351
+ end
352
+
353
+ def test_each_value
354
+ n = 0
355
+ @gdbm.each_value { n += 1 }
356
+ assert_equal(0, n)
357
+
358
+ keys = %w(foo bar baz)
359
+ values = %w(FOO BAR BAZ)
360
+
361
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
362
+
363
+ n = 0
364
+ ret = @gdbm.each_value {|val|
365
+ assert_not_nil(key = @gdbm.key(val))
366
+ assert_not_nil(i = keys.index(key))
367
+ assert_equal(val, values[i])
368
+
369
+ n += 1
370
+ }
371
+ assert_equal(keys.size, n)
372
+ assert_equal(@gdbm, ret)
373
+ end
374
+
375
+ def test_each_key
376
+ n = 0
377
+ @gdbm.each_key { n += 1 }
378
+ assert_equal(0, n)
379
+
380
+ keys = %w(foo bar baz)
381
+ values = %w(FOO BAR BAZ)
382
+
383
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
384
+
385
+ n = 0
386
+ ret = @gdbm.each_key {|key|
387
+ assert_not_nil(i = keys.index(key))
388
+ assert_equal(@gdbm[key], values[i])
389
+
390
+ n += 1
391
+ }
392
+ assert_equal(keys.size, n)
393
+ assert_equal(@gdbm, ret)
394
+ end
395
+
396
+ def test_keys
397
+ assert_equal([], @gdbm.keys)
398
+
399
+ keys = %w(foo bar baz)
400
+ values = %w(FOO BAR BAZ)
401
+
402
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
403
+
404
+ assert_equal(keys.sort, @gdbm.keys.sort)
405
+ assert_equal(values.sort, @gdbm.values.sort)
406
+ end
407
+
408
+ def test_values
409
+ test_keys
410
+ end
411
+
412
+ def test_shift
413
+ assert_nil(@gdbm.shift)
414
+ assert_equal(0, @gdbm.size)
415
+
416
+ keys = %w(foo bar baz)
417
+ values = %w(FOO BAR BAZ)
418
+
419
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
420
+
421
+ ret_keys = []
422
+ ret_values = []
423
+ while ret = @gdbm.shift
424
+ ret_keys.push ret[0]
425
+ ret_values.push ret[1]
426
+
427
+ assert_equal(keys.size - ret_keys.size, @gdbm.size)
428
+ end
429
+
430
+ assert_equal(keys.sort, ret_keys.sort)
431
+ assert_equal(values.sort, ret_values.sort)
432
+ end
433
+
434
+ def test_delete
435
+ keys = %w(foo bar baz)
436
+ values = %w(FOO BAR BAZ)
437
+ key = keys[1]
438
+
439
+ assert_nil(@gdbm.delete(key))
440
+ assert_equal(0, @gdbm.size)
441
+
442
+ @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
443
+
444
+ assert_equal('BAR', @gdbm.delete(key))
445
+ assert_nil(@gdbm[key])
446
+ assert_equal(2, @gdbm.size)
447
+
448
+ assert_nil(@gdbm.delete(key))
449
+
450
+ if /^CYGWIN_9/ !~ SYSTEM
451
+ assert_raise(GDBMError) {
452
+ @gdbm_rdonly.delete("foo")
453
+ }
454
+
455
+ assert_nil(@gdbm_rdonly.delete("bar"))
456
+ end
457
+ end
458
+ def test_delete_with_block
459
+ key = 'no called block'
460
+ @gdbm[key] = 'foo'
461
+ assert_equal('foo', @gdbm.delete(key) {|k| k.replace 'called block'})
462
+ assert_equal('no called block', key)
463
+ assert_equal(0, @gdbm.size)
464
+
465
+ key = 'no called block'
466
+ assert_equal(:blockval,
467
+ @gdbm.delete(key) {|k| k.replace 'called block'; :blockval})
468
+ assert_equal('called block', key)
469
+ assert_equal(0, @gdbm.size)
470
+ end
471
+
472
+ def test_delete_if
473
+ v = "0"
474
+ 100.times {@gdbm[v] = v; v = v.next}
475
+
476
+ ret = @gdbm.delete_if {|key, val| key.to_i < 50}
477
+ assert_equal(@gdbm, ret)
478
+ check_size(50, @gdbm)
479
+
480
+ ret = @gdbm.delete_if {|key, val| key.to_i >= 50}
481
+ assert_equal(@gdbm, ret)
482
+ check_size(0, @gdbm)
483
+
484
+ # break
485
+ v = "0"
486
+ 100.times {@gdbm[v] = v; v = v.next}
487
+ check_size(100, @gdbm)
488
+ n = 0;
489
+ @gdbm.delete_if {|key, val|
490
+ break if n > 50
491
+ n+=1
492
+ true
493
+ }
494
+ assert_equal(51, n)
495
+ check_size(49, @gdbm)
496
+
497
+ @gdbm.clear
498
+
499
+ # raise
500
+ v = "0"
501
+ 100.times {@gdbm[v] = v; v = v.next}
502
+ check_size(100, @gdbm)
503
+ n = 0;
504
+ begin
505
+ @gdbm.delete_if {|key, val|
506
+ raise "runtime error" if n > 50
507
+ n+=1
508
+ true
509
+ }
510
+ rescue
511
+ end
512
+ assert_equal(51, n)
513
+ check_size(49, @gdbm)
514
+ end
515
+
516
+ def test_reject
517
+ v = "0"
518
+ 100.times {@gdbm[v] = v; v = v.next}
519
+
520
+ hash = @gdbm.reject {|key, val| key.to_i < 50}
521
+ assert_instance_of(Hash, hash)
522
+ assert_equal(100, @gdbm.size)
523
+
524
+ assert_equal(50, hash.size)
525
+ hash.each_pair {|key,val|
526
+ assert_equal(false, key.to_i < 50)
527
+ assert_equal(key, val)
528
+ }
529
+
530
+ hash = @gdbm.reject {|key, val| key.to_i < 100}
531
+ assert_instance_of(Hash, hash)
532
+ assert_equal(true, hash.empty?)
533
+ end
534
+
535
+ def test_clear
536
+ v = "1"
537
+ 100.times {v = v.next; @gdbm[v] = v}
538
+
539
+ assert_equal(@gdbm, @gdbm.clear)
540
+
541
+ # validate GDBM#size
542
+ i = 0
543
+ @gdbm.each { i += 1 }
544
+ assert_equal(@gdbm.size, i)
545
+ assert_equal(0, i)
546
+ end
547
+
548
+ def test_invert
549
+ v = "0"
550
+ 100.times {@gdbm[v] = v; v = v.next}
551
+
552
+ hash = @gdbm.invert
553
+ assert_instance_of(Hash, hash)
554
+ assert_equal(100, hash.size)
555
+ hash.each_pair {|key, val|
556
+ assert_equal(key.to_i, val.to_i)
557
+ }
558
+ end
559
+
560
+ def test_update
561
+ hash = {}
562
+ v = "0"
563
+ 100.times {v = v.next; hash[v] = v}
564
+
565
+ @gdbm["101"] = "101"
566
+ @gdbm.update hash
567
+ assert_equal(101, @gdbm.size)
568
+ @gdbm.each_pair {|key, val|
569
+ assert_equal(key.to_i, val.to_i)
570
+ }
571
+ end
572
+
573
+ def test_replace
574
+ hash = {}
575
+ v = "0"
576
+ 100.times {v = v.next; hash[v] = v}
577
+
578
+ @gdbm["101"] = "101"
579
+ @gdbm.replace hash
580
+ assert_equal(100, @gdbm.size)
581
+ @gdbm.each_pair {|key, val|
582
+ assert_equal(key.to_i, val.to_i)
583
+ }
584
+ end
585
+
586
+ def test_reorganize
587
+ size1 = File.size(@path)
588
+ i = "1"
589
+ 1000.times {i = i.next; @gdbm[i] = i}
590
+ @gdbm.clear
591
+ @gdbm.sync
592
+
593
+ size2 = File.size(@path)
594
+ @gdbm.reorganize
595
+ size3 = File.size(@path)
596
+
597
+ # p [size1, size2, size3]
598
+ assert_equal(true, size1 < size2)
599
+ # this test is failed on Cygwin98. `GDBM version 1.8.0, as of May 19, 1999'
600
+ assert_equal(true, size3 < size2)
601
+ assert_equal(size1, size3)
602
+ end
603
+
604
+ def test_sync
605
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0666, GDBM::FAST))
606
+ assert_equal(gdbm.sync, gdbm)
607
+ gdbm.close
608
+ assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0666))
609
+ assert_equal(gdbm.sync, gdbm)
610
+ gdbm.close
611
+ end
612
+
613
+ def test_cachesize=
614
+ assert_equal(@gdbm.cachesize = 1024, 1024)
615
+ end
616
+
617
+ def test_fastmode=
618
+ assert_equal(@gdbm.fastmode = true, true)
619
+ end
620
+
621
+ def test_syncmode=
622
+ assert_equal(@gdbm.syncmode = true, true)
623
+ end
624
+
625
+ def test_haskey?
626
+ assert_equal('bar', @gdbm['foo']='bar')
627
+ assert_equal(true, @gdbm.has_key?('foo'))
628
+ assert_equal(false, @gdbm.has_key?('bar'))
629
+ end
630
+
631
+ def test_has_value?
632
+ assert_equal('bar', @gdbm['foo']='bar')
633
+ assert_equal(true, @gdbm.has_value?('bar'))
634
+ assert_equal(false, @gdbm.has_value?('foo'))
635
+ end
636
+
637
+ def test_to_a
638
+ v = "0"
639
+ 100.times {v = v.next; @gdbm[v] = v}
640
+
641
+ ary = @gdbm.to_a
642
+ assert_instance_of(Array, ary)
643
+ assert_equal(100, ary.size)
644
+ ary.each {|key,val|
645
+ assert_equal(key.to_i, val.to_i)
646
+ }
647
+ end
648
+
649
+ def test_to_hash
650
+ v = "0"
651
+ 100.times {v = v.next; @gdbm[v] = v}
652
+
653
+ hash = @gdbm.to_hash
654
+ assert_instance_of(Hash, hash)
655
+ assert_equal(100, hash.size)
656
+ hash.each {|key,val|
657
+ assert_equal(key.to_i, val.to_i)
658
+ }
659
+ end
660
+ end
661
+
662
+ class TestGDBM2 < Test::Unit::TestCase
663
+ def setup
664
+ @tmproot = Dir.mktmpdir('ruby-gdbm')
665
+ end
666
+
667
+ def teardown
668
+ FileUtils.remove_entry_secure @tmproot if File.directory?(@tmproot)
669
+ end
670
+
671
+ def test_reader_open_notexist
672
+ assert_raise(Errno::ENOENT) {
673
+ GDBM.open("#{@tmproot}/a", 0666, GDBM::READER)
674
+ }
675
+ end
676
+
677
+ def test_writer_open_notexist
678
+ assert_raise(Errno::ENOENT) {
679
+ GDBM.open("#{@tmproot}/a", 0666, GDBM::WRITER)
680
+ }
681
+ end
682
+
683
+ def test_wrcreat_open_notexist
684
+ v = GDBM.open("#{@tmproot}/a", 0666, GDBM::WRCREAT)
685
+ assert_instance_of(GDBM, v)
686
+ v.close
687
+ end
688
+
689
+ def test_newdb_open_notexist
690
+ v = GDBM.open("#{@tmproot}/a", 0666, GDBM::NEWDB)
691
+ assert_instance_of(GDBM, v)
692
+ v.close
693
+ end
694
+
695
+ def test_reader_open
696
+ GDBM.open("#{@tmproot}/a.dbm") {} # create a db.
697
+ v = GDBM.open("#{@tmproot}/a.dbm", nil, GDBM::READER) {|d|
698
+ assert_raise(GDBMError) { d["k"] = "v" }
699
+ true
700
+ }
701
+ assert(v)
702
+ end
703
+
704
+ def test_newdb_open
705
+ GDBM.open("#{@tmproot}/a.dbm") {|dbm|
706
+ dbm["k"] = "v"
707
+ }
708
+ v = GDBM.open("#{@tmproot}/a.dbm", nil, GDBM::NEWDB) {|d|
709
+ assert_equal(0, d.length)
710
+ assert_nil(d["k"])
711
+ true
712
+ }
713
+ assert(v)
714
+ end
715
+
716
+ def test_freeze
717
+ GDBM.open("#{@tmproot}/a.dbm") {|d|
718
+ d.freeze
719
+ assert_raise(RuntimeError) { d["k"] = "v" }
720
+ }
721
+ end
722
+ end
723
+ end