PageRenderTime 31ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/test/gdbm/test_gdbm.rb

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