PageRenderTime 27ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/TDDBC_Yokohama2_PCUnit/Ruby/doc/ruby/ruby-1.9.2/test/gdbm/test_gdbm.rb

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