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

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

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