PageRenderTime 24ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.9/gdbm/test_gdbm.rb

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